UNPKG

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