Skip to content

Commit e295877

Browse files
committed
🎨 improve unicode/ids.ts
1 parent af1778f commit e295877

File tree

2 files changed

+2021
-1137
lines changed

2 files changed

+2021
-1137
lines changed

‎scripts/update-unicode-ids.ts

Lines changed: 35 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -51,43 +51,48 @@ 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-
6254
let code = `${banner}
6355
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
56+
// Each two-element represents a range.
57+
// Even indices are minimum values and odd indices are maximum values.
58+
let largeIdStartRanges: number[] | undefined = undefined
59+
let largeIdContinueRanges: number[] | undefined = undefined
6960
7061
export function isIdStart(cp: number): boolean {
71-
${makeSmallCondtion(idStartSmall)}
62+
${makeSmallCondition(idStartSmall)}
7263
return isLargeIdStart(cp)
7364
}
7465
export function isIdContinue(cp: number): boolean {
75-
${makeSmallCondtion(idContinueSmall)}
66+
${makeSmallCondition(idContinueSmall)}
7667
return isLargeIdStart(cp) || isLargeIdContinue(cp)
7768
}
7869
function isLargeIdStart(cp: number): boolean {
79-
if (largeIdStartPatternSymbols === null) {
80-
largeIdStartPatternSymbols = ${setStart};
81-
largeIdStartPatternRanges = ${rangesStart};
82-
}
83-
return largeIdStartPatternSymbols.has(cp) || largeIdStartPatternRanges!.some(([r1, r2]) => r1 <= cp && cp <= r2);
70+
return isInRange(cp, largeIdStartRanges || (largeIdStartRanges = initLargeIdStartRanges()))
8471
}
8572
function isLargeIdContinue(cp: number): boolean {
86-
if (largeIdContinuePatternSymbols === null) {
87-
largeIdContinuePatternSymbols = ${setContinue};
88-
largeIdContinuePatternRanges = ${rangesContinue};
73+
return isInRange(cp, largeIdContinueRanges || (largeIdContinueRanges = initLargeIdContinueRanges()))
74+
}
75+
function initLargeIdStartRanges(): number[] {
76+
${makeInitLargeIdRanges(idStartLarge)}
77+
}
78+
function initLargeIdContinueRanges(): number[] {
79+
${makeInitLargeIdRanges(idContinueLarge)}
80+
}
81+
function isInRange(cp: number, ranges: number[]): boolean {
82+
let l = 0, r = ranges.length / 2 | 0, i = 0, min = 0, max = 0
83+
while (l < r) {
84+
i = (l + r) / 2 | 0
85+
min = ranges[2 * i]
86+
max = ranges[2 * i + 1]
87+
if (cp < min) {
88+
r = i
89+
} else if (cp > max) {
90+
l = i + 1
91+
} else {
92+
return true
93+
}
8994
}
90-
return largeIdContinuePatternSymbols.has(cp) || largeIdContinuePatternRanges!.some(([r1, r2]) => r1 <= cp && cp <= r2);
95+
return false
9196
}`
9297

9398
logger.log("Formatting code...")
@@ -145,7 +150,7 @@ function normalizeRanges(ranges: [number, number][]): void {
145150
}
146151
}
147152

148-
function makeSmallCondtion(ranges: [number, number][]): string {
153+
function makeSmallCondition(ranges: [number, number][]): string {
149154
const conditions: string[] = []
150155
for (const [min, max] of ranges) {
151156
if (min === max) {
@@ -158,24 +163,13 @@ function makeSmallCondtion(ranges: [number, number][]): string {
158163
return conditions.join("\n")
159164
}
160165

161-
function makeLargePattern(ranges: [number, number][]) {
162-
const symbols: string[] = []
163-
const symbolRanges: string[] = []
164-
166+
function makeInitLargeIdRanges(ranges: [number, number][]): string {
167+
const lines: string[] = ["return ["]
165168
for (const [min, max] of ranges) {
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)}`)
170-
} else {
171-
symbolRanges.push(`[0x${min.toString(16)}, 0x${max.toString(16)}]`)
172-
}
173-
}
174-
175-
return {
176-
set: `new Set([${symbols.join()}])`,
177-
ranges: `[${symbolRanges.join()}]`,
169+
lines.push(`0x${min.toString(16)}, 0x${max.toString(16)},`)
178170
}
171+
lines.push("]")
172+
return lines.join("\n")
179173
}
180174

181175
function save(content: string): Promise<void> {

0 commit comments

Comments
 (0)