Skip to content

Commit c3509dd

Browse files
Reuse Char constants in meta transformer
1 parent 5987222 commit c3509dd

File tree

3 files changed

+55
-68
lines changed

3 files changed

+55
-68
lines changed

src/constants/index.ts

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,12 @@ const whitespace = ` \t\r\n${nbsp}`.split('');
33

44
const digits = '0123456789'.split('');
55

6+
const underscore = '_';
67
const basicLowercase = 'abcdefghijklmnopqrstuvwxyz'.split('');
78
const basicUppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('');
8-
const basicSpecial = '~`!@#$%^&*()-_=+<,>.?/[]{}|\\:;"\''.split('');
9+
const basicAlpha = [...basicLowercase, ...basicUppercase, underscore];
10+
11+
const basicSpecial = '~`!@#$%^&*()-=+<,>.?/[]{}|\\:;"\''.split('');
912

1013
const extendedLowercase = 'àáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ'.split('');
1114
const extendedUppercase = 'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞß'.split('');
@@ -16,16 +19,26 @@ const extendedSpecial = `¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼
1619
// https://www.ascii-code.com/#extendedASCIIDescription
1720
const windows1252Special = '€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ'.split('');
1821

19-
const all = ([] as string[]).concat(
20-
whitespace,
21-
digits,
22-
basicLowercase,
23-
basicUppercase,
24-
basicSpecial,
25-
extendedLowercase,
26-
extendedUppercase,
27-
extendedSpecial,
28-
windows1252Special
29-
);
22+
const extended = [
23+
...extendedLowercase,
24+
...extendedUppercase,
25+
...extendedSpecial,
26+
...windows1252Special,
27+
];
3028

31-
export const Chars = { all };
29+
const all = [
30+
...whitespace,
31+
...digits,
32+
...basicAlpha,
33+
...basicSpecial,
34+
...extended,
35+
];
36+
37+
export const Chars = {
38+
all,
39+
basicAlpha,
40+
basicSpecial,
41+
digits,
42+
extended,
43+
whitespace,
44+
};

src/transforms/meta-to-char-class-transform.ts

Lines changed: 28 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,9 @@ import {
77
CharacterClass,
88
SpecialChar,
99
} from 'regexp-tree/ast';
10+
import { Chars } from '../constants';
1011
import * as Guards from '../types/regexp-tree-guards';
11-
import {
12-
createClassRange,
13-
createEscapedSimpleChar,
14-
createSimpleChar,
15-
createSimpleChars,
16-
} from './utils';
12+
import { createEscapedSimpleChar, createSimpleChar } from './utils';
1713

1814
type Replace<ParentType extends AstClass> = (
1915
parentNode: AsExpression<ParentType>,
@@ -59,73 +55,63 @@ const replacer: NodeReplacer = {
5955
},
6056
};
6157

62-
const optionsAlpha = [createClassRange('a', 'z'), createClassRange('A', 'Z')];
63-
const optionsDigit = createClassRange('0', '9');
64-
const optionUnderscore = createEscapedSimpleChar('_');
65-
const optionsWhitespaceNoBreak = [
66-
...createSimpleChars(' \t'),
67-
createSimpleChar(String.fromCharCode(160)), // &nbsp;
68-
];
69-
const optionsWhitespace = [
70-
...optionsWhitespaceNoBreak,
71-
...createSimpleChars('\r\n'),
72-
];
58+
const optionsAlpha = Chars.basicAlpha.map(createSimpleChar);
59+
const optionsDigit = Chars.digits.map(createSimpleChar);
60+
61+
const optionsWhitespace = Chars.whitespace.map(createSimpleChar);
62+
63+
const needEscape = [']', '-', '\\'];
64+
const noEscape = Chars.basicSpecial.filter(c => !needEscape.includes(c));
7365
const optionsOther = [
74-
...createSimpleChars('~`!@#$%^&*()=+<,>.?/[{}|:;"\''),
75-
createEscapedSimpleChar(']'),
76-
createEscapedSimpleChar('-'),
77-
createEscapedSimpleChar('\\'),
78-
];
79-
const optionsNewLine = createSimpleChar('\n');
80-
const optionsExtendedAscii = [
81-
...createSimpleChars('àáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ'),
82-
...createSimpleChars('ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞß'),
83-
...createSimpleChars('¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿'),
84-
...createSimpleChars('€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ×÷'),
85-
createSimpleChar(String.fromCharCode(173)), // &shy;
66+
...noEscape.map(createSimpleChar),
67+
...needEscape.map(createEscapedSimpleChar),
8668
];
8769

70+
const optionsExtended = Chars.extended.map(createSimpleChar);
71+
8872
function getMetaCharExpressions(
8973
metaChar: SpecialChar,
9074
regExpFlags: string
9175
): CharacterClass['expressions'] {
9276
switch (metaChar.value) {
9377
case '.': {
94-
const dotAllOptions = regExpFlags.includes('s') ? [optionsNewLine] : [];
78+
const optionsNewLine = createSimpleChar('\n');
79+
const optionsDotAll = regExpFlags.includes('s') ? [optionsNewLine] : [];
80+
const whitespaceNoBreaks = Chars.whitespace.filter(
81+
c => !'\r\n'.includes(c)
82+
);
83+
const optionsWhitespaceNoBreak = whitespaceNoBreaks.map(createSimpleChar);
9584

9685
return [
9786
...optionsAlpha,
98-
optionsDigit,
87+
...optionsDigit,
9988
...optionsWhitespaceNoBreak,
10089
...optionsOther,
101-
optionUnderscore,
102-
...optionsExtendedAscii,
103-
...dotAllOptions,
90+
...optionsExtended,
91+
...optionsDotAll,
10492
];
10593
}
10694
case '\\w':
107-
return [...optionsAlpha, optionsDigit, optionUnderscore];
95+
return [...optionsAlpha, ...optionsDigit];
10896
case '\\W':
109-
return [...optionsWhitespace, ...optionsOther, ...optionsExtendedAscii];
97+
return [...optionsWhitespace, ...optionsOther, ...optionsExtended];
11098
case '\\d':
111-
return [optionsDigit];
99+
return optionsDigit;
112100
case '\\D':
113101
return [
114102
...optionsAlpha,
115103
...optionsWhitespace,
116104
...optionsOther,
117-
optionUnderscore,
118-
...optionsExtendedAscii,
105+
...optionsExtended,
119106
];
120107
case '\\s':
121108
return optionsWhitespace;
122109
case '\\S':
123110
return [
124111
...optionsAlpha,
125-
optionsDigit,
112+
...optionsDigit,
126113
...optionsOther,
127-
optionUnderscore,
128-
...optionsExtendedAscii,
114+
...optionsExtended,
129115
];
130116
default:
131117
return [];

src/transforms/utils.ts

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { ClassRange, SimpleChar } from 'regexp-tree/ast';
1+
import { SimpleChar } from 'regexp-tree/ast';
22

33
export function createSimpleChar(value: string): SimpleChar {
44
if (value.length !== 1) throw new Error('value must be a char');
@@ -18,15 +18,3 @@ export function createEscapedSimpleChar(value: string): SimpleChar {
1818
escaped: true,
1919
};
2020
}
21-
22-
export function createSimpleChars(values: string): SimpleChar[] {
23-
return values.split('').map(createSimpleChar);
24-
}
25-
26-
export function createClassRange(from: string, to: string): ClassRange {
27-
return {
28-
from: createSimpleChar(from),
29-
to: createSimpleChar(to),
30-
type: 'ClassRange',
31-
};
32-
}

0 commit comments

Comments
 (0)