-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathcreate-unicode.ts
82 lines (55 loc) · 2.47 KB
/
create-unicode.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import * as fs from "fs";
import * as path from "path";
import { CharSet } from "../src/char-set";
import * as aliases from "../src/js/unicode/alias";
import { printRanges } from "./util";
const UNICODE_SRC_DIR = path.join(__dirname, "../src/js/unicode");
createDataFile(Object.values(aliases.Binary_Property), "Binary_Property", "binary-property-data.ts");
createDataFile(Object.values(aliases.General_Category), "General_Category", "general-category-data.ts");
createDataFile(Object.values(aliases.ScriptAndScript_Extensions), "Script", "script-data.ts");
createDataFile(Object.values(aliases.ScriptAndScript_Extensions), "Script_Extensions", "script-extensions-data.ts");
createDataStringsFile(Object.values(aliases.Binary_Property_Of_String), "properties-of-strings.ts");
function createDataFile(properties: Iterable<string>, category: string, filename: string): void {
console.log(`Creating ${filename}`);
const values = new Set(properties);
let code = `/* eslint-disable */
// DO NOT EDIT!
// THIS FILE IS GENERATED BY scripts/create-unicode.js
// Category: ${category}
// Exported ranges: ${[...values].join(", ")}
import { CharRange } from "../../char-set";
`;
for (const prop of values) {
const codePoints: number[] = require(`@unicode/unicode-15.0.0/${category}/${prop}/code-points`);
const ranges = CharSet.fromCharacters(0x10ffff, codePoints).ranges;
code += `export const ${prop}: readonly CharRange[] = ${printRanges(ranges)};\n`;
}
fs.writeFileSync(path.join(UNICODE_SRC_DIR, filename), code, "utf-8");
}
function createDataStringsFile(properties: Iterable<string>, filename: string): void {
console.log(`Creating ${filename}`);
const values = new Set(properties);
let code = `/* eslint-disable */
// DO NOT EDIT!
// THIS FILE IS GENERATED BY scripts/create-unicode.js
// Exported strings: ${[...values].join(", ")}
import { ReadonlyWord } from "../../char-types";
`;
for (const prop of values) {
const strings: string[] = require(`@unicode/unicode-15.0.0/Sequence_Property/${prop}/index.js`);
const codePoints = strings.map(s => [...s].map(c => c.codePointAt(0)!));
codePoints.sort((a, b) => {
if (a.length !== b.length) {
return a.length - b.length;
}
for (let i = 0; i < a.length; i++) {
if (a[i] !== b[i]) {
return a[i] - b[i];
}
}
return 0;
});
code += `export const ${prop}: readonly ReadonlyWord[] = JSON.parse('${JSON.stringify(codePoints)}');\n`;
}
fs.writeFileSync(path.join(UNICODE_SRC_DIR, filename), code, "utf-8");
}