UNPKG

3.85 kBJavaScriptView Raw
1"use strict";
2var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3 if (k2 === undefined) k2 = k;
4 Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5}) : (function(o, m, k, k2) {
6 if (k2 === undefined) k2 = k;
7 o[k2] = m[k];
8}));
9var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10 Object.defineProperty(o, "default", { enumerable: true, value: v });
11}) : function(o, v) {
12 o["default"] = v;
13});
14var __importStar = (this && this.__importStar) || function (mod) {
15 if (mod && mod.__esModule) return mod;
16 var result = {};
17 if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18 __setModuleDefault(result, mod);
19 return result;
20};
21Object.defineProperty(exports, "__esModule", { value: true });
22exports.writeSetTokens = exports.setChar = void 0;
23const types_1 = require("./types");
24const sets = __importStar(require("./sets-lookup"));
25/**
26 * Takes character code and returns character to be displayed in a set
27 * @param {number} charCode Character code of set element
28 * @returns {string} The string for the sets character
29 */
30function setChar(charCode) {
31 return charCode === 94 ? '\\^' :
32 charCode === 92 ? '\\\\' :
33 charCode === 93 ? '\\]' :
34 charCode === 45 ? '\\-' :
35 String.fromCharCode(charCode);
36}
37exports.setChar = setChar;
38/**
39 * Test if a character set matches a 'set-lookup'
40 * @param {SetTokens} set The set to be tested
41 * @param {SetLookup} param The predefined 'set-lookup' & the number of elements in the lookup
42 * @returns {boolean} True if the character set corresponds to the 'set-lookup'
43 */
44function isSameSet(set, { lookup, len }) {
45 // If the set and the lookup are not of the same length
46 // then we immediately know that the lookup will be false
47 if (len !== set.length) {
48 return false;
49 }
50 const map = lookup();
51 for (const elem of set) {
52 if (elem.type === types_1.types.SET) {
53 return false;
54 }
55 const key = elem.type === types_1.types.CHAR ? elem.value : `${elem.from}-${elem.to}`;
56 if (map[key]) {
57 map[key] = false;
58 }
59 else {
60 return false;
61 }
62 }
63 return true;
64}
65/**
66 * Writes the tokens for a set
67 * @param {Set} set The set to display
68 * @param {boolean} isNested Whether the token is nested inside another set token
69 * @returns {string} The tokens for the set
70 */
71function writeSetTokens(set, isNested = false) {
72 if (isSameSet(set.set, sets.INTS)) {
73 return set.not ? '\\D' : '\\d';
74 }
75 if (isSameSet(set.set, sets.WORDS)) {
76 return set.not ? '\\W' : '\\w';
77 }
78 // Notanychar is only relevant when not nested inside another set token
79 if (set.not && isSameSet(set.set, sets.NOTANYCHAR)) {
80 return '.';
81 }
82 if (isSameSet(set.set, sets.WHITESPACE)) {
83 return set.not ? '\\S' : '\\s';
84 }
85 let tokenString = '';
86 for (let i = 0; i < set.set.length; i++) {
87 const subset = set.set[i];
88 tokenString += writeSetToken(subset);
89 }
90 const contents = `${set.not ? '^' : ''}${tokenString}`;
91 return isNested ? contents : `[${contents}]`;
92}
93exports.writeSetTokens = writeSetTokens;
94/**
95 * Writes a token within a set
96 * @param {Range | Char | Set} set The set token to display
97 * @returns {string} The token as a string
98 */
99function writeSetToken(set) {
100 if (set.type === types_1.types.CHAR) {
101 return setChar(set.value);
102 }
103 else if (set.type === types_1.types.RANGE) {
104 return `${setChar(set.from)}-${setChar(set.to)}`;
105 }
106 return writeSetTokens(set, true);
107}
108//# sourceMappingURL=write-set-tokens.js.map
\No newline at end of file