UNPKG

tafic

Version:

To ASCII First Impression Converter - normalizes text to closest first impression of reader based on ASCII set.

1 lines 28.7 kB
{"version":3,"sources":["../src/index.ts","../src/tools/HardCodedMap/index.ts","../src/tools/ZeroWidthRegExp.ts"],"sourcesContent":["import { graphemeSegments } from 'unicode-segmenter/grapheme';\r\nimport Homoglypher from \"homoglypher\";\r\nimport EmojiRegexFactory from 'emoji-regex';\r\n\r\nimport HardCodedMap from \"./tools/HardCodedMap/index.js\";\r\nimport ZeroWidthRegExp from \"./tools/ZeroWidthRegExp.js\";\r\n\r\n//\r\n\r\nexport interface Options {\r\n skipHardcodedMapping?: boolean;\r\n\r\n removeLeftovers?: boolean;\r\n onLeftovers?: ((nonASCII: string) => void) | null;\r\n}\r\n\r\nexport { TAFIC };\r\n\r\n//\r\n\r\nconst DefaultOptions: Required<Options> = {\r\n skipHardcodedMapping: false,\r\n\r\n removeLeftovers: true,\r\n onLeftovers: null,\r\n};\r\n\r\n//\r\n\r\nexport default class TAFIC {\r\n private static readonly Homoglypher = new Homoglypher();\r\n private static readonly EmojiRegex = EmojiRegexFactory();\r\n\r\n private static readonly RegExp_ALL_ASCII_IN_STR = /[\\x00-\\x7F]+/g;\r\n private static readonly RegExp_ALL_NONASCII_IN_STR = /[^\\x00-\\x7F]+/g;\r\n private static readonly RegExp_ACCENTS = /\\p{Mn}/gu;\r\n\r\n //\r\n\r\n static Normalize(str: string, o?: Options): string {\r\n const skipHardcodedMapping = o?.skipHardcodedMapping ?? DefaultOptions.skipHardcodedMapping;\r\n const removeLeftovers = o?.removeLeftovers ?? DefaultOptions.removeLeftovers;\r\n\r\n //\r\n\r\n str = this.SeparateAndRemoveDiacriticsForHCMapping(str);\r\n\r\n //\r\n\r\n let graphemes = this.GetGraphemes(str);\r\n\r\n //\r\n\r\n if (!skipHardcodedMapping)\r\n graphemes = this.ApplyHardcodedMapRules(graphemes)\r\n\r\n //\r\n\r\n graphemes = this.RemoveZeroWidthCharacters(graphemes);\r\n str = graphemes.join(\"\");\r\n\r\n //\r\n\r\n str = this.ApplyBuiltinCompatibilities(str);\r\n\r\n //\r\n\r\n str = this.Homoglypher.normalize(str, { skipCustom: true });\r\n\r\n //\r\n\r\n if (o?.onLeftovers) {\r\n this.RegExp_ALL_ASCII_IN_STR.lastIndex = 0;\r\n const nonASCII = str.replace(this.RegExp_ALL_ASCII_IN_STR, '');\r\n\r\n if (nonASCII.length > 0)\r\n o.onLeftovers(nonASCII);\r\n }\r\n\r\n //\r\n\r\n const result = (removeLeftovers ? this.RemoveNonASCII(str) : str).trim();\r\n\r\n //\r\n\r\n return result;\r\n }\r\n\r\n //\r\n\r\n private static GetGraphemes(str: string): string[] {\r\n const segments = graphemeSegments(str);\r\n\r\n const result: string[] = [];\r\n\r\n for (const s of segments)\r\n result.push(s.segment);\r\n\r\n return result;\r\n }\r\n\r\n private static IsGraphemeOnlyASCII(grapheme: string): boolean {\r\n this.RegExp_ALL_NONASCII_IN_STR.lastIndex = 0;\r\n return !this.RegExp_ALL_NONASCII_IN_STR.test(grapheme);\r\n }\r\n\r\n private static IsStringOnlyEmoji(str: string): boolean {\r\n const matches = str.match(this.EmojiRegex);\r\n return matches !== null && matches.join('') === str;\r\n }\r\n\r\n //\r\n\r\n private static SeparateAndRemoveDiacriticsForHCMapping(str: string) {\r\n str = str.normalize(\"NFD\"); // Separate various diacritics for easier hcmap mapping\r\n\r\n this.RegExp_ACCENTS.lastIndex = 0;\r\n return str.replace(this.RegExp_ACCENTS, ''); // removing them\r\n }\r\n\r\n private static ApplyHardcodedMapRules(graphemes: string[]) {\r\n const hcmapMappedGlyphs = (\r\n graphemes.map(g => {\r\n return HardCodedMap.get(g) ?? g\r\n })\r\n );\r\n\r\n return hcmapMappedGlyphs;\r\n }\r\n\r\n private static RemoveZeroWidthCharacters(graphemes: string[]) {\r\n return graphemes.map(g => {\r\n if (this.IsGraphemeOnlyASCII(g) || this.IsStringOnlyEmoji(g))\r\n return g;\r\n\r\n return g.replace(ZeroWidthRegExp, '');\r\n });\r\n }\r\n\r\n private static ApplyBuiltinCompatibilities(str: string): string {\r\n return str.normalize('NFKC');\r\n }\r\n\r\n private static RemoveNonASCII(str: string): string {\r\n this.RegExp_ALL_NONASCII_IN_STR.lastIndex = 0;\r\n return str.replace(this.RegExp_ALL_NONASCII_IN_STR, '');\r\n }\r\n}","export interface HardCodedUnit {\r\n replacement: string;\r\n similarities: string[]\r\n}\r\n\r\n//\r\n\r\n// usage example: {replacement: \"a\", similarities: [\"à\", \"á\", \"â\", \"ä\", \"ã\", \"å\", \"ā\", \"ą\", \"æ\"]},\r\nexport const HardCoded: HardCodedUnit[] = [\r\n {\"replacement\":\"_\",\"similarities\":[\"˷\",\"˽\",\"\"]},\r\n {\"replacement\":\"-\",\"similarities\":[\"\",\"\",\"¬\",\"֊\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\", \"\"]},\r\n {\"replacement\":\";\",\"similarities\":[\"\"]},\r\n {\"replacement\":\":\",\"similarities\":[\"\",\"\",\"\",\"\",\"\"]},\r\n {\"replacement\":\"!\",\"similarities\":[\"\",\"❗️\",\"\",\"\"]},\r\n {\"replacement\":\"?\",\"similarities\":[\"¿\",\"؟\"]},\r\n {\"replacement\":\".\",\"similarities\":[\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"·\",\"ˑ\",\"˯\",\"˳\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\"]},\r\n {\"replacement\":\",\",\"similarities\":[\"\",\"܉\",\"\",\"ܝ\",\"¸\",\"ˏ\",\"˒\",\"˓\",\"˔\",\"ˬ\",\"˰\",\"˱\",\"˲\",\"˻\",\"˼\",\"˿\",\"\",\"\",\"\",\"\",\"\",\"\"]},\r\n {\"replacement\":\"'\",\"similarities\":[\"\",\"˙\",\"˹\",\"˺\",\"\",\"\",\"\",\"\",\"\",\"\"]},\r\n {\"replacement\":\"\\\"\",\"similarities\":[\"˵\",\"˶\",\"\",\"\"]},\r\n {\"replacement\":\"(\",\"similarities\":[\"\"]},\r\n {\"replacement\":\")\",\"similarities\":[\"\"]},\r\n {\"replacement\":\"[\",\"similarities\":[\"\"]},\r\n {\"replacement\":\"]\",\"similarities\":[\"\"]},\r\n {\"replacement\":\"*\",\"similarities\":[\"҉\",\"\",\"\",\"\",\"\",\"\",\"\",\"\"]},\r\n {\"replacement\":\"/\",\"similarities\":[\"\"]},\r\n {\"replacement\":\"\\\\\",\"similarities\":[\"\"]},\r\n {\"replacement\":\"%\",\"similarities\":[\"÷\"]},\r\n {\"replacement\":\"^\",\"similarities\":[\"\",\"\"]},\r\n {\"replacement\":\"<\",\"similarities\":[\"\",\"\",\"\"]},\r\n {\"replacement\":\"=\",\"similarities\":[\"˭\",\"\",\"\"]},\r\n {\"replacement\":\">\",\"similarities\":[\"\",\"\",\"\"]},\r\n {\"replacement\":\"|\",\"similarities\":[\"\",\"\",\"¦\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\"]},\r\n {\"replacement\":\"$\",\"similarities\":[\"💲\",\"ֆ\"]},\r\n {\"replacement\":\"0\",\"similarities\":[\"0️⃣\",\"0⃣\",\"\",\"🄌\",\"\",\"🄋\",\"θ\",\"\",\"\",\"\"]},\r\n {\"replacement\":\"1\",\"similarities\":[\"1️⃣\",\"1⃣\",\"\",\"\",\"\",\"\"]},\r\n {\"replacement\":\"2\",\"similarities\":[\"2️⃣\",\"2⃣\",\"\",\"\",\"\",\"\",\"ƨ\",\"\",\"\",\"\"]},\r\n {\"replacement\":\"3\",\"similarities\":[\"3️⃣\",\"3⃣\",\"\",\"\",\"\",\"\",\"Э\",\"з\",\"э\",\"\",\"\"]},\r\n {\"replacement\":\"4\",\"similarities\":[\"4️⃣\",\"4⃣\",\"\",\"\",\"\",\"\"]},\r\n {\"replacement\":\"5\",\"similarities\":[\"5️⃣\",\"5⃣\",\"\",\"\",\"\",\"\",\"ƽ\",\"\",\"\"]},\r\n {\"replacement\":\"6\",\"similarities\":[\"6️⃣\",\"6⃣\",\"\",\"\",\"\",\"\"]},\r\n {\"replacement\":\"7\",\"similarities\":[\"7️⃣\",\"7⃣\",\"\",\"\",\"\",\"\",\"\",\"\",\"\"]},\r\n {\"replacement\":\"8\",\"similarities\":[\"8️⃣\",\"8⃣\",\"\",\"\",\"\",\"\",\"\"]},\r\n {\"replacement\":\"9\",\"similarities\":[\"9️⃣\",\"9⃣\",\"\",\"\",\"\",\"\",\"\"]},\r\n {\"replacement\":\"a\",\"similarities\":[\"\",\"\",\"\",\"\",\"\",\"\"]},\r\n {\"replacement\":\"A\",\"similarities\":[\"\",\"\",\"🇦\",\"Δ\",\"Λ\",\"λ\",\"д\",\"\",\"\",\"\",\"\",\"\",\"𐌀\",\"🅰\",\"🅰️\"]},\r\n {\"replacement\":\"b\",\"similarities\":[\"ƀ\",\"ƃ\",\"ɓ\",\"ʙ\",\"Ъ\",\"в\",\"ъ\",\"ь\",\"\",\"\",\"\",\"\",\"\"]},\r\n {\"replacement\":\"B\",\"similarities\":[\"ß\",\"Ɓ\",\"Ƀ\",\"฿\",\"\",\"\",\"\",\"🅱️\"]},\r\n {\"replacement\":\"c\",\"similarities\":[\"¢\",\"©\",\"ƈ\",\"ɕ\",\"ς\",\"ϲ\",\"\",\"\"]},\r\n {\"replacement\":\"C\",\"similarities\":[\"Ƈ\",\"ʗ\",\"Ϲ\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"🅲\"]},\r\n {\"replacement\":\"d\",\"similarities\":[\"đ\",\"ȡ\",\"ɖ\",\"ɗ\",\"Ԁ\",\"\",\"\",\"\",\"\"]},\r\n {\"replacement\":\"D\",\"similarities\":[\"\",\"🇩\",\"Ð\",\"Đ\",\"Ɗ\"]},\r\n {\"replacement\":\"e\",\"similarities\":[\"ɐ\",\"\",\"ǝ\",\"ə\",\"\",\"\"]},\r\n {\"replacement\":\"E\",\"similarities\":[\"\",\"🇪\",\"£\",\"Ǝ\",\"Ɛ\",\"ɛ\",\"Ξ\",\"έ\",\"ε\",\"ϵ\",\"Є\",\"є\",\"ع\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"𐌄\"]},\r\n {\"replacement\":\"f\",\"similarities\":[\"ƒ\",\"ғ\",\"\",\"\"]},\r\n {\"replacement\":\"F\",\"similarities\":[\"Ƒ\",\"\"]},\r\n {\"replacement\":\"g\",\"similarities\":[\"\",\"ǥ\",\"ɠ\",\"ɢ\"]},\r\n {\"replacement\":\"G\",\"similarities\":[\"\",\"🇬\",\"Ɠ\",\"Ǥ\",\"\"]},\r\n {\"replacement\":\"h\",\"similarities\":[\"ħ\",\"ɦ\",\"ʜ\",\"\",\"\"]},\r\n {\"replacement\":\"H\",\"similarities\":[\"ӊ\",\"н\",\"\",\"\"]},\r\n {\"replacement\":\"i\",\"similarities\":[\"¡\",\"ɨ\",\"\",\"\",\"\",\"\"]},\r\n {\"replacement\":\"I\",\"similarities\":[\"Ɨ\",\"І\",\"Ї\",\"\"]},\r\n {\"replacement\":\"j\",\"similarities\":[\"ȷ\",\"ɉ\",\"ɟ\",\"ʝ\",\"د\",\"ر\",\"\",\"\",\"\"]},\r\n {\"replacement\":\"J\",\"similarities\":[\"\",\"Ɉ\",\"ك\",\"\",\"\",\"\",\"\"]},\r\n {\"replacement\":\"k\",\"similarities\":[\"ƙ\",\"κ\",\"к\",\"ќ\",\"ҝ\",\"ҟ\",\"ӄ\",\"\",\"\",\"\",\"\",\"\",\"\",\"\"]},\r\n {\"replacement\":\"K\",\"similarities\":[\"Ƙ\",\"Ҝ\",\"\",\"\",\"\",\"\"]},\r\n {\"replacement\":\"l\",\"similarities\":[\"\",\"ɭ\",\"𐑊\",\"ŀ\",\"ł\",\"ƚ\",\"ȴ\",\"ɫ\",\"ɬ\",\"ɭ\",\"ʟ\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\"]},\r\n {\"replacement\":\"L\",\"similarities\":[\"լ\",\"\",\"\",\"\",\"𐑃\",\"Ŀ\",\"Ł\",\"Ƚ\",\"Լ\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"𐌋\",\"🇱\",\"\"]},\r\n {\"replacement\":\"m\",\"similarities\":[\"\",\"ӎ\",\"ɱ\",\"м\",\"\",\"\",\"\",\"\",\"\"]},\r\n {\"replacement\":\"M\",\"similarities\":[\"𐊿\",\"ϻ\",\"Ӎ\",\"\",\"ʍ\",\"\",\"\",\"\",\"𐊎\",\"𐌼\",\"🇲\"]},\r\n {\"replacement\":\"n\",\"similarities\":[\"ʼn\",\"ŋ\",\"ƞ\",\"ȵ\",\"ɲ\",\"ɳ\",\"ɴ\",\"ή\",\"η\",\"π\",\"и\",\"л\",\"п\",\"ղ\",\"\",\"\",\"\",\"\",\"\"]},\r\n {\"replacement\":\"N\",\"similarities\":[\"Ɲ\",\"Ƞ\",\"П\",\"\",\"\",\"\",\"\"]},\r\n {\"replacement\":\"o\",\"similarities\":[\"🇴\",\"ʘ\",\"°\",\"ð\",\"ø\",\"ǿ\",\"ɵ\",\"́\",\"δ\",\"҈\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\"]},\r\n {\"replacement\":\"O\",\"similarities\":[\"Ø\",\"Ɵ\",\"Ǿ\",\"\",\"\",\"\",\"\",\"𑄶\"]},\r\n {\"replacement\":\"p\",\"similarities\":[\"\",\"þ\",\"ƥ\",\"ƿ\",\"ҏ\",\"ք\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\"]},\r\n {\"replacement\":\"P\",\"similarities\":[\"\",\"\",\"\",\"Þ\",\"Ƥ\",\"Ƿ\",\"Ҏ\",\"ק\",\"م\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"🅿️\",\"🇵\"]},\r\n {\"replacement\":\"q\",\"similarities\":[\"\",\"ɋ\",\"\",\"\",\"\"]},\r\n {\"replacement\":\"r\",\"similarities\":[\"®\",\"ſ\",\"ɍ\",\"ɼ\",\"ɽ\",\"ɾ\",\"ʀ\",\"Г\",\"ѓ\",\"ґ\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\"]},\r\n {\"replacement\":\"R\",\"similarities\":[\"Ɍ\",\"Я\",\"я\",\"\",\"\",\"🇷\"]},\r\n {\"replacement\":\"s\",\"similarities\":[\"ȿ\",\"ʂ\",\"ي\",\"\",\"\",\"\"]},\r\n {\"replacement\":\"S\",\"similarities\":[\"§\",\"\",\"\",\"\",\"\",\"𐌔\",\"🆂\"]},\r\n {\"replacement\":\"t\",\"similarities\":[\"ŧ\",\"ƫ\",\"ƭ\",\"ȶ\",\"ʈ\",\"τ\",\"т\",\"է\",\"\",\"\",\"\",\"\",\"\",\"\",\"\"]},\r\n {\"replacement\":\"T\",\"similarities\":[\"\",\"\",\"\",\"🇹\",\"Ŧ\",\"Ƭ\",\"Ʈ\",\"Ͳ\",\"ͳ\",\"\",\"\",\"\",\"\",\"\",\"\",\"\"]},\r\n {\"replacement\":\"u\",\"similarities\":[\"ʊ\",\"ц\",\"մ\",\"ت\",\"ن\",\"\",\"\",\"\",\"\"]},\r\n {\"replacement\":\"U\",\"similarities\":[\"\",\"\",\"Ʉ\",\"Ա\",\"\",\"\",\"\",\"\",\"\",\"🇺\"]},\r\n {\"replacement\":\"v\",\"similarities\":[\"\",\"\"]},\r\n {\"replacement\":\"V\",\"similarities\":[\"\",\"\",\"\",\"✔️\"]},\r\n {\"replacement\":\"w\",\"similarities\":[\"ω\",\"\"]},\r\n {\"replacement\":\"W\",\"similarities\":[\"Щ\",\"ш\",\"щ\",\"\",\"\",\"\"]},\r\n {\"replacement\":\"x\",\"similarities\":[\"ж\",\"\",\"\"]},\r\n {\"replacement\":\"X\",\"similarities\":[\"Ӽ\",\"\"]},\r\n {\"replacement\":\"y\",\"similarities\":[\"\",\"\",\"ƴ\",\"ɏ\"]},\r\n {\"replacement\":\"Y\",\"similarities\":[\"ߌ\",\"¥\",\"Ƴ\",\"Ɏ\",\"Ў\",\"\"]},\r\n {\"replacement\":\"z\",\"similarities\":[\"🇿\",\"ƶ\",\"ȥ\",\"ɀ\",\"ʐ\",\"ʑ\",\"\",\"\",\"\",\"\"]},\r\n {\"replacement\":\"Z\",\"similarities\":[\"Ƶ\",\"Ȥ\",\"\",\"\",\"\",\"\",\"Ɀ\",\"\",\"\"]},\r\n {\"replacement\":\"->\",\"similarities\":[\"\",\"\"]},\r\n {\"replacement\":\"=>\",\"similarities\":[\"\"]},\r\n {\"replacement\":\", \",\"similarities\":[\"\"]},\r\n {\"replacement\":\"::\",\"similarities\":[\"\"]},\r\n {\"replacement\":\":.\",\"similarities\":[\"\"]},\r\n {\"replacement\":\"..\",\"similarities\":[\"\",\"\"]},\r\n {\"replacement\":\"''\",\"similarities\":[\"\"]},\r\n {\"replacement\":\"/\\\\\",\"similarities\":[\"\"]},\r\n {\"replacement\":\"<-\",\"similarities\":[\"\"]},\r\n {\"replacement\":\"=)\",\"similarities\":[\"\",\"\"]},\r\n {\"replacement\":\"---\",\"similarities\":[\"\"]},\r\n {\"replacement\":\"AB\",\"similarities\":[\"🆎\"]},\r\n {\"replacement\":\"bl\",\"similarities\":[\"ы\"]},\r\n {\"replacement\":\"cl\",\"similarities\":[\"\"]},\r\n {\"replacement\":\"CL\",\"similarities\":[\"🆑\"]},\r\n {\"replacement\":\"COOL\",\"similarities\":[\"🆒\"]},\r\n {\"replacement\":\"FREE\",\"similarities\":[\"🆓\"]},\r\n {\"replacement\":\"ID\",\"similarities\":[\"🆔\"]},\r\n {\"replacement\":\"ij\",\"similarities\":[\"\",\"\"]},\r\n {\"replacement\":\"io\",\"similarities\":[\"ю\"]},\r\n {\"replacement\":\"lt\",\"similarities\":[\"\"]},\r\n {\"replacement\":\"NEW\",\"similarities\":[\"🆕\"]},\r\n {\"replacement\":\"NG\",\"similarities\":[\"🆖\"]},\r\n {\"replacement\":\"OK\",\"similarities\":[\"🆗\"]},\r\n {\"replacement\":\"RU\",\"similarities\":[\"🇷🇺\"]},\r\n {\"replacement\":\"SOS\",\"similarities\":[\"🆘\"]},\r\n {\"replacement\":\"UP!\",\"similarities\":[\"🆙\"]},\r\n {\"replacement\":\"VS\",\"similarities\":[\"🆚\"]},\r\n];\r\n\r\n//\r\n\r\nconst HardCodedMap: Map<string, string> = (() => {\r\n const map = new Map<string, string>();\r\n\r\n for (const unit of HardCoded) {\r\n for (const similiarity of unit.similarities)\r\n map.set(similiarity, unit.replacement);\r\n }\r\n\r\n return map;\r\n})();\r\n\r\nexport default HardCodedMap;","type DataUnit = string | [string, string];\r\n\r\n//\r\n\r\nconst Data: DataUnit[] = [\r\n ['200B', '200D'], // ZW chars\r\n \"200E\",\r\n ['1BCA0', '1BCA3'], // Shorthand controls\r\n ['FFF9', 'FFFB'], // Interlinear annotation\r\n '034F', '061C',\r\n '115F', '1160',\r\n '17B4', '17B5',\r\n '180E', '200C', '2060',\r\n '2061', '2062', '2063',\r\n '2028', '2029', '202F',\r\n '2800', '3164',\r\n 'FEFF', 'FFA0',\r\n 'FE0F', // Variation selector - forces emoji representation e.g. \"❗️\" becomes two chars: emoji + FE0F\r\n];\r\n\r\n//\r\n\r\nexport default (() => {\r\n const pattern = Data\r\n .map(entry => {\r\n if (Array.isArray(entry)) {\r\n const [start, end] = entry;\r\n return `\\\\u{${start}}-\\\\u{${end}}`;\r\n }\r\n else {\r\n return `\\\\u{${entry}}`;\r\n }\r\n })\r\n .join('');\r\n\r\n return new RegExp(`[${pattern}]`, 'gu');\r\n})();"],"mappings":"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","names":["Homoglypher","EmojiRegexFactory"]}