UNPKG

1.96 kBJavaScriptView Raw
1
2import { re } from './swuquery-re';
3import { swu2key, key2swu } from '../convert';
4import { range } from './swuquery-range';
5
6//needs rewritten, but it works
7/**
8 * Function to transform an SWU symbol with fill and rotation flags to a regular expression
9 * @function swuquery.symbolRanges
10 * @param {string} symbolFR - an SWU character with optional flags of 'f' for any fill and 'r' for any rotation
11 * @returns {string} a regular expression that matches one or more ranges of SWU symbols
12 * @example <caption>Match an exact symbol</caption>
13 * swuquery.symbolRanges('񀀁')
14 *
15 * return '\uD8C0\uDC01');
16 * @example <caption>Match a symbol with any fill</caption>
17 * swuquery.symbolRanges('񀀁f')
18 *
19 * return '(\uD8C0\uDC01|\uD8C0\uDC11|\uD8C0\uDC21|\uD8C0\uDC31|\uD8C0\uDC41|\uD8C0\uDC51)'
20 * @example <caption>Match a symbol with any rotation</caption>
21 * swuquery.symbolRanges('񀀁r')
22 *
23 * return '\uD8C0[\uDC01-\uDC10]'
24 * @example <caption>Match a symbol with any fill or rotation</caption>
25 * swuquery.symbolRanges('񀀁fr')
26 *
27 * return '\uD8C0[\uDC01-\uDC60]'
28 */
29const symbolRanges = (symbolFR) => {
30 let match = symbolFR.match(new RegExp(re.symbol));
31 if (match) {
32 let sym = match[0].slice(0, 2);
33 let key = swu2key(sym);
34 let base = key.slice(0, 4);
35 let start, end;
36 if (match[0].slice(-2) == 'fr') {
37 start = key2swu(base + "00");
38 end = key2swu(base + "5f");
39 return range(start, end);
40 } else if (match[0].slice(-1) == 'r') {
41 start = key2swu(key.slice(0, 5) + '0');
42 end = key2swu(key.slice(0, 5) + 'f');
43 return range(start, end);
44 } else if (match[0].slice(-1) == 'f') {
45 let list = [0, 1, 2, 3, 4, 5].map(function (f) {
46 return key2swu(base + f + key.slice(-1));
47 })
48 return "(" + list.join("|") + ")";
49 } else {
50 return sym;
51 }
52 } else {
53 return '';
54 }
55}
56
57export { symbolRanges }
\No newline at end of file