UNPKG

5.3 kBJavaScriptView Raw
1
2import { re } from './swuquery-re';
3import { re as reSWU } from '../swu/swu-re';
4import { re as reStyle } from '../style/style-re';
5import { range } from './swuquery-range';
6import { symbolRanges } from './swuquery-symbol-ranges';
7import { swu2coord, num2swu, swu2key, key2swu } from '../convert';
8
9const regexRange = (symRange) => {
10 from = swu2key(symRange.slice(1, 3));
11 to = swu2key(symRange.slice(-2));
12 from = key2swu(from.slice(0, 4) + '00');
13 to = key2swu(to.slice(0, 4) + '5f');
14 return range(from, to);
15}
16
17//needs rewritten, but it works
18/**
19 * Function to transform an SWU query string to one or more regular expressions
20 * @function swuquery.regex
21 * @param {string} query - an SWU query string
22 * @returns {string[]} an array of one or more regular expressions
23 * @example
24 * swuquery.regex('QA񀀒T')
25 *
26 * return [
27 * '(\uD836\uDC00\uD8C0\uDC12((?:(?:\uD8C0[\uDC01-\uDFFF])|(?:[\uD8C1-\uD8FC][\uDC00-\uDFFF])|(?:\uD8FD[\uDC00-\uDC80])))*)\uD836[\uDC01-\uDC04](?:\uD836[\uDC0C-\uDDFF]){2}((?:(?:\uD8C0[\uDC01-\uDFFF])|(?:[\uD8C1-\uD8FC][\uDC00-\uDFFF])|(?:\uD8FD[\uDC00-\uDC80]))(?:\uD836[\uDC0C-\uDDFF]){2})*'
28 * ]
29 */
30const regex = (query) => {
31 query = query.match(new RegExp(`^${re.full}`))[0];
32
33 if (!query) {
34 return '';
35 }
36 let matches;
37 let matchesOr;
38 let matched;
39 let orList;
40 let i;
41 let j;
42 let swu_pattern;
43 let part;
44 let from;
45 let to;
46 let coord;
47 let re_range;
48 let segment;
49 let x;
50 let y;
51 let base;
52 let fill;
53 let rotate;
54 let fuzz = 20;
55
56 let re_sym = reSWU.symbol;
57 let re_coord = reSWU.coord;
58 let re_signbox = reSWU.box;
59 let re_seq = reSWU.sort;
60 let re_word = re_signbox + re_coord + '(' + re_sym + re_coord + ')*';
61 let re_sortable = '(' + re_seq + '(' + re_sym + ')+)';
62
63 let q_range = 'R' + re_sym + re_sym;
64 let q_sym = re_sym + 'f?r?';
65 let q_coord = '(' + re_coord + ')?';
66 let q_var = '(V[0-9]+)';
67 let q_style = '(' + reStyle.full + ')?';
68 let q_sortable;
69
70 if (query == 'Q') {
71 return [reSWU.sign];
72 }
73 if (query == 'Q-') {
74 return [reSWU.sign + "(" + reStyle.full + ")?"];
75 }
76 if (query == 'QT') {
77 return [reSWU.sortable];
78 }
79 if (query == 'QT-') {
80 return [reSWU.sortable + "(" + reStyle.full + ")?"];
81 }
82 let segments = [];
83 let sym, key;
84 let sortable = query.indexOf('T') + 1;
85 if (sortable) {
86 q_sortable = '(' + reSWU.sort;
87 let qat = query.slice(0, sortable);
88 query = query.replace(qat, '');
89 if (qat == 'QT') {
90 q_sortable += '(' + re_sym + ')+)';
91 } else {
92 matches = qat.match(new RegExp('(' + re.list + ')', 'g'));
93 if (matches) {
94 for (i = 0; i < matches.length; i += 1) {
95 orList = [];
96 matchesOr = matches[i].match(new RegExp('(' + re.symbol + '|' + re.range + ')', 'g'));
97 if (matchesOr) {
98 for (j = 0; j < matchesOr.length; j += 1) {
99 matched = matchesOr[j].match(new RegExp(re.symbol));
100 if (matched) {
101 orList.push(symbolRanges(matched[0]));
102 } else {
103 orList.push(regexRange(matchesOr[j]));
104 }
105 }
106 if (orList.length==1){
107 q_sortable += orList[0];
108 } else {
109 q_sortable += '(' + orList.join('|') + ')';
110 }
111 }
112 }
113 q_sortable += '(' + reSWU.symbol + ')*)';
114 }
115 }
116 }
117
118 //get the variance
119 matches = query.match(new RegExp(q_var, 'g'));
120 if (matches) {
121 fuzz = matches.toString().slice(1) * 1;
122 }
123
124 //this gets all symbols and ranges with or without location
125 matches = query.match(new RegExp(re.list + re.coord, 'g'));
126 if (matches) {
127 for (i = 0; i < matches.length; i += 1) {
128 orList = [];
129 matchesOr = matches[i].match(new RegExp('(' + re.symbol + '|' + re.range + ')', 'g'));
130 if (matchesOr) {
131 for (j = 0; j < matchesOr.length; j += 1) {
132 matched = matchesOr[j].match(new RegExp(re.symbol));
133 if (matched) {
134 orList.push(symbolRanges(matched[0]));
135 } else {
136 orList.push(regexRange(matchesOr[j]));
137 }
138 }
139 if (orList.length==1){
140 segment = orList[0];
141 } else {
142 segment = '(' + orList.join('|') + ')';
143 }
144 }
145
146 coord = matches[i].match(new RegExp(`${reSWU.coord}`));
147 if (coord) {
148 coord = swu2coord(coord[0]);
149 x = coord[0];
150 y = coord[1];
151 segment += range(num2swu(x - fuzz), num2swu(x + fuzz));
152 segment += range(num2swu(y - fuzz), num2swu(y + fuzz));
153 } else {
154 segment += reSWU.coord;
155 }
156
157 // add to general swu word
158 segment = re_word + segment + '(' + re_sym + re_coord + ')*';
159 if (sortable) {
160 segment = q_sortable + segment;
161 } else {
162 segment = re_sortable + "?" + segment;
163 }
164 if (query.indexOf('-') > 0) {
165 segment += q_style;
166 }
167 segments.push(segment);
168 }
169 }
170
171 if (!segments.length) {
172 if (query.indexOf('-') > 0) {
173 segment += q_style;
174 }
175 segments.push(q_sortable + re_word);
176 }
177 return segments;
178}
179
180export { regex }