UNPKG

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 3.09 kB
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["type CharWidthRule = {\n test: RegExp | ((char: string) => boolean)\n width: number\n placeholder?: string\n}\n\ntype PaddingMap = Record<string, CharWidthRule>\n\nconst DefaultPaddingMap: PaddingMap = {\n cjk: {\n test: isCJK,\n width: 2,\n },\n}\n\nfunction isCJK(char: string): boolean {\n const cjkRanges = [\n [0x4e00, 0x9fff],\n [0x3400, 0x4dbf],\n [0x20000, 0x2a6df],\n [0x2a700, 0x2b73f],\n [0x2b740, 0x2b81f],\n [0x2b820, 0x2ceaf],\n [0xf900, 0xfaff],\n [0x2f800, 0x2fa1f],\n [0x3040, 0x309f],\n [0x30a0, 0x30ff],\n [0x31f0, 0x31ff],\n [0xac00, 0xd7a3],\n [0x1100, 0x11ff],\n [0x3130, 0x318f],\n [0xff00, 0xffef],\n ]\n\n const charCode = char.codePointAt(0)!\n return cjkRanges.some(([start, end]) => charCode >= start && charCode <= end)\n}\n\nfunction getCharWidth(char: string, rules: PaddingMap): number {\n for (const rule of Object.values(rules)) {\n const matched =\n typeof rule.test === 'function' ? rule.test(char) : rule.test.test(char)\n if (matched) {\n return rule.width\n }\n }\n return 1\n}\n\nfunction getStringWidth(str: string, rules: PaddingMap): number {\n let width = 0\n for (const char of str) {\n width += getCharWidth(char, rules)\n }\n return width\n}\n\nexport function alignText(\n strings: string[],\n paddingMap: PaddingMap = {},\n placeholder: string = ' ',\n): string[] {\n const mergedPaddingMap = {...DefaultPaddingMap, ...paddingMap}\n const widths = strings.map(str => getStringWidth(str, mergedPaddingMap))\n const maxWidth = Math.max(...widths)\n\n return strings.map((str, index) => {\n const diff = maxWidth - widths[index]\n return str + placeholder.repeat(diff)\n })\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA,IAAM,oBAAgC;AAAA,EACpC,KAAK;AAAA,IACH,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AACF;AAEA,SAAS,MAAM,MAAuB;AACpC,QAAM,YAAY;AAAA,IAChB,CAAC,OAAQ,KAAM;AAAA,IACf,CAAC,OAAQ,KAAM;AAAA,IACf,CAAC,QAAS,MAAO;AAAA,IACjB,CAAC,QAAS,MAAO;AAAA,IACjB,CAAC,QAAS,MAAO;AAAA,IACjB,CAAC,QAAS,MAAO;AAAA,IACjB,CAAC,OAAQ,KAAM;AAAA,IACf,CAAC,QAAS,MAAO;AAAA,IACjB,CAAC,OAAQ,KAAM;AAAA,IACf,CAAC,OAAQ,KAAM;AAAA,IACf,CAAC,OAAQ,KAAM;AAAA,IACf,CAAC,OAAQ,KAAM;AAAA,IACf,CAAC,MAAQ,IAAM;AAAA,IACf,CAAC,OAAQ,KAAM;AAAA,IACf,CAAC,OAAQ,KAAM;AAAA,EACjB;AAEA,QAAM,WAAW,KAAK,YAAY,CAAC;AACnC,SAAO,UAAU,KAAK,CAAC,CAAC,OAAO,GAAG,MAAM,YAAY,SAAS,YAAY,GAAG;AAC9E;AAEA,SAAS,aAAa,MAAc,OAA2B;AAC7D,aAAW,QAAQ,OAAO,OAAO,KAAK,GAAG;AACvC,UAAM,UACJ,OAAO,KAAK,SAAS,aAAa,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,IAAI;AACzE,QAAI,SAAS;AACX,aAAO,KAAK;AAAA,IACd;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,eAAe,KAAa,OAA2B;AAC9D,MAAI,QAAQ;AACZ,aAAW,QAAQ,KAAK;AACtB,aAAS,aAAa,MAAM,KAAK;AAAA,EACnC;AACA,SAAO;AACT;AAEO,SAAS,UACd,SACA,aAAyB,CAAC,GAC1B,cAAsB,KACZ;AACV,QAAM,mBAAmB,EAAC,GAAG,mBAAmB,GAAG,WAAU;AAC7D,QAAM,SAAS,QAAQ,IAAI,SAAO,eAAe,KAAK,gBAAgB,CAAC;AACvE,QAAM,WAAW,KAAK,IAAI,GAAG,MAAM;AAEnC,SAAO,QAAQ,IAAI,CAAC,KAAK,UAAU;AACjC,UAAM,OAAO,WAAW,OAAO,KAAK;AACpC,WAAO,MAAM,YAAY,OAAO,IAAI;AAAA,EACtC,CAAC;AACH;","names":[]}