1 |
|
2 | import { re } from './fswquery-re';
|
3 | import { re as reFSW } from '../fsw/fsw-re';
|
4 | import { re as reStyle } from '../style/style-re';
|
5 | import { range } from './fswquery-range';
|
6 | import { fsw2coord } from '../convert';
|
7 |
|
8 | const 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 |
|
25 | const 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 |
|
32 |
|
33 |
|
34 |
|
35 |
|
36 |
|
37 |
|
38 |
|
39 |
|
40 |
|
41 |
|
42 |
|
43 |
|
44 |
|
45 | const 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 |
|
116 | matches = query.match(new RegExp(re.var, 'g'));
|
117 | if (matches) {
|
118 | fuzz = matches.toString().slice(1) * 1;
|
119 | }
|
120 |
|
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 |
|
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 |
|
175 | export { regex }
|