text-aligner
Version:
Align text by adding spaces to each string so that all strings have the same number of English and Chinese characters.
1 lines • 6.31 kB
Source Map (JSON)
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["const FallbackKey = '@@fallback' as const\nconst FallbackPlaceholder = '\\u2007'\n\ntype PaddingRule = {\n test: RegExp | ((char: string) => boolean) | typeof FallbackKey\n placeholder: string\n}\n\nconst DefaultPaddingMap: Record<string, PaddingRule> = {\n cjk: {\n test: (char: string) => isCJK(char),\n placeholder: '\\u2001',\n },\n [FallbackKey]: {\n test: FallbackKey,\n placeholder: FallbackPlaceholder,\n },\n}\n\nfunction isCJK(char: string) {\n const cjkRanges = [\n // Chinese (Hanzi) ranges\n [0x4e00, 0x9fff], // CJK Unified Ideographs\n [0x3400, 0x4dbf], // CJK Unified Ideographs Extension A\n [0x20000, 0x2a6df], // CJK Unified Ideographs Extension B\n [0x2a700, 0x2b73f], // CJK Unified Ideographs Extension C\n [0x2b740, 0x2b81f], // CJK Unified Ideographs Extension D\n [0x2b820, 0x2ceaf], // CJK Unified Ideographs Extension E\n [0xf900, 0xfaff], // CJK Compatibility Ideographs\n [0x2f800, 0x2fa1f], // CJK Compatibility Ideographs Supplement\n\n // Japanese ranges\n [0x3040, 0x309f], // Hiragana\n [0x30a0, 0x30ff], // Katakana\n [0x31f0, 0x31ff], // Katakana Phonetic Extensions\n\n // Korean ranges\n [0xac00, 0xd7a3], // Hangul Syllables\n [0x1100, 0x11ff], // Hangul Jamo\n [0x3130, 0x318f], // Hangul Compatibility Jamo\n ]\n\n const charCode = char.codePointAt(0)!\n\n return cjkRanges.some(([start, end]) => charCode >= start && charCode <= end)\n}\n\nfunction countChars(\n str: string,\n rules: Record<string, PaddingRule>\n): Record<string, number> {\n const counts: Record<string, number> = {\n [FallbackKey]: 0,\n }\n\n Object.keys(rules).forEach(key => (counts[key] = 0))\n\n for (const char of str) {\n let matched = false\n for (const [key, rule] of Object.entries(rules)) {\n if (key === FallbackKey || rule.test === FallbackKey) {\n continue\n }\n\n if (\n typeof rule.test === 'function' ? rule.test(char) : rule.test.test(char)\n ) {\n counts[key]++\n matched = true\n break\n }\n }\n\n if (!matched) {\n counts[FallbackKey]++\n }\n }\n\n return counts\n}\n\nfunction findMaxCounts(\n counts: Record<string, number>[]\n): Record<string, number> {\n const maxCounts: Record<string, number> = {}\n\n for (const count of counts) {\n Object.keys(count).forEach(key => {\n maxCounts[key] = Math.max(maxCounts[key] || 0, count[key])\n })\n }\n\n return maxCounts\n}\n\n/**\n * Aligns an array of strings by adding spaces to each string so that all strings have the same number of English and Chinese characters.\n *\n * @param {string[]} strings - An array of strings to be aligned.\n * @param {Record<string, PaddingRule | string>} paddingMap - A map of padding rules for different character types.\n * @returns {string[]} - An array of aligned strings with added spaces.\n */\nexport function alignText(\n strings: string[],\n paddingMap: Record<string, PaddingRule | string> = DefaultPaddingMap\n): string[] {\n const normalizedPaddingMap: Record<string, PaddingRule> = {}\n\n for (const [key, value] of Object.entries(paddingMap)) {\n if (typeof value === 'string') {\n if (!DefaultPaddingMap[key]) {\n continue\n }\n\n normalizedPaddingMap[key] = {\n test: DefaultPaddingMap[key]?.test,\n placeholder: value,\n }\n continue\n }\n\n normalizedPaddingMap[key] = value\n }\n\n normalizedPaddingMap[FallbackKey] ??= {\n test: FallbackKey,\n placeholder: FallbackPlaceholder,\n }\n\n const counts = strings.map(str => countChars(str, normalizedPaddingMap))\n const maxCounts = findMaxCounts(counts)\n\n return strings.map((str, index) => {\n const currentCounts = counts[index]\n let result = str\n\n for (const [key, count] of Object.entries(maxCounts)) {\n const diff = count - currentCounts[key]\n result += normalizedPaddingMap[key].placeholder.repeat(diff)\n }\n\n return result\n })\n}\n"],"mappings":"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","names":[]}