1 |
|
2 | import { re } from './fswquery-re';
|
3 | import { re as reStyle } from '../style/style-re';
|
4 | import { range } from './fswquery-range';
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 | const regex = (query) => {
|
21 | query = query.match(new RegExp(`^${re.full}`))[0];
|
22 | if (!query) {
|
23 | return '';
|
24 | }
|
25 | var matches;
|
26 | var i;
|
27 | var fsw_pattern;
|
28 | var part;
|
29 | var from;
|
30 | var to;
|
31 | var re_range;
|
32 | var segment;
|
33 | var x;
|
34 | var y;
|
35 | var base;
|
36 | var fill;
|
37 | var rotate;
|
38 | var fuzz = 20;
|
39 | var re_sym = 'S[123][0-9a-f]{2}[0-5][0-9a-f]';
|
40 | var re_coord = '[0-9]{3}x[0-9]{3}';
|
41 | var re_word = '[BLMR](' + re_coord + ')(' + re_sym + re_coord + ')*';
|
42 | var re_sortable = '(A(' + re_sym + ')+)';
|
43 | var q_range = 'R[123][0-9a-f]{2}t[123][0-9a-f]{2}';
|
44 | var q_sym = 'S[123][0-9a-f]{2}[0-5u][0-9a-fu]';
|
45 | var q_coord = '([0-9]{3}x[0-9]{3})?';
|
46 | var q_var = '(V[0-9]+)';
|
47 | var q_style = '(' + reStyle.full + ')?';
|
48 | var q_sortable;
|
49 |
|
50 | if (query == 'Q') {
|
51 | return [re_sortable + "?" + re_word];
|
52 | }
|
53 | if (query == 'Q-') {
|
54 | return [re_sortable + "?" + re_word + q_style];
|
55 | }
|
56 | if (query == 'QT') {
|
57 | return [re_sortable + re_word];
|
58 | }
|
59 | if (query == 'QT-') {
|
60 | return [re_sortable + re_word + q_style];
|
61 | }
|
62 | var segments = [];
|
63 | var sortable = query.indexOf('T') + 1;
|
64 | if (sortable) {
|
65 | q_sortable = '(A';
|
66 | var qat = query.slice(0, sortable);
|
67 | query = query.replace(qat, '');
|
68 | if (qat == 'QT') {
|
69 | q_sortable += '(' + re_sym + ')+)';
|
70 | } else {
|
71 | matches = qat.match(new RegExp('(' + q_sym + '|' + q_range + ')', 'g'));
|
72 | if (matches) {
|
73 | var matched;
|
74 | for (i = 0; i < matches.length; i += 1) {
|
75 | matched = matches[i].match(new RegExp(q_sym));
|
76 | if (matched) {
|
77 | segment = matched[0].slice(0, 4);
|
78 | fill = matched[0].slice(4, 5);
|
79 | if (fill == 'u') {
|
80 | segment += '[0-5]';
|
81 | } else {
|
82 | segment += fill;
|
83 | }
|
84 | rotate = matched[0].slice(5, 6);
|
85 | if (rotate == 'u') {
|
86 | segment += '[0-9a-f]';
|
87 | } else {
|
88 | segment += rotate;
|
89 | }
|
90 | q_sortable += segment;
|
91 | } else {
|
92 | from = matches[i].slice(1, 4);
|
93 | to = matches[i].slice(5, 8);
|
94 | re_range = range(from, to, 'hex');
|
95 | segment = 'S' + re_range + '[0-5][0-9a-f]';
|
96 | q_sortable += segment;
|
97 | }
|
98 | }
|
99 | q_sortable += '(' + re_sym + ')*)';
|
100 | }
|
101 | }
|
102 | }
|
103 |
|
104 | matches = query.match(new RegExp(q_var, 'g'));
|
105 | if (matches) {
|
106 | fuzz = matches.toString().slice(1) * 1;
|
107 | }
|
108 |
|
109 | fsw_pattern = q_sym + q_coord;
|
110 | matches = query.match(new RegExp(fsw_pattern, 'g'));
|
111 | if (matches) {
|
112 | for (i = 0; i < matches.length; i += 1) {
|
113 | part = matches[i].toString();
|
114 | base = part.slice(1, 4);
|
115 | segment = 'S' + base;
|
116 | fill = part.slice(4, 5);
|
117 | if (fill == 'u') {
|
118 | segment += '[0-5]';
|
119 | } else {
|
120 | segment += fill;
|
121 | }
|
122 | rotate = part.slice(5, 6);
|
123 | if (rotate == 'u') {
|
124 | segment += '[0-9a-f]';
|
125 | } else {
|
126 | segment += rotate;
|
127 | }
|
128 | if (part.length > 6) {
|
129 | x = part.slice(6, 9) * 1;
|
130 | y = part.slice(10, 13) * 1;
|
131 |
|
132 | segment += range((x - fuzz), (x + fuzz));
|
133 | segment += 'x';
|
134 | segment += range((y - fuzz), (y + fuzz));
|
135 | } else {
|
136 | segment += re_coord;
|
137 | }
|
138 |
|
139 |
|
140 | segment = re_word + segment + '(' + re_sym + re_coord + ')*';
|
141 | if (sortable) {
|
142 | segment = q_sortable + segment;
|
143 | } else {
|
144 | segment = re_sortable + "?" + segment;
|
145 | }
|
146 | if (query.indexOf('-') > 0) {
|
147 | segment += q_style;
|
148 | }
|
149 | segments.push(segment);
|
150 | }
|
151 | }
|
152 |
|
153 | fsw_pattern = q_range + q_coord;
|
154 | matches = query.match(new RegExp(fsw_pattern, 'g'));
|
155 | if (matches) {
|
156 | for (i = 0; i < matches.length; i += 1) {
|
157 | part = matches[i].toString();
|
158 | from = part.slice(1, 4);
|
159 | to = part.slice(5, 8);
|
160 | re_range = range(from, to, "hex");
|
161 | segment = 'S' + re_range + '[0-5][0-9a-f]';
|
162 | if (part.length > 8) {
|
163 | x = part.slice(8, 11) * 1;
|
164 | y = part.slice(12, 15) * 1;
|
165 |
|
166 | segment += range((x - fuzz), (x + fuzz));
|
167 | segment += 'x';
|
168 | segment += range((y - fuzz), (y + fuzz));
|
169 | } else {
|
170 | segment += re_coord;
|
171 | }
|
172 |
|
173 | segment = re_word + segment + '(' + re_sym + re_coord + ')*';
|
174 | if (sortable) {
|
175 | segment = q_sortable + segment;
|
176 | } else {
|
177 | segment = re_sortable + "?" + segment;
|
178 | }
|
179 | if (query.indexOf('-') > 0) {
|
180 | segment += q_style;
|
181 | }
|
182 | segments.push(segment);
|
183 | }
|
184 | }
|
185 | if (!segments.length) {
|
186 | if (query.indexOf('-') > 0) {
|
187 | segment += q_style;
|
188 | }
|
189 | segments.push(q_sortable + re_word);
|
190 | }
|
191 | return segments;
|
192 | }
|
193 |
|
194 | export { regex }
|