@@ -51,10 +51,21 @@ const logger = console
51
51
normalizeRanges ( idContinueLarge )
52
52
53
53
logger . log ( "Generating code..." )
54
+ const { set : setStart , ranges : rangesStart } = makeLargePattern (
55
+ idStartLarge ,
56
+ )
57
+
58
+ const { set : setContinue , ranges : rangesContinue } = makeLargePattern (
59
+ idContinueLarge ,
60
+ )
61
+
54
62
let code = `${ banner }
55
63
56
- let largeIdStartPattern: RegExp | null = null;
57
- let largeIdContinuePattern: RegExp | null = null;
64
+ let largeIdStartPatternSymbols: Set<number> | null = null
65
+ let largeIdStartPatternRanges: [number, number][] | null = null
66
+
67
+ let largeIdContinuePatternSymbols: Set<number> | null = null
68
+ let largeIdContinuePatternRanges: [number, number][] | null = null
58
69
59
70
export function isIdStart(cp: number): boolean {
60
71
${ makeSmallCondtion ( idStartSmall ) }
@@ -65,18 +76,18 @@ export function isIdContinue(cp: number): boolean {
65
76
return isLargeIdStart(cp) || isLargeIdContinue(cp)
66
77
}
67
78
function isLargeIdStart(cp: number): boolean {
68
- if (!largeIdStartPattern) {
69
- largeIdStartPattern = new RegExp(${ makeLargePattern ( idStartLarge ) } , "u")
79
+ if (largeIdStartPatternSymbols === null) {
80
+ largeIdStartPatternSymbols = ${ setStart } ;
81
+ largeIdStartPatternRanges = ${ rangesStart } ;
70
82
}
71
- return largeIdStartPattern.test(String.fromCodePoint(cp))
83
+ return largeIdStartPatternSymbols.has(cp) || largeIdStartPatternRanges!.some(([r1, r2]) => r1 <= cp && cp <= r2);
72
84
}
73
85
function isLargeIdContinue(cp: number): boolean {
74
- if (!largeIdContinuePattern) {
75
- largeIdContinuePattern = new RegExp(${ makeLargePattern (
76
- idContinueLarge ,
77
- ) } , "u")
86
+ if (largeIdContinuePatternSymbols === null) {
87
+ largeIdContinuePatternSymbols = ${ setContinue } ;
88
+ largeIdContinuePatternRanges = ${ rangesContinue } ;
78
89
}
79
- return largeIdContinuePattern.test(String.fromCodePoint(cp))
90
+ return largeIdContinuePatternSymbols.has(cp) || largeIdContinuePatternRanges!.some(([r1, r2]) => r1 <= cp && cp <= r2);
80
91
}`
81
92
82
93
logger . log ( "Formatting code..." )
@@ -147,35 +158,24 @@ function makeSmallCondtion(ranges: [number, number][]): string {
147
158
return conditions . join ( "\n" )
148
159
}
149
160
150
- function makeLargePattern ( ranges : [ number , number ] [ ] ) : string {
151
- const lines = [ "^[" ]
161
+ function makeLargePattern ( ranges : [ number , number ] [ ] ) {
162
+ const symbols : string [ ] = [ ]
163
+ const symbolRanges : string [ ] = [ ]
164
+
152
165
for ( const [ min , max ] of ranges ) {
153
- const line = lines [ lines . length - 1 ]
154
- const part =
155
- min === max
156
- ? esc ( min )
157
- : min + 1 === max
158
- ? `${ esc ( min ) } ${ esc ( max ) } `
159
- : `${ esc ( min ) } -${ esc ( max ) } `
160
-
161
- if ( line . length + part . length > 60 ) {
162
- lines . push ( part )
166
+ if ( min === max ) {
167
+ symbols . push ( `0x${ min . toString ( 16 ) } ` )
168
+ } else if ( min + 1 === max ) {
169
+ symbols . push ( `0x${ min . toString ( 16 ) } ` , `0x${ max . toString ( 16 ) } ` )
163
170
} else {
164
- lines [ lines . length - 1 ] += part
171
+ symbolRanges . push ( `[0x ${ min . toString ( 16 ) } , 0x ${ max . toString ( 16 ) } ]` )
165
172
}
166
173
}
167
- lines [ lines . length - 1 ] += "]$"
168
- return lines . map ( line => `"${ line } "` ) . join ( "+" )
169
- }
170
174
171
- function esc ( cp : number ) : string {
172
- if ( cp <= 0xff ) {
173
- return `\\x${ cp . toString ( 16 ) . padStart ( 2 , "0" ) } `
174
- }
175
- if ( cp <= 0xffff ) {
176
- return `\\u${ cp . toString ( 16 ) . padStart ( 4 , "0" ) } `
175
+ return {
176
+ set : `new Set([${ symbols . join ( ) } ])` ,
177
+ ranges : `[${ symbolRanges . join ( ) } ]` ,
177
178
}
178
- return `\\u{${ cp . toString ( 16 ) } }`
179
179
}
180
180
181
181
function save ( content : string ) : Promise < void > {
0 commit comments