UNPKG

5.99 kBJavaScriptView Raw
1
2import { re } from './fswquery-re';
3import { re as reStyle } from '../style/style-re';
4import { range } from './fswquery-range';
5
6//needs rewritten, but it works
7/**
8 * Function to transform an FSW query string to one or more regular expressions
9 * @function fswquery.regex
10 * @param {string} query - an FSW query string
11 * @returns {string[]} an array of one or more regular expressions
12 * @example
13 * fswquery.regex('QS100uuS20500480x520')
14 *
15 * return [
16 * '(A(S[123][0-9a-f]{2}[0-5][0-9a-f])+)?[BLMR]([0-9]{3}x[0-9]{3})(S[123][0-9a-f]{2}[0-5][0-9a-f][0-9]{3}x[0-9]{3})*S100[0-5][0-9a-f][0-9]{3}x[0-9]{3}(S[123][0-9a-f]{2}[0-5][0-9a-f][0-9]{3}x[0-9]{3})*',
17 * '(A(S[123][0-9a-f]{2}[0-5][0-9a-f])+)?[BLMR]([0-9]{3}x[0-9]{3})(S[123][0-9a-f]{2}[0-5][0-9a-f][0-9]{3}x[0-9]{3})*S20500((4[6-9][0-9])|(500))x((5[0-3][0-9])|(540))(S[123][0-9a-f]{2}[0-5][0-9a-f][0-9]{3}x[0-9]{3})*'
18 * ]
19 */
20const 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 //get the variance
104 matches = query.match(new RegExp(q_var, 'g'));
105 if (matches) {
106 fuzz = matches.toString().slice(1) * 1;
107 }
108 //this gets all symbols with or without location
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 //now get the x segment range+++
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 //now I have the specific search symbol
139 // add to general ksw word
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 //this gets all ranges
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 //now get the x segment range+++
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 // add to general ksw word
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
194export { regex }