@@ -51,10 +51,21 @@ const logger = console
5151 normalizeRanges ( idContinueLarge )
5252
5353 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+
5462 let code = `${ banner }
5563
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
5869
5970export function isIdStart(cp: number): boolean {
6071 ${ makeSmallCondtion ( idStartSmall ) }
@@ -65,18 +76,18 @@ export function isIdContinue(cp: number): boolean {
6576 return isLargeIdStart(cp) || isLargeIdContinue(cp)
6677}
6778function isLargeIdStart(cp: number): boolean {
68- if (!largeIdStartPattern) {
69- largeIdStartPattern = new RegExp(${ makeLargePattern ( idStartLarge ) } , "u")
79+ if (largeIdStartPatternSymbols === null) {
80+ largeIdStartPatternSymbols = ${ setStart } ;
81+ largeIdStartPatternRanges = ${ rangesStart } ;
7082 }
71- return largeIdStartPattern.test(String.fromCodePoint(cp))
83+ return largeIdStartPatternSymbols.has(cp) || largeIdStartPatternRanges!.some(([r1, r2]) => r1 <= cp && cp <= r2);
7284}
7385function 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 } ;
7889 }
79- return largeIdContinuePattern.test(String.fromCodePoint(cp))
90+ return largeIdContinuePatternSymbols.has(cp) || largeIdContinuePatternRanges!.some(([r1, r2]) => r1 <= cp && cp <= r2);
8091}`
8192
8293 logger . log ( "Formatting code..." )
@@ -147,35 +158,24 @@ function makeSmallCondtion(ranges: [number, number][]): string {
147158 return conditions . join ( "\n" )
148159}
149160
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+
152165 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 ) } ` )
163170 } else {
164- lines [ lines . length - 1 ] += part
171+ symbolRanges . push ( `[0x ${ min . toString ( 16 ) } , 0x ${ max . toString ( 16 ) } ]` )
165172 }
166173 }
167- lines [ lines . length - 1 ] += "]$"
168- return lines . map ( line => `"${ line } "` ) . join ( "+" )
169- }
170174
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 ( ) } ]` ,
177178 }
178- return `\\u{${ cp . toString ( 16 ) } }`
179179}
180180
181181function save ( content : string ) : Promise < void > {
0 commit comments