From 3272472ffe01f3b77e5798a3cec297ef51f029d9 Mon Sep 17 00:00:00 2001 From: ylemkimon Date: Thu, 9 Jul 2020 06:58:11 +0900 Subject: [PATCH] Use babel-plugin-preval instead of own unicodeMake for unicodeSymbols (#2153) * Use babel-plugin-preval instead of own unicodeMake for unicodeSymbols * Fix circular dependency transpiling issue * Flow type unicodeSymbols.js Co-authored-by: Erik Demaine --- .eslintrc | 2 +- babel.config.js | 1 + dockers/screenshotter/screenshotter.js | 2 +- package.json | 12 +- src/Parser.js | 7 +- src/unicodeAccents.js | 4 +- src/unicodeMake.js | 70 ----- src/unicodeSymbols.js | 351 +++---------------------- yarn.lock | 50 +++- 9 files changed, 95 insertions(+), 404 deletions(-) delete mode 100644 src/unicodeMake.js diff --git a/.eslintrc b/.eslintrc index f1cf954d..551748cf 100644 --- a/.eslintrc +++ b/.eslintrc @@ -85,7 +85,7 @@ }, "overrides": [{ "files": ["katex.js", "src/**/*.js", "contrib/**/*.js"], - "excludedFiles": ["*-spec.js", "unicodeMake.js"], + "excludedFiles": ["*-spec.js", "unicodeAccents.js", "unicodeSymbols.js"], "rules": { "no-restricted-syntax": [2, "ForOfStatement", "ClassDeclaration[superClass]", "ClassExpression[superClass]"], "transform-runtime-aliasing/no-transform-runtime-aliasing": [2, { diff --git a/babel.config.js b/babel.config.js index 3efd1c17..c4379380 100644 --- a/babel.config.js +++ b/babel.config.js @@ -18,6 +18,7 @@ module.exports = api => { loose: true, }], "version-inline", + "preval", ]; return { diff --git a/dockers/screenshotter/screenshotter.js b/dockers/screenshotter/screenshotter.js index 85a47fc5..eca9c100 100644 --- a/dockers/screenshotter/screenshotter.js +++ b/dockers/screenshotter/screenshotter.js @@ -175,7 +175,7 @@ function startServer() { options: { plugins: [['istanbul', { include: ["src/**/*.js"], - exclude: ["src/unicodeMake.js"], + exclude: ["src/unicodeSymbols.js"], }]], }, }; diff --git a/package.json b/package.json index 863bfcac..057c93bd 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "babel-jest": "^24.1.0", "babel-loader": "^8.0.5", "babel-plugin-istanbul": "^5.1.1", + "babel-plugin-preval": "^3.0.1", "babel-plugin-version-inline": "^1.0.0", "benchmark": "^2.1.4", "browserslist": "^4.7.1", @@ -75,7 +76,7 @@ }, "bin": "cli.js", "scripts": { - "test": "yarn prestart && yarn test:lint && yarn test:flow && yarn test:jest", + "test": "yarn test:lint && yarn test:flow && yarn test:jest", "test:lint": "yarn test:lint:js && yarn test:lint:css", "test:lint:js": "eslint *.js src static test contrib dockers website", "test:lint:css": "stylelint src/katex.less static/main.css contrib/**/*.css website/static/**/*.css", @@ -85,14 +86,13 @@ "test:jest:update": "jest --updateSnapshot", "test:jest:coverage": "jest --coverage", "test:screenshots": "yarn test:screenshots:update --verify", - "test:screenshots:update": "yarn prestart && dockers/screenshotter/screenshotter.sh", - "test:perf": "yarn prestart && NODE_ENV=test node test/perf-test.js", + "test:screenshots:update": "dockers/screenshotter/screenshotter.sh", + "test:perf": "NODE_ENV=test node test/perf-test.js", "clean": "rm -rf dist/ node_modules/", "clean-install": "yarn clean && yarn", - "prestart": "node src/unicodeMake.js", "start": "webpack-dev-server --hot --config webpack.dev.js", "analyze": "webpack --config webpack.analyze.js", - "build": "yarn prestart && rimraf dist/ && mkdirp dist && cp README.md dist && rollup -c && webpack", + "build": "rimraf dist/ && mkdirp dist && cp README.md dist && rollup -c && webpack", "watch": "yarn build --watch", "dist": "yarn test && yarn build && yarn dist:zip", "dist:zip": "rimraf katex/ katex.tar.gz katex.zip && cp -R dist katex && tar czf katex.tar.gz katex && zip -rq katex.zip katex && rimraf katex/" @@ -111,7 +111,7 @@ "collectCoverageFrom": [ "src/**/*.js", "contrib/**/*.js", - "!src/unicodeMake.js", + "!src/unicodeSymbols.js", "!contrib/mhchem/**" ], "setupFilesAfterEnv": [ diff --git a/src/Parser.js b/src/Parser.js index 6a3e7dce..3c05a1da 100644 --- a/src/Parser.js +++ b/src/Parser.js @@ -5,13 +5,16 @@ import MacroExpander, {implicitCommands} from "./MacroExpander"; import symbols, {ATOMS, extraLatin} from "./symbols"; import {validUnit} from "./units"; import {supportedCodepoint} from "./unicodeScripts"; -import unicodeAccents from "./unicodeAccents"; -import unicodeSymbols from "./unicodeSymbols"; import ParseError from "./ParseError"; import {combiningDiacriticalMarksEndRegex} from "./Lexer"; import Settings from "./Settings"; import SourceLocation from "./SourceLocation"; import {Token} from "./Token"; + +// Pre-evaluate both modules as unicodeSymbols require String.normalize() +import unicodeAccents from /*preval*/ "./unicodeAccents"; +import unicodeSymbols from /*preval*/ "./unicodeSymbols"; + import type {ParseNode, AnyParseNode, SymbolParseNode, UnsupportedCmdParseNode} from "./parseNode"; import type {Atom, Group} from "./symbols"; diff --git a/src/unicodeAccents.js b/src/unicodeAccents.js index 635b5117..06ff052f 100644 --- a/src/unicodeAccents.js +++ b/src/unicodeAccents.js @@ -1,6 +1,8 @@ // Mapping of Unicode accent characters to their LaTeX equivalent in text and // math mode (when they exist). -export default { +// This exports a CommonJS module, allowing to be required in unicodeSymbols +// without transpiling. +module.exports = { '\u0301': {text: "\\'", math: '\\acute'}, '\u0300': {text: '\\`', math: '\\grave'}, '\u0308': {text: '\\"', math: '\\ddot'}, diff --git a/src/unicodeMake.js b/src/unicodeMake.js deleted file mode 100644 index bf80bb35..00000000 --- a/src/unicodeMake.js +++ /dev/null @@ -1,70 +0,0 @@ -/* eslint no-console:0 */ - -// This is an internal Node tool, not part of the KaTeX distribution, -// whose purpose is to generate unicodeSymbols.js in this directory. -// In this way, only this tool, and not the distribution/browser, -// needs String's normalize function. -const path = require('path'); -const fs = require('fs'); - -const target = path.join(__dirname, 'unicodeSymbols.js'); -const targetMtime = fs.statSync(target).mtime; -if (fs.statSync(__filename).mtime <= targetMtime && fs.statSync( - path.join(__dirname, 'unicodeAccents.js')).mtime <= targetMtime) { - process.exit(0); -} - -require('@babel/register'); -const accents = require('./unicodeAccents').default; - -const encode = function(string) { - let output = '"'; - for (let i = 0; i < string.length; i++) { - let hex = string.charCodeAt(i).toString(16); - while (hex.length < 4) { - hex = `0${hex}`; - } - output += `\\u${hex}`; - } - output = `${output}"`; - return output; -}; - -let unicodeSymbols = -`// @flow -// This file is GENERATED by unicodeMake.js. DO NOT MODIFY. - -export default { -`; - -const letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + - "αβγδεϵζηθϑικλμνξοπϖρϱςστυφϕχψωΓΔΘΛΞΠΣΥΦΨΩ"; -for (const letter of letters) { - for (const accent of Object.getOwnPropertyNames(accents)) { - const combined = letter + accent; - const normalized = combined.normalize('NFC'); - if (normalized.length === 1) { - unicodeSymbols += - ` ${encode(normalized)}: ${encode(combined)},` - + ` // ${normalized} = ${accents[accent].text}{${letter}}\n`; - } - for (const accent2 of Object.getOwnPropertyNames(accents)) { - if (accent === accent2) { - continue; - } - const combined2 = combined + accent2; - const normalized2 = combined2.normalize('NFC'); - if (normalized2.length === 1) { - unicodeSymbols += - ` ${encode(normalized2)}: ${encode(combined2)},` - + ` // ${normalized2} = ${accents[accent].text}` - + `${accents[accent2].text}{${letter}}\n`; - } - } - } -} - -unicodeSymbols += `}; -`; - -fs.writeFileSync(target, unicodeSymbols); diff --git a/src/unicodeSymbols.js b/src/unicodeSymbols.js index 846ca73b..dcaf3d9e 100644 --- a/src/unicodeSymbols.js +++ b/src/unicodeSymbols.js @@ -1,323 +1,32 @@ // @flow -// This file is GENERATED by unicodeMake.js. DO NOT MODIFY. +// This is an internal module, not part of the KaTeX distribution, +// whose purpose is to generate `unicodeSymbols` in Parser.js +// In this way, only this module, and not the distribution/browser, +// needs String's normalize function. As this file is not transpiled, +// Flow comment types syntax is used. +const accents = require('./unicodeAccents'); -export default { - "\u00e1": "\u0061\u0301", // á = \'{a} - "\u00e0": "\u0061\u0300", // à = \`{a} - "\u00e4": "\u0061\u0308", // ä = \"{a} - "\u01df": "\u0061\u0308\u0304", // ǟ = \"\={a} - "\u00e3": "\u0061\u0303", // ã = \~{a} - "\u0101": "\u0061\u0304", // ā = \={a} - "\u0103": "\u0061\u0306", // ă = \u{a} - "\u1eaf": "\u0061\u0306\u0301", // ắ = \u\'{a} - "\u1eb1": "\u0061\u0306\u0300", // ằ = \u\`{a} - "\u1eb5": "\u0061\u0306\u0303", // ẵ = \u\~{a} - "\u01ce": "\u0061\u030c", // ǎ = \v{a} - "\u00e2": "\u0061\u0302", // â = \^{a} - "\u1ea5": "\u0061\u0302\u0301", // ấ = \^\'{a} - "\u1ea7": "\u0061\u0302\u0300", // ầ = \^\`{a} - "\u1eab": "\u0061\u0302\u0303", // ẫ = \^\~{a} - "\u0227": "\u0061\u0307", // ȧ = \.{a} - "\u01e1": "\u0061\u0307\u0304", // ǡ = \.\={a} - "\u00e5": "\u0061\u030a", // å = \r{a} - "\u01fb": "\u0061\u030a\u0301", // ǻ = \r\'{a} - "\u1e03": "\u0062\u0307", // ḃ = \.{b} - "\u0107": "\u0063\u0301", // ć = \'{c} - "\u010d": "\u0063\u030c", // č = \v{c} - "\u0109": "\u0063\u0302", // ĉ = \^{c} - "\u010b": "\u0063\u0307", // ċ = \.{c} - "\u010f": "\u0064\u030c", // ď = \v{d} - "\u1e0b": "\u0064\u0307", // ḋ = \.{d} - "\u00e9": "\u0065\u0301", // é = \'{e} - "\u00e8": "\u0065\u0300", // è = \`{e} - "\u00eb": "\u0065\u0308", // ë = \"{e} - "\u1ebd": "\u0065\u0303", // ẽ = \~{e} - "\u0113": "\u0065\u0304", // ē = \={e} - "\u1e17": "\u0065\u0304\u0301", // ḗ = \=\'{e} - "\u1e15": "\u0065\u0304\u0300", // ḕ = \=\`{e} - "\u0115": "\u0065\u0306", // ĕ = \u{e} - "\u011b": "\u0065\u030c", // ě = \v{e} - "\u00ea": "\u0065\u0302", // ê = \^{e} - "\u1ebf": "\u0065\u0302\u0301", // ế = \^\'{e} - "\u1ec1": "\u0065\u0302\u0300", // ề = \^\`{e} - "\u1ec5": "\u0065\u0302\u0303", // ễ = \^\~{e} - "\u0117": "\u0065\u0307", // ė = \.{e} - "\u1e1f": "\u0066\u0307", // ḟ = \.{f} - "\u01f5": "\u0067\u0301", // ǵ = \'{g} - "\u1e21": "\u0067\u0304", // ḡ = \={g} - "\u011f": "\u0067\u0306", // ğ = \u{g} - "\u01e7": "\u0067\u030c", // ǧ = \v{g} - "\u011d": "\u0067\u0302", // ĝ = \^{g} - "\u0121": "\u0067\u0307", // ġ = \.{g} - "\u1e27": "\u0068\u0308", // ḧ = \"{h} - "\u021f": "\u0068\u030c", // ȟ = \v{h} - "\u0125": "\u0068\u0302", // ĥ = \^{h} - "\u1e23": "\u0068\u0307", // ḣ = \.{h} - "\u00ed": "\u0069\u0301", // í = \'{i} - "\u00ec": "\u0069\u0300", // ì = \`{i} - "\u00ef": "\u0069\u0308", // ï = \"{i} - "\u1e2f": "\u0069\u0308\u0301", // ḯ = \"\'{i} - "\u0129": "\u0069\u0303", // ĩ = \~{i} - "\u012b": "\u0069\u0304", // ī = \={i} - "\u012d": "\u0069\u0306", // ĭ = \u{i} - "\u01d0": "\u0069\u030c", // ǐ = \v{i} - "\u00ee": "\u0069\u0302", // î = \^{i} - "\u01f0": "\u006a\u030c", // ǰ = \v{j} - "\u0135": "\u006a\u0302", // ĵ = \^{j} - "\u1e31": "\u006b\u0301", // ḱ = \'{k} - "\u01e9": "\u006b\u030c", // ǩ = \v{k} - "\u013a": "\u006c\u0301", // ĺ = \'{l} - "\u013e": "\u006c\u030c", // ľ = \v{l} - "\u1e3f": "\u006d\u0301", // ḿ = \'{m} - "\u1e41": "\u006d\u0307", // ṁ = \.{m} - "\u0144": "\u006e\u0301", // ń = \'{n} - "\u01f9": "\u006e\u0300", // ǹ = \`{n} - "\u00f1": "\u006e\u0303", // ñ = \~{n} - "\u0148": "\u006e\u030c", // ň = \v{n} - "\u1e45": "\u006e\u0307", // ṅ = \.{n} - "\u00f3": "\u006f\u0301", // ó = \'{o} - "\u00f2": "\u006f\u0300", // ò = \`{o} - "\u00f6": "\u006f\u0308", // ö = \"{o} - "\u022b": "\u006f\u0308\u0304", // ȫ = \"\={o} - "\u00f5": "\u006f\u0303", // õ = \~{o} - "\u1e4d": "\u006f\u0303\u0301", // ṍ = \~\'{o} - "\u1e4f": "\u006f\u0303\u0308", // ṏ = \~\"{o} - "\u022d": "\u006f\u0303\u0304", // ȭ = \~\={o} - "\u014d": "\u006f\u0304", // ō = \={o} - "\u1e53": "\u006f\u0304\u0301", // ṓ = \=\'{o} - "\u1e51": "\u006f\u0304\u0300", // ṑ = \=\`{o} - "\u014f": "\u006f\u0306", // ŏ = \u{o} - "\u01d2": "\u006f\u030c", // ǒ = \v{o} - "\u00f4": "\u006f\u0302", // ô = \^{o} - "\u1ed1": "\u006f\u0302\u0301", // ố = \^\'{o} - "\u1ed3": "\u006f\u0302\u0300", // ồ = \^\`{o} - "\u1ed7": "\u006f\u0302\u0303", // ỗ = \^\~{o} - "\u022f": "\u006f\u0307", // ȯ = \.{o} - "\u0231": "\u006f\u0307\u0304", // ȱ = \.\={o} - "\u0151": "\u006f\u030b", // ő = \H{o} - "\u1e55": "\u0070\u0301", // ṕ = \'{p} - "\u1e57": "\u0070\u0307", // ṗ = \.{p} - "\u0155": "\u0072\u0301", // ŕ = \'{r} - "\u0159": "\u0072\u030c", // ř = \v{r} - "\u1e59": "\u0072\u0307", // ṙ = \.{r} - "\u015b": "\u0073\u0301", // ś = \'{s} - "\u1e65": "\u0073\u0301\u0307", // ṥ = \'\.{s} - "\u0161": "\u0073\u030c", // š = \v{s} - "\u1e67": "\u0073\u030c\u0307", // ṧ = \v\.{s} - "\u015d": "\u0073\u0302", // ŝ = \^{s} - "\u1e61": "\u0073\u0307", // ṡ = \.{s} - "\u1e97": "\u0074\u0308", // ẗ = \"{t} - "\u0165": "\u0074\u030c", // ť = \v{t} - "\u1e6b": "\u0074\u0307", // ṫ = \.{t} - "\u00fa": "\u0075\u0301", // ú = \'{u} - "\u00f9": "\u0075\u0300", // ù = \`{u} - "\u00fc": "\u0075\u0308", // ü = \"{u} - "\u01d8": "\u0075\u0308\u0301", // ǘ = \"\'{u} - "\u01dc": "\u0075\u0308\u0300", // ǜ = \"\`{u} - "\u01d6": "\u0075\u0308\u0304", // ǖ = \"\={u} - "\u01da": "\u0075\u0308\u030c", // ǚ = \"\v{u} - "\u0169": "\u0075\u0303", // ũ = \~{u} - "\u1e79": "\u0075\u0303\u0301", // ṹ = \~\'{u} - "\u016b": "\u0075\u0304", // ū = \={u} - "\u1e7b": "\u0075\u0304\u0308", // ṻ = \=\"{u} - "\u016d": "\u0075\u0306", // ŭ = \u{u} - "\u01d4": "\u0075\u030c", // ǔ = \v{u} - "\u00fb": "\u0075\u0302", // û = \^{u} - "\u016f": "\u0075\u030a", // ů = \r{u} - "\u0171": "\u0075\u030b", // ű = \H{u} - "\u1e7d": "\u0076\u0303", // ṽ = \~{v} - "\u1e83": "\u0077\u0301", // ẃ = \'{w} - "\u1e81": "\u0077\u0300", // ẁ = \`{w} - "\u1e85": "\u0077\u0308", // ẅ = \"{w} - "\u0175": "\u0077\u0302", // ŵ = \^{w} - "\u1e87": "\u0077\u0307", // ẇ = \.{w} - "\u1e98": "\u0077\u030a", // ẘ = \r{w} - "\u1e8d": "\u0078\u0308", // ẍ = \"{x} - "\u1e8b": "\u0078\u0307", // ẋ = \.{x} - "\u00fd": "\u0079\u0301", // ý = \'{y} - "\u1ef3": "\u0079\u0300", // ỳ = \`{y} - "\u00ff": "\u0079\u0308", // ÿ = \"{y} - "\u1ef9": "\u0079\u0303", // ỹ = \~{y} - "\u0233": "\u0079\u0304", // ȳ = \={y} - "\u0177": "\u0079\u0302", // ŷ = \^{y} - "\u1e8f": "\u0079\u0307", // ẏ = \.{y} - "\u1e99": "\u0079\u030a", // ẙ = \r{y} - "\u017a": "\u007a\u0301", // ź = \'{z} - "\u017e": "\u007a\u030c", // ž = \v{z} - "\u1e91": "\u007a\u0302", // ẑ = \^{z} - "\u017c": "\u007a\u0307", // ż = \.{z} - "\u00c1": "\u0041\u0301", // Á = \'{A} - "\u00c0": "\u0041\u0300", // À = \`{A} - "\u00c4": "\u0041\u0308", // Ä = \"{A} - "\u01de": "\u0041\u0308\u0304", // Ǟ = \"\={A} - "\u00c3": "\u0041\u0303", // Ã = \~{A} - "\u0100": "\u0041\u0304", // Ā = \={A} - "\u0102": "\u0041\u0306", // Ă = \u{A} - "\u1eae": "\u0041\u0306\u0301", // Ắ = \u\'{A} - "\u1eb0": "\u0041\u0306\u0300", // Ằ = \u\`{A} - "\u1eb4": "\u0041\u0306\u0303", // Ẵ = \u\~{A} - "\u01cd": "\u0041\u030c", // Ǎ = \v{A} - "\u00c2": "\u0041\u0302", // Â = \^{A} - "\u1ea4": "\u0041\u0302\u0301", // Ấ = \^\'{A} - "\u1ea6": "\u0041\u0302\u0300", // Ầ = \^\`{A} - "\u1eaa": "\u0041\u0302\u0303", // Ẫ = \^\~{A} - "\u0226": "\u0041\u0307", // Ȧ = \.{A} - "\u01e0": "\u0041\u0307\u0304", // Ǡ = \.\={A} - "\u00c5": "\u0041\u030a", // Å = \r{A} - "\u01fa": "\u0041\u030a\u0301", // Ǻ = \r\'{A} - "\u1e02": "\u0042\u0307", // Ḃ = \.{B} - "\u0106": "\u0043\u0301", // Ć = \'{C} - "\u010c": "\u0043\u030c", // Č = \v{C} - "\u0108": "\u0043\u0302", // Ĉ = \^{C} - "\u010a": "\u0043\u0307", // Ċ = \.{C} - "\u010e": "\u0044\u030c", // Ď = \v{D} - "\u1e0a": "\u0044\u0307", // Ḋ = \.{D} - "\u00c9": "\u0045\u0301", // É = \'{E} - "\u00c8": "\u0045\u0300", // È = \`{E} - "\u00cb": "\u0045\u0308", // Ë = \"{E} - "\u1ebc": "\u0045\u0303", // Ẽ = \~{E} - "\u0112": "\u0045\u0304", // Ē = \={E} - "\u1e16": "\u0045\u0304\u0301", // Ḗ = \=\'{E} - "\u1e14": "\u0045\u0304\u0300", // Ḕ = \=\`{E} - "\u0114": "\u0045\u0306", // Ĕ = \u{E} - "\u011a": "\u0045\u030c", // Ě = \v{E} - "\u00ca": "\u0045\u0302", // Ê = \^{E} - "\u1ebe": "\u0045\u0302\u0301", // Ế = \^\'{E} - "\u1ec0": "\u0045\u0302\u0300", // Ề = \^\`{E} - "\u1ec4": "\u0045\u0302\u0303", // Ễ = \^\~{E} - "\u0116": "\u0045\u0307", // Ė = \.{E} - "\u1e1e": "\u0046\u0307", // Ḟ = \.{F} - "\u01f4": "\u0047\u0301", // Ǵ = \'{G} - "\u1e20": "\u0047\u0304", // Ḡ = \={G} - "\u011e": "\u0047\u0306", // Ğ = \u{G} - "\u01e6": "\u0047\u030c", // Ǧ = \v{G} - "\u011c": "\u0047\u0302", // Ĝ = \^{G} - "\u0120": "\u0047\u0307", // Ġ = \.{G} - "\u1e26": "\u0048\u0308", // Ḧ = \"{H} - "\u021e": "\u0048\u030c", // Ȟ = \v{H} - "\u0124": "\u0048\u0302", // Ĥ = \^{H} - "\u1e22": "\u0048\u0307", // Ḣ = \.{H} - "\u00cd": "\u0049\u0301", // Í = \'{I} - "\u00cc": "\u0049\u0300", // Ì = \`{I} - "\u00cf": "\u0049\u0308", // Ï = \"{I} - "\u1e2e": "\u0049\u0308\u0301", // Ḯ = \"\'{I} - "\u0128": "\u0049\u0303", // Ĩ = \~{I} - "\u012a": "\u0049\u0304", // Ī = \={I} - "\u012c": "\u0049\u0306", // Ĭ = \u{I} - "\u01cf": "\u0049\u030c", // Ǐ = \v{I} - "\u00ce": "\u0049\u0302", // Î = \^{I} - "\u0130": "\u0049\u0307", // İ = \.{I} - "\u0134": "\u004a\u0302", // Ĵ = \^{J} - "\u1e30": "\u004b\u0301", // Ḱ = \'{K} - "\u01e8": "\u004b\u030c", // Ǩ = \v{K} - "\u0139": "\u004c\u0301", // Ĺ = \'{L} - "\u013d": "\u004c\u030c", // Ľ = \v{L} - "\u1e3e": "\u004d\u0301", // Ḿ = \'{M} - "\u1e40": "\u004d\u0307", // Ṁ = \.{M} - "\u0143": "\u004e\u0301", // Ń = \'{N} - "\u01f8": "\u004e\u0300", // Ǹ = \`{N} - "\u00d1": "\u004e\u0303", // Ñ = \~{N} - "\u0147": "\u004e\u030c", // Ň = \v{N} - "\u1e44": "\u004e\u0307", // Ṅ = \.{N} - "\u00d3": "\u004f\u0301", // Ó = \'{O} - "\u00d2": "\u004f\u0300", // Ò = \`{O} - "\u00d6": "\u004f\u0308", // Ö = \"{O} - "\u022a": "\u004f\u0308\u0304", // Ȫ = \"\={O} - "\u00d5": "\u004f\u0303", // Õ = \~{O} - "\u1e4c": "\u004f\u0303\u0301", // Ṍ = \~\'{O} - "\u1e4e": "\u004f\u0303\u0308", // Ṏ = \~\"{O} - "\u022c": "\u004f\u0303\u0304", // Ȭ = \~\={O} - "\u014c": "\u004f\u0304", // Ō = \={O} - "\u1e52": "\u004f\u0304\u0301", // Ṓ = \=\'{O} - "\u1e50": "\u004f\u0304\u0300", // Ṑ = \=\`{O} - "\u014e": "\u004f\u0306", // Ŏ = \u{O} - "\u01d1": "\u004f\u030c", // Ǒ = \v{O} - "\u00d4": "\u004f\u0302", // Ô = \^{O} - "\u1ed0": "\u004f\u0302\u0301", // Ố = \^\'{O} - "\u1ed2": "\u004f\u0302\u0300", // Ồ = \^\`{O} - "\u1ed6": "\u004f\u0302\u0303", // Ỗ = \^\~{O} - "\u022e": "\u004f\u0307", // Ȯ = \.{O} - "\u0230": "\u004f\u0307\u0304", // Ȱ = \.\={O} - "\u0150": "\u004f\u030b", // Ő = \H{O} - "\u1e54": "\u0050\u0301", // Ṕ = \'{P} - "\u1e56": "\u0050\u0307", // Ṗ = \.{P} - "\u0154": "\u0052\u0301", // Ŕ = \'{R} - "\u0158": "\u0052\u030c", // Ř = \v{R} - "\u1e58": "\u0052\u0307", // Ṙ = \.{R} - "\u015a": "\u0053\u0301", // Ś = \'{S} - "\u1e64": "\u0053\u0301\u0307", // Ṥ = \'\.{S} - "\u0160": "\u0053\u030c", // Š = \v{S} - "\u1e66": "\u0053\u030c\u0307", // Ṧ = \v\.{S} - "\u015c": "\u0053\u0302", // Ŝ = \^{S} - "\u1e60": "\u0053\u0307", // Ṡ = \.{S} - "\u0164": "\u0054\u030c", // Ť = \v{T} - "\u1e6a": "\u0054\u0307", // Ṫ = \.{T} - "\u00da": "\u0055\u0301", // Ú = \'{U} - "\u00d9": "\u0055\u0300", // Ù = \`{U} - "\u00dc": "\u0055\u0308", // Ü = \"{U} - "\u01d7": "\u0055\u0308\u0301", // Ǘ = \"\'{U} - "\u01db": "\u0055\u0308\u0300", // Ǜ = \"\`{U} - "\u01d5": "\u0055\u0308\u0304", // Ǖ = \"\={U} - "\u01d9": "\u0055\u0308\u030c", // Ǚ = \"\v{U} - "\u0168": "\u0055\u0303", // Ũ = \~{U} - "\u1e78": "\u0055\u0303\u0301", // Ṹ = \~\'{U} - "\u016a": "\u0055\u0304", // Ū = \={U} - "\u1e7a": "\u0055\u0304\u0308", // Ṻ = \=\"{U} - "\u016c": "\u0055\u0306", // Ŭ = \u{U} - "\u01d3": "\u0055\u030c", // Ǔ = \v{U} - "\u00db": "\u0055\u0302", // Û = \^{U} - "\u016e": "\u0055\u030a", // Ů = \r{U} - "\u0170": "\u0055\u030b", // Ű = \H{U} - "\u1e7c": "\u0056\u0303", // Ṽ = \~{V} - "\u1e82": "\u0057\u0301", // Ẃ = \'{W} - "\u1e80": "\u0057\u0300", // Ẁ = \`{W} - "\u1e84": "\u0057\u0308", // Ẅ = \"{W} - "\u0174": "\u0057\u0302", // Ŵ = \^{W} - "\u1e86": "\u0057\u0307", // Ẇ = \.{W} - "\u1e8c": "\u0058\u0308", // Ẍ = \"{X} - "\u1e8a": "\u0058\u0307", // Ẋ = \.{X} - "\u00dd": "\u0059\u0301", // Ý = \'{Y} - "\u1ef2": "\u0059\u0300", // Ỳ = \`{Y} - "\u0178": "\u0059\u0308", // Ÿ = \"{Y} - "\u1ef8": "\u0059\u0303", // Ỹ = \~{Y} - "\u0232": "\u0059\u0304", // Ȳ = \={Y} - "\u0176": "\u0059\u0302", // Ŷ = \^{Y} - "\u1e8e": "\u0059\u0307", // Ẏ = \.{Y} - "\u0179": "\u005a\u0301", // Ź = \'{Z} - "\u017d": "\u005a\u030c", // Ž = \v{Z} - "\u1e90": "\u005a\u0302", // Ẑ = \^{Z} - "\u017b": "\u005a\u0307", // Ż = \.{Z} - "\u03ac": "\u03b1\u0301", // ά = \'{α} - "\u1f70": "\u03b1\u0300", // ὰ = \`{α} - "\u1fb1": "\u03b1\u0304", // ᾱ = \={α} - "\u1fb0": "\u03b1\u0306", // ᾰ = \u{α} - "\u03ad": "\u03b5\u0301", // έ = \'{ε} - "\u1f72": "\u03b5\u0300", // ὲ = \`{ε} - "\u03ae": "\u03b7\u0301", // ή = \'{η} - "\u1f74": "\u03b7\u0300", // ὴ = \`{η} - "\u03af": "\u03b9\u0301", // ί = \'{ι} - "\u1f76": "\u03b9\u0300", // ὶ = \`{ι} - "\u03ca": "\u03b9\u0308", // ϊ = \"{ι} - "\u0390": "\u03b9\u0308\u0301", // ΐ = \"\'{ι} - "\u1fd2": "\u03b9\u0308\u0300", // ῒ = \"\`{ι} - "\u1fd1": "\u03b9\u0304", // ῑ = \={ι} - "\u1fd0": "\u03b9\u0306", // ῐ = \u{ι} - "\u03cc": "\u03bf\u0301", // ό = \'{ο} - "\u1f78": "\u03bf\u0300", // ὸ = \`{ο} - "\u03cd": "\u03c5\u0301", // ύ = \'{υ} - "\u1f7a": "\u03c5\u0300", // ὺ = \`{υ} - "\u03cb": "\u03c5\u0308", // ϋ = \"{υ} - "\u03b0": "\u03c5\u0308\u0301", // ΰ = \"\'{υ} - "\u1fe2": "\u03c5\u0308\u0300", // ῢ = \"\`{υ} - "\u1fe1": "\u03c5\u0304", // ῡ = \={υ} - "\u1fe0": "\u03c5\u0306", // ῠ = \u{υ} - "\u03ce": "\u03c9\u0301", // ώ = \'{ω} - "\u1f7c": "\u03c9\u0300", // ὼ = \`{ω} - "\u038e": "\u03a5\u0301", // Ύ = \'{Υ} - "\u1fea": "\u03a5\u0300", // Ὺ = \`{Υ} - "\u03ab": "\u03a5\u0308", // Ϋ = \"{Υ} - "\u1fe9": "\u03a5\u0304", // Ῡ = \={Υ} - "\u1fe8": "\u03a5\u0306", // Ῠ = \u{Υ} - "\u038f": "\u03a9\u0301", // Ώ = \'{Ω} - "\u1ffa": "\u03a9\u0300", // Ὼ = \`{Ω} -}; +const result /*: {[string]: string}*/ = {}; +const letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + + "αβγδεϵζηθϑικλμνξοπϖρϱςστυφϕχψωΓΔΘΛΞΠΣΥΦΨΩ"; +for (const letter of letters) { + for (const accent of Object.getOwnPropertyNames(accents)) { + const combined = letter + accent; + const normalized = combined.normalize('NFC'); + if (normalized.length === 1) { + result[normalized] = combined; + } + for (const accent2 of Object.getOwnPropertyNames(accents)) { + if (accent === accent2) { + continue; + } + const combined2 = combined + accent2; + const normalized2 = combined2.normalize('NFC'); + if (normalized2.length === 1) { + result[normalized2] = combined2; + } + } + } +} + +module.exports = result; diff --git a/yarn.lock b/yarn.lock index 1a1ce8e8..3a8f295c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -654,6 +654,13 @@ dependencies: regenerator-runtime "^0.12.0" +"@babel/runtime@^7.4.2": + version "7.7.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.7.2.tgz#111a78002a5c25fc8e3361bedc9529c696b85a6a" + integrity sha512-JONRbXbTXc9WQE2mAZd1p0Z3DZ/6vaQIkgYMSTP3KjRCyd7rCZCcfhCyX+YjwcKxcZ82UrxbRD358bpExNgrjw== + dependencies: + regenerator-runtime "^0.13.2" + "@babel/template@^7.1.0", "@babel/template@^7.1.2", "@babel/template@^7.2.2": version "7.2.2" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.2.2.tgz#005b3fdf0ed96e88041330379e0da9a708eb2907" @@ -1316,6 +1323,23 @@ babel-plugin-jest-hoist@^24.1.0: resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.1.0.tgz#dfecc491fb15e2668abbd690a697a8fd1411a7f8" integrity sha512-gljYrZz8w1b6fJzKcsfKsipSru2DU2DmQ39aB6nV3xQ0DDv3zpIzKGortA5gknrhNnPN8DweaEgrnZdmbGmhnw== +babel-plugin-macros@^2.2.2: + version "2.6.1" + resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.6.1.tgz#41f7ead616fc36f6a93180e89697f69f51671181" + integrity sha512-6W2nwiXme6j1n2erPOnmRiWfObUhWH7Qw1LMi9XZy8cj+KtESu3T6asZvtk5bMQQjX8te35o7CFueiSdL/2NmQ== + dependencies: + "@babel/runtime" "^7.4.2" + cosmiconfig "^5.2.0" + resolve "^1.10.0" + +babel-plugin-preval@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/babel-plugin-preval/-/babel-plugin-preval-3.0.1.tgz#a26f9690114a864a54a5cbdf865496ebf541a9c3" + integrity sha512-s8hmTlRSmzcL7cHSIi0s6WxmpOAxfIlWqSVQwBIt7V5bNBaac+8JMZ6kJXLOazMJ8gCIcb5AJgQUgPHvbSYUzw== + dependencies: + babel-plugin-macros "^2.2.2" + require-from-string "^2.0.2" + babel-plugin-version-inline@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/babel-plugin-version-inline/-/babel-plugin-version-inline-1.0.0.tgz#b99b6f925db4a4c6789eb08836e66d128dd5993f" @@ -2094,6 +2118,16 @@ cosmiconfig@^5.0.0, cosmiconfig@^5.0.7: lodash.get "^4.4.2" parse-json "^4.0.0" +cosmiconfig@^5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" + create-ecdh@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" @@ -4839,7 +4873,7 @@ js-levenshtein@^1.1.3: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@3.13.1, js-yaml@^3.12.0, js-yaml@^3.12.1, js-yaml@^3.13.0, js-yaml@^3.9.0: +js-yaml@3.13.1, js-yaml@^3.12.0, js-yaml@^3.12.1, js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.9.0: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== @@ -7020,6 +7054,11 @@ regenerator-runtime@^0.12.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg== +regenerator-runtime@^0.13.2: + version "0.13.3" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5" + integrity sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw== + regenerator-transform@^0.13.3: version "0.13.3" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.13.3.tgz#264bd9ff38a8ce24b06e0636496b2c856b57bcbb" @@ -7186,7 +7225,7 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= -require-from-string@^2.0.1: +require-from-string@^2.0.1, require-from-string@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== @@ -7241,6 +7280,13 @@ resolve@1.1.7: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= +resolve@^1.10.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6" + integrity sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w== + dependencies: + path-parse "^1.0.6" + resolve@^1.3.2, resolve@^1.8.1, resolve@^1.9.0: version "1.10.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba"