tty-strings
Version:
Tools for working with strings displayed in the terminal
833 lines • 35.6 kB
text/typescript
/**
* Get the visual width of a Unicode code point.
*
* @remarks
* Full width code points are include those with an `East_Asian_Width` property of `F` or `W`,
* which are derived from {@link https://unicode.org/Public/16.0.0/ucd/EastAsianWidth.txt}.
* Zero width code points include those with general category values of `Mn`, `Me`, and `Cc`,
* which are derived from {@link https://unicode.org/Public/16.0.0/ucd/extracted/DerivedGeneralCategory.txt},
* as well as all code points with the `Default_Ignorable_Code_Point` property,
* which are derived from {@link https://unicode.org/Public/16.0.0/ucd/DerivedCoreProperties.txt}.
*
* @example
* ```ts
* import { codePointWidth } from 'tty-strings';
*
* // The numerical code point for '古' is 53E4
* const width = codePointWidth(0x53E4); // 2
* ```
*
* @param code - Unicode code point.
* @returns `2` for full width, `0` for zero width, and `1` for everything else.
*/
export default function codePointWidth(code: number): 0 | 1 | 2 {
// Basic Latin ... Combining Diacritical Marks (0000 - 036F)
if (code < 0x0370) {
return (code <= 0x009F ? (
// C0 control codes
code <= 0x001F // // Cc [32]
// C1 control codes
|| code >= 0x007F // Cc [33]
) : (
// Combining Diacritical Marks
code >= 0x0300 // Mn [112]
// Soft hyphen
|| code === 0x00AD // Cf [1]
)) ? 0 : 1;
}
// Greek and Coptic ... Gujarati (0370 - 0AFF)
if (code < 0x0B00) {
return (code < 0x0591 ? (
// Cyrillic
code >= 0x0483 && code <= 0x0489 // Mn [5] & Me [2]
) : code < 0x0610 ? (
// Hebrew
(code <= 0x05C2 && code !== 0x05BE && code !== 0x05C0) // Mn [48]
|| (code >= 0x05C4 && code <= 0x05C7 && code !== 0x05C6) // Mn [3]
) : code < 0x06EE ? (
// Arabic
(code <= 0x061C && code !== 0x061B) // Mn [11] & Cf [1]
|| (code >= 0x064B && code <= 0x065F) // Mn [21]
|| code === 0x0670 // Mn [1]
|| (code >= 0x06D6 && code <= 0x06DC) // Mn [7]
|| (code >= 0x06DF && code <= 0x06E4) // Mn [6]
|| (code >= 0x06E7 && code !== 0x06E9) // Mn [6]
) : code < 0x074B ? (
// Syriac
code === 0x0711 // Mn [1]
|| code >= 0x0730 // Mn [27]
) : code < 0x0816 ? (
// Thaana
(code >= 0x07A6 && code <= 0x07B0) // Mn [11]
// NKo
|| (code >= 0x07EB && code <= 0x07F3) // Mn [9]
|| code === 0x07FD // Mn [1]
) : code < 0x082E ? (
// Samaritan
(code <= 0x0823 && code !== 0x081A) // Mn [13]
|| (code >= 0x0825 && code !== 0x0828) // Mn [8]
) : code < 0x0903 ? (
// Mandaic
(code >= 0x0859 && code <= 0x085B) // Mn [3]
// Arabic Extended-B
|| (code >= 0x0897 && code <= 0x089F) // Mn [9]
// Arabic Extended-A
|| (code >= 0x08CA && code !== 0x08E2) // Mn [56]
) : code < 0x0964 ? (
// Devanagari
(code >= 0x093A && code <= 0x093C && code !== 0x093B) // Mn [2]
|| (code >= 0x0941 && code <= 0x0948) // Mn [8]
|| code === 0x094D // Mn [1]
|| (code >= 0x0951 && code <= 0x0957) // Mn [7]
|| code >= 0x0962 // Mn [2]
) : code < 0x0A01 ? (
// Bengali
code === 0x0981 // Mn [1]
|| code === 0x09BC // Mn [1]
|| (code >= 0x09C1 && code <= 0x09C4) // Mn [4]
|| code === 0x09CD // Mn [1]
|| (code >= 0x09E2 && code <= 0x09E3) // Mn [2]
|| code === 0x09FE // Mn [1]
) : code < 0x0A81 ? (
// Gurmukhi
code <= 0x0A02 // Mn [2]
|| code === 0x0A3C // Mn [1]
|| (code >= 0x0A41 && code <= 0x0A42) // Mn [2]
|| (code >= 0x0A47 && code <= 0x0A48) // Mn [2]
|| (code >= 0x0A4B && code <= 0x0A4D) // Mn [3]
|| code === 0x0A51 // Mn [1]
|| (code >= 0x0A70 && code <= 0x0A71) // Mn [2]
|| code === 0x0A75 // Mn [1]
) : (
// Gujarati
code <= 0x0A82 // Mn [2]
|| code === 0x0ABC // Mn [1]
|| (code >= 0x0AC1 && code <= 0x0AC8 && code !== 0x0AC6) // Mn [7]
|| code === 0x0ACD // Mn [1]
|| (code >= 0x0AE2 && code <= 0x0AE3) // Mn [2]
|| code >= 0x0AFA // Mn [6]
)) ? 0 : 1;
}
// Oriya ... Myanmar (0B00 - 109F)
if (code < 0x10A0) {
return (code < 0x0B64 ? (
// Oriya
code === 0x0B01 // Mn [1]
|| code === 0x0B3C // Mn [1]
|| (code >= 0x0B3F && code <= 0x0B44 && code !== 0x0B40) // Mn [5]
|| code === 0x0B4D // Mn [1]
|| (code >= 0x0B55 && code <= 0x0B56) // Mn [2]
|| code >= 0x0B62 // Mn [2]
) : code < 0x0C00 ? (
// Tamil
code === 0x0B82 // Mn [1]
|| code === 0x0BC0 // Mn [1]
|| code === 0x0BCD // Mn [1]
) : code < 0x0C64 ? (
// Telugu
code === 0x0C00 // Mn [1]
|| code === 0x0C04 // Mn [1]
|| code === 0x0C3C // Mn [1]
|| (code >= 0x0C3E && code <= 0x0C40) // Mn [3]
|| (code >= 0x0C46 && code <= 0x0C4D && code !== 0x0C49) // Mn [7]
|| (code >= 0x0C55 && code <= 0x0C56) // Mn [2]
|| code >= 0x0C62 // Mn [2]
) : code < 0x0D00 ? (
// Kannada
code === 0x0C81 // Mn [1]
|| code === 0x0CBC // Mn [1]
|| code === 0x0CBF // Mn [1]
|| code === 0x0CC6 // Mn [1]
|| (code >= 0x0CCC && code <= 0x0CCD) // Mn [2]
|| (code >= 0x0CE2 && code <= 0x0CE3) // Mn [2]
) : code < 0x0D64 ? (
// Malayalam
code <= 0x0D01 // Mn [2]
|| (code >= 0x0D3B && code <= 0x0D3C) // Mn [2]
|| (code >= 0x0D41 && code <= 0x0D44) // Mn [4]
|| code === 0x0D4D // Mn [1]
|| code >= 0x0D62 // Mn [2]
) : code < 0x0DD7 ? (
// Sinhala
code === 0x0D81 // Mn [1]
|| code === 0x0DCA // Mn [1]
|| (code >= 0x0DD2 && code !== 0x0DD5) // Mn [4]
) : code < 0x0E4F ? (
// Thai
code === 0x0E31 // Mn [1]
|| (code >= 0x0E34 && code <= 0x0E3A) // Mn [7]
|| code >= 0x0E47 // Mn [8]
) : code < 0x0F18 ? (
// Lao
code === 0x0EB1 // Mn [1]
|| (code >= 0x0EB4 && code <= 0x0EBC) // Mn [9]
|| (code >= 0x0EC8 && code <= 0x0ECE) // Mn [7]
) : code < 0x102D ? (
// Tibetan
code <= 0x0F19 // Mn [2]
|| code === 0x0F35 // Mn [1]
|| code === 0x0F37 // Mn [1]
|| code === 0x0F39 // Mn [1]
|| (code >= 0x0F71 && code <= 0x0F87 && code !== 0x0F7F && code !== 0x0F85) // Mn [21]
|| (code >= 0x0F8D && code <= 0x0FBC && code !== 0x0F98) // Mn [47]
|| code === 0x0FC6 // Mn [1]
) : (
// Myanmar
(code <= 0x103A && code !== 0x1031 && code !== 0x1038) // Mn [12]
|| (code >= 0x103D && code <= 0x103E) // Mn [2]
|| (code >= 0x1058 && code <= 0x1059) // Mn [2]
|| (code >= 0x105E && code <= 0x1060) // Mn [3]
|| (code >= 0x1071 && code <= 0x1074) // Mn [4]
|| code === 0x1082 // Mn [1]
|| (code >= 0x1085 && code <= 0x1086) // Mn [2]
|| code === 0x108D // Mn [1]
|| code === 0x109D // Mn [1]
)) ? 0 : 1;
}
// Georgian ... Tai Tham (10A0 - 1AAF)
if (code < 0x1AB0) {
return code < 0x1712 ? (
code <= 0x1160 ? (
// Hangul Jamo
code >= 0x115F ? 0 // Lo [2]
: code >= 0x1100 ? 2 : 1 // W [96]
) : (
// Ethiopic
code >= 0x135D && code <= 0x135F // Mn [3]
) ? 0 : 1
) : (code < 0x17B4 ? (
// Tagalog
code <= 0x1714 // Mn [3]
// Hanunoo
|| (code >= 0x1732 && code <= 0x1733) // Mn [2]
// Buhid
|| (code >= 0x1752 && code <= 0x1753) // Mn [2]
// Tagbanwa
|| (code >= 0x1772 && code <= 0x1773) // Mn [2]
) : code < 0x180B ? (
// Khmer
(code <= 0x17BD && code !== 0x17B6) // Mn [9]
|| code === 0x17C6 // Mn [1]
|| (code >= 0x17C9 && code <= 0x17D3) // Mn [11]
|| code === 0x17DD // Mn [1]
) : code < 0x1920 ? (
// Mongolian
code <= 0x180F // Mn [4] & Cf [1]
|| (code >= 0x1885 && code <= 0x1886) // Mn [2]
|| code === 0x18A9 // Mn [1]
) : code < 0x193C ? (
// Limbu
code <= 0x1922 // Mn [3]
|| (code >= 0x1927 && code <= 0x1928) // Mn [2]
|| code === 0x1932 // Mn [1]
|| code >= 0x1939 // Mn [3]
) : code < 0x1A56 ? (
// Buginese
(code >= 0x1A17 && code <= 0x1A18) // Mn [2]
|| code === 0x1A1B // Mn [1]
) : (
// Tai Tham
(code <= 0x1A5E && code !== 0x1A57) // Mn [8]
|| code === 0x1A60 // Mn [1]
|| code === 0x1A62 // Mn [1]
|| (code >= 0x1A65 && code <= 0x1A6C) // Mn [8]
|| (code >= 0x1A73 && code <= 0x1A7C) // Mn [10]
|| code === 0x1A7F // Mn [1]
)) ? 0 : 1;
}
// Combining Diacritical Marks Extended ... Greek Extended (1AB0 - 1FFF)
if (code < 0x200B) {
return (code < 0x1B00 ? (
// Combining Diacritical Marks Extended
code <= 0x1ACE // Mn [30] & Me [1]
) : code < 0x1B80 ? (
// Balinese
code <= 0x1B03 // Mn [4]
|| (code >= 0x1B34 && code <= 0x1B3A && code !== 0x1B35) // Mn [6]
|| code === 0x1B3C // Mn [1]
|| code === 0x1B42 // Mn [1]
|| (code >= 0x1B6B && code <= 0x1B73) // Mn [9]
) : code < 0x1BAE ? (
// Sundanese
code <= 0x1B81 // Mn [2]
|| (code >= 0x1BA2 && code <= 0x1BA5) // Mn [4]
|| (code >= 0x1BA8 && code !== 0x1BAA) // Mn [5]
) : code < 0x1BF2 ? (
// Batak
(code >= 0x1BE6 && code <= 0x1BE9 && code !== 0x1BE7) // Mn [3]
|| (code >= 0x1BED && code !== 0x1BEE) // Mn [4]
) : code < 0x1CD0 ? (
// Lepcha
(code >= 0x1C2C && code <= 0x1C33) // Mn [8]
|| (code >= 0x1C36 && code <= 0x1C37) // Mn [2]
) : code < 0x1CFA ? (
// Vedic Extensions
(code <= 0x1CE0 && code !== 0x1CD3) // Mn [16]
|| (code >= 0x1CE2 && code <= 0x1CE8) // Mn [7]
|| code === 0x1CED // Mn [1]
|| code === 0x1CF4 // Mn [1]
|| code >= 0x1CF8 // Mn [2]
) : (
// Combining Diacritical Marks Supplement
code >= 0x1DC0 && code <= 0x1DFF // Mn [64]
)) ? 0 : 1;
}
// General Punctuation ... Cyrillic Extended-A (2000 - 2DFF)
if (code < 0x2E00) {
return code < 0x231A ? (
(code <= 0x20F0 && (
// General Punctuation
code <= 0x200F // Cf [5]
|| (code >= 0x202A && code <= 0x202E) // Cf [5]
|| (code >= 0x2060 && code <= 0x206F) // Cf [15] & Cn [1]
// Combining Diacritical Marks for Symbols
|| code >= 0x20D0 // Mn [26] & Me [7]
)) ? 0 : 1
) : code < 0x2614 ? (
(code < 0x23F4 ? (
// Miscellaneous Technical
code <= 0x231B // W [2]
|| (code >= 0x2329 && code <= 0x232A) // W [2]
|| (code >= 0x23E9 && code <= 0x23EC) // W [4]
|| code === 0x23F0 // W [1]
|| code === 0x23F3 // W [1]
) : (
// Geometric Shapes
code >= 0x25FD && code <= 0x25FE // W [2]
)) ? 2 : 1
) : code < 0x2700 ? (
// Miscellaneous Symbols
(code <= 0x26C5 ? (
code <= 0x2615 // W [2]
|| (code >= 0x2630 && code <= 0x2637) // W [8]
|| (code >= 0x2648 && code <= 0x2653) // W [12]
|| code === 0x267F // W [1]
|| (code >= 0x268A && code <= 0x268F) // W [6]
|| code === 0x2693 // W [1]
|| code === 0x26A1 // W [1]
|| (code >= 0x26AA && code <= 0x26AB) // W [2]
|| (code >= 0x26BD && code <= 0x26BE) // W [2]
|| code >= 0x26C4 // W [2]
) : (
code === 0x26CE // W [1]
|| code === 0x26D4 // W [1]
|| code === 0x26EA // W [1]
|| (code >= 0x26F2 && code <= 0x26F5 && code !== 0x26F4) // W [3]
|| code === 0x26FA // W [1]
|| code === 0x26FD // W [1]
)) ? 2 : 1
) : code < 0x27C0 ? (
// Dingbats
(code < 0x2753 ? (
code === 0x2705 // W [1]
|| (code >= 0x270A && code <= 0x270B) // W [2]
|| code === 0x2728 // W [1]
|| code === 0x274C // W [1]
|| code === 0x274E // W [1]
) : (
(code <= 0x2757 && code !== 0x2756) // W [4]
|| (code >= 0x2795 && code <= 0x2797) // W [3]
|| code === 0x27B0 // W [1]
|| code === 0x27BF // W [1]
)) ? 2 : 1
) : code < 0x2CEF ? (
(code >= 0x2B1B && (
// Miscellaneous Symbols and Arrows
code <= 0x2B1C // W [2]
|| code === 0x2B50 // W [1]
|| code === 0x2B55 // W [1]
)) ? 2 : 1
) : (
// Coptic
code <= 0x2CF1 // Mn [3]
// Tifinagh
|| code === 0x2D7F // Mn [1]
// Cyrillic Extended-A
|| code >= 0x2DE0 // Mn [32]
) ? 0 : 1;
}
// Supplemental Punctuation ... Hangul Jamo Extended-A (2E00 - A97F)
if (code < 0xA980) {
return code < 0x2FF0 ? (
(code >= 0x2E80 && (
// CJK Radicals Supplement
(code <= 0x2EF3 && code !== 0x2E9A) // W [115]
// Kangxi Radicals
|| (code >= 0x2F00 && code <= 0x2FD5) // W [214]
)) ? 2 : 1
) : code < 0x3100 ? (
code <= 0x303E
// Ideographic Description Characters + CJK Symbols and Punctuation
? ((code >= 0x302A && code <= 0x302D) ? 0 : 2) // Mn [4] / F [1] & W [74]
// Hiragana & Katakana
: ((code >= 0x3041 && code <= 0x3096) || code >= 0x309B) ? 2 // W [187]
: (code >= 0x3099) ? 0 : 1 // Mn [2]
) : code < 0xA66F ? (
code <= 0x31E5 ? (
// Bopomofo ... CJK Strokes
code === 0x3164 ? 0 // Lo [1]
: (code >= 0x3105 && code !== 0x3130 && code !== 0x318F) ? 2 : 1 // W [222]
) : (code < 0x3250 ? (
// Katakana Phonetic Extensions & Enclosed CJK Letters and Months
code >= 0x31EF && code <= 0x3247 && code !== 0x321F // W [88]
) : (
// CJK Compatibility ... Yi Syllables
code <= 0xA48C // W [29,245]
// Yi Radicals
|| (code <= 0xA4C6 && code >= 0xA490) // W [55]
)) ? 2 : 1
) : code < 0xA8C4 ? (
(code < 0xA800 ? (
// Cyrillic Extended-B
(code <= 0xA67D && code !== 0xA673) // Mn [11] & Me [3]
|| (code >= 0xA69E && code <= 0xA69F) // Mn [2]
// Bamum
|| (code >= 0xA6F0 && code <= 0xA6F1) // Mn [2]
) : (
// Syloti Nagri
code === 0xA802 // Mn [1]
|| code === 0xA806 // Mn [1]
|| code === 0xA80B // Mn [1]
|| (code >= 0xA825 && code <= 0xA826) // Mn [2]
|| code === 0xA82C // Mn [1]
)) ? 0 : 1
) : (code <= 0xA951 ? ((
// Saurashtra
code <= 0xA8C5 // Mn [2]
// Devanagari Extended
|| (code >= 0xA8E0 && code <= 0xA8F1) // Mn [18]
|| code === 0xA8FF // Mn [1]
// Kayah Li
|| (code >= 0xA926 && code <= 0xA92D) // Mn [8]
// Rejang
|| code >= 0xA947 // Mn [11]
) ? 0 : 1) : (
// Hangul Jamo Extended-A
code >= 0xA960 && code <= 0xA97C // W [29]
) ? 2 : 1);
}
// Javanese ... Specials (A980 - FFFF)
if (code < 0x10000) {
return code < 0xAC00 ? (
(code < 0xAA29 ? (
// Javanese
code <= 0xA982 // Mn [3]
|| code === 0xA9B3 // Mn [1]
|| (code >= 0xA9B6 && code <= 0xA9B9) // Mn [4]
|| (code >= 0xA9BC && code <= 0xA9BD) // Mn [2]
// Myanmar Extended-B
|| code === 0xA9E5 // Mn [1]
) : code < 0xAAB0 ? (
// Cham
code <= 0xAA2E // Mn [6]
|| (code >= 0xAA31 && code <= 0xAA32) // Mn [2]
|| (code >= 0xAA35 && code <= 0xAA36) // Mn [2]
|| code === 0xAA43 // Mn [1]
|| code === 0xAA4C // Mn [1]
// Myanmar Extended-A
|| code === 0xAA7C // Mn [1]
) : code < 0xAAC2 ? (
// Tai Viet
(code <= 0xAAB4 && code !== 0xAAB1) // Mn [5]
|| (code >= 0xAAB7 && code <= 0xAAB8) // Mn [2]
|| (code >= 0xAABE && code !== 0xAAC0) // Mn [3]
) : code < 0xABC0 ? (
// Meetei Mayek Extensions
(code >= 0xAAEC && code <= 0xAAED) // Mn [2]
|| code === 0xAAF6 // Mn [1]
) : (
// Meetei Mayek
code === 0xABE5 // Mn [1]
|| code === 0xABE8 // Mn [1]
|| code === 0xABED // Mn [1]
)) ? 0 : 1
) : code < 0xFE00 ? (
code <= 0xFAD9 ? ((
// Hangul Syllables
code <= 0xD7A3 // W [11,172]
// CJK Compatibility Ideographs
|| (code >= 0xF900 && code <= 0xFA6D) // W [366]
|| code >= 0xFA70 // W [106]
) ? 2 : 1) : code === 0xFB1E ? 0 : 1 // Mn [1]
) : code < 0xFE6C ? (
code < 0xFE30 ? (
// Variation Selectors, Vertical Forms, Combining Half Marks
(code <= 0xFE0F || code >= 0xFE20) ? 0 // Mn [32]
: code <= 0xFE19 ? 2 : 1 // W [10]
) : (
// CJK Compatibility Forms, Small Form Variants
(code <= 0xFE66 && code !== 0xFE53) // W [54]
|| code >= 0xFE68 // W [4]
) ? 2 : 1
) : (code < 0xFF01 ? (
// Arabic Presentation Forms-B
code === 0xFEFF ? 0 : 1 // Cf [1]
) : code <= 0xFFE6 ? (
// Halfwidth and Fullwidth Forms
(code <= 0xFF60 || code >= 0xFFE0) ? 2 // F [103]
: code === 0xFFA0 ? 0 : 1 // Lo [1]
) : (
// Specials
code >= 0xFFF0 && code <= 0xFFF8 // Cn [9]
) ? 0 : 1);
}
// Linear B Syllabary ... Khudawadi (10000 - 112FF)
if (code < 0x11300) {
return (code < 0x10A01 ? (
// Phaistos Disc
code === 0x101FD // Mn [1]
// Coptic Epact Numbers
|| code === 0x102E0 // Mn [1]
// Old Permic
|| (code >= 0x10376 && code <= 0x1037A) // Mn [5]
) : code < 0x10AE5 ? (
// Kharoshthi
(code <= 0x10A06 && code !== 0x10A04) // Mn [5]
|| (code >= 0x10A0C && code <= 0x10A0F) // Mn [4]
|| (code >= 0x10A38 && code <= 0x10A3A) // Mn [3]
|| code === 0x10A3F // Mn [1]
) : code < 0x10D28 ? (
// Manichaean
code <= 0x10AE6 // Mn [2]
// Hanifi Rohingya
|| code >= 0x10D24 // Mn [4]
) : code < 0x10F51 ? (
// Garay
(code >= 0x10D69 && code <= 0x10D6D) // Mn [5]
// Yezidi
|| (code >= 0x10EAB && code <= 0x10EAC) // Mn [2]
// Arabic Extended-C
|| (code >= 0x10EFC && code <= 0x10EFF) // Mn [4]
// Sogdian
|| code >= 0x10F46 // Mn [11]
) : code < 0x1107F ? (
// Old Uyghur
(code >= 0x10F82 && code <= 0x10F85) // Mn [4]
// Brahmi
|| code === 0x11001 // Mn [1]
|| (code >= 0x11038 && code <= 0x11046) // Mn [15]
|| code === 0x11070 // Mn [1]
|| (code >= 0x11073 && code <= 0x11074) // Mn [2]
) : code < 0x11100 ? (
// Kaithi
code <= 0x11081 // Mn [3]
|| (code >= 0x110B3 && code <= 0x110B6) // Mn [4]
|| (code >= 0x110B9 && code <= 0x110BA) // Mn [2]
|| code === 0x110C2 // Mn [1]
) : code < 0x11180 ? (
// Chakma
code <= 0x11102 // Mn [3]
|| (code >= 0x11127 && code <= 0x11134 && code !== 0x1112C) // Mn [13]
// Mahajani
|| code === 0x11173 // Mn [1]
) : code < 0x1122F ? (
// Sharada
code <= 0x11181 // Mn [2]
|| (code >= 0x111B6 && code <= 0x111BE) // Mn [9]
|| (code >= 0x111C9 && code <= 0x111CC) // Mn [4]
|| code === 0x111CF // Mn [1]
) : code < 0x11280 ? (
// Khojki
code <= 0x11231 // Mn [3]
|| (code >= 0x11234 && code <= 0x11237 && code !== 0x11235) // Mn [3]
|| code === 0x1123E // Mn [1]
|| code === 0x11241 // Mn [1]
) : (
// Khudawadi
code === 0x112DF // Mn [1]
|| (code >= 0x112E3 && code <= 0x112EA) // Mn [8]
)) ? 0 : 1;
}
// Grantha ... Mro (11300 - 16A6F)
if (code < 0x16AD0) {
return (code <= 0x113E2 ? (
code < 0x11375 ? (
// Grantha
code <= 0x11301 // Mn [2]
|| (code >= 0x1133B && code <= 0x1133C) // Mn [2]
|| code === 0x11340 // Mn [1]
|| (code >= 0x11366 && code <= 0x1136C) // Mn [7]
|| code >= 0x11370 // Mn [5]
) : (code >= 0x113BB && (
// Tulu-Tigalari
code <= 0x113C0 // Mn [6]
|| code === 0x113CE // Mn [1]
|| code === 0x113D0 // Mn [1]
|| code === 0x113D2 // Mn [1]
|| code >= 0x113E1 // Mn [2]
))
) : code < 0x114C4 ? (
code <= 0x1145E ? (code >= 0x11438 && (
// Newa
code <= 0x1143F // Mn [8]
|| (code >= 0x11442 && code <= 0x11446 && code !== 0x11445) // Mn [4]
|| code === 0x1145E // Mn [1]
)) : (code >= 0x114B3 && (
// Tirhuta
(code <= 0x114BA && code !== 0x114B9) // Mn [7]
|| (code >= 0x114BF && code !== 0x114C1) // Mn [4]
))
) : code < 0x11641 ? (
code < 0x115DE ? (code >= 0x115B2 && (
// Siddham
code <= 0x115B5 // Mn [4]
|| (code >= 0x115BC && code <= 0x115C0 && code !== 0x115BE) // Mn [4]
|| code >= 0x115DC // Mn [2]
)) : (code >= 0x11633 && (
// Modi
code <= 0x1163A // Mn [8]
|| (code >= 0x1163D && code !== 0x1163E) // Mn [3]
))
) : code < 0x1172C ? (
code < 0x116B8 ? (code >= 0x116AB && (
// Takri
(code <= 0x116AD && code !== 0x116AC) // Mn [2]
|| (code >= 0x116B0 && code !== 0x116B6) // Mn [7]
)) : (code >= 0x1171D && (
// Ahom
(code <= 0x1171F && code !== 0x1171E) // Mn [2]
|| (code >= 0x11722 && code !== 0x11726) // Mn [9]
))
) : code < 0x119D4 ? (
code <= 0x1183A ? (
// Dogra
code >= 0x1182F && code !== 0x11838 // Mn [11]
) : (code >= 0x1193B && (
// Dives Akuru
(code <= 0x1193E && code !== 0x1193D) // Mn [3]
|| code === 0x11943 // Mn [1]
))
) : code < 0x11A01 ? (
// Nandinagari
code <= 0x119D7 // Mn [4]
|| (code >= 0x119DA && code <= 0x119DB) // Mn [2]
|| code === 0x119E0 // Mn [1]
) : code < 0x11A51 ? (
// Zanabazar Square
code <= 0x11A0A // Mn [10]
|| (code >= 0x11A33 && code <= 0x11A38) // Mn [6]
|| (code >= 0x11A3B && code <= 0x11A3E) // Mn [4]
|| code === 0x11A47 // Mn [1]
) : code < 0x11C92 ? (
code <= 0x11A99 ? (
// Soyombo
code <= 0x11A56 // Mn [6]
|| (code >= 0x11A59 && code <= 0x11A5B) // Mn [3]
|| (code >= 0x11A8A && code !== 0x11A97) // Mn [15]
) : (code >= 0x11C30 && code <= 0x11C3F && (
// Bhaiksuki
code !== 0x11C37 && code !== 0x11C3E // Mn [14]
))
) : code < 0x11CB7 ? (
// Marchen
code <= 0x11CA7 // Mn [22]
|| (code >= 0x11CAA && code <= 0x11CB0) // Mn [7]
|| (code >= 0x11CB2 && code !== 0x11CB4) // Mn [4]
) : code < 0x11D48 ? (
// Masaram Gondi
(code >= 0x11D31 && code <= 0x11D36) // Mn [6]
|| (code >= 0x11D3A && code <= 0x11D3D && code !== 0x11D3B) // Mn [3]
|| (code >= 0x11D3F && code !== 0x11D46) // Mn [8]
) : code < 0x11F00 ? (code <= 0x11EF4 && code >= 0x11D90 && (
// Gunjala Gondi
code <= 0x11D91 // Mn [2]
|| code === 0x11D95 // Mn [1]
|| code === 0x11D97 // Mn [1]
// Makasar
|| code >= 0x11EF3 // Mn [2]
)) : code <= 0x11F5A ? (
// Kawi
code <= 0x11F01 // Mn [2]
|| (code >= 0x11F36 && code <= 0x11F3A) // Mn [5]
|| code === 0x11F40 // Mn [1]
|| code === 0x11F42 // Mn [1]
|| code === 0x11F5A // Mn [1]
) : code <= 0x13455 ? (
// Egyptian Hieroglyph Format Controls
code === 0x13440 // Mn [1]
|| code >= 0x13447 // Mn [15]
) : (
// Gurung Khema
(code >= 0x1611E && code <= 0x16129) // Mn [12]
|| (code >= 0x1612D && code <= 0x1612F) // Mn [3]
)) ? 0 : 1;
}
// Bassa Vah ... Arabic Mathematical Alphabetic Symbols (16AD0 - 1EEFF)
if (code < 0x1F000) {
return code < 0x17000 ? (
code < 0x16F93 ? ((
// Bassa Vah
(code >= 0x16AF0 && code <= 0x16AF4) // Mn [5]
// Pahawh Hmong
|| (code >= 0x16B30 && code <= 0x16B36) // Mn [7]
// Miao
|| code === 0x16F4F // Mn [1]
|| code >= 0x16F8F // Mn [4]
) ? 0 : 1) : ((code >= 0x16FE0 && code <= 0x16FF1) ? (
// Ideographic Symbols and Punctuation
(code <= 0x16FE3 || code >= 0x16FF0) ? 2 // W [6]
: code === 0x16FE4 ? 0 : 1 // Mn [1]
) : 1)
) : code < 0x1B2FC ? (
(code <= 0x18D08 ? (
// Tangut
code <= 0x187F7 // W [6,136]
// Tangut Components, Khitan Small Script
|| (code >= 0x18800 && code <= 0x18CD5) // W [1,238]
// Tangut Supplement
|| (code >= 0x18CFF) // W [10]
) : code <= 0x1B122 ? (
// Kana Extended-B, Kana Supplement, Kana Extended-A
code >= 0x1AFF0 && code !== 0x1AFF4 && code !== 0x1AFFC && code !== 0x1AFFF // W [304]
) : (
// Small Kana Extension
code === 0x1B132 // W [1]
|| (code >= 0x1B150 && code <= 0x1B152) // W [3]
|| code === 0x1B155 // W [1]
|| (code >= 0x1B164 && code <= 0x1B167) // W [4]
// Nushu
|| code >= 0x1B170 // W [396]
)) ? 2 : 1
) : code < 0x1D245 ? (
(code < 0x1D167 ? (
// Duployan, Shorthand Format Controls
(code >= 0x1BC9D && code <= 0x1BCA3 && code !== 0x1BC9F) // Mn [2] & Cf [4]
// Znamenny Musical Notation
|| (code >= 0x1CF00 && code <= 0x1CF2D) // Mn [46]
|| (code >= 0x1CF30 && code <= 0x1CF46) // Mn [23]
) : (
// Musical Symbols
code <= 0x1D169 // Mn [3]
|| (code >= 0x1D173 && code <= 0x1D182) // Cf [8] & Mn [8]
|| (code >= 0x1D185 && code <= 0x1D18B) // Mn [7]
|| (code >= 0x1D1AA && code <= 0x1D1AD) // Mn [4]
// Ancient Greek Musical Notation
|| code >= 0x1D242 // Mn [3]
)) ? 0 : 1
) : code < 0x1DA00 ? (
(code <= 0x1D376 && (
// Tai Xuan Jing Symbols
(code >= 0x1D300 && code <= 0x1D356) // W [87]
// Counting Rod Numerals
|| code >= 0x1D360 // W [23]
)) ? 2 : 1
) : (code < 0x1E000 ? (
// Sutton SignWriting
code <= 0x1DA36 // Mn [55]
|| (code >= 0x1DA3B && code <= 0x1DA6C) // Mn [50]
|| code === 0x1DA75 // Mn [1]
|| code === 0x1DA84 // Mn [1]
|| (code >= 0x1DA9B && code <= 0x1DAAF && code !== 0x1DAA0) // Mn [20]
) : code < 0x1E02B ? (
// Glagolitic Supplement
(code <= 0x1E018 && code !== 0x1E007) // Mn [24]
|| (code >= 0x1E01B && code <= 0x1E021) // Mn [7]
|| (code >= 0x1E023 && code !== 0x1E025) // Mn [7]
) : (code <= 0x1E94A && (
// Cyrillic Extended-D
code === 0x1E08F // Mn [1]
// Nyiakeng Puachue Hmong
|| (code >= 0x1E130 && code <= 0x1E136) // Mn [7]
// Toto
|| code === 0x1E2AE // Mn [1]
// Wancho
|| (code >= 0x1E2EC && code <= 0x1E2EF) // Mn [4]
// Nag Mundari
|| (code >= 0x1E4EC && code <= 0x1E4EF) // Mn [4]
// Ol Onal
|| (code >= 0x1E5EE && code <= 0x1E5EF) // Mn [2]
// Mende Kikakui
|| (code >= 0x1E8D0 && code <= 0x1E8D6) // Mn [7]
// Adlam
|| code >= 0x1E944 // Mn [7]
))) ? 0 : 1;
}
// Mahjong Tiles ... CJK Unified Ideographs Extension H (1F000 - 323AF)
if (code <= 0x323AF) {
return (code < 0x1F200 ? (
// Mahjong Tiles
code === 0x1F004 // W [1]
// Playing Cards
|| code === 0x1F0CF // W [1]
// Enclosed Alphanumeric Supplement
|| code === 0x1F18E // W [1]
|| (code >= 0x1F191 && code <= 0x1F19A) // W [10]
) : code < 0x1F300 ? (
// Enclosed Ideographic Supplement
code <= 0x1F202 // W [3]
|| (code >= 0x1F210 && code <= 0x1F23B) // W [44]
|| (code >= 0x1F240 && code <= 0x1F248) // W [9]
|| (code >= 0x1F250 && code <= 0x1F251) // W [2]
|| (code >= 0x1F260 && code <= 0x1F265) // W [6]
) : code < 0x1F650 ? (
// Miscellaneous Symbols and Pictographs
code < 0x1F3F8 ? (
code <= 0x1F320 // W [33]
|| (code >= 0x1F32D && code <= 0x1F393 && code !== 0x1F336 && code !== 0x1F37D) // W [101]
|| (code >= 0x1F3A0 && code <= 0x1F3CA) // W [43]
|| (code >= 0x1F3CF && code <= 0x1F3D3) // W [5]
|| (code >= 0x1F3E0 && code <= 0x1F3F0) // W [17]
|| code === 0x1F3F4 // W [1]
) : (
(code <= 0x1F4FC && code !== 0x1F43F && code !== 0x1F441) // W [259]
|| (code >= 0x1F4FF && code <= 0x1F53D) // W [63]
|| (code >= 0x1F54B && code <= 0x1F567 && code !== 0x1F54F) // W [28]
|| code === 0x1F57A // W [1]
|| (code >= 0x1F595 && code <= 0x1F596) // W [2]
|| code === 0x1F5A4 // W [1]
// Emoticons
|| code >= 0x1F5FB // W [85]
)
) : code < 0x1F6FD ? (
// Transport and Map Symbols
code >= 0x1F680 && (
code <= 0x1F6C5 // W [70]
|| code === 0x1F6CC // W [1]
|| (code >= 0x1F6D0 && code <= 0x1F6D2) // W [3]
|| (code >= 0x1F6D5 && code <= 0x1F6D7) // W [3]
|| (code >= 0x1F6DC && code <= 0x1F6DF) // W [4]
|| (code >= 0x1F6EB && code <= 0x1F6EC) // W [2]
|| code >= 0x1F6F4 // W [9]
)
) : code < 0x1FA00 ? (
// Geometric Shapes Extended
(code >= 0x1F7E0 && code <= 0x1F7EB) // W [12]
|| (code === 0x1F7F0) // W [1]
// Supplemental Symbols and Pictographs
|| (code >= 0x1F90C && code !== 0x1F93B && code !== 0x1F946) // W [242]
) : code <= 0x1FAF8 ? (
// Symbols and Pictographs Extended-A
code >= 0x1FA70 && (code <= 0x1FAC6 ? (
code <= 0x1FA7C // W [13]
|| (code >= 0x1FA80 && code <= 0x1FA89) // W [10]
|| code >= 0x1FA8F // W [56]
) : (
(code >= 0x1FACE && code <= 0x1FADC) // W [15]
|| (code >= 0x1FADF && code <= 0x1FAE9) // W [11]
|| code >= 0x1FAF0 // W [9]
))
) : (code >= 0x20000 && (code <= 0x2CEA1 ? (
// CJK Unified Ideographs Extension B
code <= 0x2A6DF // W [42,720]
// CJK Unified Ideographs Extension C
|| (code >= 0x2A700 && code <= 0x2B739) // W [4,154]
// CJK Unified Ideographs Extension D
|| (code >= 0x2B740 && code <= 0x2B81D) // W [222]
// CJK Unified Ideographs Extension E
|| code >= 0x2B820 // W [5,762]
) : (
// CJK Unified Ideographs Extension F
(code >= 0x2CEB0 && code <= 0x2EBE0) // W [7,473]
// CJK Unified Ideographs Extension I
|| (code >= 0x2EBF0 && code <= 0x2EE5D) // W [622]
// CJK Compatibility Ideographs Supplement
|| (code >= 0x2F800 && code <= 0x2FA1D) // W [542]
// CJK Unified Ideographs Extension G
|| (code >= 0x30000 && code <= 0x3134A) // W [4,939]
// CJK Unified Ideographs Extension H
|| code >= 0x31350 // W [4,192]
)))) ? 2 : 1;
}
// Tags, Variation Selectors Supplement (E0000 - E01EF)
return (code >= 0xE0000 && code <= 0xE0FFF) ? 0 : 1; // Cn [3,759] & Cf [97] & Mn [240]
}