UNPKG

mathlive

Version:

Render and edit beautifully typeset math

784 lines (749 loc) 105 kB
/* Breaks a JavaScript string into individual user-perceived "characters" called extended grapheme clusters by implementing the Unicode UAX-29 standard, version 8.0.0 Usage: var splitter = new GraphemeSplitter(); //returns an array of strings, one string for each grapheme cluster var graphemes = splitter.splitGraphemes(string); */ const CR = 0, LF = 1, Control = 2, Extend = 3, Regional_Indicator = 4, SpacingMark = 5, L = 6, V = 7, T = 8, LV = 9, LVT = 10, Other = 11, Skin_Tone = 12; // Private function, gets a Unicode code point from a JavaScript UTF-16 string // handling surrogate pairs appropriately function codePointAt(str, idx){ idx = idx || 0; const code = str.charCodeAt(idx); // if a high surrogate if (0xD800 <= code && code <= 0xDBFF && idx < str.length - 1){ const hi = code; const low = str.charCodeAt(idx + 1); if (0xDC00 <= low && low <= 0xDFFF){ return ((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000; } return hi; } // if a low surrogate if (0xDC00 <= code && code <= 0xDFFF && idx >= 1){ const hi = str.charCodeAt(idx - 1); const low = code; if (0xD800 <= hi && hi <= 0xDBFF){ return ((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000; } return low; } //just return the char if an unmatched surrogate half or a //single-char codepoint return code; } // Private function, returns whether a break is allowed between the // two given grapheme breaking classes function shouldBreak(previous, current){ if (previous === Other && current === Skin_Tone) { // From version 10. Skin tone modifiers with emojis return false; } else if (previous === Extend && current === Other) { // From version 10. Combining emojis, such as the Bowie emoji return false; } else if (previous === Other && current === Extend) { // From version 10. Combining emojis, such as skin tones emojis return false; } else if(previous === CR && current === LF){ // GB3. CR X LF return false; } else if(previous === Control || previous === CR || previous === LF){ // GB4. (Control|CR|LF) ÷ return true; } else if(current === Control || current === CR || current === LF){ // GB5. ÷ (Control|CR|LF) return true; } else if(previous === L && (current === L || current === V || current === LV || current === LVT)){ // GB6. L X (L|V|LV|LVT) return false; } else if((previous === LV || previous === V) && // GB7. (LV|V) X (V|T) (current === V || current === T)){ return false; } else if((previous === LVT || previous === T) && current === T){ // GB8. (LVT|T) X (T) return false; } else if(previous === Regional_Indicator && current === Regional_Indicator){ // GB8a. Regional_Indicator X Regional_Indicator return false; } else if (current === Extend){ // GB9. X Extend return false; } else if(current === SpacingMark){ // GB9a. X SpacingMark return false; } // GB9b. Prepend X (there are currently no characters with this class) // else if previous is Prepend // return false // GB10. Any ÷ Any return true; } // Returns the next grapheme break in the string after the given index function nextBreak(string, index){ index = index || 0; if(index < 0){ return 0; } if(index >= string.length - 1){ return string.length; } let prev = getGraphemeBreakProperty(codePointAt(string, index)); for (let i = index + 1; i < string.length; i++) { // check for already processed low surrogates if(0xd800 <= string.charCodeAt(i - 1) && string.charCodeAt(i - 1) <= 0xdbff && 0xdc00 <= string.charCodeAt(i) && string.charCodeAt(i) <= 0xdfff){ continue; } const next = getGraphemeBreakProperty(codePointAt(string, i)); if(shouldBreak(prev, next)){ return i; } prev = next; } return string.length; } // Breaks the given string into an array of grapheme cluster strings function splitGraphemes(str){ // If it's all ASCII, short-circuit the grapheme splitting... if (/^[\x20-\xFF]*$/.test(str)) return str; const res = []; let index = 0; let brk; while((brk = nextBreak(str, index)) < str.length){ res.push(str.slice(index, brk)); index = brk; } if(index < str.length){ res.push(str.slice(index)); } return res; } // Returns the number of grapheme clusters there are in the given string function countGraphemes(str){ let count = 0; let index = 0; let brk; while((brk = nextBreak(str, index)) < str.length){ index = brk; count++; } if(index < str.length){ count++; } return count; } //given a Unicode code point, determines this symbol's grapheme break property function getGraphemeBreakProperty(code){ //grapheme break property for Unicode 8.0.0, //taken from http://www.unicode.org/Public/8.0.0/ucd/auxiliary/GraphemeBreakProperty.txt //and adapted to JavaScript rules if( 0x000D === code // Cc <control-000D> ){ return CR; } if( 0x000A === code // Cc <control-000A> ){ return LF; } if( (0x0000 <= code && code <= 0x0009) || // Cc [10] <control-0000>..<control-0009> (0x000B <= code && code <= 0x000C) || // Cc [2] <control-000B>..<control-000C> (0x000E <= code && code <= 0x001F) || // Cc [18] <control-000E>..<control-001F> (0x007F <= code && code <= 0x009F) || // Cc [33] <control-007F>..<control-009F> 0x00AD === code || // Cf SOFT HYPHEN (0x0600 <= code && code <= 0x0605) || // Cf [6] ARABIC NUMBER SIGN..ARABIC NUMBER MARK ABOVE 0x061C === code || // Cf ARABIC LETTER MARK 0x06DD === code || // Cf ARABIC END OF AYAH 0x070F === code || // Cf SYRIAC ABBREVIATION MARK 0x180E === code || // Cf MONGOLIAN VOWEL SEPARATOR 0x200B === code || // Cf ZERO WIDTH SPACE (0x200E <= code && code <= 0x200F) || // Cf [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK 0x2028 === code || // Zl LINE SEPARATOR 0x2029 === code || // Zp PARAGRAPH SEPARATOR (0x202A <= code && code <= 0x202E) || // Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE (0x2060 <= code && code <= 0x2064) || // Cf [5] WORD JOINER..INVISIBLE PLUS 0x2065 === code || // Cn <reserved-2065> (0x2066 <= code && code <= 0x206F) || // Cf [10] LEFT-TO-RIGHT ISOLATE..NOMINAL DIGIT SHAPES (0xD800 <= code && code <= 0xDFFF) || // Cs [2048] <surrogate-D800>..<surrogate-DFFF> 0xFEFF === code || // Cf ZERO WIDTH NO-BREAK SPACE (0xFFF0 <= code && code <= 0xFFF8) || // Cn [9] <reserved-FFF0>..<reserved-FFF8> (0xFFF9 <= code && code <= 0xFFFB) || // Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR 0x110BD === code || // Cf KAITHI NUMBER SIGN (0x1BCA0 <= code && code <= 0x1BCA3) || // Cf [4] SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP (0x1D173 <= code && code <= 0x1D17A) || // Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE 0xE0000 === code || // Cn <reserved-E0000> 0xE0001 === code || // Cf LANGUAGE TAG (0xE0002 <= code && code <= 0xE001F) || // Cn [30] <reserved-E0002>..<reserved-E001F> (0xE0020 <= code && code <= 0xE007F) || // Cf [96] TAG SPACE..CANCEL TAG (0xE0080 <= code && code <= 0xE00FF) || // Cn [128] <reserved-E0080>..<reserved-E00FF> (0xE01F0 <= code && code <= 0xE0FFF) // Cn [3600] <reserved-E01F0>..<reserved-E0FFF> ){ return Control; } if( (0x0300 <= code && code <= 0x036F) || // Mn [112] COMBINING GRAVE ACCENT..COMBINING LATIN SMALL LETTER X (0x0483 <= code && code <= 0x0487) || // Mn [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE (0x0488 <= code && code <= 0x0489) || // Me [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN (0x0591 <= code && code <= 0x05BD) || // Mn [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG 0x05BF === code || // Mn HEBREW POINT RAFE (0x05C1 <= code && code <= 0x05C2) || // Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT (0x05C4 <= code && code <= 0x05C5) || // Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT 0x05C7 === code || // Mn HEBREW POINT QAMATS QATAN (0x0610 <= code && code <= 0x061A) || // Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA (0x064B <= code && code <= 0x065F) || // Mn [21] ARABIC FATHATAN..ARABIC WAVY HAMZA BELOW 0x0670 === code || // Mn ARABIC LETTER SUPERSCRIPT ALEF (0x06D6 <= code && code <= 0x06DC) || // Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN (0x06DF <= code && code <= 0x06E4) || // Mn [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA (0x06E7 <= code && code <= 0x06E8) || // Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON (0x06EA <= code && code <= 0x06ED) || // Mn [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM 0x0711 === code || // Mn SYRIAC LETTER SUPERSCRIPT ALAPH (0x0730 <= code && code <= 0x074A) || // Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH (0x07A6 <= code && code <= 0x07B0) || // Mn [11] THAANA ABAFILI..THAANA SUKUN (0x07EB <= code && code <= 0x07F3) || // Mn [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE (0x0816 <= code && code <= 0x0819) || // Mn [4] SAMARITAN MARK IN..SAMARITAN MARK DAGESH (0x081B <= code && code <= 0x0823) || // Mn [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A (0x0825 <= code && code <= 0x0827) || // Mn [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U (0x0829 <= code && code <= 0x082D) || // Mn [5] SAMARITAN VOWEL SIGN LONG I..SAMARITAN MARK NEQUDAA (0x0859 <= code && code <= 0x085B) || // Mn [3] MANDAIC AFFRICATION MARK..MANDAIC GEMINATION MARK (0x08E3 <= code && code <= 0x0902) || // Mn [32] ARABIC TURNED DAMMA BELOW..DEVANAGARI SIGN ANUSVARA 0x093A === code || // Mn DEVANAGARI VOWEL SIGN OE 0x093C === code || // Mn DEVANAGARI SIGN NUKTA (0x0941 <= code && code <= 0x0948) || // Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI 0x094D === code || // Mn DEVANAGARI SIGN VIRAMA (0x0951 <= code && code <= 0x0957) || // Mn [7] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI VOWEL SIGN UUE (0x0962 <= code && code <= 0x0963) || // Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL 0x0981 === code || // Mn BENGALI SIGN CANDRABINDU 0x09BC === code || // Mn BENGALI SIGN NUKTA 0x09BE === code || // Mc BENGALI VOWEL SIGN AA (0x09C1 <= code && code <= 0x09C4) || // Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR 0x09CD === code || // Mn BENGALI SIGN VIRAMA 0x09D7 === code || // Mc BENGALI AU LENGTH MARK (0x09E2 <= code && code <= 0x09E3) || // Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL (0x0A01 <= code && code <= 0x0A02) || // Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI 0x0A3C === code || // Mn GURMUKHI SIGN NUKTA (0x0A41 <= code && code <= 0x0A42) || // Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU (0x0A47 <= code && code <= 0x0A48) || // Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI (0x0A4B <= code && code <= 0x0A4D) || // Mn [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA 0x0A51 === code || // Mn GURMUKHI SIGN UDAAT (0x0A70 <= code && code <= 0x0A71) || // Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK 0x0A75 === code || // Mn GURMUKHI SIGN YAKASH (0x0A81 <= code && code <= 0x0A82) || // Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA 0x0ABC === code || // Mn GUJARATI SIGN NUKTA (0x0AC1 <= code && code <= 0x0AC5) || // Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E (0x0AC7 <= code && code <= 0x0AC8) || // Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI 0x0ACD === code || // Mn GUJARATI SIGN VIRAMA (0x0AE2 <= code && code <= 0x0AE3) || // Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL 0x0B01 === code || // Mn ORIYA SIGN CANDRABINDU 0x0B3C === code || // Mn ORIYA SIGN NUKTA 0x0B3E === code || // Mc ORIYA VOWEL SIGN AA 0x0B3F === code || // Mn ORIYA VOWEL SIGN I (0x0B41 <= code && code <= 0x0B44) || // Mn [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR 0x0B4D === code || // Mn ORIYA SIGN VIRAMA 0x0B56 === code || // Mn ORIYA AI LENGTH MARK 0x0B57 === code || // Mc ORIYA AU LENGTH MARK (0x0B62 <= code && code <= 0x0B63) || // Mn [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL 0x0B82 === code || // Mn TAMIL SIGN ANUSVARA 0x0BBE === code || // Mc TAMIL VOWEL SIGN AA 0x0BC0 === code || // Mn TAMIL VOWEL SIGN II 0x0BCD === code || // Mn TAMIL SIGN VIRAMA 0x0BD7 === code || // Mc TAMIL AU LENGTH MARK 0x0C00 === code || // Mn TELUGU SIGN COMBINING CANDRABINDU ABOVE (0x0C3E <= code && code <= 0x0C40) || // Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II (0x0C46 <= code && code <= 0x0C48) || // Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI (0x0C4A <= code && code <= 0x0C4D) || // Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA (0x0C55 <= code && code <= 0x0C56) || // Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK (0x0C62 <= code && code <= 0x0C63) || // Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL 0x0C81 === code || // Mn KANNADA SIGN CANDRABINDU 0x0CBC === code || // Mn KANNADA SIGN NUKTA 0x0CBF === code || // Mn KANNADA VOWEL SIGN I 0x0CC2 === code || // Mc KANNADA VOWEL SIGN UU 0x0CC6 === code || // Mn KANNADA VOWEL SIGN E (0x0CCC <= code && code <= 0x0CCD) || // Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA (0x0CD5 <= code && code <= 0x0CD6) || // Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK (0x0CE2 <= code && code <= 0x0CE3) || // Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL 0x0D01 === code || // Mn MALAYALAM SIGN CANDRABINDU 0x0D3E === code || // Mc MALAYALAM VOWEL SIGN AA (0x0D41 <= code && code <= 0x0D44) || // Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR 0x0D4D === code || // Mn MALAYALAM SIGN VIRAMA 0x0D57 === code || // Mc MALAYALAM AU LENGTH MARK (0x0D62 <= code && code <= 0x0D63) || // Mn [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL 0x0DCA === code || // Mn SINHALA SIGN AL-LAKUNA 0x0DCF === code || // Mc SINHALA VOWEL SIGN AELA-PILLA (0x0DD2 <= code && code <= 0x0DD4) || // Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA 0x0DD6 === code || // Mn SINHALA VOWEL SIGN DIGA PAA-PILLA 0x0DDF === code || // Mc SINHALA VOWEL SIGN GAYANUKITTA 0x0E31 === code || // Mn THAI CHARACTER MAI HAN-AKAT (0x0E34 <= code && code <= 0x0E3A) || // Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU (0x0E47 <= code && code <= 0x0E4E) || // Mn [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN 0x0EB1 === code || // Mn LAO VOWEL SIGN MAI KAN (0x0EB4 <= code && code <= 0x0EB9) || // Mn [6] LAO VOWEL SIGN I..LAO VOWEL SIGN UU (0x0EBB <= code && code <= 0x0EBC) || // Mn [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN LO (0x0EC8 <= code && code <= 0x0ECD) || // Mn [6] LAO TONE MAI EK..LAO NIGGAHITA (0x0F18 <= code && code <= 0x0F19) || // Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS 0x0F35 === code || // Mn TIBETAN MARK NGAS BZUNG NYI ZLA 0x0F37 === code || // Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS 0x0F39 === code || // Mn TIBETAN MARK TSA -PHRU (0x0F71 <= code && code <= 0x0F7E) || // Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO (0x0F80 <= code && code <= 0x0F84) || // Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA (0x0F86 <= code && code <= 0x0F87) || // Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS (0x0F8D <= code && code <= 0x0F97) || // Mn [11] TIBETAN SUBJOINED SIGN LCE TSA CAN..TIBETAN SUBJOINED LETTER JA (0x0F99 <= code && code <= 0x0FBC) || // Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA 0x0FC6 === code || // Mn TIBETAN SYMBOL PADMA GDAN (0x102D <= code && code <= 0x1030) || // Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU (0x1032 <= code && code <= 0x1037) || // Mn [6] MYANMAR VOWEL SIGN AI..MYANMAR SIGN DOT BELOW (0x1039 <= code && code <= 0x103A) || // Mn [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT (0x103D <= code && code <= 0x103E) || // Mn [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA (0x1058 <= code && code <= 0x1059) || // Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL (0x105E <= code && code <= 0x1060) || // Mn [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA (0x1071 <= code && code <= 0x1074) || // Mn [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE 0x1082 === code || // Mn MYANMAR CONSONANT SIGN SHAN MEDIAL WA (0x1085 <= code && code <= 0x1086) || // Mn [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y 0x108D === code || // Mn MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE 0x109D === code || // Mn MYANMAR VOWEL SIGN AITON AI (0x135D <= code && code <= 0x135F) || // Mn [3] ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK..ETHIOPIC COMBINING GEMINATION MARK (0x1712 <= code && code <= 0x1714) || // Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA (0x1732 <= code && code <= 0x1734) || // Mn [3] HANUNOO VOWEL SIGN I..HANUNOO SIGN PAMUDPOD (0x1752 <= code && code <= 0x1753) || // Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U (0x1772 <= code && code <= 0x1773) || // Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U (0x17B4 <= code && code <= 0x17B5) || // Mn [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA (0x17B7 <= code && code <= 0x17BD) || // Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA 0x17C6 === code || // Mn KHMER SIGN NIKAHIT (0x17C9 <= code && code <= 0x17D3) || // Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT 0x17DD === code || // Mn KHMER SIGN ATTHACAN (0x180B <= code && code <= 0x180D) || // Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE 0x18A9 === code || // Mn MONGOLIAN LETTER ALI GALI DAGALGA (0x1920 <= code && code <= 0x1922) || // Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U (0x1927 <= code && code <= 0x1928) || // Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O 0x1932 === code || // Mn LIMBU SMALL LETTER ANUSVARA (0x1939 <= code && code <= 0x193B) || // Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I (0x1A17 <= code && code <= 0x1A18) || // Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U 0x1A1B === code || // Mn BUGINESE VOWEL SIGN AE 0x1A56 === code || // Mn TAI THAM CONSONANT SIGN MEDIAL LA (0x1A58 <= code && code <= 0x1A5E) || // Mn [7] TAI THAM SIGN MAI KANG LAI..TAI THAM CONSONANT SIGN SA 0x1A60 === code || // Mn TAI THAM SIGN SAKOT 0x1A62 === code || // Mn TAI THAM VOWEL SIGN MAI SAT (0x1A65 <= code && code <= 0x1A6C) || // Mn [8] TAI THAM VOWEL SIGN I..TAI THAM VOWEL SIGN OA BELOW (0x1A73 <= code && code <= 0x1A7C) || // Mn [10] TAI THAM VOWEL SIGN OA ABOVE..TAI THAM SIGN KHUEN-LUE KARAN 0x1A7F === code || // Mn TAI THAM COMBINING CRYPTOGRAMMIC DOT (0x1AB0 <= code && code <= 0x1ABD) || // Mn [14] COMBINING DOUBLED CIRCUMFLEX ACCENT..COMBINING PARENTHESES BELOW 0x1ABE === code || // Me COMBINING PARENTHESES OVERLAY (0x1B00 <= code && code <= 0x1B03) || // Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG 0x1B34 === code || // Mn BALINESE SIGN REREKAN (0x1B36 <= code && code <= 0x1B3A) || // Mn [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA 0x1B3C === code || // Mn BALINESE VOWEL SIGN LA LENGA 0x1B42 === code || // Mn BALINESE VOWEL SIGN PEPET (0x1B6B <= code && code <= 0x1B73) || // Mn [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG (0x1B80 <= code && code <= 0x1B81) || // Mn [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR (0x1BA2 <= code && code <= 0x1BA5) || // Mn [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU (0x1BA8 <= code && code <= 0x1BA9) || // Mn [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG (0x1BAB <= code && code <= 0x1BAD) || // Mn [3] SUNDANESE SIGN VIRAMA..SUNDANESE CONSONANT SIGN PASANGAN WA 0x1BE6 === code || // Mn BATAK SIGN TOMPI (0x1BE8 <= code && code <= 0x1BE9) || // Mn [2] BATAK VOWEL SIGN PAKPAK E..BATAK VOWEL SIGN EE 0x1BED === code || // Mn BATAK VOWEL SIGN KARO O (0x1BEF <= code && code <= 0x1BF1) || // Mn [3] BATAK VOWEL SIGN U FOR SIMALUNGUN SA..BATAK CONSONANT SIGN H (0x1C2C <= code && code <= 0x1C33) || // Mn [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T (0x1C36 <= code && code <= 0x1C37) || // Mn [2] LEPCHA SIGN RAN..LEPCHA SIGN NUKTA (0x1CD0 <= code && code <= 0x1CD2) || // Mn [3] VEDIC TONE KARSHANA..VEDIC TONE PRENKHA (0x1CD4 <= code && code <= 0x1CE0) || // Mn [13] VEDIC SIGN YAJURVEDIC MIDLINE SVARITA..VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA (0x1CE2 <= code && code <= 0x1CE8) || // Mn [7] VEDIC SIGN VISARGA SVARITA..VEDIC SIGN VISARGA ANUDATTA WITH TAIL 0x1CED === code || // Mn VEDIC SIGN TIRYAK 0x1CF4 === code || // Mn VEDIC TONE CANDRA ABOVE (0x1CF8 <= code && code <= 0x1CF9) || // Mn [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE (0x1DC0 <= code && code <= 0x1DF5) || // Mn [54] COMBINING DOTTED GRAVE ACCENT..COMBINING UP TACK ABOVE (0x1DFC <= code && code <= 0x1DFF) || // Mn [4] COMBINING DOUBLE INVERTED BREVE BELOW..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW (0x200C <= code && code <= 0x200D) || // Cf [2] ZERO WIDTH NON-JOINER..ZERO WIDTH JOINER (0x20D0 <= code && code <= 0x20DC) || // Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE (0x20DD <= code && code <= 0x20E0) || // Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH 0x20E1 === code || // Mn COMBINING LEFT RIGHT ARROW ABOVE (0x20E2 <= code && code <= 0x20E4) || // Me [3] COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE (0x20E5 <= code && code <= 0x20F0) || // Mn [12] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING ASTERISK ABOVE (0x2CEF <= code && code <= 0x2CF1) || // Mn [3] COPTIC COMBINING NI ABOVE..COPTIC COMBINING SPIRITUS LENIS 0x2D7F === code || // Mn TIFINAGH CONSONANT JOINER (0x2DE0 <= code && code <= 0x2DFF) || // Mn [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS (0x302A <= code && code <= 0x302D) || // Mn [4] IDEOGRAPHIC LEVEL TONE MARK..IDEOGRAPHIC ENTERING TONE MARK (0x302E <= code && code <= 0x302F) || // Mc [2] HANGUL SINGLE DOT TONE MARK..HANGUL DOUBLE DOT TONE MARK (0x3099 <= code && code <= 0x309A) || // Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK 0xA66F === code || // Mn COMBINING CYRILLIC VZMET (0xA670 <= code && code <= 0xA672) || // Me [3] COMBINING CYRILLIC TEN MILLIONS SIGN..COMBINING CYRILLIC THOUSAND MILLIONS SIGN (0xA674 <= code && code <= 0xA67D) || // Mn [10] COMBINING CYRILLIC LETTER UKRAINIAN IE..COMBINING CYRILLIC PAYEROK (0xA69E <= code && code <= 0xA69F) || // Mn [2] COMBINING CYRILLIC LETTER EF..COMBINING CYRILLIC LETTER IOTIFIED E (0xA6F0 <= code && code <= 0xA6F1) || // Mn [2] BAMUM COMBINING MARK KOQNDON..BAMUM COMBINING MARK TUKWENTIS 0xA802 === code || // Mn SYLOTI NAGRI SIGN DVISVARA 0xA806 === code || // Mn SYLOTI NAGRI SIGN HASANTA 0xA80B === code || // Mn SYLOTI NAGRI SIGN ANUSVARA (0xA825 <= code && code <= 0xA826) || // Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E 0xA8C4 === code || // Mn SAURASHTRA SIGN VIRAMA (0xA8E0 <= code && code <= 0xA8F1) || // Mn [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA (0xA926 <= code && code <= 0xA92D) || // Mn [8] KAYAH LI VOWEL UE..KAYAH LI TONE CALYA PLOPHU (0xA947 <= code && code <= 0xA951) || // Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R (0xA980 <= code && code <= 0xA982) || // Mn [3] JAVANESE SIGN PANYANGGA..JAVANESE SIGN LAYAR 0xA9B3 === code || // Mn JAVANESE SIGN CECAK TELU (0xA9B6 <= code && code <= 0xA9B9) || // Mn [4] JAVANESE VOWEL SIGN WULU..JAVANESE VOWEL SIGN SUKU MENDUT 0xA9BC === code || // Mn JAVANESE VOWEL SIGN PEPET 0xA9E5 === code || // Mn MYANMAR SIGN SHAN SAW (0xAA29 <= code && code <= 0xAA2E) || // Mn [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE (0xAA31 <= code && code <= 0xAA32) || // Mn [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE (0xAA35 <= code && code <= 0xAA36) || // Mn [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA 0xAA43 === code || // Mn CHAM CONSONANT SIGN FINAL NG 0xAA4C === code || // Mn CHAM CONSONANT SIGN FINAL M 0xAA7C === code || // Mn MYANMAR SIGN TAI LAING TONE-2 0xAAB0 === code || // Mn TAI VIET MAI KANG (0xAAB2 <= code && code <= 0xAAB4) || // Mn [3] TAI VIET VOWEL I..TAI VIET VOWEL U (0xAAB7 <= code && code <= 0xAAB8) || // Mn [2] TAI VIET MAI KHIT..TAI VIET VOWEL IA (0xAABE <= code && code <= 0xAABF) || // Mn [2] TAI VIET VOWEL AM..TAI VIET TONE MAI EK 0xAAC1 === code || // Mn TAI VIET TONE MAI THO (0xAAEC <= code && code <= 0xAAED) || // Mn [2] MEETEI MAYEK VOWEL SIGN UU..MEETEI MAYEK VOWEL SIGN AAI 0xAAF6 === code || // Mn MEETEI MAYEK VIRAMA 0xABE5 === code || // Mn MEETEI MAYEK VOWEL SIGN ANAP 0xABE8 === code || // Mn MEETEI MAYEK VOWEL SIGN UNAP 0xABED === code || // Mn MEETEI MAYEK APUN IYEK 0xFB1E === code || // Mn HEBREW POINT JUDEO-SPANISH VARIKA (0xFE00 <= code && code <= 0xFE0F) || // Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 (0xFE20 <= code && code <= 0xFE2F) || // Mn [16] COMBINING LIGATURE LEFT HALF..COMBINING CYRILLIC TITLO RIGHT HALF (0xFF9E <= code && code <= 0xFF9F) || // Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK 0x101FD === code || // Mn PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE 0x102E0 === code || // Mn COPTIC EPACT THOUSANDS MARK (0x10376 <= code && code <= 0x1037A) || // Mn [5] COMBINING OLD PERMIC LETTER AN..COMBINING OLD PERMIC LETTER SII (0x10A01 <= code && code <= 0x10A03) || // Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R (0x10A05 <= code && code <= 0x10A06) || // Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O (0x10A0C <= code && code <= 0x10A0F) || // Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA (0x10A38 <= code && code <= 0x10A3A) || // Mn [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW 0x10A3F === code || // Mn KHAROSHTHI VIRAMA (0x10AE5 <= code && code <= 0x10AE6) || // Mn [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW 0x11001 === code || // Mn BRAHMI SIGN ANUSVARA (0x11038 <= code && code <= 0x11046) || // Mn [15] BRAHMI VOWEL SIGN AA..BRAHMI VIRAMA (0x1107F <= code && code <= 0x11081) || // Mn [3] BRAHMI NUMBER JOINER..KAITHI SIGN ANUSVARA (0x110B3 <= code && code <= 0x110B6) || // Mn [4] KAITHI VOWEL SIGN U..KAITHI VOWEL SIGN AI (0x110B9 <= code && code <= 0x110BA) || // Mn [2] KAITHI SIGN VIRAMA..KAITHI SIGN NUKTA (0x11100 <= code && code <= 0x11102) || // Mn [3] CHAKMA SIGN CANDRABINDU..CHAKMA SIGN VISARGA (0x11127 <= code && code <= 0x1112B) || // Mn [5] CHAKMA VOWEL SIGN A..CHAKMA VOWEL SIGN UU (0x1112D <= code && code <= 0x11134) || // Mn [8] CHAKMA VOWEL SIGN AI..CHAKMA MAAYYAA 0x11173 === code || // Mn MAHAJANI SIGN NUKTA (0x11180 <= code && code <= 0x11181) || // Mn [2] SHARADA SIGN CANDRABINDU..SHARADA SIGN ANUSVARA (0x111B6 <= code && code <= 0x111BE) || // Mn [9] SHARADA VOWEL SIGN U..SHARADA VOWEL SIGN O (0x111CA <= code && code <= 0x111CC) || // Mn [3] SHARADA SIGN NUKTA..SHARADA EXTRA SHORT VOWEL MARK (0x1122F <= code && code <= 0x11231) || // Mn [3] KHOJKI VOWEL SIGN U..KHOJKI VOWEL SIGN AI 0x11234 === code || // Mn KHOJKI SIGN ANUSVARA (0x11236 <= code && code <= 0x11237) || // Mn [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA 0x112DF === code || // Mn KHUDAWADI SIGN ANUSVARA (0x112E3 <= code && code <= 0x112EA) || // Mn [8] KHUDAWADI VOWEL SIGN U..KHUDAWADI SIGN VIRAMA (0x11300 <= code && code <= 0x11301) || // Mn [2] GRANTHA SIGN COMBINING ANUSVARA ABOVE..GRANTHA SIGN CANDRABINDU 0x1133C === code || // Mn GRANTHA SIGN NUKTA 0x1133E === code || // Mc GRANTHA VOWEL SIGN AA 0x11340 === code || // Mn GRANTHA VOWEL SIGN II 0x11357 === code || // Mc GRANTHA AU LENGTH MARK (0x11366 <= code && code <= 0x1136C) || // Mn [7] COMBINING GRANTHA DIGIT ZERO..COMBINING GRANTHA DIGIT SIX (0x11370 <= code && code <= 0x11374) || // Mn [5] COMBINING GRANTHA LETTER A..COMBINING GRANTHA LETTER PA 0x114B0 === code || // Mc TIRHUTA VOWEL SIGN AA (0x114B3 <= code && code <= 0x114B8) || // Mn [6] TIRHUTA VOWEL SIGN U..TIRHUTA VOWEL SIGN VOCALIC LL 0x114BA === code || // Mn TIRHUTA VOWEL SIGN SHORT E 0x114BD === code || // Mc TIRHUTA VOWEL SIGN SHORT O (0x114BF <= code && code <= 0x114C0) || // Mn [2] TIRHUTA SIGN CANDRABINDU..TIRHUTA SIGN ANUSVARA (0x114C2 <= code && code <= 0x114C3) || // Mn [2] TIRHUTA SIGN VIRAMA..TIRHUTA SIGN NUKTA 0x115AF === code || // Mc SIDDHAM VOWEL SIGN AA (0x115B2 <= code && code <= 0x115B5) || // Mn [4] SIDDHAM VOWEL SIGN U..SIDDHAM VOWEL SIGN VOCALIC RR (0x115BC <= code && code <= 0x115BD) || // Mn [2] SIDDHAM SIGN CANDRABINDU..SIDDHAM SIGN ANUSVARA (0x115BF <= code && code <= 0x115C0) || // Mn [2] SIDDHAM SIGN VIRAMA..SIDDHAM SIGN NUKTA (0x115DC <= code && code <= 0x115DD) || // Mn [2] SIDDHAM VOWEL SIGN ALTERNATE U..SIDDHAM VOWEL SIGN ALTERNATE UU (0x11633 <= code && code <= 0x1163A) || // Mn [8] MODI VOWEL SIGN U..MODI VOWEL SIGN AI 0x1163D === code || // Mn MODI SIGN ANUSVARA (0x1163F <= code && code <= 0x11640) || // Mn [2] MODI SIGN VIRAMA..MODI SIGN ARDHACANDRA 0x116AB === code || // Mn TAKRI SIGN ANUSVARA 0x116AD === code || // Mn TAKRI VOWEL SIGN AA (0x116B0 <= code && code <= 0x116B5) || // Mn [6] TAKRI VOWEL SIGN U..TAKRI VOWEL SIGN AU 0x116B7 === code || // Mn TAKRI SIGN NUKTA (0x1171D <= code && code <= 0x1171F) || // Mn [3] AHOM CONSONANT SIGN MEDIAL LA..AHOM CONSONANT SIGN MEDIAL LIGATING RA (0x11722 <= code && code <= 0x11725) || // Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU (0x11727 <= code && code <= 0x1172B) || // Mn [5] AHOM VOWEL SIGN AW..AHOM SIGN KILLER (0x16AF0 <= code && code <= 0x16AF4) || // Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE (0x16B30 <= code && code <= 0x16B36) || // Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM (0x16F8F <= code && code <= 0x16F92) || // Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW (0x1BC9D <= code && code <= 0x1BC9E) || // Mn [2] DUPLOYAN THICK LETTER SELECTOR..DUPLOYAN DOUBLE MARK 0x1D165 === code || // Mc MUSICAL SYMBOL COMBINING STEM (0x1D167 <= code && code <= 0x1D169) || // Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 (0x1D16E <= code && code <= 0x1D172) || // Mc [5] MUSICAL SYMBOL COMBINING FLAG-1..MUSICAL SYMBOL COMBINING FLAG-5 (0x1D17B <= code && code <= 0x1D182) || // Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE (0x1D185 <= code && code <= 0x1D18B) || // Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE (0x1D1AA <= code && code <= 0x1D1AD) || // Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO (0x1D242 <= code && code <= 0x1D244) || // Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME (0x1DA00 <= code && code <= 0x1DA36) || // Mn [55] SIGNWRITING HEAD RIM..SIGNWRITING AIR SUCKING IN (0x1DA3B <= code && code <= 0x1DA6C) || // Mn [50] SIGNWRITING MOUTH CLOSED NEUTRAL..SIGNWRITING EXCITEMENT 0x1DA75 === code || // Mn SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS 0x1DA84 === code || // Mn SIGNWRITING LOCATION HEAD NECK (0x1DA9B <= code && code <= 0x1DA9F) || // Mn [5] SIGNWRITING FILL MODIFIER-2..SIGNWRITING FILL MODIFIER-6 (0x1DAA1 <= code && code <= 0x1DAAF) || // Mn [15] SIGNWRITING ROTATION MODIFIER-2..SIGNWRITING ROTATION MODIFIER-16 (0x1E8D0 <= code && code <= 0x1E8D6) || // Mn [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS (0xE0100 <= code && code <= 0xE01EF) // Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 ){ return Extend; } if( (0x1F1E6 <= code && code <= 0x1F1FF) // So [26] REGIONAL INDICATOR SYMBOL LETTER A..REGIONAL INDICATOR SYMBOL LETTER Z ){ return Regional_Indicator; } if( (0x1F3FB <= code && code <= 0x1F3FF) //EMOJI MODIFIER FITZPATRICK ){ return Skin_Tone; } if( 0x0903 === code || // Mc DEVANAGARI SIGN VISARGA 0x093B === code || // Mc DEVANAGARI VOWEL SIGN OOE (0x093E <= code && code <= 0x0940) || // Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II (0x0949 <= code && code <= 0x094C) || // Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU (0x094E <= code && code <= 0x094F) || // Mc [2] DEVANAGARI VOWEL SIGN PRISHTHAMATRA E..DEVANAGARI VOWEL SIGN AW (0x0982 <= code && code <= 0x0983) || // Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA (0x09BF <= code && code <= 0x09C0) || // Mc [2] BENGALI VOWEL SIGN I..BENGALI VOWEL SIGN II (0x09C7 <= code && code <= 0x09C8) || // Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI (0x09CB <= code && code <= 0x09CC) || // Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU 0x0A03 === code || // Mc GURMUKHI SIGN VISARGA (0x0A3E <= code && code <= 0x0A40) || // Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II 0x0A83 === code || // Mc GUJARATI SIGN VISARGA (0x0ABE <= code && code <= 0x0AC0) || // Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II 0x0AC9 === code || // Mc GUJARATI VOWEL SIGN CANDRA O (0x0ACB <= code && code <= 0x0ACC) || // Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU (0x0B02 <= code && code <= 0x0B03) || // Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA 0x0B40 === code || // Mc ORIYA VOWEL SIGN II (0x0B47 <= code && code <= 0x0B48) || // Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI (0x0B4B <= code && code <= 0x0B4C) || // Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU 0x0BBF === code || // Mc TAMIL VOWEL SIGN I (0x0BC1 <= code && code <= 0x0BC2) || // Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU (0x0BC6 <= code && code <= 0x0BC8) || // Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI (0x0BCA <= code && code <= 0x0BCC) || // Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU (0x0C01 <= code && code <= 0x0C03) || // Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA (0x0C41 <= code && code <= 0x0C44) || // Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR (0x0C82 <= code && code <= 0x0C83) || // Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA 0x0CBE === code || // Mc KANNADA VOWEL SIGN AA (0x0CC0 <= code && code <= 0x0CC1) || // Mc [2] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN U (0x0CC3 <= code && code <= 0x0CC4) || // Mc [2] KANNADA VOWEL SIGN VOCALIC R..KANNADA VOWEL SIGN VOCALIC RR (0x0CC7 <= code && code <= 0x0CC8) || // Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI (0x0CCA <= code && code <= 0x0CCB) || // Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO (0x0D02 <= code && code <= 0x0D03) || // Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA (0x0D3F <= code && code <= 0x0D40) || // Mc [2] MALAYALAM VOWEL SIGN I..MALAYALAM VOWEL SIGN II (0x0D46 <= code && code <= 0x0D48) || // Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI (0x0D4A <= code && code <= 0x0D4C) || // Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU (0x0D82 <= code && code <= 0x0D83) || // Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA (0x0DD0 <= code && code <= 0x0DD1) || // Mc [2] SINHALA VOWEL SIGN KETTI AEDA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA (0x0DD8 <= code && code <= 0x0DDE) || // Mc [7] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA (0x0DF2 <= code && code <= 0x0DF3) || // Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA 0x0E33 === code || // Lo THAI CHARACTER SARA AM 0x0EB3 === code || // Lo LAO VOWEL SIGN AM (0x0F3E <= code && code <= 0x0F3F) || // Mc [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES 0x0F7F === code || // Mc TIBETAN SIGN RNAM BCAD 0x1031 === code || // Mc MYANMAR VOWEL SIGN E (0x103B <= code && code <= 0x103C) || // Mc [2] MYANMAR CONSONANT SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA (0x1056 <= code && code <= 0x1057) || // Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR 0x1084 === code || // Mc MYANMAR VOWEL SIGN SHAN E 0x17B6 === code || // Mc KHMER VOWEL SIGN AA (0x17BE <= code && code <= 0x17C5) || // Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU (0x17C7 <= code && code <= 0x17C8) || // Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU (0x1923 <= code && code <= 0x1926) || // Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU (0x1929 <= code && code <= 0x192B) || // Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA (0x1930 <= code && code <= 0x1931) || // Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA (0x1933 <= code && code <= 0x1938) || // Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA (0x1A19 <= code && code <= 0x1A1A) || // Mc [2] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN O 0x1A55 === code || // Mc TAI THAM CONSONANT SIGN MEDIAL RA 0x1A57 === code || // Mc TAI THAM CONSONANT SIGN LA TANG LAI (0x1A6D <= code && code <= 0x1A72) || // Mc [6] TAI THAM VOWEL SIGN OY..TAI THAM VOWEL SIGN THAM AI 0x1B04 === code || // Mc BALINESE SIGN BISAH 0x1B35 === code || // Mc BALINESE VOWEL SIGN TEDUNG 0x1B3B === code || // Mc BALINESE VOWEL SIGN RA REPA TEDUNG (0x1B3D <= code && code <= 0x1B41) || // Mc [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG (0x1B43 <= code && code <= 0x1B44) || // Mc [2] BALINESE VOWEL SIGN PEPET TEDUNG..BALINESE ADEG ADEG 0x1B82 === code || // Mc SUNDANESE SIGN PANGWISAD 0x1BA1 === code || // Mc SUNDANESE CONSONANT SIGN PAMINGKAL (0x1BA6 <= code && code <= 0x1BA7) || // Mc [2] SUNDANESE VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG 0x1BAA === code || // Mc SUNDANESE SIGN PAMAAEH 0x1BE7 === code || // Mc BATAK VOWEL SIGN E (0x1BEA <= code && code <= 0x1BEC) || // Mc [3] BATAK VOWEL SIGN I..BATAK VOWEL SIGN O 0x1BEE === code || // Mc BATAK VOWEL SIGN U (0x1BF2 <= code && code <= 0x1BF3) || // Mc [2] BATAK PANGOLAT..BATAK PANONGONAN (0x1C24 <= code && code <= 0x1C2B) || // Mc [8] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN UU (0x1C34 <= code && code <= 0x1C35) || // Mc [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA CONSONANT SIGN KANG 0x1CE1 === code || // Mc VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA (0x1CF2 <= code && code <= 0x1CF3) || // Mc [2] VEDIC SIGN ARDHAVISARGA..VEDIC SIGN ROTATED ARDHAVISARGA (0xA823 <= code && code <= 0xA824) || // Mc [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I 0xA827 === code || // Mc SYLOTI NAGRI VOWEL SIGN OO (0xA880 <= code && code <= 0xA881) || // Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA (0xA8B4 <= code && code <= 0xA8C3) || // Mc [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU (0xA952 <= code && code <= 0xA953) || // Mc [2] REJANG CONSONANT SIGN H..REJANG VIRAMA 0xA983 === code || // Mc JAVANESE SIGN WIGNYAN (0xA9B4 <= code && code <= 0xA9B5) || // Mc [2] JAVANESE VOWEL SIGN TARUNG..JAVANESE VOWEL SIGN TOLONG (0xA9BA <= code && code <= 0xA9BB) || // Mc [2] JAVANESE VOWEL SIGN TALING..JAVANESE VOWEL SIGN DIRGA MURE (0xA9BD <= code && code <= 0xA9C0) || // Mc [4] JAVANESE CONSONANT SIGN KERET..JAVANESE PANGKON (0xAA2F <= code && code <= 0xAA30) || // Mc [2] CHAM VOWEL SIGN O..CHAM VOWEL SIGN AI (0xAA33 <= code && code <= 0xAA34) || // Mc [2] CHAM CONSONANT SIGN YA..CHAM CONSONANT SIGN RA 0xAA4D === code || // Mc CHAM CONSONANT SIGN FINAL H 0xAAEB === code || // Mc MEETEI MAYEK VOWEL SIGN II (0xAAEE <= code && code <= 0xAAEF) || // Mc [2] MEETEI MAYEK VOWEL SIGN AU..MEETEI MAYEK VOWEL SIGN AAU 0xAAF5 === code || // Mc MEETEI MAYEK VOWEL SIGN VISARGA (0xABE3 <= code && code <= 0xABE4) || // Mc [2] MEETEI MAYEK VOWEL SIGN ONAP..MEETEI MAYEK VOWEL SIGN INAP (0xABE6 <= code && code <= 0xABE7) || // Mc [2] MEETEI MAYEK VOWEL SIGN YENAP..MEETEI MAYEK VOWEL SIGN SOUNAP (0xABE9 <= code && code <= 0xABEA) || // Mc [2] MEETEI MAYEK VOWEL SIGN CHEINAP..MEETEI MAYEK VOWEL SIGN NUNG 0xABEC === code || // Mc MEETEI MAYEK LUM IYEK 0x11000 === code || // Mc BRAHMI SIGN CANDRABINDU 0x11002 === code || // Mc BRAHMI SIGN VISARGA 0x11082 === code || // Mc KAITHI SIGN VISARGA (0x110B0 <= code && code <= 0x110B2) || // Mc [3] KAITHI VOWEL SIGN AA..KAITHI VOWEL SIGN II (0x110B7 <= code && code <= 0x110B8) || // Mc [2] KAITHI VOWEL SIGN O..KAITHI VOWEL SIGN AU 0x1112C === code || // Mc CHAKMA VOWEL SIGN E 0x11182 === code || // Mc SHARADA SIGN VISARGA (0x111B3 <= code && code <= 0x111B5) || // Mc [3] SHARADA VOWEL SIGN AA..SHARADA VOWEL SIGN II (0x111BF <= code && code <= 0x111C0) || // Mc [2] SHARADA VOWEL SIGN AU..SHARADA SIGN VIRAMA (0x1122C <= code && code <= 0x1122E) || // Mc [3] KHOJKI VOWEL SIGN AA..KHOJKI VOWEL SIGN II (0x11232 <= code && code <= 0x11233) || // Mc [2] KHOJKI VOWEL SIGN O..KHOJKI VOWEL SIGN AU 0x11235 === code || // Mc KHOJKI SIGN VIRAMA (0x112E0 <= code && code <= 0x112E2) || // Mc [3] KHUDAWADI VOWEL SIGN AA..KHUDAWADI VOWEL SIGN II (0x11302 <= code && code <= 0x11303) || // Mc [2] GRANTHA SIGN ANUSVARA..GRANTHA SIGN VISARGA 0x1133F === code || // Mc GRANTHA VOWEL SIGN I (0x11341 <= code && code <= 0x11344) || // Mc [4] GRANTHA VOWEL SIGN U..GRANTHA VOWEL SIGN VOCALIC RR (0x11347 <= code && code <= 0x11348) || // Mc [2] GRANTHA VOWEL SIGN EE..GRANTHA VOWEL SIGN AI (0x1134B <= code && code <= 0x1134D) || // Mc [3] GRANTHA VOWEL SIGN OO..GRANTHA SIGN VIRAMA (0x11362 <= code && code <= 0x11363) || // Mc [2] GRANTHA VOWEL SIGN VOCALIC L..GRANTHA VOWEL SIGN VOCALIC LL (0x114B1 <= code && code <= 0x114B2) || // Mc [2] TIRHUTA VOWEL SIGN I..TIRHUTA VOWEL SIGN II 0x114B9 === code || // Mc TIRHUTA VOWEL SIGN E (0x114BB <= code && code <= 0x114BC) || // Mc [2] TIRHUTA VOWEL SIGN AI..TIRHUTA VOWEL SIGN O 0x114BE === code || // Mc TIRHUTA VOWEL SIGN AU 0x114C1 === code || // Mc TIRHUTA SIGN VISARGA (0x115B0 <= code && code <= 0x115B1) || // Mc [2] SIDDHAM VOWEL SIGN I..SIDDHAM VOWEL SIGN II (0x115B8 <= code && code <= 0x115BB) || // Mc [4] SIDDHAM VOWEL SIGN E..SIDDHAM VOWEL SIGN AU 0x115BE === code || // Mc SIDDHAM SIGN VISARGA (0x11630 <= code && code <= 0x11632) || // Mc [3] MODI VOWEL SIGN AA..MODI VOWEL SIGN II (0x1163B <= code && code <= 0x1163C) || // Mc [2] MODI VOWEL SIGN O..MODI VOWEL SIGN AU 0x1163E === code || // Mc MODI SIGN VISARGA 0x116AC === code || // Mc TAKRI SIGN VISARGA (0x116AE <= code && code <= 0x116AF) || // Mc [2] TAKRI VOWEL SIGN I..TAKRI VOWEL SIGN II 0x116B6 === code || // Mc TAKRI SIGN VIRAMA (0x11720 <= code && code <= 0x11721) || // Mc [2] AHOM VOWEL SIGN A..AHOM VOWEL SIGN AA 0x11726 === code || // Mc AHOM VOWEL SIGN E (0x16F51 <= code && code <= 0x16F7E) || // Mc [46] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN NG 0x1D166 === code || // Mc MUSICAL SYMBOL COMBINING SPRECHGESANG STEM 0x1D16D === code // Mc MUSICAL SYMBOL COMBINING AUGMENTATION DOT ){ return SpacingMark; } if( (0x1100 <= code && code <= 0x115F) || // Lo [96] HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG FILLER (0xA960 <= code && code <= 0xA97C) // Lo [29] HANGUL CHOSEONG TIKEUT-MIEUM..HANGUL CHOSEONG SSANGYEORINHIEUH ){ return L; } if( (0x1160 <= code && code <= 0x11A7) || // Lo [72] HANGUL JUNGSEONG FILLER..HANGUL JUNGSEONG O-YAE (0xD7B0 <= code && code <= 0xD7C6) // Lo [23] HANGUL JUNGSEONG O-YEO..HANGUL JUNGSEONG ARAEA-E ){ return V; } if( (0x11A8 <= code && code <= 0x11FF) || // Lo [88] HANGUL JONGSEONG KIYEOK..HANGUL JONGSEONG SSANGNIEUN (0xD7CB <= code && code <= 0xD7FB) // Lo [49] HANGUL JONGSEONG NIEUN-RIEUL..HANGUL JONGSEONG PHIEUPH-THIEUTH ){ return T; } if( 0xAC00 === code || // Lo HANGUL SYLLABLE GA 0xAC1C === code || // Lo HANGUL SYLLABLE GAE 0xAC38 === code || // Lo HANGUL SYLLABLE GYA 0xAC54 === code || // Lo HANGUL SYLLABLE GYAE 0xAC70 === code || // Lo HANGUL SYLLABLE GEO 0xAC8C === code || // Lo HANGUL SYLLABLE GE 0xACA8 === code || // Lo HANGUL SYLLABLE GYEO 0xACC4 === code || // Lo HANGUL SYLLABLE GYE 0xACE0 === code || // Lo HANGUL SYLLABLE GO 0xACFC === code || // Lo HANGUL SYLLABLE GWA 0xAD18 === code || // Lo HANGUL SYLLABLE GWAE 0xAD34 === code || // Lo HANGUL SYLLABLE GOE 0xAD50 === code || // Lo HANGUL SYLLABLE GYO 0xAD6C === code || // Lo HANGUL SYLLABLE GU 0xAD88 === code || // Lo HANGUL SYLLABLE GWEO 0xADA4 === code || // Lo HANGUL SYLLABLE GWE 0xADC0 === code || // Lo HANGUL SYLLABLE GWI 0xADDC === code || // Lo HANGUL SYLLABLE GYU 0xADF8 === code || // Lo HANGUL SYLLABLE GEU 0xAE14 === code || // Lo HANGUL SYLLABLE GYI 0xAE30 === code || // Lo HANGUL SYLLABLE GI 0xAE4C === code || // Lo HANGUL SYLLABLE GGA 0xAE68 === code || // Lo HANGUL SYLLABLE GGAE 0xAE84 === code || // Lo HANGUL SYLLABLE GGYA 0xAEA0 === code || // Lo HANGUL SYLLABLE GGYAE 0xAEBC === code || // Lo HANGUL SYLLABLE GGEO 0xAED8 === code || // Lo HANGUL SYLLABLE GGE 0xAEF4 === code || // Lo HANGUL SYLLABLE GGYEO 0xAF10 === code || // Lo HANGUL SYLLABLE GGYE 0xAF2C === code || // Lo HANGUL SYLLABLE GGO 0xAF48 === code || // Lo HANGUL SYLLABLE GGWA 0xAF64 === code || // Lo HANGUL SYLLABLE GGWAE 0xAF80 === code || // Lo HANGUL SYLLABLE GGOE 0xAF9C === code || // Lo HANGUL SYLLABLE GGYO 0xAFB8 === code || // Lo HANGUL SYLLABLE GGU 0xAFD4 === code || // Lo HANGUL SYLLABLE GGWEO 0xAFF0 === code || // Lo HANGUL SYLLABLE GGWE 0xB00C === code || // Lo HANGUL SYLLABLE GGWI 0xB028 === code || // Lo HANGUL SYLLABLE GGYU 0xB044 === code || // Lo HANGUL SYLLABLE GGEU 0xB060 === code || // Lo HANGUL SYLLABLE GGYI 0xB07C === code || // Lo HANGUL SYLLABLE GGI 0xB098 === code || // Lo HANGUL SYLLABLE NA 0xB0B4 === code || // Lo HANGUL SYLLABLE NAE 0xB0D0 === code || // Lo HANGUL SYLLABLE NYA 0xB0EC === code || // Lo HANGUL SYLLABLE NYAE 0xB108 === code || // Lo HANGUL SYLLABLE NEO 0xB124 === code || // Lo HANGUL SYLLABLE NE 0xB140 === code || // Lo HANGUL SYLLABLE NYEO 0xB15C === code || // Lo HANGUL SYLLABLE NYE 0xB178 === code || // Lo HANGUL SYLLABLE NO 0xB194 === code || // Lo HANGUL SYLLABLE NWA 0xB1B0 === code || // Lo HANGUL SYLLABLE NWAE 0xB1CC === code || // Lo HANGUL SYLLABLE NOE 0xB1E8 === code || // Lo HANGUL SYLLABLE NYO 0xB204 === code || // Lo HANGUL SYLLABLE NU 0xB220 === code || // Lo HANGUL SYLLABLE NWEO 0xB23C === code || // Lo HANGUL SYLLABLE NWE 0xB258 === code || // Lo HANGUL SYLLABLE NWI 0xB274 === code || // Lo HANGUL SYLLABLE NYU 0xB290 === code || // Lo HANGUL SYLLABLE NEU 0xB2AC === code || // Lo HANGUL SYLLABLE NYI 0xB2C8 === code || // Lo HANGUL SYLLABLE NI 0xB2E4 === code || // Lo HANGUL SYLLABLE DA 0xB300 === code || // Lo HANGUL SYLLABLE DAE 0xB31C === code || // Lo HANGUL SYLLABLE DYA 0xB338 === code || // Lo HANGUL SYLLABLE DYAE 0xB354 === code || // Lo HANGUL SYLLABLE DEO 0xB370 === code || // Lo HANGUL SYLLABLE DE 0xB38C === code || // Lo HANGUL SYLLABLE DYEO 0xB3A8 === code || // Lo HANGUL SYLLABLE DYE 0xB3C4 === code || // Lo HANGUL SYLLABLE DO 0xB3E0 === code || // Lo HANGUL SYLLABLE DWA 0xB3FC === code || // Lo HANGUL SYLLABLE DWAE 0xB418 === code || // Lo HANGUL SYLLABLE DOE 0xB434 === code || // Lo HANGUL SYLLABLE DYO 0xB450 === code || // Lo HANGUL SYLLABLE DU 0xB46C === code || // Lo HANGUL SYLLABLE DWEO 0xB488 === code || // Lo HANGUL SYLLABLE DWE 0xB4A4 === code || // Lo HANGUL SYLLABLE DWI 0xB4C0 === code || // Lo HANGUL SYLLABLE DYU 0xB4DC === code || // Lo HANGUL SYLLABLE DEU 0xB4F8 === code || // Lo HANGUL SYLLABLE DYI 0xB514 === code || // Lo