From 1d7ed3b472421d8600fca79d541b5b80b4f15ac2 Mon Sep 17 00:00:00 2001 From: Matt Ellis Date: Mon, 2 Sep 2024 18:03:10 +0100 Subject: [PATCH 01/17] Add tests for digraph output --- .../commands/DigraphsCommandTest.kt | 241 +++++++++++++++++- 1 file changed, 240 insertions(+), 1 deletion(-) diff --git a/src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/commands/DigraphsCommandTest.kt b/src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/commands/DigraphsCommandTest.kt index 92cce3cc76..a4920cba99 100644 --- a/src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/commands/DigraphsCommandTest.kt +++ b/src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/commands/DigraphsCommandTest.kt @@ -12,12 +12,251 @@ import com.maddyhome.idea.vim.api.injector import com.maddyhome.idea.vim.vimscript.model.commands.DigraphCommand import org.jetbrains.plugins.ideavim.VimTestCase import org.junit.jupiter.api.Assertions.assertTrue +import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test +import org.junit.jupiter.api.TestInfo class DigraphsCommandTest : VimTestCase() { + @BeforeEach + override fun setUp(testInfo: TestInfo) { + super.setUp(testInfo) + configureByText("\n") + } + @Test fun `test digraphs is parsed correctly`() { val exCommand = injector.vimscriptParser.parseCommand("digraphs") assertTrue(exCommand is DigraphCommand) } -} \ No newline at end of file + + @Test + fun `test digraph output`() { + assertCommandOutput("digraphs", + """ + |NU ^@ 0000 SH ^A 0001 SX ^B 0002 EX ^C 0003 ET ^D 0004 EQ ^E 0005 + |AK ^F 0006 BL ^G 0007 BS ^H 0008 HT ^I 0009 LF ^J 000a VT ^K 000b + |FF ^L 000c CR ^M 000d SO ^N 000e SI ^O 000f DL ^P 0010 D1 ^Q 0011 + |D2 ^R 0012 D3 ^S 0013 D4 ^T 0014 NK ^U 0015 SY ^V 0016 EB ^W 0017 + |CN ^X 0018 EM ^Y 0019 SB ^Z 001a EC ^[ 001b FS ^\ 001c GS ^] 001d + |RS ^^ 001e US ^_ 001f SP 0020 Nb # 0023 DO ${'$'} 0024 At @ 0040 + |<( [ 005b // \ 005c )> ] 005d '> ^ 005e '! ` 0060 (! { 007b + |!! | 007c !) } 007d '? ~ 007e DT  007f PA ~@ 0080 HO ~A 0081 + |BH ~B 0082 NH ~C 0083 IN ~D 0084 NL ~E 0085 SA ~F 0086 ES ~G 0087 + |HS ~H 0088 HJ ~I 0089 VS ~J 008a PD ~K 008b PU ~L 008c RI ~M 008d + |S2 ~N 008e S3 ~O 008f DC ~P 0090 P1 ~Q 0091 P2 ~R 0092 TS ~S 0093 + |CC ~T 0094 MW ~U 0095 SG ~V 0096 EG ~W 0097 SS ~X 0098 GC ~Y 0099 + |SC ~Z 009a CI ~[ 009b ST ~\ 009c OC ~] 009d PM ~^ 009e AC ~_ 009f + |NS   00a0 !I ¡ 00a1 Ct ¢ 00a2 Pd £ 00a3 Cu ¤ 00a4 Ye ¥ 00a5 + |BB ¦ 00a6 SE § 00a7 ': ¨ 00a8 Co © 00a9 -a ª 00aa << « 00ab + |NO ¬ 00ac -- ­ 00ad Rg ® 00ae 'm ¯ 00af DG ° 00b0 +- ± 00b1 + |2S ² 00b2 3S ³ 00b3 '' ´ 00b4 My µ 00b5 PI ¶ 00b6 .M · 00b7 + |', ¸ 00b8 1S ¹ 00b9 -o º 00ba >> » 00bb 14 ¼ 00bc 12 ½ 00bd + |34 ¾ 00be ?I ¿ 00bf A! À 00c0 A' Á 00c1 A>  00c2 A? à 00c3 + |A: Ä 00c4 AA Å 00c5 AE Æ 00c6 C, Ç 00c7 E! È 00c8 E' É 00c9 + |E> Ê 00ca E: Ë 00cb I! Ì 00cc I' Í 00cd I> Î 00ce I: Ï 00cf + |D- Ð 00d0 N? Ñ 00d1 O! Ò 00d2 O' Ó 00d3 O> Ô 00d4 O? Õ 00d5 + |O: Ö 00d6 *X × 00d7 O/ Ø 00d8 U! Ù 00d9 U' Ú 00da U> Û 00db + |U: Ü 00dc Y' Ý 00dd TH Þ 00de ss ß 00df a! à 00e0 a' á 00e1 + |a> â 00e2 a? ã 00e3 a: ä 00e4 aa å 00e5 ae æ 00e6 c, ç 00e7 + |e! è 00e8 e' é 00e9 e> ê 00ea e: ë 00eb i! ì 00ec i' í 00ed + |i> î 00ee i: ï 00ef d- ð 00f0 n? ñ 00f1 o! ò 00f2 o' ó 00f3 + |o> ô 00f4 o? õ 00f5 o: ö 00f6 -: ÷ 00f7 o/ ø 00f8 u! ù 00f9 + |u' ú 00fa u> û 00fb u: ü 00fc y' ý 00fd th þ 00fe y: ÿ 00ff + |A- Ā 0100 a- ā 0101 A( Ă 0102 a( ă 0103 A; Ą 0104 a; ą 0105 + |C' Ć 0106 c' ć 0107 C> Ĉ 0108 c> ĉ 0109 C. Ċ 010a c. ċ 010b + |C< Č 010c c< č 010d D< Ď 010e d< ď 010f D/ Đ 0110 d/ đ 0111 + |E- Ē 0112 e- ē 0113 E( Ĕ 0114 e( ĕ 0115 E. Ė 0116 e. ė 0117 + |E; Ę 0118 e; ę 0119 E< Ě 011a e< ě 011b G> Ĝ 011c g> ĝ 011d + |G( Ğ 011e g( ğ 011f G. Ġ 0120 g. ġ 0121 G, Ģ 0122 g, ģ 0123 + |H> Ĥ 0124 h> ĥ 0125 H/ Ħ 0126 h/ ħ 0127 I? Ĩ 0128 i? ĩ 0129 + |I- Ī 012a i- ī 012b I( Ĭ 012c i( ĭ 012d I; Į 012e i; į 012f + |I. İ 0130 i. ı 0131 IJ IJ 0132 ij ij 0133 J> Ĵ 0134 j> ĵ 0135 + |K, Ķ 0136 k, ķ 0137 kk ĸ 0138 L' Ĺ 0139 l' ĺ 013a L, Ļ 013b + |l, ļ 013c L< Ľ 013d l< ľ 013e L. Ŀ 013f l. ŀ 0140 L/ Ł 0141 + |l/ ł 0142 N' Ń 0143 n' ń 0144 N, Ņ 0145 n, ņ 0146 N< Ň 0147 + |n< ň 0148 'n ʼn 0149 NG Ŋ 014a ng ŋ 014b O- Ō 014c o- ō 014d + |O( Ŏ 014e o( ŏ 014f O" Ő 0150 o" ő 0151 OE Œ 0152 oe œ 0153 + |R' Ŕ 0154 r' ŕ 0155 R, Ŗ 0156 r, ŗ 0157 R< Ř 0158 r< ř 0159 + |S' Ś 015a s' ś 015b S> Ŝ 015c s> ŝ 015d S, Ş 015e s, ş 015f + |S< Š 0160 s< š 0161 T, Ţ 0162 t, ţ 0163 T< Ť 0164 t< ť 0165 + |T/ Ŧ 0166 t/ ŧ 0167 U? Ũ 0168 u? ũ 0169 U- Ū 016a u- ū 016b + |U( Ŭ 016c u( ŭ 016d U0 Ů 016e u0 ů 016f U" Ű 0170 u" ű 0171 + |U; Ų 0172 u; ų 0173 W> Ŵ 0174 w> ŵ 0175 Y> Ŷ 0176 y> ŷ 0177 + |Y: Ÿ 0178 Z' Ź 0179 z' ź 017a Z. Ż 017b z. ż 017c Z< Ž 017d + |z< ž 017e O9 Ơ 01a0 o9 ơ 01a1 OI Ƣ 01a2 oi ƣ 01a3 yr Ʀ 01a6 + |U9 Ư 01af u9 ư 01b0 Z/ Ƶ 01b5 z/ ƶ 01b6 ED Ʒ 01b7 A< Ǎ 01cd + |a< ǎ 01ce I< Ǐ 01cf i< ǐ 01d0 O< Ǒ 01d1 o< ǒ 01d2 U< Ǔ 01d3 + |u< ǔ 01d4 A1 Ǟ 01de a1 ǟ 01df A7 Ǡ 01e0 a7 ǡ 01e1 A3 Ǣ 01e2 + |a3 ǣ 01e3 G/ Ǥ 01e4 g/ ǥ 01e5 G< Ǧ 01e6 g< ǧ 01e7 K< Ǩ 01e8 + |k< ǩ 01e9 O; Ǫ 01ea o; ǫ 01eb O1 Ǭ 01ec o1 ǭ 01ed EZ Ǯ 01ee + |ez ǯ 01ef j< ǰ 01f0 G' Ǵ 01f4 g' ǵ 01f5 ;S ʿ 02bf '< ˇ 02c7 + |'( ˘ 02d8 '. ˙ 02d9 '0 ˚ 02da '; ˛ 02db '" ˝ 02dd A% Ά 0386 + |E% Έ 0388 Y% Ή 0389 I% Ί 038a O% Ό 038c U% Ύ 038e W% Ώ 038f + |i3 ΐ 0390 A* Α 0391 B* Β 0392 G* Γ 0393 D* Δ 0394 E* Ε 0395 + |Z* Ζ 0396 Y* Η 0397 H* Θ 0398 I* Ι 0399 K* Κ 039a L* Λ 039b + |M* Μ 039c N* Ν 039d C* Ξ 039e O* Ο 039f P* Π 03a0 R* Ρ 03a1 + |S* Σ 03a3 T* Τ 03a4 U* Υ 03a5 F* Φ 03a6 X* Χ 03a7 Q* Ψ 03a8 + |W* Ω 03a9 J* Ϊ 03aa V* Ϋ 03ab a% ά 03ac e% έ 03ad y% ή 03ae + |i% ί 03af u3 ΰ 03b0 a* α 03b1 b* β 03b2 g* γ 03b3 d* δ 03b4 + |e* ε 03b5 z* ζ 03b6 y* η 03b7 h* θ 03b8 i* ι 03b9 k* κ 03ba + |l* λ 03bb m* μ 03bc n* ν 03bd c* ξ 03be o* ο 03bf p* π 03c0 + |r* ρ 03c1 *s ς 03c2 s* σ 03c3 t* τ 03c4 u* υ 03c5 f* φ 03c6 + |x* χ 03c7 q* ψ 03c8 w* ω 03c9 j* ϊ 03ca v* ϋ 03cb o% ό 03cc + |u% ύ 03cd w% ώ 03ce 'G Ϙ 03d8 ,G ϙ 03d9 T3 Ϛ 03da t3 ϛ 03db + |M3 Ϝ 03dc m3 ϝ 03dd K3 Ϟ 03de k3 ϟ 03df P3 Ϡ 03e0 p3 ϡ 03e1 + |'% ϴ 03f4 j3 ϵ 03f5 IO Ё 0401 D% Ђ 0402 G% Ѓ 0403 IE Є 0404 + |DS Ѕ 0405 II І 0406 YI Ї 0407 J% Ј 0408 LJ Љ 0409 NJ Њ 040a + |Ts Ћ 040b KJ Ќ 040c V% Ў 040e DZ Џ 040f A= А 0410 B= Б 0411 + |V= В 0412 G= Г 0413 D= Д 0414 E= Е 0415 Z% Ж 0416 Z= З 0417 + |I= И 0418 J= Й 0419 K= К 041a L= Л 041b M= М 041c N= Н 041d + |O= О 041e P= П 041f R= Р 0420 S= С 0421 T= Т 0422 U= У 0423 + |F= Ф 0424 H= Х 0425 C= Ц 0426 C% Ч 0427 S% Ш 0428 Sc Щ 0429 + |=" Ъ 042a Y= Ы 042b %" Ь 042c JE Э 042d JU Ю 042e JA Я 042f + |a= а 0430 b= б 0431 v= в 0432 g= г 0433 d= д 0434 e= е 0435 + |z% ж 0436 z= з 0437 i= и 0438 j= й 0439 k= к 043a l= л 043b + |m= м 043c n= н 043d o= о 043e p= п 043f r= р 0440 s= с 0441 + |t= т 0442 u= у 0443 f= ф 0444 h= х 0445 c= ц 0446 c% ч 0447 + |s% ш 0448 sc щ 0449 =' ъ 044a y= ы 044b %' ь 044c je э 044d + |ju ю 044e ja я 044f io ё 0451 d% ђ 0452 g% ѓ 0453 ie є 0454 + |ds ѕ 0455 ii і 0456 yi ї 0457 j% ј 0458 lj љ 0459 nj њ 045a + |ts ћ 045b kj ќ 045c v% ў 045e dz џ 045f Y3 Ѣ 0462 y3 ѣ 0463 + |O3 Ѫ 046a o3 ѫ 046b F3 Ѳ 0472 f3 ѳ 0473 V3 Ѵ 0474 v3 ѵ 0475 + |C3 Ҁ 0480 c3 ҁ 0481 G3 Ґ 0490 g3 ґ 0491 A+ א 05d0 B+ ב 05d1 + |G+ ג 05d2 D+ ד 05d3 H+ ה 05d4 W+ ו 05d5 Z+ ז 05d6 X+ ח 05d7 + |Tj ט 05d8 J+ י 05d9 K% ך 05da K+ כ 05db L+ ל 05dc M% ם 05dd + |M+ מ 05de N% ן 05df N+ נ 05e0 S+ ס 05e1 E+ ע 05e2 P% ף 05e3 + |P+ פ 05e4 Zj ץ 05e5 ZJ צ 05e6 Q+ ק 05e7 R+ ר 05e8 Sh ש 05e9 + |T+ ת 05ea ,+ ، 060c ;+ ؛ 061b ?+ ؟ 061f H' ء 0621 aM آ 0622 + |aH أ 0623 wH ؤ 0624 ah إ 0625 yH ئ 0626 a+ ا 0627 b+ ب 0628 + |tm ة 0629 t+ ت 062a tk ث 062b g+ ج 062c hk ح 062d x+ خ 062e + |d+ د 062f dk ذ 0630 r+ ر 0631 z+ ز 0632 s+ س 0633 sn ش 0634 + |c+ ص 0635 dd ض 0636 tj ط 0637 zH ظ 0638 e+ ع 0639 i+ غ 063a + |++ ـ 0640 f+ ف 0641 q+ ق 0642 k+ ك 0643 l+ ل 0644 m+ م 0645 + |n+ ن 0646 h+ ه 0647 w+ و 0648 j+ ى 0649 y+ ي 064a :+ ً 064b + |"+ ٌ 064c =+ ٍ 064d /+ َ 064e '+ ُ 064f 1+ ِ 0650 3+ ّ 0651 + |0+ ْ 0652 aS ٰ 0670 p+ پ 067e v+ ڤ 06a4 gf گ 06af 0a ۰ 06f0 + |1a ۱ 06f1 2a ۲ 06f2 3a ۳ 06f3 4a ۴ 06f4 5a ۵ 06f5 6a ۶ 06f6 + |7a ۷ 06f7 8a ۸ 06f8 9a ۹ 06f9 B. Ḃ 1e02 b. ḃ 1e03 B_ Ḇ 1e06 + |b_ ḇ 1e07 D. Ḋ 1e0a d. ḋ 1e0b D_ Ḏ 1e0e d_ ḏ 1e0f D, Ḑ 1e10 + |d, ḑ 1e11 F. Ḟ 1e1e f. ḟ 1e1f G- Ḡ 1e20 g- ḡ 1e21 H. Ḣ 1e22 + |h. ḣ 1e23 H: Ḧ 1e26 h: ḧ 1e27 H, Ḩ 1e28 h, ḩ 1e29 K' Ḱ 1e30 + |k' ḱ 1e31 K_ Ḵ 1e34 k_ ḵ 1e35 L_ Ḻ 1e3a l_ ḻ 1e3b M' Ḿ 1e3e + |m' ḿ 1e3f M. Ṁ 1e40 m. ṁ 1e41 N. Ṅ 1e44 n. ṅ 1e45 N_ Ṉ 1e48 + |n_ ṉ 1e49 P' Ṕ 1e54 p' ṕ 1e55 P. Ṗ 1e56 p. ṗ 1e57 R. Ṙ 1e58 + |r. ṙ 1e59 R_ Ṟ 1e5e r_ ṟ 1e5f S. Ṡ 1e60 s. ṡ 1e61 T. Ṫ 1e6a + |t. ṫ 1e6b T_ Ṯ 1e6e t_ ṯ 1e6f V? Ṽ 1e7c v? ṽ 1e7d W! Ẁ 1e80 + |w! ẁ 1e81 W' Ẃ 1e82 w' ẃ 1e83 W: Ẅ 1e84 w: ẅ 1e85 W. Ẇ 1e86 + |w. ẇ 1e87 X. Ẋ 1e8a x. ẋ 1e8b X: Ẍ 1e8c x: ẍ 1e8d Y. Ẏ 1e8e + |y. ẏ 1e8f Z> Ẑ 1e90 z> ẑ 1e91 Z_ Ẕ 1e94 z_ ẕ 1e95 h_ ẖ 1e96 + |t: ẗ 1e97 w0 ẘ 1e98 y0 ẙ 1e99 A2 Ả 1ea2 a2 ả 1ea3 E2 Ẻ 1eba + |e2 ẻ 1ebb E? Ẽ 1ebc e? ẽ 1ebd I2 Ỉ 1ec8 i2 ỉ 1ec9 O2 Ỏ 1ece + |o2 ỏ 1ecf U2 Ủ 1ee6 u2 ủ 1ee7 Y! Ỳ 1ef2 y! ỳ 1ef3 Y2 Ỷ 1ef6 + |y2 ỷ 1ef7 Y? Ỹ 1ef8 y? ỹ 1ef9 ;' ἀ 1f00 ,' ἁ 1f01 ;! ἂ 1f02 + |,! ἃ 1f03 ?; ἄ 1f04 ?, ἅ 1f05 !: ἆ 1f06 ?: ἇ 1f07 1N   2002 + |1M   2003 3M   2004 4M   2005 6M   2006 1T   2009 1H   200a + |-1 ‐ 2010 -N – 2013 -M — 2014 -3 ― 2015 !2 ‖ 2016 =2 ‗ 2017 + |'6 ‘ 2018 '9 ’ 2019 .9 ‚ 201a 9' ‛ 201b "6 “ 201c "9 ” 201d + |:9 „ 201e 9" ‟ 201f /- † 2020 /= ‡ 2021 .. ‥ 2025 ,. … 2026 + |%0 ‰ 2030 1' ′ 2032 2' ″ 2033 3' ‴ 2034 1" ‵ 2035 2" ‶ 2036 + |3" ‷ 2037 Ca ‸ 2038 <1 ‹ 2039 >1 › 203a :X ※ 203b '- ‾ 203e + |/f ⁄ 2044 0S ⁰ 2070 4S ⁴ 2074 5S ⁵ 2075 6S ⁶ 2076 7S ⁷ 2077 + |8S ⁸ 2078 9S ⁹ 2079 +S ⁺ 207a -S ⁻ 207b =S ⁼ 207c (S ⁽ 207d + |)S ⁾ 207e nS ⁿ 207f 0s ₀ 2080 1s ₁ 2081 2s ₂ 2082 3s ₃ 2083 + |4s ₄ 2084 5s ₅ 2085 6s ₆ 2086 7s ₇ 2087 8s ₈ 2088 9s ₉ 2089 + |+s ₊ 208a -s ₋ 208b =s ₌ 208c (s ₍ 208d )s ₎ 208e Li ₤ 20a4 + |Pt ₧ 20a7 W= ₩ 20a9 oC ℃ 2103 co ℅ 2105 oF ℉ 2109 N0 № 2116 + |PO ℗ 2117 Rx ℞ 211e SM ℠ 2120 TM ™ 2122 Om Ω 2126 AO Å 212b + |13 ⅓ 2153 23 ⅔ 2154 15 ⅕ 2155 25 ⅖ 2156 35 ⅗ 2157 45 ⅘ 2158 + |16 ⅙ 2159 56 ⅚ 215a 18 ⅛ 215b 38 ⅜ 215c 58 ⅝ 215d 78 ⅞ 215e + |1R Ⅰ 2160 2R Ⅱ 2161 3R Ⅲ 2162 4R Ⅳ 2163 5R Ⅴ 2164 6R Ⅵ 2165 + |7R Ⅶ 2166 8R Ⅷ 2167 9R Ⅸ 2168 aR Ⅹ 2169 bR Ⅺ 216a cR Ⅻ 216b + |1r ⅰ 2170 2r ⅱ 2171 3r ⅲ 2172 4r ⅳ 2173 5r ⅴ 2174 6r ⅵ 2175 + |7r ⅶ 2176 8r ⅷ 2177 9r ⅸ 2178 ar ⅹ 2179 br ⅺ 217a cr ⅻ 217b + |<- ← 2190 -! ↑ 2191 -> → 2192 -v ↓ 2193 <> ↔ 2194 UD ↕ 2195 + |<= ⇐ 21d0 => ⇒ 21d2 == ⇔ 21d4 FA ∀ 2200 dP ∂ 2202 TE ∃ 2203 + |/0 ∅ 2205 DE ∆ 2206 NB ∇ 2207 (- ∈ 2208 -) ∋ 220b *P ∏ 220f + |+Z ∑ 2211 -2 − 2212 -+ ∓ 2213 *- ∗ 2217 Ob ∘ 2218 Sb ∙ 2219 + |RT √ 221a 0( ∝ 221d 00 ∞ 221e -L ∟ 221f -V ∠ 2220 PP ∥ 2225 + |AN ∧ 2227 OR ∨ 2228 (U ∩ 2229 )U ∪ 222a In ∫ 222b DI ∬ 222c + |Io ∮ 222e .: ∴ 2234 :. ∵ 2235 :R ∶ 2236 :: ∷ 2237 ?1 ∼ 223c + |CG ∾ 223e ?- ≃ 2243 ?= ≅ 2245 ?2 ≈ 2248 =? ≌ 224c HI ≓ 2253 + |!= ≠ 2260 =3 ≡ 2261 =< ≤ 2264 >= ≥ 2265 <* ≪ 226a *> ≫ 226b + |!< ≮ 226e !> ≯ 226f (C ⊂ 2282 )C ⊃ 2283 (_ ⊆ 2286 )_ ⊇ 2287 + |0. ⊙ 2299 02 ⊚ 229a -T ⊥ 22a5 .P ⋅ 22c5 :3 ⋮ 22ee .3 ⋯ 22ef + |Eh ⌂ 2302 <7 ⌈ 2308 >7 ⌉ 2309 7< ⌊ 230a 7> ⌋ 230b NI ⌐ 2310 + |(A ⌒ 2312 TR ⌕ 2315 Iu ⌠ 2320 Il ⌡ 2321 〉 232a + |Vs ␣ 2423 1h ⑀ 2440 3h ⑁ 2441 2h ⑂ 2442 4h ⑃ 2443 1j ⑆ 2446 + |2j ⑇ 2447 3j ⑈ 2448 4j ⑉ 2449 1. ⒈ 2488 2. ⒉ 2489 3. ⒊ 248a + |4. ⒋ 248b 5. ⒌ 248c 6. ⒍ 248d 7. ⒎ 248e 8. ⒏ 248f 9. ⒐ 2490 + |hh ─ 2500 HH ━ 2501 vv │ 2502 VV ┃ 2503 3- ┄ 2504 3_ ┅ 2505 + |3! ┆ 2506 3/ ┇ 2507 4- ┈ 2508 4_ ┉ 2509 4! ┊ 250a 4/ ┋ 250b + |dr ┌ 250c dR ┍ 250d Dr ┎ 250e DR ┏ 250f dl ┐ 2510 dL ┑ 2511 + |Dl ┒ 2512 LD ┓ 2513 ur └ 2514 uR ┕ 2515 Ur ┖ 2516 UR ┗ 2517 + |ul ┘ 2518 uL ┙ 2519 Ul ┚ 251a UL ┛ 251b vr ├ 251c vR ┝ 251d + |Vr ┠ 2520 VR ┣ 2523 vl ┤ 2524 vL ┥ 2525 Vl ┨ 2528 VL ┫ 252b + |dh ┬ 252c dH ┯ 252f Dh ┰ 2530 DH ┳ 2533 uh ┴ 2534 uH ┷ 2537 + |Uh ┸ 2538 UH ┻ 253b vh ┼ 253c vH ┿ 253f Vh ╂ 2542 VH ╋ 254b + |FD ╱ 2571 BD ╲ 2572 TB ▀ 2580 LB ▄ 2584 FB █ 2588 lB ▌ 258c + |RB ▐ 2590 .S ░ 2591 :S ▒ 2592 ?S ▓ 2593 fS ■ 25a0 OS □ 25a1 + |RO ▢ 25a2 Rr ▣ 25a3 RF ▤ 25a4 RY ▥ 25a5 RH ▦ 25a6 RZ ▧ 25a7 + |RK ▨ 25a8 RX ▩ 25a9 sB ▪ 25aa SR ▬ 25ac Or ▭ 25ad UT ▲ 25b2 + |uT △ 25b3 PR ▶ 25b6 Tr ▷ 25b7 Dt ▼ 25bc dT ▽ 25bd PL ◀ 25c0 + |Tl ◁ 25c1 Db ◆ 25c6 Dw ◇ 25c7 LZ ◊ 25ca 0m ○ 25cb 0o ◎ 25ce + |0M ● 25cf 0L ◐ 25d0 0R ◑ 25d1 Sn ◘ 25d8 Ic ◙ 25d9 Fd ◢ 25e2 + |Bd ◣ 25e3 *2 ★ 2605 *1 ☆ 2606 H ☞ 261e 0u ☺ 263a + |0U ☻ 263b SU ☼ 263c Fm ♀ 2640 Ml ♂ 2642 cS ♠ 2660 cH ♡ 2661 + |cD ♢ 2662 cC ♣ 2663 Md ♩ 2669 M8 ♪ 266a M2 ♫ 266b Mb ♭ 266d + |Mx ♮ 266e MX ♯ 266f OK ✓ 2713 XX ✗ 2717 -X ✠ 2720 IS   3000 + |,_ 、 3001 ._ 。 3002 +" 〃 3003 +_ 〄 3004 *_ 々 3005 ;_ 〆 3006 + |0_ 〇 3007 <+ 《 300a >+ 》 300b <' 「 300c >' 」 300d <" 『 300e + |>" 』 300f (" 【 3010 )" 】 3011 =T 〒 3012 =_ 〓 3013 (' 〔 3014 + |)' 〕 3015 (I 〖 3016 )I 〗 3017 -? 〜 301c A5 ぁ 3041 a5 あ 3042 + |I5 ぃ 3043 i5 い 3044 U5 ぅ 3045 u5 う 3046 E5 ぇ 3047 e5 え 3048 + |O5 ぉ 3049 o5 お 304a ka か 304b ga が 304c ki き 304d gi ぎ 304e + |ku く 304f gu ぐ 3050 ke け 3051 ge げ 3052 ko こ 3053 go ご 3054 + |sa さ 3055 za ざ 3056 si し 3057 zi じ 3058 su す 3059 zu ず 305a + |se せ 305b ze ぜ 305c so そ 305d zo ぞ 305e ta た 305f da だ 3060 + |ti ち 3061 di ぢ 3062 tU っ 3063 tu つ 3064 du づ 3065 te て 3066 + |de で 3067 to と 3068 do ど 3069 na な 306a ni に 306b nu ぬ 306c + |ne ね 306d no の 306e ha は 306f ba ば 3070 pa ぱ 3071 hi ひ 3072 + |bi び 3073 pi ぴ 3074 hu ふ 3075 bu ぶ 3076 pu ぷ 3077 he へ 3078 + |be べ 3079 pe ぺ 307a ho ほ 307b bo ぼ 307c po ぽ 307d ma ま 307e + |mi み 307f mu む 3080 me め 3081 mo も 3082 yA ゃ 3083 ya や 3084 + |yU ゅ 3085 yu ゆ 3086 yO ょ 3087 yo よ 3088 ra ら 3089 ri り 308a + |ru る 308b re れ 308c ro ろ 308d wA ゎ 308e wa わ 308f wi ゐ 3090 + |we ゑ 3091 wo を 3092 n5 ん 3093 vu ゔ 3094 "5 ゛ 309b 05 ゜ 309c + |*5 ゝ 309d +5 ゞ 309e a6 ァ 30a1 A6 ア 30a2 i6 ィ 30a3 I6 イ 30a4 + |u6 ゥ 30a5 U6 ウ 30a6 e6 ェ 30a7 E6 エ 30a8 o6 ォ 30a9 O6 オ 30aa + |Ka カ 30ab Ga ガ 30ac Ki キ 30ad Gi ギ 30ae Ku ク 30af Gu グ 30b0 + |Ke ケ 30b1 Ge ゲ 30b2 Ko コ 30b3 Go ゴ 30b4 Sa サ 30b5 Za ザ 30b6 + |Si シ 30b7 Zi ジ 30b8 Su ス 30b9 Zu ズ 30ba Se セ 30bb Ze ゼ 30bc + |So ソ 30bd Zo ゾ 30be Ta タ 30bf Da ダ 30c0 Ti チ 30c1 Di ヂ 30c2 + |TU ッ 30c3 Tu ツ 30c4 Du ヅ 30c5 Te テ 30c6 De デ 30c7 To ト 30c8 + |Do ド 30c9 Na ナ 30ca Ni ニ 30cb Nu ヌ 30cc Ne ネ 30cd No ノ 30ce + |Ha ハ 30cf Ba バ 30d0 Pa パ 30d1 Hi ヒ 30d2 Bi ビ 30d3 Pi ピ 30d4 + |Hu フ 30d5 Bu ブ 30d6 Pu プ 30d7 He ヘ 30d8 Be ベ 30d9 Pe ペ 30da + |Ho ホ 30db Bo ボ 30dc Po ポ 30dd Ma マ 30de Mi ミ 30df Mu ム 30e0 + |Me メ 30e1 Mo モ 30e2 YA ャ 30e3 Ya ヤ 30e4 YU ュ 30e5 Yu ユ 30e6 + |YO ョ 30e7 Yo ヨ 30e8 Ra ラ 30e9 Ri リ 30ea Ru ル 30eb Re レ 30ec + |Ro ロ 30ed WA ヮ 30ee Wa ワ 30ef Wi ヰ 30f0 We ヱ 30f1 Wo ヲ 30f2 + |N6 ン 30f3 Vu ヴ 30f4 KA ヵ 30f5 KE ヶ 30f6 Va ヷ 30f7 Vi ヸ 30f8 + |Ve ヹ 30f9 Vo ヺ 30fa .6 ・ 30fb -6 ー 30fc *6 ヽ 30fd +6 ヾ 30fe + |b4 ㄅ 3105 p4 ㄆ 3106 m4 ㄇ 3107 f4 ㄈ 3108 d4 ㄉ 3109 t4 ㄊ 310a + |n4 ㄋ 310b l4 ㄌ 310c g4 ㄍ 310d k4 ㄎ 310e h4 ㄏ 310f j4 ㄐ 3110 + |q4 ㄑ 3111 x4 ㄒ 3112 zh ㄓ 3113 ch ㄔ 3114 sh ㄕ 3115 r4 ㄖ 3116 + |z4 ㄗ 3117 c4 ㄘ 3118 s4 ㄙ 3119 a4 ㄚ 311a o4 ㄛ 311b e4 ㄜ 311c + |ai ㄞ 311e ei ㄟ 311f au ㄠ 3120 ou ㄡ 3121 an ㄢ 3122 en ㄣ 3123 + |aN ㄤ 3124 eN ㄥ 3125 er ㄦ 3126 i4 ㄧ 3127 u4 ㄨ 3128 iu ㄩ 3129 + |v4 ㄪ 312a nG ㄫ 312b gn ㄬ 312c 1c ㈠ 3220 2c ㈡ 3221 3c ㈢ 3222 + |4c ㈣ 3223 5c ㈤ 3224 6c ㈥ 3225 7c ㈦ 3226 8c ㈧ 3227 9c ㈨ 3228 + |/c  e001 UA  e002 UB  e003 "3  e004 "1  e005 "!  e006 + |"'  e007 ">  e008 "?  e009 "-  e00a "(  e00b ".  e00c + |":  e00d "0  e00e ""  e00f "<  e010 ",  e011 ";  e012 + |"_  e013 "=  e014 "/  e015 "i  e016 "d  e017 "p  e018 + |;;  e019 ,,  e01a b3  e01b Ci  e01c f(  e01d ed  e01e + |am  e01f pm  e020 Fl  e023 GF  e024 >V  e025 !*  e026 + |?*  e027 J<  e028 ff ff fb00 fi fi fb01 fl fl fb02 ft ſt fb05 + |st st fb06 + """.trimMargin()) + } +} From 944c5d2bdcf88d862249246badf36d603847eb1a Mon Sep 17 00:00:00 2001 From: Matt Ellis Date: Mon, 2 Sep 2024 18:08:04 +0100 Subject: [PATCH 02/17] Migrate digraph output to engine --- .../com/maddyhome/idea/vim/VimPlugin.java | 10 +-- .../idea/vim/group/DigraphGroup.java | 83 ------------------- .../META-INF/includes/ApplicationServices.xml | 2 +- .../idea/vim/api/VimDigraphGroupBase.kt | 64 +++++++++++++- 4 files changed, 67 insertions(+), 92 deletions(-) delete mode 100644 src/main/java/com/maddyhome/idea/vim/group/DigraphGroup.java diff --git a/src/main/java/com/maddyhome/idea/vim/VimPlugin.java b/src/main/java/com/maddyhome/idea/vim/VimPlugin.java index acb103fa08..ce66a754df 100644 --- a/src/main/java/com/maddyhome/idea/vim/VimPlugin.java +++ b/src/main/java/com/maddyhome/idea/vim/VimPlugin.java @@ -24,10 +24,7 @@ import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.SystemInfo; -import com.maddyhome.idea.vim.api.VimEditor; -import com.maddyhome.idea.vim.api.VimInjectorKt; -import com.maddyhome.idea.vim.api.VimKeyGroup; -import com.maddyhome.idea.vim.api.VimOptionGroup; +import com.maddyhome.idea.vim.api.*; import com.maddyhome.idea.vim.config.VimState; import com.maddyhome.idea.vim.config.migration.ApplicationConfigurationMigrator; import com.maddyhome.idea.vim.extension.VimExtensionRegistrar; @@ -36,7 +33,6 @@ import com.maddyhome.idea.vim.group.visual.VisualMotionGroup; import com.maddyhome.idea.vim.helper.MacKeyRepeat; import com.maddyhome.idea.vim.listener.VimListenerManager; -import com.maddyhome.idea.vim.newapi.IjVimInjector; import com.maddyhome.idea.vim.newapi.IjVimInjectorKt; import com.maddyhome.idea.vim.newapi.IjVimSearchGroup; import com.maddyhome.idea.vim.ui.StatusBarIconFactory; @@ -141,8 +137,8 @@ public class VimPlugin implements PersistentStateComponent, Disposable return (MacroGroup)VimInjectorKt.getInjector().getMacro(); } - public static @NotNull DigraphGroup getDigraph() { - return (DigraphGroup)VimInjectorKt.getInjector().getDigraphGroup(); + public static @NotNull VimDigraphGroup getDigraph() { + return VimInjectorKt.getInjector().getDigraphGroup(); } public static @NotNull HistoryGroup getHistory() { diff --git a/src/main/java/com/maddyhome/idea/vim/group/DigraphGroup.java b/src/main/java/com/maddyhome/idea/vim/group/DigraphGroup.java deleted file mode 100644 index ea6c777474..0000000000 --- a/src/main/java/com/maddyhome/idea/vim/group/DigraphGroup.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright 2003-2023 The IdeaVim authors - * - * Use of this source code is governed by an MIT-style - * license that can be found in the LICENSE.txt file or at - * https://opensource.org/licenses/MIT. - */ - -package com.maddyhome.idea.vim.group; - -import com.intellij.openapi.diagnostic.Logger; -import com.maddyhome.idea.vim.api.VimDigraphGroupBase; -import com.maddyhome.idea.vim.api.VimEditor; -import com.maddyhome.idea.vim.api.VimOutputPanel; -import com.maddyhome.idea.vim.ex.ExOutputModel; -import com.maddyhome.idea.vim.helper.EditorHelper; -import com.maddyhome.idea.vim.newapi.IjVimEditor; -import org.jetbrains.annotations.NotNull; - -import static com.maddyhome.idea.vim.api.VimInjectorKt.injector; - -public class DigraphGroup extends VimDigraphGroupBase { - - public void showDigraphs(@NotNull VimEditor editor) { - int width = EditorHelper.getApproximateScreenWidth(((IjVimEditor) editor).getEditor()); - if (width < 10) { - width = 80; - } - int colCount = width / 12; - int height = (int)Math.ceil((double) getDigraphs().size() / (double)colCount); - - if (logger.isDebugEnabled()) { - logger.debug("width=" + width); - logger.debug("colCount=" + colCount); - logger.debug("height=" + height); - } - - StringBuilder res = new StringBuilder(); - int cnt = 0; - for (Character code : getKeys().keySet()) { - String key = getKeys().get(code); - - res.append(key); - res.append(' '); - if (code < 32) { - res.append('^'); - res.append((char)(code + '@')); - } - else if (code >= 128 && code <= 159) { - res.append('~'); - res.append((char)(code - 128 + '@')); - } - else { - res.append(code); - res.append(' '); - } - res.append(' '); - if (code < 0x1000) { - res.append('0'); - } - if (code < 0x100) { - res.append('0'); - } - if (code < 0x10) { - res.append('0'); - } - res.append(Integer.toHexString(code)); - res.append(" "); - - cnt++; - if (cnt == colCount) { - res.append('\n'); - cnt = 0; - } - } - - VimOutputPanel output = injector.getOutputPanel().getOrCreate(editor, injector.getExecutionContextManager().getEditorExecutionContext(editor)); - output.addText(res.toString(), true ); - output.show(); - } - - private static final Logger logger = Logger.getInstance(DigraphGroup.class.getName()); -} diff --git a/src/main/resources/META-INF/includes/ApplicationServices.xml b/src/main/resources/META-INF/includes/ApplicationServices.xml index 8063204905..a825860cb3 100644 --- a/src/main/resources/META-INF/includes/ApplicationServices.xml +++ b/src/main/resources/META-INF/includes/ApplicationServices.xml @@ -26,7 +26,7 @@ serviceInterface="com.maddyhome.idea.vim.api.VimCommandLineService"/> - () + +open class VimDigraphGroupBase() : VimDigraphGroup { override fun getDigraph(ch1: Char, ch2: Char): Char { var key = String(charArrayOf(ch1, ch2)) @@ -84,6 +89,62 @@ abstract class VimDigraphGroupBase() : VimDigraphGroup { return true } + override fun showDigraphs(editor: VimEditor) { + val width = injector.engineEditorHelper.getApproximateScreenWidth(editor).let { if (it < 10) 80 else it } + val colWidth = 12 + val colCount = width / colWidth + val height = ceil(digraphs.size.toDouble() / colCount.toDouble()).toInt() + + if (logger.isDebug()) { + logger.debug("width=$width") + logger.debug("colCount=$colCount") + logger.debug("height=$height") + } + + val output = buildString { + + var count = 0 + keys.forEach { (char, digraph) -> + append(digraph) + append(' ') + if (char.code < 32) { + append('^') + append(char + '@'.code) + } + else if (char.code >= 128 && char.code <= 159) { + append('~') + append(char - 128 + '@'.code) + } + else { + append(char) + append(' ') + } + append(' ') + if (char.code < 0x1000) { + append('0') + } + if (char.code < 0x100) { + append('0') + } + if (char.code < 0x10) { + append('0') + } + append(toHexString(char.code)) + append(" ") + + count++ + if (count == colCount) { + appendLine() + count = 0 + } + } + } + + val context = injector.executionContextManager.getEditorExecutionContext(editor) + injector.outputPanel.output(editor, context, output) + } + + @Suppress("GrazieInspection", "SpellCheckingInspection") private val defaultDigraphs = charArrayOf( /* 'N', 'U', // 0 ^@ 'S', 'H', // 1 ^A @@ -1682,6 +1743,7 @@ abstract class VimDigraphGroupBase() : VimDigraphGroup { 'f', 't', '\ufb05', // LATIN SMALL LIGATURE FT 's', 't', '\ufb06', ) + protected val digraphs: HashMap = HashMap(defaultDigraphs.size) protected val keys: TreeMap = TreeMap() From 471d42723f8c6dfa8e46bea26a79fab4326ffcd0 Mon Sep 17 00:00:00 2001 From: Matt Ellis Date: Mon, 2 Sep 2024 18:37:15 +0100 Subject: [PATCH 03/17] Strip trailing spaces --- .../commands/DigraphsCommandTest.kt | 448 +++++++++--------- .../idea/vim/api/VimDigraphGroupBase.kt | 7 +- 2 files changed, 228 insertions(+), 227 deletions(-) diff --git a/src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/commands/DigraphsCommandTest.kt b/src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/commands/DigraphsCommandTest.kt index a4920cba99..8da945c255 100644 --- a/src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/commands/DigraphsCommandTest.kt +++ b/src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/commands/DigraphsCommandTest.kt @@ -33,230 +33,230 @@ class DigraphsCommandTest : VimTestCase() { fun `test digraph output`() { assertCommandOutput("digraphs", """ - |NU ^@ 0000 SH ^A 0001 SX ^B 0002 EX ^C 0003 ET ^D 0004 EQ ^E 0005 - |AK ^F 0006 BL ^G 0007 BS ^H 0008 HT ^I 0009 LF ^J 000a VT ^K 000b - |FF ^L 000c CR ^M 000d SO ^N 000e SI ^O 000f DL ^P 0010 D1 ^Q 0011 - |D2 ^R 0012 D3 ^S 0013 D4 ^T 0014 NK ^U 0015 SY ^V 0016 EB ^W 0017 - |CN ^X 0018 EM ^Y 0019 SB ^Z 001a EC ^[ 001b FS ^\ 001c GS ^] 001d - |RS ^^ 001e US ^_ 001f SP 0020 Nb # 0023 DO ${'$'} 0024 At @ 0040 - |<( [ 005b // \ 005c )> ] 005d '> ^ 005e '! ` 0060 (! { 007b - |!! | 007c !) } 007d '? ~ 007e DT  007f PA ~@ 0080 HO ~A 0081 - |BH ~B 0082 NH ~C 0083 IN ~D 0084 NL ~E 0085 SA ~F 0086 ES ~G 0087 - |HS ~H 0088 HJ ~I 0089 VS ~J 008a PD ~K 008b PU ~L 008c RI ~M 008d - |S2 ~N 008e S3 ~O 008f DC ~P 0090 P1 ~Q 0091 P2 ~R 0092 TS ~S 0093 - |CC ~T 0094 MW ~U 0095 SG ~V 0096 EG ~W 0097 SS ~X 0098 GC ~Y 0099 - |SC ~Z 009a CI ~[ 009b ST ~\ 009c OC ~] 009d PM ~^ 009e AC ~_ 009f - |NS   00a0 !I ¡ 00a1 Ct ¢ 00a2 Pd £ 00a3 Cu ¤ 00a4 Ye ¥ 00a5 - |BB ¦ 00a6 SE § 00a7 ': ¨ 00a8 Co © 00a9 -a ª 00aa << « 00ab - |NO ¬ 00ac -- ­ 00ad Rg ® 00ae 'm ¯ 00af DG ° 00b0 +- ± 00b1 - |2S ² 00b2 3S ³ 00b3 '' ´ 00b4 My µ 00b5 PI ¶ 00b6 .M · 00b7 - |', ¸ 00b8 1S ¹ 00b9 -o º 00ba >> » 00bb 14 ¼ 00bc 12 ½ 00bd - |34 ¾ 00be ?I ¿ 00bf A! À 00c0 A' Á 00c1 A>  00c2 A? à 00c3 - |A: Ä 00c4 AA Å 00c5 AE Æ 00c6 C, Ç 00c7 E! È 00c8 E' É 00c9 - |E> Ê 00ca E: Ë 00cb I! Ì 00cc I' Í 00cd I> Î 00ce I: Ï 00cf - |D- Ð 00d0 N? Ñ 00d1 O! Ò 00d2 O' Ó 00d3 O> Ô 00d4 O? Õ 00d5 - |O: Ö 00d6 *X × 00d7 O/ Ø 00d8 U! Ù 00d9 U' Ú 00da U> Û 00db - |U: Ü 00dc Y' Ý 00dd TH Þ 00de ss ß 00df a! à 00e0 a' á 00e1 - |a> â 00e2 a? ã 00e3 a: ä 00e4 aa å 00e5 ae æ 00e6 c, ç 00e7 - |e! è 00e8 e' é 00e9 e> ê 00ea e: ë 00eb i! ì 00ec i' í 00ed - |i> î 00ee i: ï 00ef d- ð 00f0 n? ñ 00f1 o! ò 00f2 o' ó 00f3 - |o> ô 00f4 o? õ 00f5 o: ö 00f6 -: ÷ 00f7 o/ ø 00f8 u! ù 00f9 - |u' ú 00fa u> û 00fb u: ü 00fc y' ý 00fd th þ 00fe y: ÿ 00ff - |A- Ā 0100 a- ā 0101 A( Ă 0102 a( ă 0103 A; Ą 0104 a; ą 0105 - |C' Ć 0106 c' ć 0107 C> Ĉ 0108 c> ĉ 0109 C. Ċ 010a c. ċ 010b - |C< Č 010c c< č 010d D< Ď 010e d< ď 010f D/ Đ 0110 d/ đ 0111 - |E- Ē 0112 e- ē 0113 E( Ĕ 0114 e( ĕ 0115 E. Ė 0116 e. ė 0117 - |E; Ę 0118 e; ę 0119 E< Ě 011a e< ě 011b G> Ĝ 011c g> ĝ 011d - |G( Ğ 011e g( ğ 011f G. Ġ 0120 g. ġ 0121 G, Ģ 0122 g, ģ 0123 - |H> Ĥ 0124 h> ĥ 0125 H/ Ħ 0126 h/ ħ 0127 I? Ĩ 0128 i? ĩ 0129 - |I- Ī 012a i- ī 012b I( Ĭ 012c i( ĭ 012d I; Į 012e i; į 012f - |I. İ 0130 i. ı 0131 IJ IJ 0132 ij ij 0133 J> Ĵ 0134 j> ĵ 0135 - |K, Ķ 0136 k, ķ 0137 kk ĸ 0138 L' Ĺ 0139 l' ĺ 013a L, Ļ 013b - |l, ļ 013c L< Ľ 013d l< ľ 013e L. Ŀ 013f l. ŀ 0140 L/ Ł 0141 - |l/ ł 0142 N' Ń 0143 n' ń 0144 N, Ņ 0145 n, ņ 0146 N< Ň 0147 - |n< ň 0148 'n ʼn 0149 NG Ŋ 014a ng ŋ 014b O- Ō 014c o- ō 014d - |O( Ŏ 014e o( ŏ 014f O" Ő 0150 o" ő 0151 OE Œ 0152 oe œ 0153 - |R' Ŕ 0154 r' ŕ 0155 R, Ŗ 0156 r, ŗ 0157 R< Ř 0158 r< ř 0159 - |S' Ś 015a s' ś 015b S> Ŝ 015c s> ŝ 015d S, Ş 015e s, ş 015f - |S< Š 0160 s< š 0161 T, Ţ 0162 t, ţ 0163 T< Ť 0164 t< ť 0165 - |T/ Ŧ 0166 t/ ŧ 0167 U? Ũ 0168 u? ũ 0169 U- Ū 016a u- ū 016b - |U( Ŭ 016c u( ŭ 016d U0 Ů 016e u0 ů 016f U" Ű 0170 u" ű 0171 - |U; Ų 0172 u; ų 0173 W> Ŵ 0174 w> ŵ 0175 Y> Ŷ 0176 y> ŷ 0177 - |Y: Ÿ 0178 Z' Ź 0179 z' ź 017a Z. Ż 017b z. ż 017c Z< Ž 017d - |z< ž 017e O9 Ơ 01a0 o9 ơ 01a1 OI Ƣ 01a2 oi ƣ 01a3 yr Ʀ 01a6 - |U9 Ư 01af u9 ư 01b0 Z/ Ƶ 01b5 z/ ƶ 01b6 ED Ʒ 01b7 A< Ǎ 01cd - |a< ǎ 01ce I< Ǐ 01cf i< ǐ 01d0 O< Ǒ 01d1 o< ǒ 01d2 U< Ǔ 01d3 - |u< ǔ 01d4 A1 Ǟ 01de a1 ǟ 01df A7 Ǡ 01e0 a7 ǡ 01e1 A3 Ǣ 01e2 - |a3 ǣ 01e3 G/ Ǥ 01e4 g/ ǥ 01e5 G< Ǧ 01e6 g< ǧ 01e7 K< Ǩ 01e8 - |k< ǩ 01e9 O; Ǫ 01ea o; ǫ 01eb O1 Ǭ 01ec o1 ǭ 01ed EZ Ǯ 01ee - |ez ǯ 01ef j< ǰ 01f0 G' Ǵ 01f4 g' ǵ 01f5 ;S ʿ 02bf '< ˇ 02c7 - |'( ˘ 02d8 '. ˙ 02d9 '0 ˚ 02da '; ˛ 02db '" ˝ 02dd A% Ά 0386 - |E% Έ 0388 Y% Ή 0389 I% Ί 038a O% Ό 038c U% Ύ 038e W% Ώ 038f - |i3 ΐ 0390 A* Α 0391 B* Β 0392 G* Γ 0393 D* Δ 0394 E* Ε 0395 - |Z* Ζ 0396 Y* Η 0397 H* Θ 0398 I* Ι 0399 K* Κ 039a L* Λ 039b - |M* Μ 039c N* Ν 039d C* Ξ 039e O* Ο 039f P* Π 03a0 R* Ρ 03a1 - |S* Σ 03a3 T* Τ 03a4 U* Υ 03a5 F* Φ 03a6 X* Χ 03a7 Q* Ψ 03a8 - |W* Ω 03a9 J* Ϊ 03aa V* Ϋ 03ab a% ά 03ac e% έ 03ad y% ή 03ae - |i% ί 03af u3 ΰ 03b0 a* α 03b1 b* β 03b2 g* γ 03b3 d* δ 03b4 - |e* ε 03b5 z* ζ 03b6 y* η 03b7 h* θ 03b8 i* ι 03b9 k* κ 03ba - |l* λ 03bb m* μ 03bc n* ν 03bd c* ξ 03be o* ο 03bf p* π 03c0 - |r* ρ 03c1 *s ς 03c2 s* σ 03c3 t* τ 03c4 u* υ 03c5 f* φ 03c6 - |x* χ 03c7 q* ψ 03c8 w* ω 03c9 j* ϊ 03ca v* ϋ 03cb o% ό 03cc - |u% ύ 03cd w% ώ 03ce 'G Ϙ 03d8 ,G ϙ 03d9 T3 Ϛ 03da t3 ϛ 03db - |M3 Ϝ 03dc m3 ϝ 03dd K3 Ϟ 03de k3 ϟ 03df P3 Ϡ 03e0 p3 ϡ 03e1 - |'% ϴ 03f4 j3 ϵ 03f5 IO Ё 0401 D% Ђ 0402 G% Ѓ 0403 IE Є 0404 - |DS Ѕ 0405 II І 0406 YI Ї 0407 J% Ј 0408 LJ Љ 0409 NJ Њ 040a - |Ts Ћ 040b KJ Ќ 040c V% Ў 040e DZ Џ 040f A= А 0410 B= Б 0411 - |V= В 0412 G= Г 0413 D= Д 0414 E= Е 0415 Z% Ж 0416 Z= З 0417 - |I= И 0418 J= Й 0419 K= К 041a L= Л 041b M= М 041c N= Н 041d - |O= О 041e P= П 041f R= Р 0420 S= С 0421 T= Т 0422 U= У 0423 - |F= Ф 0424 H= Х 0425 C= Ц 0426 C% Ч 0427 S% Ш 0428 Sc Щ 0429 - |=" Ъ 042a Y= Ы 042b %" Ь 042c JE Э 042d JU Ю 042e JA Я 042f - |a= а 0430 b= б 0431 v= в 0432 g= г 0433 d= д 0434 e= е 0435 - |z% ж 0436 z= з 0437 i= и 0438 j= й 0439 k= к 043a l= л 043b - |m= м 043c n= н 043d o= о 043e p= п 043f r= р 0440 s= с 0441 - |t= т 0442 u= у 0443 f= ф 0444 h= х 0445 c= ц 0446 c% ч 0447 - |s% ш 0448 sc щ 0449 =' ъ 044a y= ы 044b %' ь 044c je э 044d - |ju ю 044e ja я 044f io ё 0451 d% ђ 0452 g% ѓ 0453 ie є 0454 - |ds ѕ 0455 ii і 0456 yi ї 0457 j% ј 0458 lj љ 0459 nj њ 045a - |ts ћ 045b kj ќ 045c v% ў 045e dz џ 045f Y3 Ѣ 0462 y3 ѣ 0463 - |O3 Ѫ 046a o3 ѫ 046b F3 Ѳ 0472 f3 ѳ 0473 V3 Ѵ 0474 v3 ѵ 0475 - |C3 Ҁ 0480 c3 ҁ 0481 G3 Ґ 0490 g3 ґ 0491 A+ א 05d0 B+ ב 05d1 - |G+ ג 05d2 D+ ד 05d3 H+ ה 05d4 W+ ו 05d5 Z+ ז 05d6 X+ ח 05d7 - |Tj ט 05d8 J+ י 05d9 K% ך 05da K+ כ 05db L+ ל 05dc M% ם 05dd - |M+ מ 05de N% ן 05df N+ נ 05e0 S+ ס 05e1 E+ ע 05e2 P% ף 05e3 - |P+ פ 05e4 Zj ץ 05e5 ZJ צ 05e6 Q+ ק 05e7 R+ ר 05e8 Sh ש 05e9 - |T+ ת 05ea ,+ ، 060c ;+ ؛ 061b ?+ ؟ 061f H' ء 0621 aM آ 0622 - |aH أ 0623 wH ؤ 0624 ah إ 0625 yH ئ 0626 a+ ا 0627 b+ ب 0628 - |tm ة 0629 t+ ت 062a tk ث 062b g+ ج 062c hk ح 062d x+ خ 062e - |d+ د 062f dk ذ 0630 r+ ر 0631 z+ ز 0632 s+ س 0633 sn ش 0634 - |c+ ص 0635 dd ض 0636 tj ط 0637 zH ظ 0638 e+ ع 0639 i+ غ 063a - |++ ـ 0640 f+ ف 0641 q+ ق 0642 k+ ك 0643 l+ ل 0644 m+ م 0645 - |n+ ن 0646 h+ ه 0647 w+ و 0648 j+ ى 0649 y+ ي 064a :+ ً 064b - |"+ ٌ 064c =+ ٍ 064d /+ َ 064e '+ ُ 064f 1+ ِ 0650 3+ ّ 0651 - |0+ ْ 0652 aS ٰ 0670 p+ پ 067e v+ ڤ 06a4 gf گ 06af 0a ۰ 06f0 - |1a ۱ 06f1 2a ۲ 06f2 3a ۳ 06f3 4a ۴ 06f4 5a ۵ 06f5 6a ۶ 06f6 - |7a ۷ 06f7 8a ۸ 06f8 9a ۹ 06f9 B. Ḃ 1e02 b. ḃ 1e03 B_ Ḇ 1e06 - |b_ ḇ 1e07 D. Ḋ 1e0a d. ḋ 1e0b D_ Ḏ 1e0e d_ ḏ 1e0f D, Ḑ 1e10 - |d, ḑ 1e11 F. Ḟ 1e1e f. ḟ 1e1f G- Ḡ 1e20 g- ḡ 1e21 H. Ḣ 1e22 - |h. ḣ 1e23 H: Ḧ 1e26 h: ḧ 1e27 H, Ḩ 1e28 h, ḩ 1e29 K' Ḱ 1e30 - |k' ḱ 1e31 K_ Ḵ 1e34 k_ ḵ 1e35 L_ Ḻ 1e3a l_ ḻ 1e3b M' Ḿ 1e3e - |m' ḿ 1e3f M. Ṁ 1e40 m. ṁ 1e41 N. Ṅ 1e44 n. ṅ 1e45 N_ Ṉ 1e48 - |n_ ṉ 1e49 P' Ṕ 1e54 p' ṕ 1e55 P. Ṗ 1e56 p. ṗ 1e57 R. Ṙ 1e58 - |r. ṙ 1e59 R_ Ṟ 1e5e r_ ṟ 1e5f S. Ṡ 1e60 s. ṡ 1e61 T. Ṫ 1e6a - |t. ṫ 1e6b T_ Ṯ 1e6e t_ ṯ 1e6f V? Ṽ 1e7c v? ṽ 1e7d W! Ẁ 1e80 - |w! ẁ 1e81 W' Ẃ 1e82 w' ẃ 1e83 W: Ẅ 1e84 w: ẅ 1e85 W. Ẇ 1e86 - |w. ẇ 1e87 X. Ẋ 1e8a x. ẋ 1e8b X: Ẍ 1e8c x: ẍ 1e8d Y. Ẏ 1e8e - |y. ẏ 1e8f Z> Ẑ 1e90 z> ẑ 1e91 Z_ Ẕ 1e94 z_ ẕ 1e95 h_ ẖ 1e96 - |t: ẗ 1e97 w0 ẘ 1e98 y0 ẙ 1e99 A2 Ả 1ea2 a2 ả 1ea3 E2 Ẻ 1eba - |e2 ẻ 1ebb E? Ẽ 1ebc e? ẽ 1ebd I2 Ỉ 1ec8 i2 ỉ 1ec9 O2 Ỏ 1ece - |o2 ỏ 1ecf U2 Ủ 1ee6 u2 ủ 1ee7 Y! Ỳ 1ef2 y! ỳ 1ef3 Y2 Ỷ 1ef6 - |y2 ỷ 1ef7 Y? Ỹ 1ef8 y? ỹ 1ef9 ;' ἀ 1f00 ,' ἁ 1f01 ;! ἂ 1f02 - |,! ἃ 1f03 ?; ἄ 1f04 ?, ἅ 1f05 !: ἆ 1f06 ?: ἇ 1f07 1N   2002 - |1M   2003 3M   2004 4M   2005 6M   2006 1T   2009 1H   200a - |-1 ‐ 2010 -N – 2013 -M — 2014 -3 ― 2015 !2 ‖ 2016 =2 ‗ 2017 - |'6 ‘ 2018 '9 ’ 2019 .9 ‚ 201a 9' ‛ 201b "6 “ 201c "9 ” 201d - |:9 „ 201e 9" ‟ 201f /- † 2020 /= ‡ 2021 .. ‥ 2025 ,. … 2026 - |%0 ‰ 2030 1' ′ 2032 2' ″ 2033 3' ‴ 2034 1" ‵ 2035 2" ‶ 2036 - |3" ‷ 2037 Ca ‸ 2038 <1 ‹ 2039 >1 › 203a :X ※ 203b '- ‾ 203e - |/f ⁄ 2044 0S ⁰ 2070 4S ⁴ 2074 5S ⁵ 2075 6S ⁶ 2076 7S ⁷ 2077 - |8S ⁸ 2078 9S ⁹ 2079 +S ⁺ 207a -S ⁻ 207b =S ⁼ 207c (S ⁽ 207d - |)S ⁾ 207e nS ⁿ 207f 0s ₀ 2080 1s ₁ 2081 2s ₂ 2082 3s ₃ 2083 - |4s ₄ 2084 5s ₅ 2085 6s ₆ 2086 7s ₇ 2087 8s ₈ 2088 9s ₉ 2089 - |+s ₊ 208a -s ₋ 208b =s ₌ 208c (s ₍ 208d )s ₎ 208e Li ₤ 20a4 - |Pt ₧ 20a7 W= ₩ 20a9 oC ℃ 2103 co ℅ 2105 oF ℉ 2109 N0 № 2116 - |PO ℗ 2117 Rx ℞ 211e SM ℠ 2120 TM ™ 2122 Om Ω 2126 AO Å 212b - |13 ⅓ 2153 23 ⅔ 2154 15 ⅕ 2155 25 ⅖ 2156 35 ⅗ 2157 45 ⅘ 2158 - |16 ⅙ 2159 56 ⅚ 215a 18 ⅛ 215b 38 ⅜ 215c 58 ⅝ 215d 78 ⅞ 215e - |1R Ⅰ 2160 2R Ⅱ 2161 3R Ⅲ 2162 4R Ⅳ 2163 5R Ⅴ 2164 6R Ⅵ 2165 - |7R Ⅶ 2166 8R Ⅷ 2167 9R Ⅸ 2168 aR Ⅹ 2169 bR Ⅺ 216a cR Ⅻ 216b - |1r ⅰ 2170 2r ⅱ 2171 3r ⅲ 2172 4r ⅳ 2173 5r ⅴ 2174 6r ⅵ 2175 - |7r ⅶ 2176 8r ⅷ 2177 9r ⅸ 2178 ar ⅹ 2179 br ⅺ 217a cr ⅻ 217b - |<- ← 2190 -! ↑ 2191 -> → 2192 -v ↓ 2193 <> ↔ 2194 UD ↕ 2195 - |<= ⇐ 21d0 => ⇒ 21d2 == ⇔ 21d4 FA ∀ 2200 dP ∂ 2202 TE ∃ 2203 - |/0 ∅ 2205 DE ∆ 2206 NB ∇ 2207 (- ∈ 2208 -) ∋ 220b *P ∏ 220f - |+Z ∑ 2211 -2 − 2212 -+ ∓ 2213 *- ∗ 2217 Ob ∘ 2218 Sb ∙ 2219 - |RT √ 221a 0( ∝ 221d 00 ∞ 221e -L ∟ 221f -V ∠ 2220 PP ∥ 2225 - |AN ∧ 2227 OR ∨ 2228 (U ∩ 2229 )U ∪ 222a In ∫ 222b DI ∬ 222c - |Io ∮ 222e .: ∴ 2234 :. ∵ 2235 :R ∶ 2236 :: ∷ 2237 ?1 ∼ 223c - |CG ∾ 223e ?- ≃ 2243 ?= ≅ 2245 ?2 ≈ 2248 =? ≌ 224c HI ≓ 2253 - |!= ≠ 2260 =3 ≡ 2261 =< ≤ 2264 >= ≥ 2265 <* ≪ 226a *> ≫ 226b - |!< ≮ 226e !> ≯ 226f (C ⊂ 2282 )C ⊃ 2283 (_ ⊆ 2286 )_ ⊇ 2287 - |0. ⊙ 2299 02 ⊚ 229a -T ⊥ 22a5 .P ⋅ 22c5 :3 ⋮ 22ee .3 ⋯ 22ef - |Eh ⌂ 2302 <7 ⌈ 2308 >7 ⌉ 2309 7< ⌊ 230a 7> ⌋ 230b NI ⌐ 2310 - |(A ⌒ 2312 TR ⌕ 2315 Iu ⌠ 2320 Il ⌡ 2321 〉 232a - |Vs ␣ 2423 1h ⑀ 2440 3h ⑁ 2441 2h ⑂ 2442 4h ⑃ 2443 1j ⑆ 2446 - |2j ⑇ 2447 3j ⑈ 2448 4j ⑉ 2449 1. ⒈ 2488 2. ⒉ 2489 3. ⒊ 248a - |4. ⒋ 248b 5. ⒌ 248c 6. ⒍ 248d 7. ⒎ 248e 8. ⒏ 248f 9. ⒐ 2490 - |hh ─ 2500 HH ━ 2501 vv │ 2502 VV ┃ 2503 3- ┄ 2504 3_ ┅ 2505 - |3! ┆ 2506 3/ ┇ 2507 4- ┈ 2508 4_ ┉ 2509 4! ┊ 250a 4/ ┋ 250b - |dr ┌ 250c dR ┍ 250d Dr ┎ 250e DR ┏ 250f dl ┐ 2510 dL ┑ 2511 - |Dl ┒ 2512 LD ┓ 2513 ur └ 2514 uR ┕ 2515 Ur ┖ 2516 UR ┗ 2517 - |ul ┘ 2518 uL ┙ 2519 Ul ┚ 251a UL ┛ 251b vr ├ 251c vR ┝ 251d - |Vr ┠ 2520 VR ┣ 2523 vl ┤ 2524 vL ┥ 2525 Vl ┨ 2528 VL ┫ 252b - |dh ┬ 252c dH ┯ 252f Dh ┰ 2530 DH ┳ 2533 uh ┴ 2534 uH ┷ 2537 - |Uh ┸ 2538 UH ┻ 253b vh ┼ 253c vH ┿ 253f Vh ╂ 2542 VH ╋ 254b - |FD ╱ 2571 BD ╲ 2572 TB ▀ 2580 LB ▄ 2584 FB █ 2588 lB ▌ 258c - |RB ▐ 2590 .S ░ 2591 :S ▒ 2592 ?S ▓ 2593 fS ■ 25a0 OS □ 25a1 - |RO ▢ 25a2 Rr ▣ 25a3 RF ▤ 25a4 RY ▥ 25a5 RH ▦ 25a6 RZ ▧ 25a7 - |RK ▨ 25a8 RX ▩ 25a9 sB ▪ 25aa SR ▬ 25ac Or ▭ 25ad UT ▲ 25b2 - |uT △ 25b3 PR ▶ 25b6 Tr ▷ 25b7 Dt ▼ 25bc dT ▽ 25bd PL ◀ 25c0 - |Tl ◁ 25c1 Db ◆ 25c6 Dw ◇ 25c7 LZ ◊ 25ca 0m ○ 25cb 0o ◎ 25ce - |0M ● 25cf 0L ◐ 25d0 0R ◑ 25d1 Sn ◘ 25d8 Ic ◙ 25d9 Fd ◢ 25e2 - |Bd ◣ 25e3 *2 ★ 2605 *1 ☆ 2606 H ☞ 261e 0u ☺ 263a - |0U ☻ 263b SU ☼ 263c Fm ♀ 2640 Ml ♂ 2642 cS ♠ 2660 cH ♡ 2661 - |cD ♢ 2662 cC ♣ 2663 Md ♩ 2669 M8 ♪ 266a M2 ♫ 266b Mb ♭ 266d - |Mx ♮ 266e MX ♯ 266f OK ✓ 2713 XX ✗ 2717 -X ✠ 2720 IS   3000 - |,_ 、 3001 ._ 。 3002 +" 〃 3003 +_ 〄 3004 *_ 々 3005 ;_ 〆 3006 - |0_ 〇 3007 <+ 《 300a >+ 》 300b <' 「 300c >' 」 300d <" 『 300e - |>" 』 300f (" 【 3010 )" 】 3011 =T 〒 3012 =_ 〓 3013 (' 〔 3014 - |)' 〕 3015 (I 〖 3016 )I 〗 3017 -? 〜 301c A5 ぁ 3041 a5 あ 3042 - |I5 ぃ 3043 i5 い 3044 U5 ぅ 3045 u5 う 3046 E5 ぇ 3047 e5 え 3048 - |O5 ぉ 3049 o5 お 304a ka か 304b ga が 304c ki き 304d gi ぎ 304e - |ku く 304f gu ぐ 3050 ke け 3051 ge げ 3052 ko こ 3053 go ご 3054 - |sa さ 3055 za ざ 3056 si し 3057 zi じ 3058 su す 3059 zu ず 305a - |se せ 305b ze ぜ 305c so そ 305d zo ぞ 305e ta た 305f da だ 3060 - |ti ち 3061 di ぢ 3062 tU っ 3063 tu つ 3064 du づ 3065 te て 3066 - |de で 3067 to と 3068 do ど 3069 na な 306a ni に 306b nu ぬ 306c - |ne ね 306d no の 306e ha は 306f ba ば 3070 pa ぱ 3071 hi ひ 3072 - |bi び 3073 pi ぴ 3074 hu ふ 3075 bu ぶ 3076 pu ぷ 3077 he へ 3078 - |be べ 3079 pe ぺ 307a ho ほ 307b bo ぼ 307c po ぽ 307d ma ま 307e - |mi み 307f mu む 3080 me め 3081 mo も 3082 yA ゃ 3083 ya や 3084 - |yU ゅ 3085 yu ゆ 3086 yO ょ 3087 yo よ 3088 ra ら 3089 ri り 308a - |ru る 308b re れ 308c ro ろ 308d wA ゎ 308e wa わ 308f wi ゐ 3090 - |we ゑ 3091 wo を 3092 n5 ん 3093 vu ゔ 3094 "5 ゛ 309b 05 ゜ 309c - |*5 ゝ 309d +5 ゞ 309e a6 ァ 30a1 A6 ア 30a2 i6 ィ 30a3 I6 イ 30a4 - |u6 ゥ 30a5 U6 ウ 30a6 e6 ェ 30a7 E6 エ 30a8 o6 ォ 30a9 O6 オ 30aa - |Ka カ 30ab Ga ガ 30ac Ki キ 30ad Gi ギ 30ae Ku ク 30af Gu グ 30b0 - |Ke ケ 30b1 Ge ゲ 30b2 Ko コ 30b3 Go ゴ 30b4 Sa サ 30b5 Za ザ 30b6 - |Si シ 30b7 Zi ジ 30b8 Su ス 30b9 Zu ズ 30ba Se セ 30bb Ze ゼ 30bc - |So ソ 30bd Zo ゾ 30be Ta タ 30bf Da ダ 30c0 Ti チ 30c1 Di ヂ 30c2 - |TU ッ 30c3 Tu ツ 30c4 Du ヅ 30c5 Te テ 30c6 De デ 30c7 To ト 30c8 - |Do ド 30c9 Na ナ 30ca Ni ニ 30cb Nu ヌ 30cc Ne ネ 30cd No ノ 30ce - |Ha ハ 30cf Ba バ 30d0 Pa パ 30d1 Hi ヒ 30d2 Bi ビ 30d3 Pi ピ 30d4 - |Hu フ 30d5 Bu ブ 30d6 Pu プ 30d7 He ヘ 30d8 Be ベ 30d9 Pe ペ 30da - |Ho ホ 30db Bo ボ 30dc Po ポ 30dd Ma マ 30de Mi ミ 30df Mu ム 30e0 - |Me メ 30e1 Mo モ 30e2 YA ャ 30e3 Ya ヤ 30e4 YU ュ 30e5 Yu ユ 30e6 - |YO ョ 30e7 Yo ヨ 30e8 Ra ラ 30e9 Ri リ 30ea Ru ル 30eb Re レ 30ec - |Ro ロ 30ed WA ヮ 30ee Wa ワ 30ef Wi ヰ 30f0 We ヱ 30f1 Wo ヲ 30f2 - |N6 ン 30f3 Vu ヴ 30f4 KA ヵ 30f5 KE ヶ 30f6 Va ヷ 30f7 Vi ヸ 30f8 - |Ve ヹ 30f9 Vo ヺ 30fa .6 ・ 30fb -6 ー 30fc *6 ヽ 30fd +6 ヾ 30fe - |b4 ㄅ 3105 p4 ㄆ 3106 m4 ㄇ 3107 f4 ㄈ 3108 d4 ㄉ 3109 t4 ㄊ 310a - |n4 ㄋ 310b l4 ㄌ 310c g4 ㄍ 310d k4 ㄎ 310e h4 ㄏ 310f j4 ㄐ 3110 - |q4 ㄑ 3111 x4 ㄒ 3112 zh ㄓ 3113 ch ㄔ 3114 sh ㄕ 3115 r4 ㄖ 3116 - |z4 ㄗ 3117 c4 ㄘ 3118 s4 ㄙ 3119 a4 ㄚ 311a o4 ㄛ 311b e4 ㄜ 311c - |ai ㄞ 311e ei ㄟ 311f au ㄠ 3120 ou ㄡ 3121 an ㄢ 3122 en ㄣ 3123 - |aN ㄤ 3124 eN ㄥ 3125 er ㄦ 3126 i4 ㄧ 3127 u4 ㄨ 3128 iu ㄩ 3129 - |v4 ㄪ 312a nG ㄫ 312b gn ㄬ 312c 1c ㈠ 3220 2c ㈡ 3221 3c ㈢ 3222 - |4c ㈣ 3223 5c ㈤ 3224 6c ㈥ 3225 7c ㈦ 3226 8c ㈧ 3227 9c ㈨ 3228 - |/c  e001 UA  e002 UB  e003 "3  e004 "1  e005 "!  e006 - |"'  e007 ">  e008 "?  e009 "-  e00a "(  e00b ".  e00c - |":  e00d "0  e00e ""  e00f "<  e010 ",  e011 ";  e012 - |"_  e013 "=  e014 "/  e015 "i  e016 "d  e017 "p  e018 - |;;  e019 ,,  e01a b3  e01b Ci  e01c f(  e01d ed  e01e - |am  e01f pm  e020 Fl  e023 GF  e024 >V  e025 !*  e026 - |?*  e027 J<  e028 ff ff fb00 fi fi fb01 fl fl fb02 ft ſt fb05 - |st st fb06 + |NU ^@ 0000 SH ^A 0001 SX ^B 0002 EX ^C 0003 ET ^D 0004 EQ ^E 0005 + |AK ^F 0006 BL ^G 0007 BS ^H 0008 HT ^I 0009 LF ^J 000a VT ^K 000b + |FF ^L 000c CR ^M 000d SO ^N 000e SI ^O 000f DL ^P 0010 D1 ^Q 0011 + |D2 ^R 0012 D3 ^S 0013 D4 ^T 0014 NK ^U 0015 SY ^V 0016 EB ^W 0017 + |CN ^X 0018 EM ^Y 0019 SB ^Z 001a EC ^[ 001b FS ^\ 001c GS ^] 001d + |RS ^^ 001e US ^_ 001f SP 0020 Nb # 0023 DO ${'$'} 0024 At @ 0040 + |<( [ 005b // \ 005c )> ] 005d '> ^ 005e '! ` 0060 (! { 007b + |!! | 007c !) } 007d '? ~ 007e DT  007f PA ~@ 0080 HO ~A 0081 + |BH ~B 0082 NH ~C 0083 IN ~D 0084 NL ~E 0085 SA ~F 0086 ES ~G 0087 + |HS ~H 0088 HJ ~I 0089 VS ~J 008a PD ~K 008b PU ~L 008c RI ~M 008d + |S2 ~N 008e S3 ~O 008f DC ~P 0090 P1 ~Q 0091 P2 ~R 0092 TS ~S 0093 + |CC ~T 0094 MW ~U 0095 SG ~V 0096 EG ~W 0097 SS ~X 0098 GC ~Y 0099 + |SC ~Z 009a CI ~[ 009b ST ~\ 009c OC ~] 009d PM ~^ 009e AC ~_ 009f + |NS   00a0 !I ¡ 00a1 Ct ¢ 00a2 Pd £ 00a3 Cu ¤ 00a4 Ye ¥ 00a5 + |BB ¦ 00a6 SE § 00a7 ': ¨ 00a8 Co © 00a9 -a ª 00aa << « 00ab + |NO ¬ 00ac -- ­ 00ad Rg ® 00ae 'm ¯ 00af DG ° 00b0 +- ± 00b1 + |2S ² 00b2 3S ³ 00b3 '' ´ 00b4 My µ 00b5 PI ¶ 00b6 .M · 00b7 + |', ¸ 00b8 1S ¹ 00b9 -o º 00ba >> » 00bb 14 ¼ 00bc 12 ½ 00bd + |34 ¾ 00be ?I ¿ 00bf A! À 00c0 A' Á 00c1 A>  00c2 A? à 00c3 + |A: Ä 00c4 AA Å 00c5 AE Æ 00c6 C, Ç 00c7 E! È 00c8 E' É 00c9 + |E> Ê 00ca E: Ë 00cb I! Ì 00cc I' Í 00cd I> Î 00ce I: Ï 00cf + |D- Ð 00d0 N? Ñ 00d1 O! Ò 00d2 O' Ó 00d3 O> Ô 00d4 O? Õ 00d5 + |O: Ö 00d6 *X × 00d7 O/ Ø 00d8 U! Ù 00d9 U' Ú 00da U> Û 00db + |U: Ü 00dc Y' Ý 00dd TH Þ 00de ss ß 00df a! à 00e0 a' á 00e1 + |a> â 00e2 a? ã 00e3 a: ä 00e4 aa å 00e5 ae æ 00e6 c, ç 00e7 + |e! è 00e8 e' é 00e9 e> ê 00ea e: ë 00eb i! ì 00ec i' í 00ed + |i> î 00ee i: ï 00ef d- ð 00f0 n? ñ 00f1 o! ò 00f2 o' ó 00f3 + |o> ô 00f4 o? õ 00f5 o: ö 00f6 -: ÷ 00f7 o/ ø 00f8 u! ù 00f9 + |u' ú 00fa u> û 00fb u: ü 00fc y' ý 00fd th þ 00fe y: ÿ 00ff + |A- Ā 0100 a- ā 0101 A( Ă 0102 a( ă 0103 A; Ą 0104 a; ą 0105 + |C' Ć 0106 c' ć 0107 C> Ĉ 0108 c> ĉ 0109 C. Ċ 010a c. ċ 010b + |C< Č 010c c< č 010d D< Ď 010e d< ď 010f D/ Đ 0110 d/ đ 0111 + |E- Ē 0112 e- ē 0113 E( Ĕ 0114 e( ĕ 0115 E. Ė 0116 e. ė 0117 + |E; Ę 0118 e; ę 0119 E< Ě 011a e< ě 011b G> Ĝ 011c g> ĝ 011d + |G( Ğ 011e g( ğ 011f G. Ġ 0120 g. ġ 0121 G, Ģ 0122 g, ģ 0123 + |H> Ĥ 0124 h> ĥ 0125 H/ Ħ 0126 h/ ħ 0127 I? Ĩ 0128 i? ĩ 0129 + |I- Ī 012a i- ī 012b I( Ĭ 012c i( ĭ 012d I; Į 012e i; į 012f + |I. İ 0130 i. ı 0131 IJ IJ 0132 ij ij 0133 J> Ĵ 0134 j> ĵ 0135 + |K, Ķ 0136 k, ķ 0137 kk ĸ 0138 L' Ĺ 0139 l' ĺ 013a L, Ļ 013b + |l, ļ 013c L< Ľ 013d l< ľ 013e L. Ŀ 013f l. ŀ 0140 L/ Ł 0141 + |l/ ł 0142 N' Ń 0143 n' ń 0144 N, Ņ 0145 n, ņ 0146 N< Ň 0147 + |n< ň 0148 'n ʼn 0149 NG Ŋ 014a ng ŋ 014b O- Ō 014c o- ō 014d + |O( Ŏ 014e o( ŏ 014f O" Ő 0150 o" ő 0151 OE Œ 0152 oe œ 0153 + |R' Ŕ 0154 r' ŕ 0155 R, Ŗ 0156 r, ŗ 0157 R< Ř 0158 r< ř 0159 + |S' Ś 015a s' ś 015b S> Ŝ 015c s> ŝ 015d S, Ş 015e s, ş 015f + |S< Š 0160 s< š 0161 T, Ţ 0162 t, ţ 0163 T< Ť 0164 t< ť 0165 + |T/ Ŧ 0166 t/ ŧ 0167 U? Ũ 0168 u? ũ 0169 U- Ū 016a u- ū 016b + |U( Ŭ 016c u( ŭ 016d U0 Ů 016e u0 ů 016f U" Ű 0170 u" ű 0171 + |U; Ų 0172 u; ų 0173 W> Ŵ 0174 w> ŵ 0175 Y> Ŷ 0176 y> ŷ 0177 + |Y: Ÿ 0178 Z' Ź 0179 z' ź 017a Z. Ż 017b z. ż 017c Z< Ž 017d + |z< ž 017e O9 Ơ 01a0 o9 ơ 01a1 OI Ƣ 01a2 oi ƣ 01a3 yr Ʀ 01a6 + |U9 Ư 01af u9 ư 01b0 Z/ Ƶ 01b5 z/ ƶ 01b6 ED Ʒ 01b7 A< Ǎ 01cd + |a< ǎ 01ce I< Ǐ 01cf i< ǐ 01d0 O< Ǒ 01d1 o< ǒ 01d2 U< Ǔ 01d3 + |u< ǔ 01d4 A1 Ǟ 01de a1 ǟ 01df A7 Ǡ 01e0 a7 ǡ 01e1 A3 Ǣ 01e2 + |a3 ǣ 01e3 G/ Ǥ 01e4 g/ ǥ 01e5 G< Ǧ 01e6 g< ǧ 01e7 K< Ǩ 01e8 + |k< ǩ 01e9 O; Ǫ 01ea o; ǫ 01eb O1 Ǭ 01ec o1 ǭ 01ed EZ Ǯ 01ee + |ez ǯ 01ef j< ǰ 01f0 G' Ǵ 01f4 g' ǵ 01f5 ;S ʿ 02bf '< ˇ 02c7 + |'( ˘ 02d8 '. ˙ 02d9 '0 ˚ 02da '; ˛ 02db '" ˝ 02dd A% Ά 0386 + |E% Έ 0388 Y% Ή 0389 I% Ί 038a O% Ό 038c U% Ύ 038e W% Ώ 038f + |i3 ΐ 0390 A* Α 0391 B* Β 0392 G* Γ 0393 D* Δ 0394 E* Ε 0395 + |Z* Ζ 0396 Y* Η 0397 H* Θ 0398 I* Ι 0399 K* Κ 039a L* Λ 039b + |M* Μ 039c N* Ν 039d C* Ξ 039e O* Ο 039f P* Π 03a0 R* Ρ 03a1 + |S* Σ 03a3 T* Τ 03a4 U* Υ 03a5 F* Φ 03a6 X* Χ 03a7 Q* Ψ 03a8 + |W* Ω 03a9 J* Ϊ 03aa V* Ϋ 03ab a% ά 03ac e% έ 03ad y% ή 03ae + |i% ί 03af u3 ΰ 03b0 a* α 03b1 b* β 03b2 g* γ 03b3 d* δ 03b4 + |e* ε 03b5 z* ζ 03b6 y* η 03b7 h* θ 03b8 i* ι 03b9 k* κ 03ba + |l* λ 03bb m* μ 03bc n* ν 03bd c* ξ 03be o* ο 03bf p* π 03c0 + |r* ρ 03c1 *s ς 03c2 s* σ 03c3 t* τ 03c4 u* υ 03c5 f* φ 03c6 + |x* χ 03c7 q* ψ 03c8 w* ω 03c9 j* ϊ 03ca v* ϋ 03cb o% ό 03cc + |u% ύ 03cd w% ώ 03ce 'G Ϙ 03d8 ,G ϙ 03d9 T3 Ϛ 03da t3 ϛ 03db + |M3 Ϝ 03dc m3 ϝ 03dd K3 Ϟ 03de k3 ϟ 03df P3 Ϡ 03e0 p3 ϡ 03e1 + |'% ϴ 03f4 j3 ϵ 03f5 IO Ё 0401 D% Ђ 0402 G% Ѓ 0403 IE Є 0404 + |DS Ѕ 0405 II І 0406 YI Ї 0407 J% Ј 0408 LJ Љ 0409 NJ Њ 040a + |Ts Ћ 040b KJ Ќ 040c V% Ў 040e DZ Џ 040f A= А 0410 B= Б 0411 + |V= В 0412 G= Г 0413 D= Д 0414 E= Е 0415 Z% Ж 0416 Z= З 0417 + |I= И 0418 J= Й 0419 K= К 041a L= Л 041b M= М 041c N= Н 041d + |O= О 041e P= П 041f R= Р 0420 S= С 0421 T= Т 0422 U= У 0423 + |F= Ф 0424 H= Х 0425 C= Ц 0426 C% Ч 0427 S% Ш 0428 Sc Щ 0429 + |=" Ъ 042a Y= Ы 042b %" Ь 042c JE Э 042d JU Ю 042e JA Я 042f + |a= а 0430 b= б 0431 v= в 0432 g= г 0433 d= д 0434 e= е 0435 + |z% ж 0436 z= з 0437 i= и 0438 j= й 0439 k= к 043a l= л 043b + |m= м 043c n= н 043d o= о 043e p= п 043f r= р 0440 s= с 0441 + |t= т 0442 u= у 0443 f= ф 0444 h= х 0445 c= ц 0446 c% ч 0447 + |s% ш 0448 sc щ 0449 =' ъ 044a y= ы 044b %' ь 044c je э 044d + |ju ю 044e ja я 044f io ё 0451 d% ђ 0452 g% ѓ 0453 ie є 0454 + |ds ѕ 0455 ii і 0456 yi ї 0457 j% ј 0458 lj љ 0459 nj њ 045a + |ts ћ 045b kj ќ 045c v% ў 045e dz џ 045f Y3 Ѣ 0462 y3 ѣ 0463 + |O3 Ѫ 046a o3 ѫ 046b F3 Ѳ 0472 f3 ѳ 0473 V3 Ѵ 0474 v3 ѵ 0475 + |C3 Ҁ 0480 c3 ҁ 0481 G3 Ґ 0490 g3 ґ 0491 A+ א 05d0 B+ ב 05d1 + |G+ ג 05d2 D+ ד 05d3 H+ ה 05d4 W+ ו 05d5 Z+ ז 05d6 X+ ח 05d7 + |Tj ט 05d8 J+ י 05d9 K% ך 05da K+ כ 05db L+ ל 05dc M% ם 05dd + |M+ מ 05de N% ן 05df N+ נ 05e0 S+ ס 05e1 E+ ע 05e2 P% ף 05e3 + |P+ פ 05e4 Zj ץ 05e5 ZJ צ 05e6 Q+ ק 05e7 R+ ר 05e8 Sh ש 05e9 + |T+ ת 05ea ,+ ، 060c ;+ ؛ 061b ?+ ؟ 061f H' ء 0621 aM آ 0622 + |aH أ 0623 wH ؤ 0624 ah إ 0625 yH ئ 0626 a+ ا 0627 b+ ب 0628 + |tm ة 0629 t+ ت 062a tk ث 062b g+ ج 062c hk ح 062d x+ خ 062e + |d+ د 062f dk ذ 0630 r+ ر 0631 z+ ز 0632 s+ س 0633 sn ش 0634 + |c+ ص 0635 dd ض 0636 tj ط 0637 zH ظ 0638 e+ ع 0639 i+ غ 063a + |++ ـ 0640 f+ ف 0641 q+ ق 0642 k+ ك 0643 l+ ل 0644 m+ م 0645 + |n+ ن 0646 h+ ه 0647 w+ و 0648 j+ ى 0649 y+ ي 064a :+ ً 064b + |"+ ٌ 064c =+ ٍ 064d /+ َ 064e '+ ُ 064f 1+ ِ 0650 3+ ّ 0651 + |0+ ْ 0652 aS ٰ 0670 p+ پ 067e v+ ڤ 06a4 gf گ 06af 0a ۰ 06f0 + |1a ۱ 06f1 2a ۲ 06f2 3a ۳ 06f3 4a ۴ 06f4 5a ۵ 06f5 6a ۶ 06f6 + |7a ۷ 06f7 8a ۸ 06f8 9a ۹ 06f9 B. Ḃ 1e02 b. ḃ 1e03 B_ Ḇ 1e06 + |b_ ḇ 1e07 D. Ḋ 1e0a d. ḋ 1e0b D_ Ḏ 1e0e d_ ḏ 1e0f D, Ḑ 1e10 + |d, ḑ 1e11 F. Ḟ 1e1e f. ḟ 1e1f G- Ḡ 1e20 g- ḡ 1e21 H. Ḣ 1e22 + |h. ḣ 1e23 H: Ḧ 1e26 h: ḧ 1e27 H, Ḩ 1e28 h, ḩ 1e29 K' Ḱ 1e30 + |k' ḱ 1e31 K_ Ḵ 1e34 k_ ḵ 1e35 L_ Ḻ 1e3a l_ ḻ 1e3b M' Ḿ 1e3e + |m' ḿ 1e3f M. Ṁ 1e40 m. ṁ 1e41 N. Ṅ 1e44 n. ṅ 1e45 N_ Ṉ 1e48 + |n_ ṉ 1e49 P' Ṕ 1e54 p' ṕ 1e55 P. Ṗ 1e56 p. ṗ 1e57 R. Ṙ 1e58 + |r. ṙ 1e59 R_ Ṟ 1e5e r_ ṟ 1e5f S. Ṡ 1e60 s. ṡ 1e61 T. Ṫ 1e6a + |t. ṫ 1e6b T_ Ṯ 1e6e t_ ṯ 1e6f V? Ṽ 1e7c v? ṽ 1e7d W! Ẁ 1e80 + |w! ẁ 1e81 W' Ẃ 1e82 w' ẃ 1e83 W: Ẅ 1e84 w: ẅ 1e85 W. Ẇ 1e86 + |w. ẇ 1e87 X. Ẋ 1e8a x. ẋ 1e8b X: Ẍ 1e8c x: ẍ 1e8d Y. Ẏ 1e8e + |y. ẏ 1e8f Z> Ẑ 1e90 z> ẑ 1e91 Z_ Ẕ 1e94 z_ ẕ 1e95 h_ ẖ 1e96 + |t: ẗ 1e97 w0 ẘ 1e98 y0 ẙ 1e99 A2 Ả 1ea2 a2 ả 1ea3 E2 Ẻ 1eba + |e2 ẻ 1ebb E? Ẽ 1ebc e? ẽ 1ebd I2 Ỉ 1ec8 i2 ỉ 1ec9 O2 Ỏ 1ece + |o2 ỏ 1ecf U2 Ủ 1ee6 u2 ủ 1ee7 Y! Ỳ 1ef2 y! ỳ 1ef3 Y2 Ỷ 1ef6 + |y2 ỷ 1ef7 Y? Ỹ 1ef8 y? ỹ 1ef9 ;' ἀ 1f00 ,' ἁ 1f01 ;! ἂ 1f02 + |,! ἃ 1f03 ?; ἄ 1f04 ?, ἅ 1f05 !: ἆ 1f06 ?: ἇ 1f07 1N   2002 + |1M   2003 3M   2004 4M   2005 6M   2006 1T   2009 1H   200a + |-1 ‐ 2010 -N – 2013 -M — 2014 -3 ― 2015 !2 ‖ 2016 =2 ‗ 2017 + |'6 ‘ 2018 '9 ’ 2019 .9 ‚ 201a 9' ‛ 201b "6 “ 201c "9 ” 201d + |:9 „ 201e 9" ‟ 201f /- † 2020 /= ‡ 2021 .. ‥ 2025 ,. … 2026 + |%0 ‰ 2030 1' ′ 2032 2' ″ 2033 3' ‴ 2034 1" ‵ 2035 2" ‶ 2036 + |3" ‷ 2037 Ca ‸ 2038 <1 ‹ 2039 >1 › 203a :X ※ 203b '- ‾ 203e + |/f ⁄ 2044 0S ⁰ 2070 4S ⁴ 2074 5S ⁵ 2075 6S ⁶ 2076 7S ⁷ 2077 + |8S ⁸ 2078 9S ⁹ 2079 +S ⁺ 207a -S ⁻ 207b =S ⁼ 207c (S ⁽ 207d + |)S ⁾ 207e nS ⁿ 207f 0s ₀ 2080 1s ₁ 2081 2s ₂ 2082 3s ₃ 2083 + |4s ₄ 2084 5s ₅ 2085 6s ₆ 2086 7s ₇ 2087 8s ₈ 2088 9s ₉ 2089 + |+s ₊ 208a -s ₋ 208b =s ₌ 208c (s ₍ 208d )s ₎ 208e Li ₤ 20a4 + |Pt ₧ 20a7 W= ₩ 20a9 oC ℃ 2103 co ℅ 2105 oF ℉ 2109 N0 № 2116 + |PO ℗ 2117 Rx ℞ 211e SM ℠ 2120 TM ™ 2122 Om Ω 2126 AO Å 212b + |13 ⅓ 2153 23 ⅔ 2154 15 ⅕ 2155 25 ⅖ 2156 35 ⅗ 2157 45 ⅘ 2158 + |16 ⅙ 2159 56 ⅚ 215a 18 ⅛ 215b 38 ⅜ 215c 58 ⅝ 215d 78 ⅞ 215e + |1R Ⅰ 2160 2R Ⅱ 2161 3R Ⅲ 2162 4R Ⅳ 2163 5R Ⅴ 2164 6R Ⅵ 2165 + |7R Ⅶ 2166 8R Ⅷ 2167 9R Ⅸ 2168 aR Ⅹ 2169 bR Ⅺ 216a cR Ⅻ 216b + |1r ⅰ 2170 2r ⅱ 2171 3r ⅲ 2172 4r ⅳ 2173 5r ⅴ 2174 6r ⅵ 2175 + |7r ⅶ 2176 8r ⅷ 2177 9r ⅸ 2178 ar ⅹ 2179 br ⅺ 217a cr ⅻ 217b + |<- ← 2190 -! ↑ 2191 -> → 2192 -v ↓ 2193 <> ↔ 2194 UD ↕ 2195 + |<= ⇐ 21d0 => ⇒ 21d2 == ⇔ 21d4 FA ∀ 2200 dP ∂ 2202 TE ∃ 2203 + |/0 ∅ 2205 DE ∆ 2206 NB ∇ 2207 (- ∈ 2208 -) ∋ 220b *P ∏ 220f + |+Z ∑ 2211 -2 − 2212 -+ ∓ 2213 *- ∗ 2217 Ob ∘ 2218 Sb ∙ 2219 + |RT √ 221a 0( ∝ 221d 00 ∞ 221e -L ∟ 221f -V ∠ 2220 PP ∥ 2225 + |AN ∧ 2227 OR ∨ 2228 (U ∩ 2229 )U ∪ 222a In ∫ 222b DI ∬ 222c + |Io ∮ 222e .: ∴ 2234 :. ∵ 2235 :R ∶ 2236 :: ∷ 2237 ?1 ∼ 223c + |CG ∾ 223e ?- ≃ 2243 ?= ≅ 2245 ?2 ≈ 2248 =? ≌ 224c HI ≓ 2253 + |!= ≠ 2260 =3 ≡ 2261 =< ≤ 2264 >= ≥ 2265 <* ≪ 226a *> ≫ 226b + |!< ≮ 226e !> ≯ 226f (C ⊂ 2282 )C ⊃ 2283 (_ ⊆ 2286 )_ ⊇ 2287 + |0. ⊙ 2299 02 ⊚ 229a -T ⊥ 22a5 .P ⋅ 22c5 :3 ⋮ 22ee .3 ⋯ 22ef + |Eh ⌂ 2302 <7 ⌈ 2308 >7 ⌉ 2309 7< ⌊ 230a 7> ⌋ 230b NI ⌐ 2310 + |(A ⌒ 2312 TR ⌕ 2315 Iu ⌠ 2320 Il ⌡ 2321 〉 232a + |Vs ␣ 2423 1h ⑀ 2440 3h ⑁ 2441 2h ⑂ 2442 4h ⑃ 2443 1j ⑆ 2446 + |2j ⑇ 2447 3j ⑈ 2448 4j ⑉ 2449 1. ⒈ 2488 2. ⒉ 2489 3. ⒊ 248a + |4. ⒋ 248b 5. ⒌ 248c 6. ⒍ 248d 7. ⒎ 248e 8. ⒏ 248f 9. ⒐ 2490 + |hh ─ 2500 HH ━ 2501 vv │ 2502 VV ┃ 2503 3- ┄ 2504 3_ ┅ 2505 + |3! ┆ 2506 3/ ┇ 2507 4- ┈ 2508 4_ ┉ 2509 4! ┊ 250a 4/ ┋ 250b + |dr ┌ 250c dR ┍ 250d Dr ┎ 250e DR ┏ 250f dl ┐ 2510 dL ┑ 2511 + |Dl ┒ 2512 LD ┓ 2513 ur └ 2514 uR ┕ 2515 Ur ┖ 2516 UR ┗ 2517 + |ul ┘ 2518 uL ┙ 2519 Ul ┚ 251a UL ┛ 251b vr ├ 251c vR ┝ 251d + |Vr ┠ 2520 VR ┣ 2523 vl ┤ 2524 vL ┥ 2525 Vl ┨ 2528 VL ┫ 252b + |dh ┬ 252c dH ┯ 252f Dh ┰ 2530 DH ┳ 2533 uh ┴ 2534 uH ┷ 2537 + |Uh ┸ 2538 UH ┻ 253b vh ┼ 253c vH ┿ 253f Vh ╂ 2542 VH ╋ 254b + |FD ╱ 2571 BD ╲ 2572 TB ▀ 2580 LB ▄ 2584 FB █ 2588 lB ▌ 258c + |RB ▐ 2590 .S ░ 2591 :S ▒ 2592 ?S ▓ 2593 fS ■ 25a0 OS □ 25a1 + |RO ▢ 25a2 Rr ▣ 25a3 RF ▤ 25a4 RY ▥ 25a5 RH ▦ 25a6 RZ ▧ 25a7 + |RK ▨ 25a8 RX ▩ 25a9 sB ▪ 25aa SR ▬ 25ac Or ▭ 25ad UT ▲ 25b2 + |uT △ 25b3 PR ▶ 25b6 Tr ▷ 25b7 Dt ▼ 25bc dT ▽ 25bd PL ◀ 25c0 + |Tl ◁ 25c1 Db ◆ 25c6 Dw ◇ 25c7 LZ ◊ 25ca 0m ○ 25cb 0o ◎ 25ce + |0M ● 25cf 0L ◐ 25d0 0R ◑ 25d1 Sn ◘ 25d8 Ic ◙ 25d9 Fd ◢ 25e2 + |Bd ◣ 25e3 *2 ★ 2605 *1 ☆ 2606 H ☞ 261e 0u ☺ 263a + |0U ☻ 263b SU ☼ 263c Fm ♀ 2640 Ml ♂ 2642 cS ♠ 2660 cH ♡ 2661 + |cD ♢ 2662 cC ♣ 2663 Md ♩ 2669 M8 ♪ 266a M2 ♫ 266b Mb ♭ 266d + |Mx ♮ 266e MX ♯ 266f OK ✓ 2713 XX ✗ 2717 -X ✠ 2720 IS   3000 + |,_ 、 3001 ._ 。 3002 +" 〃 3003 +_ 〄 3004 *_ 々 3005 ;_ 〆 3006 + |0_ 〇 3007 <+ 《 300a >+ 》 300b <' 「 300c >' 」 300d <" 『 300e + |>" 』 300f (" 【 3010 )" 】 3011 =T 〒 3012 =_ 〓 3013 (' 〔 3014 + |)' 〕 3015 (I 〖 3016 )I 〗 3017 -? 〜 301c A5 ぁ 3041 a5 あ 3042 + |I5 ぃ 3043 i5 い 3044 U5 ぅ 3045 u5 う 3046 E5 ぇ 3047 e5 え 3048 + |O5 ぉ 3049 o5 お 304a ka か 304b ga が 304c ki き 304d gi ぎ 304e + |ku く 304f gu ぐ 3050 ke け 3051 ge げ 3052 ko こ 3053 go ご 3054 + |sa さ 3055 za ざ 3056 si し 3057 zi じ 3058 su す 3059 zu ず 305a + |se せ 305b ze ぜ 305c so そ 305d zo ぞ 305e ta た 305f da だ 3060 + |ti ち 3061 di ぢ 3062 tU っ 3063 tu つ 3064 du づ 3065 te て 3066 + |de で 3067 to と 3068 do ど 3069 na な 306a ni に 306b nu ぬ 306c + |ne ね 306d no の 306e ha は 306f ba ば 3070 pa ぱ 3071 hi ひ 3072 + |bi び 3073 pi ぴ 3074 hu ふ 3075 bu ぶ 3076 pu ぷ 3077 he へ 3078 + |be べ 3079 pe ぺ 307a ho ほ 307b bo ぼ 307c po ぽ 307d ma ま 307e + |mi み 307f mu む 3080 me め 3081 mo も 3082 yA ゃ 3083 ya や 3084 + |yU ゅ 3085 yu ゆ 3086 yO ょ 3087 yo よ 3088 ra ら 3089 ri り 308a + |ru る 308b re れ 308c ro ろ 308d wA ゎ 308e wa わ 308f wi ゐ 3090 + |we ゑ 3091 wo を 3092 n5 ん 3093 vu ゔ 3094 "5 ゛ 309b 05 ゜ 309c + |*5 ゝ 309d +5 ゞ 309e a6 ァ 30a1 A6 ア 30a2 i6 ィ 30a3 I6 イ 30a4 + |u6 ゥ 30a5 U6 ウ 30a6 e6 ェ 30a7 E6 エ 30a8 o6 ォ 30a9 O6 オ 30aa + |Ka カ 30ab Ga ガ 30ac Ki キ 30ad Gi ギ 30ae Ku ク 30af Gu グ 30b0 + |Ke ケ 30b1 Ge ゲ 30b2 Ko コ 30b3 Go ゴ 30b4 Sa サ 30b5 Za ザ 30b6 + |Si シ 30b7 Zi ジ 30b8 Su ス 30b9 Zu ズ 30ba Se セ 30bb Ze ゼ 30bc + |So ソ 30bd Zo ゾ 30be Ta タ 30bf Da ダ 30c0 Ti チ 30c1 Di ヂ 30c2 + |TU ッ 30c3 Tu ツ 30c4 Du ヅ 30c5 Te テ 30c6 De デ 30c7 To ト 30c8 + |Do ド 30c9 Na ナ 30ca Ni ニ 30cb Nu ヌ 30cc Ne ネ 30cd No ノ 30ce + |Ha ハ 30cf Ba バ 30d0 Pa パ 30d1 Hi ヒ 30d2 Bi ビ 30d3 Pi ピ 30d4 + |Hu フ 30d5 Bu ブ 30d6 Pu プ 30d7 He ヘ 30d8 Be ベ 30d9 Pe ペ 30da + |Ho ホ 30db Bo ボ 30dc Po ポ 30dd Ma マ 30de Mi ミ 30df Mu ム 30e0 + |Me メ 30e1 Mo モ 30e2 YA ャ 30e3 Ya ヤ 30e4 YU ュ 30e5 Yu ユ 30e6 + |YO ョ 30e7 Yo ヨ 30e8 Ra ラ 30e9 Ri リ 30ea Ru ル 30eb Re レ 30ec + |Ro ロ 30ed WA ヮ 30ee Wa ワ 30ef Wi ヰ 30f0 We ヱ 30f1 Wo ヲ 30f2 + |N6 ン 30f3 Vu ヴ 30f4 KA ヵ 30f5 KE ヶ 30f6 Va ヷ 30f7 Vi ヸ 30f8 + |Ve ヹ 30f9 Vo ヺ 30fa .6 ・ 30fb -6 ー 30fc *6 ヽ 30fd +6 ヾ 30fe + |b4 ㄅ 3105 p4 ㄆ 3106 m4 ㄇ 3107 f4 ㄈ 3108 d4 ㄉ 3109 t4 ㄊ 310a + |n4 ㄋ 310b l4 ㄌ 310c g4 ㄍ 310d k4 ㄎ 310e h4 ㄏ 310f j4 ㄐ 3110 + |q4 ㄑ 3111 x4 ㄒ 3112 zh ㄓ 3113 ch ㄔ 3114 sh ㄕ 3115 r4 ㄖ 3116 + |z4 ㄗ 3117 c4 ㄘ 3118 s4 ㄙ 3119 a4 ㄚ 311a o4 ㄛ 311b e4 ㄜ 311c + |ai ㄞ 311e ei ㄟ 311f au ㄠ 3120 ou ㄡ 3121 an ㄢ 3122 en ㄣ 3123 + |aN ㄤ 3124 eN ㄥ 3125 er ㄦ 3126 i4 ㄧ 3127 u4 ㄨ 3128 iu ㄩ 3129 + |v4 ㄪ 312a nG ㄫ 312b gn ㄬ 312c 1c ㈠ 3220 2c ㈡ 3221 3c ㈢ 3222 + |4c ㈣ 3223 5c ㈤ 3224 6c ㈥ 3225 7c ㈦ 3226 8c ㈧ 3227 9c ㈨ 3228 + |/c  e001 UA  e002 UB  e003 "3  e004 "1  e005 "!  e006 + |"'  e007 ">  e008 "?  e009 "-  e00a "(  e00b ".  e00c + |":  e00d "0  e00e ""  e00f "<  e010 ",  e011 ";  e012 + |"_  e013 "=  e014 "/  e015 "i  e016 "d  e017 "p  e018 + |;;  e019 ,,  e01a b3  e01b Ci  e01c f(  e01d ed  e01e + |am  e01f pm  e020 Fl  e023 GF  e024 >V  e025 !*  e026 + |?*  e027 J<  e028 ff ff fb00 fi fi fb01 fl fl fb02 ft ſt fb05 + |st st fb06 """.trimMargin()) } } diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt index 16d9cef081..20a8c60347 100644 --- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt +++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt @@ -102,7 +102,6 @@ open class VimDigraphGroupBase() : VimDigraphGroup { } val output = buildString { - var count = 0 keys.forEach { (char, digraph) -> append(digraph) @@ -130,15 +129,17 @@ open class VimDigraphGroupBase() : VimDigraphGroup { append('0') } append(toHexString(char.code)) - append(" ") count++ if (count == colCount) { appendLine() count = 0 } + else { + append(" ") + } } - } + }.trimEnd() // TODO: Try to get rid of this val context = injector.executionContextManager.getEditorExecutionContext(editor) injector.outputPanel.output(editor, context, output) From 6cb6e4152223517d8bd5c1baabff91283e5724a0 Mon Sep 17 00:00:00 2001 From: Matt Ellis Date: Mon, 2 Sep 2024 18:50:05 +0100 Subject: [PATCH 04/17] Update digraph formatting to match Vim Vim only use the `~` prefix if the encoding is "latin1". We can just treat it as though the encoding is Unicode, and match the other places we format printable characters. Note that for Vim, if `'display'` contains "uhex", then all unprintable characters are shown in hex, including control characters (`^C`, etc.). IdeaVim does not support the `'display'` option. --- .../commands/DigraphsCommandTest.kt | 28 ++++++------ .../idea/vim/api/VimDigraphGroupBase.kt | 43 ++++++++----------- .../idea/vim/helper/EngineStringHelper.kt | 9 +++- 3 files changed, 40 insertions(+), 40 deletions(-) diff --git a/src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/commands/DigraphsCommandTest.kt b/src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/commands/DigraphsCommandTest.kt index 8da945c255..4592016aaa 100644 --- a/src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/commands/DigraphsCommandTest.kt +++ b/src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/commands/DigraphsCommandTest.kt @@ -40,15 +40,15 @@ class DigraphsCommandTest : VimTestCase() { |CN ^X 0018 EM ^Y 0019 SB ^Z 001a EC ^[ 001b FS ^\ 001c GS ^] 001d |RS ^^ 001e US ^_ 001f SP 0020 Nb # 0023 DO ${'$'} 0024 At @ 0040 |<( [ 005b // \ 005c )> ] 005d '> ^ 005e '! ` 0060 (! { 007b - |!! | 007c !) } 007d '? ~ 007e DT  007f PA ~@ 0080 HO ~A 0081 - |BH ~B 0082 NH ~C 0083 IN ~D 0084 NL ~E 0085 SA ~F 0086 ES ~G 0087 - |HS ~H 0088 HJ ~I 0089 VS ~J 008a PD ~K 008b PU ~L 008c RI ~M 008d - |S2 ~N 008e S3 ~O 008f DC ~P 0090 P1 ~Q 0091 P2 ~R 0092 TS ~S 0093 - |CC ~T 0094 MW ~U 0095 SG ~V 0096 EG ~W 0097 SS ~X 0098 GC ~Y 0099 - |SC ~Z 009a CI ~[ 009b ST ~\ 009c OC ~] 009d PM ~^ 009e AC ~_ 009f + |!! | 007c !) } 007d '? ~ 007e DT ^? 007f PA <80> 0080 HO <81> 0081 + |BH <82> 0082 NH <83> 0083 IN <84> 0084 NL <85> 0085 SA <86> 0086 ES <87> 0087 + |HS <88> 0088 HJ <89> 0089 VS <8a> 008a PD <8b> 008b PU <8c> 008c RI <8d> 008d + |S2 <8e> 008e S3 <8f> 008f DC <90> 0090 P1 <91> 0091 P2 <92> 0092 TS <93> 0093 + |CC <94> 0094 MW <95> 0095 SG <96> 0096 EG <97> 0097 SS <98> 0098 GC <99> 0099 + |SC <9a> 009a CI <9b> 009b ST <9c> 009c OC <9d> 009d PM <9e> 009e AC <9f> 009f |NS   00a0 !I ¡ 00a1 Ct ¢ 00a2 Pd £ 00a3 Cu ¤ 00a4 Ye ¥ 00a5 |BB ¦ 00a6 SE § 00a7 ': ¨ 00a8 Co © 00a9 -a ª 00aa << « 00ab - |NO ¬ 00ac -- ­ 00ad Rg ® 00ae 'm ¯ 00af DG ° 00b0 +- ± 00b1 + |NO ¬ 00ac -- 00ad Rg ® 00ae 'm ¯ 00af DG ° 00b0 +- ± 00b1 |2S ² 00b2 3S ³ 00b3 '' ´ 00b4 My µ 00b5 PI ¶ 00b6 .M · 00b7 |', ¸ 00b8 1S ¹ 00b9 -o º 00ba >> » 00bb 14 ¼ 00bc 12 ½ 00bd |34 ¾ 00be ?I ¿ 00bf A! À 00c0 A' Á 00c1 A>  00c2 A? à 00c3 @@ -249,13 +249,13 @@ class DigraphsCommandTest : VimTestCase() { |aN ㄤ 3124 eN ㄥ 3125 er ㄦ 3126 i4 ㄧ 3127 u4 ㄨ 3128 iu ㄩ 3129 |v4 ㄪ 312a nG ㄫ 312b gn ㄬ 312c 1c ㈠ 3220 2c ㈡ 3221 3c ㈢ 3222 |4c ㈣ 3223 5c ㈤ 3224 6c ㈥ 3225 7c ㈦ 3226 8c ㈧ 3227 9c ㈨ 3228 - |/c  e001 UA  e002 UB  e003 "3  e004 "1  e005 "!  e006 - |"'  e007 ">  e008 "?  e009 "-  e00a "(  e00b ".  e00c - |":  e00d "0  e00e ""  e00f "<  e010 ",  e011 ";  e012 - |"_  e013 "=  e014 "/  e015 "i  e016 "d  e017 "p  e018 - |;;  e019 ,,  e01a b3  e01b Ci  e01c f(  e01d ed  e01e - |am  e01f pm  e020 Fl  e023 GF  e024 >V  e025 !*  e026 - |?*  e027 J<  e028 ff ff fb00 fi fi fb01 fl fl fb02 ft ſt fb05 + |/c e001 UA e002 UB e003 "3 e004 "1 e005 "! e006 + |"' e007 "> e008 "? e009 "- e00a "( e00b ". e00c + |": e00d "0 e00e "" e00f "< e010 ", e011 "; e012 + |"_ e013 "= e014 "/ e015 "i e016 "d e017 "p e018 + |;; e019 ,, e01a b3 e01b Ci e01c f( e01d ed e01e + |am e01f pm e020 Fl e023 GF e024 >V e025 !* e026 + |?* e027 J< e028 ff ff fb00 fi fi fb01 fl fl fb02 ft ſt fb05 |st st fb06 """.trimMargin()) } diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt index 20a8c60347..a813cef62e 100644 --- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt +++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt @@ -91,13 +91,13 @@ open class VimDigraphGroupBase() : VimDigraphGroup { override fun showDigraphs(editor: VimEditor) { val width = injector.engineEditorHelper.getApproximateScreenWidth(editor).let { if (it < 10) 80 else it } - val colWidth = 12 - val colCount = width / colWidth - val height = ceil(digraphs.size.toDouble() / colCount.toDouble()).toInt() + val columnWidth = 12 + val columnCount = width / columnWidth + val height = ceil(digraphs.size.toDouble() / columnCount.toDouble()).toInt() if (logger.isDebug()) { logger.debug("width=$width") - logger.debug("colCount=$colCount") + logger.debug("colCount=$columnCount") logger.debug("height=$height") } @@ -106,32 +106,25 @@ open class VimDigraphGroupBase() : VimDigraphGroup { keys.forEach { (char, digraph) -> append(digraph) append(' ') - if (char.code < 32) { - append('^') - append(char + '@'.code) - } - else if (char.code >= 128 && char.code <= 159) { - append('~') - append(char - 128 + '@'.code) - } - else { - append(char) + + val l = this.length + append(EngineStringHelper.toPrintableCharacter(char)) + + // Add an extra space if we've only used one text cell. Subtract 3 for the characters + a space + // Ideally here, we'd check the EAST_ASIAN_WIDTH Unicode property of the printed character. If it's full width, + // it's taken two "cells". I'm not sure this would work for all characters, e.g. Ⅵ seems to be 1.5 "cells" wide. + // Perhaps we could set the output panel's tab size to 13, and use tab stops to make things line up? + if (length - l == 1) { append(' ') } + + // Print the code: ' %3d' append(' ') - if (char.code < 0x1000) { - append('0') - } - if (char.code < 0x100) { - append('0') - } - if (char.code < 0x10) { - append('0') - } - append(toHexString(char.code)) +// append(char.toString().padStart(3)) + append(toHexString(char.code).padStart(4, '0')) count++ - if (count == colCount) { + if (count == columnCount) { appendLine() count = 0 } diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/helper/EngineStringHelper.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/helper/EngineStringHelper.kt index 3c5147a749..cd36d1e7c5 100644 --- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/helper/EngineStringHelper.kt +++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/helper/EngineStringHelper.kt @@ -42,6 +42,10 @@ object EngineStringHelper { } else if (c == KeyEvent.CHAR_UNDEFINED && key.modifiers and InputEvent.CTRL_DOWN_MASK != 0) { c = (key.keyCode - 'A'.code + 1).toChar() } + return toPrintableCharacter(c) + } + + fun toPrintableCharacter(c: Char): String { if (c.code <= 31) { return "^" + (c.code + 'A'.code - 1).toChar() } else if (c.code == 127) { @@ -56,7 +60,10 @@ object EngineStringHelper { // } else if (c == 255) { // return "~" + (char)(c - (('A' - 1) * 3)); } else if (CharacterHelper.isInvisibleControlCharacter(c) || CharacterHelper.isZeroWidthCharacter(c)) { - return String.format("<%04x>", c.code) + if (c.code > 0xff) { + return String.format("<%04x>", c.code) + } + return String.format("<%02x>", c.code) } return c.toString() } From 40a5c7df58df3520dbd984bde747ca09b44d0ddf Mon Sep 17 00:00:00 2001 From: Matt Ellis Date: Mon, 2 Sep 2024 19:10:09 +0100 Subject: [PATCH 05/17] Output digraph character codes in decimal, like Vim Not sure why IdeaVim has used hex. Vim appears to have used decimal for at least 20 years. --- .../commands/DigraphsCommandTest.kt | 448 +++++++++--------- .../idea/vim/api/VimDigraphGroupBase.kt | 32 +- 2 files changed, 243 insertions(+), 237 deletions(-) diff --git a/src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/commands/DigraphsCommandTest.kt b/src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/commands/DigraphsCommandTest.kt index 4592016aaa..5076973103 100644 --- a/src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/commands/DigraphsCommandTest.kt +++ b/src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/commands/DigraphsCommandTest.kt @@ -33,230 +33,230 @@ class DigraphsCommandTest : VimTestCase() { fun `test digraph output`() { assertCommandOutput("digraphs", """ - |NU ^@ 0000 SH ^A 0001 SX ^B 0002 EX ^C 0003 ET ^D 0004 EQ ^E 0005 - |AK ^F 0006 BL ^G 0007 BS ^H 0008 HT ^I 0009 LF ^J 000a VT ^K 000b - |FF ^L 000c CR ^M 000d SO ^N 000e SI ^O 000f DL ^P 0010 D1 ^Q 0011 - |D2 ^R 0012 D3 ^S 0013 D4 ^T 0014 NK ^U 0015 SY ^V 0016 EB ^W 0017 - |CN ^X 0018 EM ^Y 0019 SB ^Z 001a EC ^[ 001b FS ^\ 001c GS ^] 001d - |RS ^^ 001e US ^_ 001f SP 0020 Nb # 0023 DO ${'$'} 0024 At @ 0040 - |<( [ 005b // \ 005c )> ] 005d '> ^ 005e '! ` 0060 (! { 007b - |!! | 007c !) } 007d '? ~ 007e DT ^? 007f PA <80> 0080 HO <81> 0081 - |BH <82> 0082 NH <83> 0083 IN <84> 0084 NL <85> 0085 SA <86> 0086 ES <87> 0087 - |HS <88> 0088 HJ <89> 0089 VS <8a> 008a PD <8b> 008b PU <8c> 008c RI <8d> 008d - |S2 <8e> 008e S3 <8f> 008f DC <90> 0090 P1 <91> 0091 P2 <92> 0092 TS <93> 0093 - |CC <94> 0094 MW <95> 0095 SG <96> 0096 EG <97> 0097 SS <98> 0098 GC <99> 0099 - |SC <9a> 009a CI <9b> 009b ST <9c> 009c OC <9d> 009d PM <9e> 009e AC <9f> 009f - |NS   00a0 !I ¡ 00a1 Ct ¢ 00a2 Pd £ 00a3 Cu ¤ 00a4 Ye ¥ 00a5 - |BB ¦ 00a6 SE § 00a7 ': ¨ 00a8 Co © 00a9 -a ª 00aa << « 00ab - |NO ¬ 00ac -- 00ad Rg ® 00ae 'm ¯ 00af DG ° 00b0 +- ± 00b1 - |2S ² 00b2 3S ³ 00b3 '' ´ 00b4 My µ 00b5 PI ¶ 00b6 .M · 00b7 - |', ¸ 00b8 1S ¹ 00b9 -o º 00ba >> » 00bb 14 ¼ 00bc 12 ½ 00bd - |34 ¾ 00be ?I ¿ 00bf A! À 00c0 A' Á 00c1 A>  00c2 A? à 00c3 - |A: Ä 00c4 AA Å 00c5 AE Æ 00c6 C, Ç 00c7 E! È 00c8 E' É 00c9 - |E> Ê 00ca E: Ë 00cb I! Ì 00cc I' Í 00cd I> Î 00ce I: Ï 00cf - |D- Ð 00d0 N? Ñ 00d1 O! Ò 00d2 O' Ó 00d3 O> Ô 00d4 O? Õ 00d5 - |O: Ö 00d6 *X × 00d7 O/ Ø 00d8 U! Ù 00d9 U' Ú 00da U> Û 00db - |U: Ü 00dc Y' Ý 00dd TH Þ 00de ss ß 00df a! à 00e0 a' á 00e1 - |a> â 00e2 a? ã 00e3 a: ä 00e4 aa å 00e5 ae æ 00e6 c, ç 00e7 - |e! è 00e8 e' é 00e9 e> ê 00ea e: ë 00eb i! ì 00ec i' í 00ed - |i> î 00ee i: ï 00ef d- ð 00f0 n? ñ 00f1 o! ò 00f2 o' ó 00f3 - |o> ô 00f4 o? õ 00f5 o: ö 00f6 -: ÷ 00f7 o/ ø 00f8 u! ù 00f9 - |u' ú 00fa u> û 00fb u: ü 00fc y' ý 00fd th þ 00fe y: ÿ 00ff - |A- Ā 0100 a- ā 0101 A( Ă 0102 a( ă 0103 A; Ą 0104 a; ą 0105 - |C' Ć 0106 c' ć 0107 C> Ĉ 0108 c> ĉ 0109 C. Ċ 010a c. ċ 010b - |C< Č 010c c< č 010d D< Ď 010e d< ď 010f D/ Đ 0110 d/ đ 0111 - |E- Ē 0112 e- ē 0113 E( Ĕ 0114 e( ĕ 0115 E. Ė 0116 e. ė 0117 - |E; Ę 0118 e; ę 0119 E< Ě 011a e< ě 011b G> Ĝ 011c g> ĝ 011d - |G( Ğ 011e g( ğ 011f G. Ġ 0120 g. ġ 0121 G, Ģ 0122 g, ģ 0123 - |H> Ĥ 0124 h> ĥ 0125 H/ Ħ 0126 h/ ħ 0127 I? Ĩ 0128 i? ĩ 0129 - |I- Ī 012a i- ī 012b I( Ĭ 012c i( ĭ 012d I; Į 012e i; į 012f - |I. İ 0130 i. ı 0131 IJ IJ 0132 ij ij 0133 J> Ĵ 0134 j> ĵ 0135 - |K, Ķ 0136 k, ķ 0137 kk ĸ 0138 L' Ĺ 0139 l' ĺ 013a L, Ļ 013b - |l, ļ 013c L< Ľ 013d l< ľ 013e L. Ŀ 013f l. ŀ 0140 L/ Ł 0141 - |l/ ł 0142 N' Ń 0143 n' ń 0144 N, Ņ 0145 n, ņ 0146 N< Ň 0147 - |n< ň 0148 'n ʼn 0149 NG Ŋ 014a ng ŋ 014b O- Ō 014c o- ō 014d - |O( Ŏ 014e o( ŏ 014f O" Ő 0150 o" ő 0151 OE Œ 0152 oe œ 0153 - |R' Ŕ 0154 r' ŕ 0155 R, Ŗ 0156 r, ŗ 0157 R< Ř 0158 r< ř 0159 - |S' Ś 015a s' ś 015b S> Ŝ 015c s> ŝ 015d S, Ş 015e s, ş 015f - |S< Š 0160 s< š 0161 T, Ţ 0162 t, ţ 0163 T< Ť 0164 t< ť 0165 - |T/ Ŧ 0166 t/ ŧ 0167 U? Ũ 0168 u? ũ 0169 U- Ū 016a u- ū 016b - |U( Ŭ 016c u( ŭ 016d U0 Ů 016e u0 ů 016f U" Ű 0170 u" ű 0171 - |U; Ų 0172 u; ų 0173 W> Ŵ 0174 w> ŵ 0175 Y> Ŷ 0176 y> ŷ 0177 - |Y: Ÿ 0178 Z' Ź 0179 z' ź 017a Z. Ż 017b z. ż 017c Z< Ž 017d - |z< ž 017e O9 Ơ 01a0 o9 ơ 01a1 OI Ƣ 01a2 oi ƣ 01a3 yr Ʀ 01a6 - |U9 Ư 01af u9 ư 01b0 Z/ Ƶ 01b5 z/ ƶ 01b6 ED Ʒ 01b7 A< Ǎ 01cd - |a< ǎ 01ce I< Ǐ 01cf i< ǐ 01d0 O< Ǒ 01d1 o< ǒ 01d2 U< Ǔ 01d3 - |u< ǔ 01d4 A1 Ǟ 01de a1 ǟ 01df A7 Ǡ 01e0 a7 ǡ 01e1 A3 Ǣ 01e2 - |a3 ǣ 01e3 G/ Ǥ 01e4 g/ ǥ 01e5 G< Ǧ 01e6 g< ǧ 01e7 K< Ǩ 01e8 - |k< ǩ 01e9 O; Ǫ 01ea o; ǫ 01eb O1 Ǭ 01ec o1 ǭ 01ed EZ Ǯ 01ee - |ez ǯ 01ef j< ǰ 01f0 G' Ǵ 01f4 g' ǵ 01f5 ;S ʿ 02bf '< ˇ 02c7 - |'( ˘ 02d8 '. ˙ 02d9 '0 ˚ 02da '; ˛ 02db '" ˝ 02dd A% Ά 0386 - |E% Έ 0388 Y% Ή 0389 I% Ί 038a O% Ό 038c U% Ύ 038e W% Ώ 038f - |i3 ΐ 0390 A* Α 0391 B* Β 0392 G* Γ 0393 D* Δ 0394 E* Ε 0395 - |Z* Ζ 0396 Y* Η 0397 H* Θ 0398 I* Ι 0399 K* Κ 039a L* Λ 039b - |M* Μ 039c N* Ν 039d C* Ξ 039e O* Ο 039f P* Π 03a0 R* Ρ 03a1 - |S* Σ 03a3 T* Τ 03a4 U* Υ 03a5 F* Φ 03a6 X* Χ 03a7 Q* Ψ 03a8 - |W* Ω 03a9 J* Ϊ 03aa V* Ϋ 03ab a% ά 03ac e% έ 03ad y% ή 03ae - |i% ί 03af u3 ΰ 03b0 a* α 03b1 b* β 03b2 g* γ 03b3 d* δ 03b4 - |e* ε 03b5 z* ζ 03b6 y* η 03b7 h* θ 03b8 i* ι 03b9 k* κ 03ba - |l* λ 03bb m* μ 03bc n* ν 03bd c* ξ 03be o* ο 03bf p* π 03c0 - |r* ρ 03c1 *s ς 03c2 s* σ 03c3 t* τ 03c4 u* υ 03c5 f* φ 03c6 - |x* χ 03c7 q* ψ 03c8 w* ω 03c9 j* ϊ 03ca v* ϋ 03cb o% ό 03cc - |u% ύ 03cd w% ώ 03ce 'G Ϙ 03d8 ,G ϙ 03d9 T3 Ϛ 03da t3 ϛ 03db - |M3 Ϝ 03dc m3 ϝ 03dd K3 Ϟ 03de k3 ϟ 03df P3 Ϡ 03e0 p3 ϡ 03e1 - |'% ϴ 03f4 j3 ϵ 03f5 IO Ё 0401 D% Ђ 0402 G% Ѓ 0403 IE Є 0404 - |DS Ѕ 0405 II І 0406 YI Ї 0407 J% Ј 0408 LJ Љ 0409 NJ Њ 040a - |Ts Ћ 040b KJ Ќ 040c V% Ў 040e DZ Џ 040f A= А 0410 B= Б 0411 - |V= В 0412 G= Г 0413 D= Д 0414 E= Е 0415 Z% Ж 0416 Z= З 0417 - |I= И 0418 J= Й 0419 K= К 041a L= Л 041b M= М 041c N= Н 041d - |O= О 041e P= П 041f R= Р 0420 S= С 0421 T= Т 0422 U= У 0423 - |F= Ф 0424 H= Х 0425 C= Ц 0426 C% Ч 0427 S% Ш 0428 Sc Щ 0429 - |=" Ъ 042a Y= Ы 042b %" Ь 042c JE Э 042d JU Ю 042e JA Я 042f - |a= а 0430 b= б 0431 v= в 0432 g= г 0433 d= д 0434 e= е 0435 - |z% ж 0436 z= з 0437 i= и 0438 j= й 0439 k= к 043a l= л 043b - |m= м 043c n= н 043d o= о 043e p= п 043f r= р 0440 s= с 0441 - |t= т 0442 u= у 0443 f= ф 0444 h= х 0445 c= ц 0446 c% ч 0447 - |s% ш 0448 sc щ 0449 =' ъ 044a y= ы 044b %' ь 044c je э 044d - |ju ю 044e ja я 044f io ё 0451 d% ђ 0452 g% ѓ 0453 ie є 0454 - |ds ѕ 0455 ii і 0456 yi ї 0457 j% ј 0458 lj љ 0459 nj њ 045a - |ts ћ 045b kj ќ 045c v% ў 045e dz џ 045f Y3 Ѣ 0462 y3 ѣ 0463 - |O3 Ѫ 046a o3 ѫ 046b F3 Ѳ 0472 f3 ѳ 0473 V3 Ѵ 0474 v3 ѵ 0475 - |C3 Ҁ 0480 c3 ҁ 0481 G3 Ґ 0490 g3 ґ 0491 A+ א 05d0 B+ ב 05d1 - |G+ ג 05d2 D+ ד 05d3 H+ ה 05d4 W+ ו 05d5 Z+ ז 05d6 X+ ח 05d7 - |Tj ט 05d8 J+ י 05d9 K% ך 05da K+ כ 05db L+ ל 05dc M% ם 05dd - |M+ מ 05de N% ן 05df N+ נ 05e0 S+ ס 05e1 E+ ע 05e2 P% ף 05e3 - |P+ פ 05e4 Zj ץ 05e5 ZJ צ 05e6 Q+ ק 05e7 R+ ר 05e8 Sh ש 05e9 - |T+ ת 05ea ,+ ، 060c ;+ ؛ 061b ?+ ؟ 061f H' ء 0621 aM آ 0622 - |aH أ 0623 wH ؤ 0624 ah إ 0625 yH ئ 0626 a+ ا 0627 b+ ب 0628 - |tm ة 0629 t+ ت 062a tk ث 062b g+ ج 062c hk ح 062d x+ خ 062e - |d+ د 062f dk ذ 0630 r+ ر 0631 z+ ز 0632 s+ س 0633 sn ش 0634 - |c+ ص 0635 dd ض 0636 tj ط 0637 zH ظ 0638 e+ ع 0639 i+ غ 063a - |++ ـ 0640 f+ ف 0641 q+ ق 0642 k+ ك 0643 l+ ل 0644 m+ م 0645 - |n+ ن 0646 h+ ه 0647 w+ و 0648 j+ ى 0649 y+ ي 064a :+ ً 064b - |"+ ٌ 064c =+ ٍ 064d /+ َ 064e '+ ُ 064f 1+ ِ 0650 3+ ّ 0651 - |0+ ْ 0652 aS ٰ 0670 p+ پ 067e v+ ڤ 06a4 gf گ 06af 0a ۰ 06f0 - |1a ۱ 06f1 2a ۲ 06f2 3a ۳ 06f3 4a ۴ 06f4 5a ۵ 06f5 6a ۶ 06f6 - |7a ۷ 06f7 8a ۸ 06f8 9a ۹ 06f9 B. Ḃ 1e02 b. ḃ 1e03 B_ Ḇ 1e06 - |b_ ḇ 1e07 D. Ḋ 1e0a d. ḋ 1e0b D_ Ḏ 1e0e d_ ḏ 1e0f D, Ḑ 1e10 - |d, ḑ 1e11 F. Ḟ 1e1e f. ḟ 1e1f G- Ḡ 1e20 g- ḡ 1e21 H. Ḣ 1e22 - |h. ḣ 1e23 H: Ḧ 1e26 h: ḧ 1e27 H, Ḩ 1e28 h, ḩ 1e29 K' Ḱ 1e30 - |k' ḱ 1e31 K_ Ḵ 1e34 k_ ḵ 1e35 L_ Ḻ 1e3a l_ ḻ 1e3b M' Ḿ 1e3e - |m' ḿ 1e3f M. Ṁ 1e40 m. ṁ 1e41 N. Ṅ 1e44 n. ṅ 1e45 N_ Ṉ 1e48 - |n_ ṉ 1e49 P' Ṕ 1e54 p' ṕ 1e55 P. Ṗ 1e56 p. ṗ 1e57 R. Ṙ 1e58 - |r. ṙ 1e59 R_ Ṟ 1e5e r_ ṟ 1e5f S. Ṡ 1e60 s. ṡ 1e61 T. Ṫ 1e6a - |t. ṫ 1e6b T_ Ṯ 1e6e t_ ṯ 1e6f V? Ṽ 1e7c v? ṽ 1e7d W! Ẁ 1e80 - |w! ẁ 1e81 W' Ẃ 1e82 w' ẃ 1e83 W: Ẅ 1e84 w: ẅ 1e85 W. Ẇ 1e86 - |w. ẇ 1e87 X. Ẋ 1e8a x. ẋ 1e8b X: Ẍ 1e8c x: ẍ 1e8d Y. Ẏ 1e8e - |y. ẏ 1e8f Z> Ẑ 1e90 z> ẑ 1e91 Z_ Ẕ 1e94 z_ ẕ 1e95 h_ ẖ 1e96 - |t: ẗ 1e97 w0 ẘ 1e98 y0 ẙ 1e99 A2 Ả 1ea2 a2 ả 1ea3 E2 Ẻ 1eba - |e2 ẻ 1ebb E? Ẽ 1ebc e? ẽ 1ebd I2 Ỉ 1ec8 i2 ỉ 1ec9 O2 Ỏ 1ece - |o2 ỏ 1ecf U2 Ủ 1ee6 u2 ủ 1ee7 Y! Ỳ 1ef2 y! ỳ 1ef3 Y2 Ỷ 1ef6 - |y2 ỷ 1ef7 Y? Ỹ 1ef8 y? ỹ 1ef9 ;' ἀ 1f00 ,' ἁ 1f01 ;! ἂ 1f02 - |,! ἃ 1f03 ?; ἄ 1f04 ?, ἅ 1f05 !: ἆ 1f06 ?: ἇ 1f07 1N   2002 - |1M   2003 3M   2004 4M   2005 6M   2006 1T   2009 1H   200a - |-1 ‐ 2010 -N – 2013 -M — 2014 -3 ― 2015 !2 ‖ 2016 =2 ‗ 2017 - |'6 ‘ 2018 '9 ’ 2019 .9 ‚ 201a 9' ‛ 201b "6 “ 201c "9 ” 201d - |:9 „ 201e 9" ‟ 201f /- † 2020 /= ‡ 2021 .. ‥ 2025 ,. … 2026 - |%0 ‰ 2030 1' ′ 2032 2' ″ 2033 3' ‴ 2034 1" ‵ 2035 2" ‶ 2036 - |3" ‷ 2037 Ca ‸ 2038 <1 ‹ 2039 >1 › 203a :X ※ 203b '- ‾ 203e - |/f ⁄ 2044 0S ⁰ 2070 4S ⁴ 2074 5S ⁵ 2075 6S ⁶ 2076 7S ⁷ 2077 - |8S ⁸ 2078 9S ⁹ 2079 +S ⁺ 207a -S ⁻ 207b =S ⁼ 207c (S ⁽ 207d - |)S ⁾ 207e nS ⁿ 207f 0s ₀ 2080 1s ₁ 2081 2s ₂ 2082 3s ₃ 2083 - |4s ₄ 2084 5s ₅ 2085 6s ₆ 2086 7s ₇ 2087 8s ₈ 2088 9s ₉ 2089 - |+s ₊ 208a -s ₋ 208b =s ₌ 208c (s ₍ 208d )s ₎ 208e Li ₤ 20a4 - |Pt ₧ 20a7 W= ₩ 20a9 oC ℃ 2103 co ℅ 2105 oF ℉ 2109 N0 № 2116 - |PO ℗ 2117 Rx ℞ 211e SM ℠ 2120 TM ™ 2122 Om Ω 2126 AO Å 212b - |13 ⅓ 2153 23 ⅔ 2154 15 ⅕ 2155 25 ⅖ 2156 35 ⅗ 2157 45 ⅘ 2158 - |16 ⅙ 2159 56 ⅚ 215a 18 ⅛ 215b 38 ⅜ 215c 58 ⅝ 215d 78 ⅞ 215e - |1R Ⅰ 2160 2R Ⅱ 2161 3R Ⅲ 2162 4R Ⅳ 2163 5R Ⅴ 2164 6R Ⅵ 2165 - |7R Ⅶ 2166 8R Ⅷ 2167 9R Ⅸ 2168 aR Ⅹ 2169 bR Ⅺ 216a cR Ⅻ 216b - |1r ⅰ 2170 2r ⅱ 2171 3r ⅲ 2172 4r ⅳ 2173 5r ⅴ 2174 6r ⅵ 2175 - |7r ⅶ 2176 8r ⅷ 2177 9r ⅸ 2178 ar ⅹ 2179 br ⅺ 217a cr ⅻ 217b - |<- ← 2190 -! ↑ 2191 -> → 2192 -v ↓ 2193 <> ↔ 2194 UD ↕ 2195 - |<= ⇐ 21d0 => ⇒ 21d2 == ⇔ 21d4 FA ∀ 2200 dP ∂ 2202 TE ∃ 2203 - |/0 ∅ 2205 DE ∆ 2206 NB ∇ 2207 (- ∈ 2208 -) ∋ 220b *P ∏ 220f - |+Z ∑ 2211 -2 − 2212 -+ ∓ 2213 *- ∗ 2217 Ob ∘ 2218 Sb ∙ 2219 - |RT √ 221a 0( ∝ 221d 00 ∞ 221e -L ∟ 221f -V ∠ 2220 PP ∥ 2225 - |AN ∧ 2227 OR ∨ 2228 (U ∩ 2229 )U ∪ 222a In ∫ 222b DI ∬ 222c - |Io ∮ 222e .: ∴ 2234 :. ∵ 2235 :R ∶ 2236 :: ∷ 2237 ?1 ∼ 223c - |CG ∾ 223e ?- ≃ 2243 ?= ≅ 2245 ?2 ≈ 2248 =? ≌ 224c HI ≓ 2253 - |!= ≠ 2260 =3 ≡ 2261 =< ≤ 2264 >= ≥ 2265 <* ≪ 226a *> ≫ 226b - |!< ≮ 226e !> ≯ 226f (C ⊂ 2282 )C ⊃ 2283 (_ ⊆ 2286 )_ ⊇ 2287 - |0. ⊙ 2299 02 ⊚ 229a -T ⊥ 22a5 .P ⋅ 22c5 :3 ⋮ 22ee .3 ⋯ 22ef - |Eh ⌂ 2302 <7 ⌈ 2308 >7 ⌉ 2309 7< ⌊ 230a 7> ⌋ 230b NI ⌐ 2310 - |(A ⌒ 2312 TR ⌕ 2315 Iu ⌠ 2320 Il ⌡ 2321 〉 232a - |Vs ␣ 2423 1h ⑀ 2440 3h ⑁ 2441 2h ⑂ 2442 4h ⑃ 2443 1j ⑆ 2446 - |2j ⑇ 2447 3j ⑈ 2448 4j ⑉ 2449 1. ⒈ 2488 2. ⒉ 2489 3. ⒊ 248a - |4. ⒋ 248b 5. ⒌ 248c 6. ⒍ 248d 7. ⒎ 248e 8. ⒏ 248f 9. ⒐ 2490 - |hh ─ 2500 HH ━ 2501 vv │ 2502 VV ┃ 2503 3- ┄ 2504 3_ ┅ 2505 - |3! ┆ 2506 3/ ┇ 2507 4- ┈ 2508 4_ ┉ 2509 4! ┊ 250a 4/ ┋ 250b - |dr ┌ 250c dR ┍ 250d Dr ┎ 250e DR ┏ 250f dl ┐ 2510 dL ┑ 2511 - |Dl ┒ 2512 LD ┓ 2513 ur └ 2514 uR ┕ 2515 Ur ┖ 2516 UR ┗ 2517 - |ul ┘ 2518 uL ┙ 2519 Ul ┚ 251a UL ┛ 251b vr ├ 251c vR ┝ 251d - |Vr ┠ 2520 VR ┣ 2523 vl ┤ 2524 vL ┥ 2525 Vl ┨ 2528 VL ┫ 252b - |dh ┬ 252c dH ┯ 252f Dh ┰ 2530 DH ┳ 2533 uh ┴ 2534 uH ┷ 2537 - |Uh ┸ 2538 UH ┻ 253b vh ┼ 253c vH ┿ 253f Vh ╂ 2542 VH ╋ 254b - |FD ╱ 2571 BD ╲ 2572 TB ▀ 2580 LB ▄ 2584 FB █ 2588 lB ▌ 258c - |RB ▐ 2590 .S ░ 2591 :S ▒ 2592 ?S ▓ 2593 fS ■ 25a0 OS □ 25a1 - |RO ▢ 25a2 Rr ▣ 25a3 RF ▤ 25a4 RY ▥ 25a5 RH ▦ 25a6 RZ ▧ 25a7 - |RK ▨ 25a8 RX ▩ 25a9 sB ▪ 25aa SR ▬ 25ac Or ▭ 25ad UT ▲ 25b2 - |uT △ 25b3 PR ▶ 25b6 Tr ▷ 25b7 Dt ▼ 25bc dT ▽ 25bd PL ◀ 25c0 - |Tl ◁ 25c1 Db ◆ 25c6 Dw ◇ 25c7 LZ ◊ 25ca 0m ○ 25cb 0o ◎ 25ce - |0M ● 25cf 0L ◐ 25d0 0R ◑ 25d1 Sn ◘ 25d8 Ic ◙ 25d9 Fd ◢ 25e2 - |Bd ◣ 25e3 *2 ★ 2605 *1 ☆ 2606 H ☞ 261e 0u ☺ 263a - |0U ☻ 263b SU ☼ 263c Fm ♀ 2640 Ml ♂ 2642 cS ♠ 2660 cH ♡ 2661 - |cD ♢ 2662 cC ♣ 2663 Md ♩ 2669 M8 ♪ 266a M2 ♫ 266b Mb ♭ 266d - |Mx ♮ 266e MX ♯ 266f OK ✓ 2713 XX ✗ 2717 -X ✠ 2720 IS   3000 - |,_ 、 3001 ._ 。 3002 +" 〃 3003 +_ 〄 3004 *_ 々 3005 ;_ 〆 3006 - |0_ 〇 3007 <+ 《 300a >+ 》 300b <' 「 300c >' 」 300d <" 『 300e - |>" 』 300f (" 【 3010 )" 】 3011 =T 〒 3012 =_ 〓 3013 (' 〔 3014 - |)' 〕 3015 (I 〖 3016 )I 〗 3017 -? 〜 301c A5 ぁ 3041 a5 あ 3042 - |I5 ぃ 3043 i5 い 3044 U5 ぅ 3045 u5 う 3046 E5 ぇ 3047 e5 え 3048 - |O5 ぉ 3049 o5 お 304a ka か 304b ga が 304c ki き 304d gi ぎ 304e - |ku く 304f gu ぐ 3050 ke け 3051 ge げ 3052 ko こ 3053 go ご 3054 - |sa さ 3055 za ざ 3056 si し 3057 zi じ 3058 su す 3059 zu ず 305a - |se せ 305b ze ぜ 305c so そ 305d zo ぞ 305e ta た 305f da だ 3060 - |ti ち 3061 di ぢ 3062 tU っ 3063 tu つ 3064 du づ 3065 te て 3066 - |de で 3067 to と 3068 do ど 3069 na な 306a ni に 306b nu ぬ 306c - |ne ね 306d no の 306e ha は 306f ba ば 3070 pa ぱ 3071 hi ひ 3072 - |bi び 3073 pi ぴ 3074 hu ふ 3075 bu ぶ 3076 pu ぷ 3077 he へ 3078 - |be べ 3079 pe ぺ 307a ho ほ 307b bo ぼ 307c po ぽ 307d ma ま 307e - |mi み 307f mu む 3080 me め 3081 mo も 3082 yA ゃ 3083 ya や 3084 - |yU ゅ 3085 yu ゆ 3086 yO ょ 3087 yo よ 3088 ra ら 3089 ri り 308a - |ru る 308b re れ 308c ro ろ 308d wA ゎ 308e wa わ 308f wi ゐ 3090 - |we ゑ 3091 wo を 3092 n5 ん 3093 vu ゔ 3094 "5 ゛ 309b 05 ゜ 309c - |*5 ゝ 309d +5 ゞ 309e a6 ァ 30a1 A6 ア 30a2 i6 ィ 30a3 I6 イ 30a4 - |u6 ゥ 30a5 U6 ウ 30a6 e6 ェ 30a7 E6 エ 30a8 o6 ォ 30a9 O6 オ 30aa - |Ka カ 30ab Ga ガ 30ac Ki キ 30ad Gi ギ 30ae Ku ク 30af Gu グ 30b0 - |Ke ケ 30b1 Ge ゲ 30b2 Ko コ 30b3 Go ゴ 30b4 Sa サ 30b5 Za ザ 30b6 - |Si シ 30b7 Zi ジ 30b8 Su ス 30b9 Zu ズ 30ba Se セ 30bb Ze ゼ 30bc - |So ソ 30bd Zo ゾ 30be Ta タ 30bf Da ダ 30c0 Ti チ 30c1 Di ヂ 30c2 - |TU ッ 30c3 Tu ツ 30c4 Du ヅ 30c5 Te テ 30c6 De デ 30c7 To ト 30c8 - |Do ド 30c9 Na ナ 30ca Ni ニ 30cb Nu ヌ 30cc Ne ネ 30cd No ノ 30ce - |Ha ハ 30cf Ba バ 30d0 Pa パ 30d1 Hi ヒ 30d2 Bi ビ 30d3 Pi ピ 30d4 - |Hu フ 30d5 Bu ブ 30d6 Pu プ 30d7 He ヘ 30d8 Be ベ 30d9 Pe ペ 30da - |Ho ホ 30db Bo ボ 30dc Po ポ 30dd Ma マ 30de Mi ミ 30df Mu ム 30e0 - |Me メ 30e1 Mo モ 30e2 YA ャ 30e3 Ya ヤ 30e4 YU ュ 30e5 Yu ユ 30e6 - |YO ョ 30e7 Yo ヨ 30e8 Ra ラ 30e9 Ri リ 30ea Ru ル 30eb Re レ 30ec - |Ro ロ 30ed WA ヮ 30ee Wa ワ 30ef Wi ヰ 30f0 We ヱ 30f1 Wo ヲ 30f2 - |N6 ン 30f3 Vu ヴ 30f4 KA ヵ 30f5 KE ヶ 30f6 Va ヷ 30f7 Vi ヸ 30f8 - |Ve ヹ 30f9 Vo ヺ 30fa .6 ・ 30fb -6 ー 30fc *6 ヽ 30fd +6 ヾ 30fe - |b4 ㄅ 3105 p4 ㄆ 3106 m4 ㄇ 3107 f4 ㄈ 3108 d4 ㄉ 3109 t4 ㄊ 310a - |n4 ㄋ 310b l4 ㄌ 310c g4 ㄍ 310d k4 ㄎ 310e h4 ㄏ 310f j4 ㄐ 3110 - |q4 ㄑ 3111 x4 ㄒ 3112 zh ㄓ 3113 ch ㄔ 3114 sh ㄕ 3115 r4 ㄖ 3116 - |z4 ㄗ 3117 c4 ㄘ 3118 s4 ㄙ 3119 a4 ㄚ 311a o4 ㄛ 311b e4 ㄜ 311c - |ai ㄞ 311e ei ㄟ 311f au ㄠ 3120 ou ㄡ 3121 an ㄢ 3122 en ㄣ 3123 - |aN ㄤ 3124 eN ㄥ 3125 er ㄦ 3126 i4 ㄧ 3127 u4 ㄨ 3128 iu ㄩ 3129 - |v4 ㄪ 312a nG ㄫ 312b gn ㄬ 312c 1c ㈠ 3220 2c ㈡ 3221 3c ㈢ 3222 - |4c ㈣ 3223 5c ㈤ 3224 6c ㈥ 3225 7c ㈦ 3226 8c ㈧ 3227 9c ㈨ 3228 - |/c e001 UA e002 UB e003 "3 e004 "1 e005 "! e006 - |"' e007 "> e008 "? e009 "- e00a "( e00b ". e00c - |": e00d "0 e00e "" e00f "< e010 ", e011 "; e012 - |"_ e013 "= e014 "/ e015 "i e016 "d e017 "p e018 - |;; e019 ,, e01a b3 e01b Ci e01c f( e01d ed e01e - |am e01f pm e020 Fl e023 GF e024 >V e025 !* e026 - |?* e027 J< e028 ff ff fb00 fi fi fb01 fl fl fb02 ft ſt fb05 - |st st fb06 + |NU ^@ 0 SH ^A 1 SX ^B 2 EX ^C 3 ET ^D 4 EQ ^E 5 + |AK ^F 6 BL ^G 7 BS ^H 8 HT ^I 9 LF ^J 10 VT ^K 11 + |FF ^L 12 CR ^M 13 SO ^N 14 SI ^O 15 DL ^P 16 D1 ^Q 17 + |D2 ^R 18 D3 ^S 19 D4 ^T 20 NK ^U 21 SY ^V 22 EB ^W 23 + |CN ^X 24 EM ^Y 25 SB ^Z 26 EC ^[ 27 FS ^\ 28 GS ^] 29 + |RS ^^ 30 US ^_ 31 SP 32 Nb # 35 DO $ 36 At @ 64 + |<( [ 91 // \ 92 )> ] 93 '> ^ 94 '! ` 96 (! { 123 + |!! | 124 !) } 125 '? ~ 126 DT ^? 127 PA <80> 128 HO <81> 129 + |BH <82> 130 NH <83> 131 IN <84> 132 NL <85> 133 SA <86> 134 ES <87> 135 + |HS <88> 136 HJ <89> 137 VS <8a> 138 PD <8b> 139 PU <8c> 140 RI <8d> 141 + |S2 <8e> 142 S3 <8f> 143 DC <90> 144 P1 <91> 145 P2 <92> 146 TS <93> 147 + |CC <94> 148 MW <95> 149 SG <96> 150 EG <97> 151 SS <98> 152 GC <99> 153 + |SC <9a> 154 CI <9b> 155 ST <9c> 156 OC <9d> 157 PM <9e> 158 AC <9f> 159 + |NS   160 !I ¡ 161 Ct ¢ 162 Pd £ 163 Cu ¤ 164 Ye ¥ 165 + |BB ¦ 166 SE § 167 ': ¨ 168 Co © 169 -a ª 170 << « 171 + |NO ¬ 172 -- 173 Rg ® 174 'm ¯ 175 DG ° 176 +- ± 177 + |2S ² 178 3S ³ 179 '' ´ 180 My µ 181 PI ¶ 182 .M · 183 + |', ¸ 184 1S ¹ 185 -o º 186 >> » 187 14 ¼ 188 12 ½ 189 + |34 ¾ 190 ?I ¿ 191 A! À 192 A' Á 193 A>  194 A? à 195 + |A: Ä 196 AA Å 197 AE Æ 198 C, Ç 199 E! È 200 E' É 201 + |E> Ê 202 E: Ë 203 I! Ì 204 I' Í 205 I> Î 206 I: Ï 207 + |D- Ð 208 N? Ñ 209 O! Ò 210 O' Ó 211 O> Ô 212 O? Õ 213 + |O: Ö 214 *X × 215 O/ Ø 216 U! Ù 217 U' Ú 218 U> Û 219 + |U: Ü 220 Y' Ý 221 TH Þ 222 ss ß 223 a! à 224 a' á 225 + |a> â 226 a? ã 227 a: ä 228 aa å 229 ae æ 230 c, ç 231 + |e! è 232 e' é 233 e> ê 234 e: ë 235 i! ì 236 i' í 237 + |i> î 238 i: ï 239 d- ð 240 n? ñ 241 o! ò 242 o' ó 243 + |o> ô 244 o? õ 245 o: ö 246 -: ÷ 247 o/ ø 248 u! ù 249 + |u' ú 250 u> û 251 u: ü 252 y' ý 253 th þ 254 y: ÿ 255 + |A- Ā 256 a- ā 257 A( Ă 258 a( ă 259 A; Ą 260 a; ą 261 + |C' Ć 262 c' ć 263 C> Ĉ 264 c> ĉ 265 C. Ċ 266 c. ċ 267 + |C< Č 268 c< č 269 D< Ď 270 d< ď 271 D/ Đ 272 d/ đ 273 + |E- Ē 274 e- ē 275 E( Ĕ 276 e( ĕ 277 E. Ė 278 e. ė 279 + |E; Ę 280 e; ę 281 E< Ě 282 e< ě 283 G> Ĝ 284 g> ĝ 285 + |G( Ğ 286 g( ğ 287 G. Ġ 288 g. ġ 289 G, Ģ 290 g, ģ 291 + |H> Ĥ 292 h> ĥ 293 H/ Ħ 294 h/ ħ 295 I? Ĩ 296 i? ĩ 297 + |I- Ī 298 i- ī 299 I( Ĭ 300 i( ĭ 301 I; Į 302 i; į 303 + |I. İ 304 i. ı 305 IJ IJ 306 ij ij 307 J> Ĵ 308 j> ĵ 309 + |K, Ķ 310 k, ķ 311 kk ĸ 312 L' Ĺ 313 l' ĺ 314 L, Ļ 315 + |l, ļ 316 L< Ľ 317 l< ľ 318 L. Ŀ 319 l. ŀ 320 L/ Ł 321 + |l/ ł 322 N' Ń 323 n' ń 324 N, Ņ 325 n, ņ 326 N< Ň 327 + |n< ň 328 'n ʼn 329 NG Ŋ 330 ng ŋ 331 O- Ō 332 o- ō 333 + |O( Ŏ 334 o( ŏ 335 O" Ő 336 o" ő 337 OE Œ 338 oe œ 339 + |R' Ŕ 340 r' ŕ 341 R, Ŗ 342 r, ŗ 343 R< Ř 344 r< ř 345 + |S' Ś 346 s' ś 347 S> Ŝ 348 s> ŝ 349 S, Ş 350 s, ş 351 + |S< Š 352 s< š 353 T, Ţ 354 t, ţ 355 T< Ť 356 t< ť 357 + |T/ Ŧ 358 t/ ŧ 359 U? Ũ 360 u? ũ 361 U- Ū 362 u- ū 363 + |U( Ŭ 364 u( ŭ 365 U0 Ů 366 u0 ů 367 U" Ű 368 u" ű 369 + |U; Ų 370 u; ų 371 W> Ŵ 372 w> ŵ 373 Y> Ŷ 374 y> ŷ 375 + |Y: Ÿ 376 Z' Ź 377 z' ź 378 Z. Ż 379 z. ż 380 Z< Ž 381 + |z< ž 382 O9 Ơ 416 o9 ơ 417 OI Ƣ 418 oi ƣ 419 yr Ʀ 422 + |U9 Ư 431 u9 ư 432 Z/ Ƶ 437 z/ ƶ 438 ED Ʒ 439 A< Ǎ 461 + |a< ǎ 462 I< Ǐ 463 i< ǐ 464 O< Ǒ 465 o< ǒ 466 U< Ǔ 467 + |u< ǔ 468 A1 Ǟ 478 a1 ǟ 479 A7 Ǡ 480 a7 ǡ 481 A3 Ǣ 482 + |a3 ǣ 483 G/ Ǥ 484 g/ ǥ 485 G< Ǧ 486 g< ǧ 487 K< Ǩ 488 + |k< ǩ 489 O; Ǫ 490 o; ǫ 491 O1 Ǭ 492 o1 ǭ 493 EZ Ǯ 494 + |ez ǯ 495 j< ǰ 496 G' Ǵ 500 g' ǵ 501 ;S ʿ 703 '< ˇ 711 + |'( ˘ 728 '. ˙ 729 '0 ˚ 730 '; ˛ 731 '" ˝ 733 A% Ά 902 + |E% Έ 904 Y% Ή 905 I% Ί 906 O% Ό 908 U% Ύ 910 W% Ώ 911 + |i3 ΐ 912 A* Α 913 B* Β 914 G* Γ 915 D* Δ 916 E* Ε 917 + |Z* Ζ 918 Y* Η 919 H* Θ 920 I* Ι 921 K* Κ 922 L* Λ 923 + |M* Μ 924 N* Ν 925 C* Ξ 926 O* Ο 927 P* Π 928 R* Ρ 929 + |S* Σ 931 T* Τ 932 U* Υ 933 F* Φ 934 X* Χ 935 Q* Ψ 936 + |W* Ω 937 J* Ϊ 938 V* Ϋ 939 a% ά 940 e% έ 941 y% ή 942 + |i% ί 943 u3 ΰ 944 a* α 945 b* β 946 g* γ 947 d* δ 948 + |e* ε 949 z* ζ 950 y* η 951 h* θ 952 i* ι 953 k* κ 954 + |l* λ 955 m* μ 956 n* ν 957 c* ξ 958 o* ο 959 p* π 960 + |r* ρ 961 *s ς 962 s* σ 963 t* τ 964 u* υ 965 f* φ 966 + |x* χ 967 q* ψ 968 w* ω 969 j* ϊ 970 v* ϋ 971 o% ό 972 + |u% ύ 973 w% ώ 974 'G Ϙ 984 ,G ϙ 985 T3 Ϛ 986 t3 ϛ 987 + |M3 Ϝ 988 m3 ϝ 989 K3 Ϟ 990 k3 ϟ 991 P3 Ϡ 992 p3 ϡ 993 + |'% ϴ 1012 j3 ϵ 1013 IO Ё 1025 D% Ђ 1026 G% Ѓ 1027 IE Є 1028 + |DS Ѕ 1029 II І 1030 YI Ї 1031 J% Ј 1032 LJ Љ 1033 NJ Њ 1034 + |Ts Ћ 1035 KJ Ќ 1036 V% Ў 1038 DZ Џ 1039 A= А 1040 B= Б 1041 + |V= В 1042 G= Г 1043 D= Д 1044 E= Е 1045 Z% Ж 1046 Z= З 1047 + |I= И 1048 J= Й 1049 K= К 1050 L= Л 1051 M= М 1052 N= Н 1053 + |O= О 1054 P= П 1055 R= Р 1056 S= С 1057 T= Т 1058 U= У 1059 + |F= Ф 1060 H= Х 1061 C= Ц 1062 C% Ч 1063 S% Ш 1064 Sc Щ 1065 + |=" Ъ 1066 Y= Ы 1067 %" Ь 1068 JE Э 1069 JU Ю 1070 JA Я 1071 + |a= а 1072 b= б 1073 v= в 1074 g= г 1075 d= д 1076 e= е 1077 + |z% ж 1078 z= з 1079 i= и 1080 j= й 1081 k= к 1082 l= л 1083 + |m= м 1084 n= н 1085 o= о 1086 p= п 1087 r= р 1088 s= с 1089 + |t= т 1090 u= у 1091 f= ф 1092 h= х 1093 c= ц 1094 c% ч 1095 + |s% ш 1096 sc щ 1097 =' ъ 1098 y= ы 1099 %' ь 1100 je э 1101 + |ju ю 1102 ja я 1103 io ё 1105 d% ђ 1106 g% ѓ 1107 ie є 1108 + |ds ѕ 1109 ii і 1110 yi ї 1111 j% ј 1112 lj љ 1113 nj њ 1114 + |ts ћ 1115 kj ќ 1116 v% ў 1118 dz џ 1119 Y3 Ѣ 1122 y3 ѣ 1123 + |O3 Ѫ 1130 o3 ѫ 1131 F3 Ѳ 1138 f3 ѳ 1139 V3 Ѵ 1140 v3 ѵ 1141 + |C3 Ҁ 1152 c3 ҁ 1153 G3 Ґ 1168 g3 ґ 1169 A+ א 1488 B+ ב 1489 + |G+ ג 1490 D+ ד 1491 H+ ה 1492 W+ ו 1493 Z+ ז 1494 X+ ח 1495 + |Tj ט 1496 J+ י 1497 K% ך 1498 K+ כ 1499 L+ ל 1500 M% ם 1501 + |M+ מ 1502 N% ן 1503 N+ נ 1504 S+ ס 1505 E+ ע 1506 P% ף 1507 + |P+ פ 1508 Zj ץ 1509 ZJ צ 1510 Q+ ק 1511 R+ ר 1512 Sh ש 1513 + |T+ ת 1514 ,+ ، 1548 ;+ ؛ 1563 ?+ ؟ 1567 H' ء 1569 aM آ 1570 + |aH أ 1571 wH ؤ 1572 ah إ 1573 yH ئ 1574 a+ ا 1575 b+ ب 1576 + |tm ة 1577 t+ ت 1578 tk ث 1579 g+ ج 1580 hk ح 1581 x+ خ 1582 + |d+ د 1583 dk ذ 1584 r+ ر 1585 z+ ز 1586 s+ س 1587 sn ش 1588 + |c+ ص 1589 dd ض 1590 tj ط 1591 zH ظ 1592 e+ ع 1593 i+ غ 1594 + |++ ـ 1600 f+ ف 1601 q+ ق 1602 k+ ك 1603 l+ ل 1604 m+ م 1605 + |n+ ن 1606 h+ ه 1607 w+ و 1608 j+ ى 1609 y+ ي 1610 :+ ً 1611 + |"+ ٌ 1612 =+ ٍ 1613 /+ َ 1614 '+ ُ 1615 1+ ِ 1616 3+ ّ 1617 + |0+ ْ 1618 aS ٰ 1648 p+ پ 1662 v+ ڤ 1700 gf گ 1711 0a ۰ 1776 + |1a ۱ 1777 2a ۲ 1778 3a ۳ 1779 4a ۴ 1780 5a ۵ 1781 6a ۶ 1782 + |7a ۷ 1783 8a ۸ 1784 9a ۹ 1785 B. Ḃ 7682 b. ḃ 7683 B_ Ḇ 7686 + |b_ ḇ 7687 D. Ḋ 7690 d. ḋ 7691 D_ Ḏ 7694 d_ ḏ 7695 D, Ḑ 7696 + |d, ḑ 7697 F. Ḟ 7710 f. ḟ 7711 G- Ḡ 7712 g- ḡ 7713 H. Ḣ 7714 + |h. ḣ 7715 H: Ḧ 7718 h: ḧ 7719 H, Ḩ 7720 h, ḩ 7721 K' Ḱ 7728 + |k' ḱ 7729 K_ Ḵ 7732 k_ ḵ 7733 L_ Ḻ 7738 l_ ḻ 7739 M' Ḿ 7742 + |m' ḿ 7743 M. Ṁ 7744 m. ṁ 7745 N. Ṅ 7748 n. ṅ 7749 N_ Ṉ 7752 + |n_ ṉ 7753 P' Ṕ 7764 p' ṕ 7765 P. Ṗ 7766 p. ṗ 7767 R. Ṙ 7768 + |r. ṙ 7769 R_ Ṟ 7774 r_ ṟ 7775 S. Ṡ 7776 s. ṡ 7777 T. Ṫ 7786 + |t. ṫ 7787 T_ Ṯ 7790 t_ ṯ 7791 V? Ṽ 7804 v? ṽ 7805 W! Ẁ 7808 + |w! ẁ 7809 W' Ẃ 7810 w' ẃ 7811 W: Ẅ 7812 w: ẅ 7813 W. Ẇ 7814 + |w. ẇ 7815 X. Ẋ 7818 x. ẋ 7819 X: Ẍ 7820 x: ẍ 7821 Y. Ẏ 7822 + |y. ẏ 7823 Z> Ẑ 7824 z> ẑ 7825 Z_ Ẕ 7828 z_ ẕ 7829 h_ ẖ 7830 + |t: ẗ 7831 w0 ẘ 7832 y0 ẙ 7833 A2 Ả 7842 a2 ả 7843 E2 Ẻ 7866 + |e2 ẻ 7867 E? Ẽ 7868 e? ẽ 7869 I2 Ỉ 7880 i2 ỉ 7881 O2 Ỏ 7886 + |o2 ỏ 7887 U2 Ủ 7910 u2 ủ 7911 Y! Ỳ 7922 y! ỳ 7923 Y2 Ỷ 7926 + |y2 ỷ 7927 Y? Ỹ 7928 y? ỹ 7929 ;' ἀ 7936 ,' ἁ 7937 ;! ἂ 7938 + |,! ἃ 7939 ?; ἄ 7940 ?, ἅ 7941 !: ἆ 7942 ?: ἇ 7943 1N   8194 + |1M   8195 3M   8196 4M   8197 6M   8198 1T   8201 1H   8202 + |-1 ‐ 8208 -N – 8211 -M — 8212 -3 ― 8213 !2 ‖ 8214 =2 ‗ 8215 + |'6 ‘ 8216 '9 ’ 8217 .9 ‚ 8218 9' ‛ 8219 "6 “ 8220 "9 ” 8221 + |:9 „ 8222 9" ‟ 8223 /- † 8224 /= ‡ 8225 .. ‥ 8229 ,. … 8230 + |%0 ‰ 8240 1' ′ 8242 2' ″ 8243 3' ‴ 8244 1" ‵ 8245 2" ‶ 8246 + |3" ‷ 8247 Ca ‸ 8248 <1 ‹ 8249 >1 › 8250 :X ※ 8251 '- ‾ 8254 + |/f ⁄ 8260 0S ⁰ 8304 4S ⁴ 8308 5S ⁵ 8309 6S ⁶ 8310 7S ⁷ 8311 + |8S ⁸ 8312 9S ⁹ 8313 +S ⁺ 8314 -S ⁻ 8315 =S ⁼ 8316 (S ⁽ 8317 + |)S ⁾ 8318 nS ⁿ 8319 0s ₀ 8320 1s ₁ 8321 2s ₂ 8322 3s ₃ 8323 + |4s ₄ 8324 5s ₅ 8325 6s ₆ 8326 7s ₇ 8327 8s ₈ 8328 9s ₉ 8329 + |+s ₊ 8330 -s ₋ 8331 =s ₌ 8332 (s ₍ 8333 )s ₎ 8334 Li ₤ 8356 + |Pt ₧ 8359 W= ₩ 8361 oC ℃ 8451 co ℅ 8453 oF ℉ 8457 N0 № 8470 + |PO ℗ 8471 Rx ℞ 8478 SM ℠ 8480 TM ™ 8482 Om Ω 8486 AO Å 8491 + |13 ⅓ 8531 23 ⅔ 8532 15 ⅕ 8533 25 ⅖ 8534 35 ⅗ 8535 45 ⅘ 8536 + |16 ⅙ 8537 56 ⅚ 8538 18 ⅛ 8539 38 ⅜ 8540 58 ⅝ 8541 78 ⅞ 8542 + |1R Ⅰ 8544 2R Ⅱ 8545 3R Ⅲ 8546 4R Ⅳ 8547 5R Ⅴ 8548 6R Ⅵ 8549 + |7R Ⅶ 8550 8R Ⅷ 8551 9R Ⅸ 8552 aR Ⅹ 8553 bR Ⅺ 8554 cR Ⅻ 8555 + |1r ⅰ 8560 2r ⅱ 8561 3r ⅲ 8562 4r ⅳ 8563 5r ⅴ 8564 6r ⅵ 8565 + |7r ⅶ 8566 8r ⅷ 8567 9r ⅸ 8568 ar ⅹ 8569 br ⅺ 8570 cr ⅻ 8571 + |<- ← 8592 -! ↑ 8593 -> → 8594 -v ↓ 8595 <> ↔ 8596 UD ↕ 8597 + |<= ⇐ 8656 => ⇒ 8658 == ⇔ 8660 FA ∀ 8704 dP ∂ 8706 TE ∃ 8707 + |/0 ∅ 8709 DE ∆ 8710 NB ∇ 8711 (- ∈ 8712 -) ∋ 8715 *P ∏ 8719 + |+Z ∑ 8721 -2 − 8722 -+ ∓ 8723 *- ∗ 8727 Ob ∘ 8728 Sb ∙ 8729 + |RT √ 8730 0( ∝ 8733 00 ∞ 8734 -L ∟ 8735 -V ∠ 8736 PP ∥ 8741 + |AN ∧ 8743 OR ∨ 8744 (U ∩ 8745 )U ∪ 8746 In ∫ 8747 DI ∬ 8748 + |Io ∮ 8750 .: ∴ 8756 :. ∵ 8757 :R ∶ 8758 :: ∷ 8759 ?1 ∼ 8764 + |CG ∾ 8766 ?- ≃ 8771 ?= ≅ 8773 ?2 ≈ 8776 =? ≌ 8780 HI ≓ 8787 + |!= ≠ 8800 =3 ≡ 8801 =< ≤ 8804 >= ≥ 8805 <* ≪ 8810 *> ≫ 8811 + |!< ≮ 8814 !> ≯ 8815 (C ⊂ 8834 )C ⊃ 8835 (_ ⊆ 8838 )_ ⊇ 8839 + |0. ⊙ 8857 02 ⊚ 8858 -T ⊥ 8869 .P ⋅ 8901 :3 ⋮ 8942 .3 ⋯ 8943 + |Eh ⌂ 8962 <7 ⌈ 8968 >7 ⌉ 8969 7< ⌊ 8970 7> ⌋ 8971 NI ⌐ 8976 + |(A ⌒ 8978 TR ⌕ 8981 Iu ⌠ 8992 Il ⌡ 8993 〉 9002 + |Vs ␣ 9251 1h ⑀ 9280 3h ⑁ 9281 2h ⑂ 9282 4h ⑃ 9283 1j ⑆ 9286 + |2j ⑇ 9287 3j ⑈ 9288 4j ⑉ 9289 1. ⒈ 9352 2. ⒉ 9353 3. ⒊ 9354 + |4. ⒋ 9355 5. ⒌ 9356 6. ⒍ 9357 7. ⒎ 9358 8. ⒏ 9359 9. ⒐ 9360 + |hh ─ 9472 HH ━ 9473 vv │ 9474 VV ┃ 9475 3- ┄ 9476 3_ ┅ 9477 + |3! ┆ 9478 3/ ┇ 9479 4- ┈ 9480 4_ ┉ 9481 4! ┊ 9482 4/ ┋ 9483 + |dr ┌ 9484 dR ┍ 9485 Dr ┎ 9486 DR ┏ 9487 dl ┐ 9488 dL ┑ 9489 + |Dl ┒ 9490 LD ┓ 9491 ur └ 9492 uR ┕ 9493 Ur ┖ 9494 UR ┗ 9495 + |ul ┘ 9496 uL ┙ 9497 Ul ┚ 9498 UL ┛ 9499 vr ├ 9500 vR ┝ 9501 + |Vr ┠ 9504 VR ┣ 9507 vl ┤ 9508 vL ┥ 9509 Vl ┨ 9512 VL ┫ 9515 + |dh ┬ 9516 dH ┯ 9519 Dh ┰ 9520 DH ┳ 9523 uh ┴ 9524 uH ┷ 9527 + |Uh ┸ 9528 UH ┻ 9531 vh ┼ 9532 vH ┿ 9535 Vh ╂ 9538 VH ╋ 9547 + |FD ╱ 9585 BD ╲ 9586 TB ▀ 9600 LB ▄ 9604 FB █ 9608 lB ▌ 9612 + |RB ▐ 9616 .S ░ 9617 :S ▒ 9618 ?S ▓ 9619 fS ■ 9632 OS □ 9633 + |RO ▢ 9634 Rr ▣ 9635 RF ▤ 9636 RY ▥ 9637 RH ▦ 9638 RZ ▧ 9639 + |RK ▨ 9640 RX ▩ 9641 sB ▪ 9642 SR ▬ 9644 Or ▭ 9645 UT ▲ 9650 + |uT △ 9651 PR ▶ 9654 Tr ▷ 9655 Dt ▼ 9660 dT ▽ 9661 PL ◀ 9664 + |Tl ◁ 9665 Db ◆ 9670 Dw ◇ 9671 LZ ◊ 9674 0m ○ 9675 0o ◎ 9678 + |0M ● 9679 0L ◐ 9680 0R ◑ 9681 Sn ◘ 9688 Ic ◙ 9689 Fd ◢ 9698 + |Bd ◣ 9699 *2 ★ 9733 *1 ☆ 9734 H ☞ 9758 0u ☺ 9786 + |0U ☻ 9787 SU ☼ 9788 Fm ♀ 9792 Ml ♂ 9794 cS ♠ 9824 cH ♡ 9825 + |cD ♢ 9826 cC ♣ 9827 Md ♩ 9833 M8 ♪ 9834 M2 ♫ 9835 Mb ♭ 9837 + |Mx ♮ 9838 MX ♯ 9839 OK ✓ 10003 XX ✗ 10007 -X ✠ 10016 IS   12288 + |,_ 、 12289 ._ 。 12290 +" 〃 12291 +_ 〄 12292 *_ 々 12293 ;_ 〆 12294 + |0_ 〇 12295 <+ 《 12298 >+ 》 12299 <' 「 12300 >' 」 12301 <" 『 12302 + |>" 』 12303 (" 【 12304 )" 】 12305 =T 〒 12306 =_ 〓 12307 (' 〔 12308 + |)' 〕 12309 (I 〖 12310 )I 〗 12311 -? 〜 12316 A5 ぁ 12353 a5 あ 12354 + |I5 ぃ 12355 i5 い 12356 U5 ぅ 12357 u5 う 12358 E5 ぇ 12359 e5 え 12360 + |O5 ぉ 12361 o5 お 12362 ka か 12363 ga が 12364 ki き 12365 gi ぎ 12366 + |ku く 12367 gu ぐ 12368 ke け 12369 ge げ 12370 ko こ 12371 go ご 12372 + |sa さ 12373 za ざ 12374 si し 12375 zi じ 12376 su す 12377 zu ず 12378 + |se せ 12379 ze ぜ 12380 so そ 12381 zo ぞ 12382 ta た 12383 da だ 12384 + |ti ち 12385 di ぢ 12386 tU っ 12387 tu つ 12388 du づ 12389 te て 12390 + |de で 12391 to と 12392 do ど 12393 na な 12394 ni に 12395 nu ぬ 12396 + |ne ね 12397 no の 12398 ha は 12399 ba ば 12400 pa ぱ 12401 hi ひ 12402 + |bi び 12403 pi ぴ 12404 hu ふ 12405 bu ぶ 12406 pu ぷ 12407 he へ 12408 + |be べ 12409 pe ぺ 12410 ho ほ 12411 bo ぼ 12412 po ぽ 12413 ma ま 12414 + |mi み 12415 mu む 12416 me め 12417 mo も 12418 yA ゃ 12419 ya や 12420 + |yU ゅ 12421 yu ゆ 12422 yO ょ 12423 yo よ 12424 ra ら 12425 ri り 12426 + |ru る 12427 re れ 12428 ro ろ 12429 wA ゎ 12430 wa わ 12431 wi ゐ 12432 + |we ゑ 12433 wo を 12434 n5 ん 12435 vu ゔ 12436 "5 ゛ 12443 05 ゜ 12444 + |*5 ゝ 12445 +5 ゞ 12446 a6 ァ 12449 A6 ア 12450 i6 ィ 12451 I6 イ 12452 + |u6 ゥ 12453 U6 ウ 12454 e6 ェ 12455 E6 エ 12456 o6 ォ 12457 O6 オ 12458 + |Ka カ 12459 Ga ガ 12460 Ki キ 12461 Gi ギ 12462 Ku ク 12463 Gu グ 12464 + |Ke ケ 12465 Ge ゲ 12466 Ko コ 12467 Go ゴ 12468 Sa サ 12469 Za ザ 12470 + |Si シ 12471 Zi ジ 12472 Su ス 12473 Zu ズ 12474 Se セ 12475 Ze ゼ 12476 + |So ソ 12477 Zo ゾ 12478 Ta タ 12479 Da ダ 12480 Ti チ 12481 Di ヂ 12482 + |TU ッ 12483 Tu ツ 12484 Du ヅ 12485 Te テ 12486 De デ 12487 To ト 12488 + |Do ド 12489 Na ナ 12490 Ni ニ 12491 Nu ヌ 12492 Ne ネ 12493 No ノ 12494 + |Ha ハ 12495 Ba バ 12496 Pa パ 12497 Hi ヒ 12498 Bi ビ 12499 Pi ピ 12500 + |Hu フ 12501 Bu ブ 12502 Pu プ 12503 He ヘ 12504 Be ベ 12505 Pe ペ 12506 + |Ho ホ 12507 Bo ボ 12508 Po ポ 12509 Ma マ 12510 Mi ミ 12511 Mu ム 12512 + |Me メ 12513 Mo モ 12514 YA ャ 12515 Ya ヤ 12516 YU ュ 12517 Yu ユ 12518 + |YO ョ 12519 Yo ヨ 12520 Ra ラ 12521 Ri リ 12522 Ru ル 12523 Re レ 12524 + |Ro ロ 12525 WA ヮ 12526 Wa ワ 12527 Wi ヰ 12528 We ヱ 12529 Wo ヲ 12530 + |N6 ン 12531 Vu ヴ 12532 KA ヵ 12533 KE ヶ 12534 Va ヷ 12535 Vi ヸ 12536 + |Ve ヹ 12537 Vo ヺ 12538 .6 ・ 12539 -6 ー 12540 *6 ヽ 12541 +6 ヾ 12542 + |b4 ㄅ 12549 p4 ㄆ 12550 m4 ㄇ 12551 f4 ㄈ 12552 d4 ㄉ 12553 t4 ㄊ 12554 + |n4 ㄋ 12555 l4 ㄌ 12556 g4 ㄍ 12557 k4 ㄎ 12558 h4 ㄏ 12559 j4 ㄐ 12560 + |q4 ㄑ 12561 x4 ㄒ 12562 zh ㄓ 12563 ch ㄔ 12564 sh ㄕ 12565 r4 ㄖ 12566 + |z4 ㄗ 12567 c4 ㄘ 12568 s4 ㄙ 12569 a4 ㄚ 12570 o4 ㄛ 12571 e4 ㄜ 12572 + |ai ㄞ 12574 ei ㄟ 12575 au ㄠ 12576 ou ㄡ 12577 an ㄢ 12578 en ㄣ 12579 + |aN ㄤ 12580 eN ㄥ 12581 er ㄦ 12582 i4 ㄧ 12583 u4 ㄨ 12584 iu ㄩ 12585 + |v4 ㄪ 12586 nG ㄫ 12587 gn ㄬ 12588 1c ㈠ 12832 2c ㈡ 12833 3c ㈢ 12834 + |4c ㈣ 12835 5c ㈤ 12836 6c ㈥ 12837 7c ㈦ 12838 8c ㈧ 12839 9c ㈨ 12840 + |/c 57345 UA 57346 UB 57347 "3 57348 "1 57349 "! 57350 + |"' 57351 "> 57352 "? 57353 "- 57354 "( 57355 ". 57356 + |": 57357 "0 57358 "" 57359 "< 57360 ", 57361 "; 57362 + |"_ 57363 "= 57364 "/ 57365 "i 57366 "d 57367 "p 57368 + |;; 57369 ,, 57370 b3 57371 Ci 57372 f( 57373 ed 57374 + |am 57375 pm 57376 Fl 57379 GF 57380 >V 57381 !* 57382 + |?* 57383 J< 57384 ff ff 64256 fi fi 64257 fl fl 64258 ft ſt 64261 + |st st 64262 """.trimMargin()) } } diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt index a813cef62e..2e77d3d842 100644 --- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt +++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt @@ -10,7 +10,6 @@ package com.maddyhome.idea.vim.api import com.maddyhome.idea.vim.diagnostic.vimLogger import com.maddyhome.idea.vim.helper.EngineStringHelper -import java.lang.Integer.toHexString import java.util.* import javax.swing.KeyStroke import kotlin.math.ceil @@ -91,7 +90,7 @@ open class VimDigraphGroupBase() : VimDigraphGroup { override fun showDigraphs(editor: VimEditor) { val width = injector.engineEditorHelper.getApproximateScreenWidth(editor).let { if (it < 10) 80 else it } - val columnWidth = 12 + val columnWidth = 13 val columnCount = width / columnWidth val height = ceil(digraphs.size.toDouble() / columnCount.toDouble()).toInt() @@ -102,34 +101,41 @@ open class VimDigraphGroupBase() : VimDigraphGroup { } val output = buildString { - var count = 0 + var column = 0 keys.forEach { (char, digraph) -> + val start = length append(digraph) append(' ') - val l = this.length - append(EngineStringHelper.toPrintableCharacter(char)) + val printable = EngineStringHelper.toPrintableCharacter(char) + append(printable) - // Add an extra space if we've only used one text cell. Subtract 3 for the characters + a space + // Add an extra space if we've only used one text cell // Ideally here, we'd check the EAST_ASIAN_WIDTH Unicode property of the printed character. If it's full width, // it's taken two "cells". I'm not sure this would work for all characters, e.g. Ⅵ seems to be 1.5 "cells" wide. // Perhaps we could set the output panel's tab size to 13, and use tab stops to make things line up? - if (length - l == 1) { + if (printable.length == 1) { append(' ') } // Print the code: ' %3d' append(' ') -// append(char.toString().padStart(3)) - append(toHexString(char.code).padStart(4, '0')) + append(char.code.toString().padStart(3)) - count++ - if (count == columnCount) { + column++ + if (column == columnCount) { appendLine() - count = 0 + column = 0 } else { - append(" ") + if (length - start > columnWidth) { + append(' ') + } + else { + repeat(columnWidth - ((length - start) % columnWidth)) { + append(' ') + } + } } } }.trimEnd() // TODO: Try to get rid of this From 36500de8e626d3e02b54ee662281421304481e8c Mon Sep 17 00:00:00 2001 From: Matt Ellis Date: Mon, 2 Sep 2024 23:24:37 +0100 Subject: [PATCH 06/17] Correctly format RTL and combining digraph chars --- .../commands/DigraphsCommandTest.kt | 31 ++++++++-------- .../idea/vim/api/VimDigraphGroupBase.kt | 36 +++++++++++++++++-- 2 files changed, 51 insertions(+), 16 deletions(-) diff --git a/src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/commands/DigraphsCommandTest.kt b/src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/commands/DigraphsCommandTest.kt index 5076973103..e7406f4eea 100644 --- a/src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/commands/DigraphsCommandTest.kt +++ b/src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/commands/DigraphsCommandTest.kt @@ -31,6 +31,9 @@ class DigraphsCommandTest : VimTestCase() { @Test fun `test digraph output`() { + // Note that the following text has some control characters in, notably Unicode's RLI and PDI characters to isolate + // RTL characters and then reset the isolation + // Other control characters are either encoded or left as-is, matching Vim behaviour assertCommandOutput("digraphs", """ |NU ^@ 0 SH ^A 1 SX ^B 2 EX ^C 3 ET ^D 4 EQ ^E 5 @@ -121,20 +124,20 @@ class DigraphsCommandTest : VimTestCase() { |ds ѕ 1109 ii і 1110 yi ї 1111 j% ј 1112 lj љ 1113 nj њ 1114 |ts ћ 1115 kj ќ 1116 v% ў 1118 dz џ 1119 Y3 Ѣ 1122 y3 ѣ 1123 |O3 Ѫ 1130 o3 ѫ 1131 F3 Ѳ 1138 f3 ѳ 1139 V3 Ѵ 1140 v3 ѵ 1141 - |C3 Ҁ 1152 c3 ҁ 1153 G3 Ґ 1168 g3 ґ 1169 A+ א 1488 B+ ב 1489 - |G+ ג 1490 D+ ד 1491 H+ ה 1492 W+ ו 1493 Z+ ז 1494 X+ ח 1495 - |Tj ט 1496 J+ י 1497 K% ך 1498 K+ כ 1499 L+ ל 1500 M% ם 1501 - |M+ מ 1502 N% ן 1503 N+ נ 1504 S+ ס 1505 E+ ע 1506 P% ף 1507 - |P+ פ 1508 Zj ץ 1509 ZJ צ 1510 Q+ ק 1511 R+ ר 1512 Sh ש 1513 - |T+ ת 1514 ,+ ، 1548 ;+ ؛ 1563 ?+ ؟ 1567 H' ء 1569 aM آ 1570 - |aH أ 1571 wH ؤ 1572 ah إ 1573 yH ئ 1574 a+ ا 1575 b+ ب 1576 - |tm ة 1577 t+ ت 1578 tk ث 1579 g+ ج 1580 hk ح 1581 x+ خ 1582 - |d+ د 1583 dk ذ 1584 r+ ر 1585 z+ ز 1586 s+ س 1587 sn ش 1588 - |c+ ص 1589 dd ض 1590 tj ط 1591 zH ظ 1592 e+ ع 1593 i+ غ 1594 - |++ ـ 1600 f+ ف 1601 q+ ق 1602 k+ ك 1603 l+ ل 1604 m+ م 1605 - |n+ ن 1606 h+ ه 1607 w+ و 1608 j+ ى 1609 y+ ي 1610 :+ ً 1611 - |"+ ٌ 1612 =+ ٍ 1613 /+ َ 1614 '+ ُ 1615 1+ ِ 1616 3+ ّ 1617 - |0+ ْ 1618 aS ٰ 1648 p+ پ 1662 v+ ڤ 1700 gf گ 1711 0a ۰ 1776 + |C3 Ҁ 1152 c3 ҁ 1153 G3 Ґ 1168 g3 ґ 1169 A+ ⁧א⁩ 1488 B+ ⁧ב⁩ 1489 + |G+ ⁧ג⁩ 1490 D+ ⁧ד⁩ 1491 H+ ⁧ה⁩ 1492 W+ ⁧ו⁩ 1493 Z+ ⁧ז⁩ 1494 X+ ⁧ח⁩ 1495 + |Tj ⁧ט⁩ 1496 J+ ⁧י⁩ 1497 K% ⁧ך⁩ 1498 K+ ⁧כ⁩ 1499 L+ ⁧ל⁩ 1500 M% ⁧ם⁩ 1501 + |M+ ⁧מ⁩ 1502 N% ⁧ן⁩ 1503 N+ ⁧נ⁩ 1504 S+ ⁧ס⁩ 1505 E+ ⁧ע⁩ 1506 P% ⁧ף⁩ 1507 + |P+ ⁧פ⁩ 1508 Zj ⁧ץ⁩ 1509 ZJ ⁧צ⁩ 1510 Q+ ⁧ק⁩ 1511 R+ ⁧ר⁩ 1512 Sh ⁧ש⁩ 1513 + |T+ ⁧ת⁩ 1514 ,+ ، 1548 ;+ ⁧؛⁩ 1563 ?+ ⁧؟⁩ 1567 H' ⁧ء⁩ 1569 aM ⁧آ⁩ 1570 + |aH ⁧أ⁩ 1571 wH ⁧ؤ⁩ 1572 ah ⁧إ⁩ 1573 yH ⁧ئ⁩ 1574 a+ ⁧ا⁩ 1575 b+ ⁧ب⁩ 1576 + |tm ⁧ة⁩ 1577 t+ ⁧ت⁩ 1578 tk ⁧ث⁩ 1579 g+ ⁧ج⁩ 1580 hk ⁧ح⁩ 1581 x+ ⁧خ⁩ 1582 + |d+ ⁧د⁩ 1583 dk ⁧ذ⁩ 1584 r+ ⁧ر⁩ 1585 z+ ⁧ز⁩ 1586 s+ ⁧س⁩ 1587 sn ⁧ش⁩ 1588 + |c+ ⁧ص⁩ 1589 dd ⁧ض⁩ 1590 tj ⁧ط⁩ 1591 zH ⁧ظ⁩ 1592 e+ ⁧ع⁩ 1593 i+ ⁧غ⁩ 1594 + |++ ⁧ـ⁩ 1600 f+ ⁧ف⁩ 1601 q+ ⁧ق⁩ 1602 k+ ⁧ك⁩ 1603 l+ ⁧ل⁩ 1604 m+ ⁧م⁩ 1605 + |n+ ⁧ن⁩ 1606 h+ ⁧ه⁩ 1607 w+ ⁧و⁩ 1608 j+ ⁧ى⁩ 1609 y+ ⁧ي⁩ 1610 :+ ً 1611 + |"+ ٌ 1612 =+ ٍ 1613 /+ َ 1614 '+ ُ 1615 1+ ِ 1616 3+ ّ 1617 + |0+ ْ 1618 aS ٰ 1648 p+ ⁧پ⁩ 1662 v+ ⁧ڤ⁩ 1700 gf ⁧گ⁩ 1711 0a ۰ 1776 |1a ۱ 1777 2a ۲ 1778 3a ۳ 1779 4a ۴ 1780 5a ۵ 1781 6a ۶ 1782 |7a ۷ 1783 8a ۸ 1784 9a ۹ 1785 B. Ḃ 7682 b. ḃ 7683 B_ Ḇ 7686 |b_ ḇ 7687 D. Ḋ 7690 d. ḋ 7691 D_ Ḏ 7694 d_ ḏ 7695 D, Ḑ 7696 diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt index 2e77d3d842..40fe1b74cb 100644 --- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt +++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt @@ -108,7 +108,23 @@ open class VimDigraphGroupBase() : VimDigraphGroup { append(' ') val printable = EngineStringHelper.toPrintableCharacter(char) - append(printable) + val adjustment = when { + printable.length == 1 && isRightToLeft(char) -> { + append('\u2067') // RIGHT_TO_LEFT_ISOLATE - set RTL and isolate following content from the surrounding text + append(printable) + append('\u2069') // POP_DIRECTIONAL_ISOLATE - close the isolation range and return to LTR + 2 + } + printable.length == 1 && isCombiningCharacter(char) -> { + append(' ') // Give the combining character something to combine with + append(printable) + 1 + } + else -> { + append(printable) + 0 + } + } // Add an extra space if we've only used one text cell // Ideally here, we'd check the EAST_ASIAN_WIDTH Unicode property of the printed character. If it's full width, @@ -132,7 +148,7 @@ open class VimDigraphGroupBase() : VimDigraphGroup { append(' ') } else { - repeat(columnWidth - ((length - start) % columnWidth)) { + repeat(columnWidth - ((length - start - adjustment) % columnWidth)) { append(' ') } } @@ -144,6 +160,22 @@ open class VimDigraphGroupBase() : VimDigraphGroup { injector.outputPanel.output(editor, context, output) } + private fun isRightToLeft(c: Char): Boolean { + val directionality = Character.getDirectionality(c) + return directionality == Character.DIRECTIONALITY_RIGHT_TO_LEFT + || directionality == Character.DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC + || directionality == Character.DIRECTIONALITY_RIGHT_TO_LEFT_EMBEDDING + || directionality == Character.DIRECTIONALITY_RIGHT_TO_LEFT_OVERRIDE + } + + private fun isCombiningCharacter(char: Char): Boolean { + val type = Character.getType(char).toByte() + return type == Character.NON_SPACING_MARK + || type == Character.COMBINING_SPACING_MARK + || type == Character.ENCLOSING_MARK + || type == Character.FORMAT + } + @Suppress("GrazieInspection", "SpellCheckingInspection") private val defaultDigraphs = charArrayOf( /* 'N', 'U', // 0 ^@ From 0e48f20c1441487b0b31fc838e39cc163fe89fef Mon Sep 17 00:00:00 2001 From: Matt Ellis Date: Mon, 2 Sep 2024 23:40:21 +0100 Subject: [PATCH 07/17] Remove unused commented digraph data --- .../idea/vim/api/VimDigraphGroupBase.kt | 265 +----------------- 1 file changed, 4 insertions(+), 261 deletions(-) diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt index 40fe1b74cb..7a4d6daae8 100644 --- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt +++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt @@ -177,264 +177,7 @@ open class VimDigraphGroupBase() : VimDigraphGroup { } @Suppress("GrazieInspection", "SpellCheckingInspection") - private val defaultDigraphs = charArrayOf( /* - 'N', 'U', // 0 ^@ - 'S', 'H', // 1 ^A - 'S', 'X', // 2 ^B - 'E', 'X', // 3 ^C - 'E', 'T', // 4 ^D - 'E', 'Q', // 5 ^E - 'A', 'K', // 6 ^F - 'B', 'L', // 7 ^G - 'B', 'S', // 8 ^H - 'H', 'T', // 9 ^I - 'L', 'F', // 10 ^J - 'V', 'T', // 11 ^K - 'F', 'F', // 12 ^L - 'C', 'R', // 13 ^M - 'S', 'O', // 14 ^N - 'S', 'I', // 15 ^O - 'D', 'L', // 16 ^P - 'D', '1', // 17 ^Q - 'D', '2', // 18 ^R - 'D', '3', // 19 ^S - 'D', '4', // 20 ^T - 'N', 'K', // 21 ^U - 'S', 'Y', // 22 ^V - 'E', 'B', // 23 ^W - 'C', 'N', // 24 ^X - 'E', 'M', // 25 ^Y - 'S', 'B', // 26 ^Z - 'E', 'C', // 27 ^[ - 'F', 'S', // 28 ^\ - 'G', 'S', // 29 ^] - 'R', 'S', // 30 ^^ - 'U', 'S', // 31 ^_ - 'S', 'P', // 32 Space - '\0', '\0', // 33 Unused - '\0', '\0', // 34 Unused - 'N', 'b', // 35 # - 'D', 'O', // 36 $ - '\0', '\0', // 37 Unused - '\0', '\0', // 38 Unused - '\0', '\0', // 39 Unused - '\0', '\0', // 40 Unused - '\0', '\0', // 41 Unused - '\0', '\0', // 42 Unused - '\0', '\0', // 43 Unused - '\0', '\0', // 44 Unused - '\0', '\0', // 45 Unused - '\0', '\0', // 46 Unused - '\0', '\0', // 47 Unused - '\0', '\0', // 48 Unused - '\0', '\0', // 49 Unused - '\0', '\0', // 50 Unused - '\0', '\0', // 51 Unused - '\0', '\0', // 52 Unused - '\0', '\0', // 53 Unused - '\0', '\0', // 54 Unused - '\0', '\0', // 55 Unused - '\0', '\0', // 56 Unused - '\0', '\0', // 57 Unused - '\0', '\0', // 58 Unused - '\0', '\0', // 59 Unused - '\0', '\0', // 60 Unused - '\0', '\0', // 61 Unused - '\0', '\0', // 62 Unused - '\0', '\0', // 63 Unused - 'A', 't', // 64 @ - '\0', '\0', // 65 Unused - '\0', '\0', // 66 Unused - '\0', '\0', // 67 Unused - '\0', '\0', // 68 Unused - '\0', '\0', // 69 Unused - '\0', '\0', // 70 Unused - '\0', '\0', // 71 Unused - '\0', '\0', // 72 Unused - '\0', '\0', // 73 Unused - '\0', '\0', // 74 Unused - '\0', '\0', // 75 Unused - '\0', '\0', // 76 Unused - '\0', '\0', // 77 Unused - '\0', '\0', // 78 Unused - '\0', '\0', // 79 Unused - '\0', '\0', // 80 Unused - '\0', '\0', // 81 Unused - '\0', '\0', // 82 Unused - '\0', '\0', // 83 Unused - '\0', '\0', // 84 Unused - '\0', '\0', // 85 Unused - '\0', '\0', // 86 Unused - '\0', '\0', // 87 Unused - '\0', '\0', // 88 Unused - '\0', '\0', // 89 Unused - '\0', '\0', // 90 Unused - '<', '(', // 91 [ - '/', '/', // 92 \ - ')', '>', // 93 ] - '\'', '>', // 94 ^ - '\0', '\0', // 95 Unused - '\'', '!', // 96 ` - '\0', '\0', // 97 Unused - '\0', '\0', // 98 Unused - '\0', '\0', // 99 Unused - '\0', '\0', // 100 Unused - '\0', '\0', // 101 Unused - '\0', '\0', // 102 Unused - '\0', '\0', // 103 Unused - '\0', '\0', // 104 Unused - '\0', '\0', // 105 Unused - '\0', '\0', // 106 Unused - '\0', '\0', // 107 Unused - '\0', '\0', // 108 Unused - '\0', '\0', // 109 Unused - '\0', '\0', // 110 Unused - '\0', '\0', // 111 Unused - '\0', '\0', // 112 Unused - '\0', '\0', // 113 Unused - '\0', '\0', // 114 Unused - '\0', '\0', // 115 Unused - '\0', '\0', // 116 Unused - '\0', '\0', // 117 Unused - '\0', '\0', // 118 Unused - '\0', '\0', // 119 Unused - '\0', '\0', // 120 Unused - '\0', '\0', // 121 Unused - '\0', '\0', // 122 Unused - '(', '!', // 123 { - '!', '!', // 124 | - '!', ')', // 125 } - '\'', '?', // 126 ~ - 'D', 'T', // 127 ^? - 'P', 'A', // 128 ~@ - 'H', 'O', // 129 ~A - 'B', 'H', // 130 ~B - 'N', 'H', // 131 ~C - 'I', 'N', // 132 ~D - 'N', 'L', // 133 ~E - 'S', 'A', // 134 ~F - 'E', 'S', // 135 ~G - 'H', 'S', // 136 ~H - 'H', 'J', // 137 ~I - 'V', 'S', // 138 ~J - 'P', 'D', // 139 ~K - 'P', 'U', // 140 ~L - 'R', 'I', // 141 ~M - 'S', '2', // 142 ~N - 'S', '3', // 143 ~O - 'D', 'C', // 144 ~P - 'P', '1', // 145 ~Q - 'P', '2', // 146 ~R - 'T', 'S', // 147 ~S - 'C', 'C', // 148 ~T - 'M', 'W', // 149 ~U - 'S', 'G', // 150 ~V - 'E', 'G', // 151 ~W - 'S', 'S', // 152 ~X - 'G', 'C', // 153 ~Y - 'S', 'C', // 154 ~Z - 'C', 'I', // 155 ~[ - 'S', 'T', // 156 ~\ - 'O', 'C', // 157 ~] - 'P', 'M', // 158 ~^ - 'A', 'C', // 159 ~_ - 'N', 'S', // 160 | - '!', 'I', // 161 - 'C', 't', // 162 - 'P', 'd', // 163 - 'C', 'u', // 164 - 'Y', 'e', // 165 - 'B', 'B', // 166 - 'S', 'E', // 167 - '\'', ':', // 168 - 'C', 'o', // 169 - '-', 'a', // 170 - '<', '<', // 171 - 'N', 'O', // 172 - '-', '-', // 173 - 'R', 'g', // 174 - '\'', 'm', // 175 - 'D', 'G', // 176 - '+', '-', // 177 - '2', 'S', // 178 - '3', 'S', // 179 - '\'', '\'', // 180 - 'M', 'y', // 181 - 'P', 'I', // 182 - '.', 'M', // 183 - '\'', ',', // 184 - '1', 'S', // 185 - '-', 'o', // 186 - '>', '>', // 187 - '1', '4', // 188 - '1', '2', // 189 - '3', '4', // 190 - '?', 'I', // 191 - 'A', '!', // 192 - 'A', '\'', // 193 - 'A', '>', // 194 - 'A', '?', // 195 - 'A', ':', // 196 - 'A', 'A', // 197 - 'A', 'E', // 198 - 'C', ',', // 199 - 'E', '!', // 200 - 'E', '\'', // 201 - 'E', '>', // 202 - 'E', ':', // 203 - 'I', '!', // 204 - 'I', '\'', // 205 - 'I', '>', // 206 - 'I', ':', // 207 - 'D', '-', // 208 - 'N', '?', // 209 - 'O', '!', // 210 - 'O', '\'', // 211 - 'O', '>', // 212 - 'O', '?', // 213 - 'O', ':', // 214 - '*', 'X', // 215 - 'O', '/', // 216 - 'U', '!', // 217 - 'U', '\'', // 218 - 'U', '>', // 219 - 'U', ':', // 220 - 'Y', '\'', // 221 - 'T', 'H', // 222 - 's', 's', // 223 - 'a', '!', // 224 - 'a', '\'', // 225 - 'a', '>', // 226 - 'a', '?', // 227 - 'a', ':', // 228 - 'a', 'a', // 229 - 'a', 'e', // 230 - 'c', ',', // 231 - 'e', '!', // 232 - 'e', '\'', // 233 - 'e', '>', // 234 - 'e', ':', // 235 - 'i', '!', // 236 - 'i', '\'', // 237 - 'i', '>', // 238 - 'i', ':', // 239 - 'd', '-', // 240 - 'n', '?', // 241 - 'o', '!', // 242 - 'o', '\'', // 243 - 'o', '>', // 244 - 'o', '?', // 245 - 'o', ':', // 246 - '-', ':', // 247 - 'o', '/', // 248 - 'u', '!', // 249 - 'u', '\'', // 250 - 'u', '>', // 251 - 'u', ':', // 252 - 'y', '\'', // 253 - 't', 'h', // 254 - 'y', ':', // 255 - */ + private val defaultDigraphs = charArrayOf( 'N', 'U', '\u0000', // NULL (NUL) 'S', 'H', '\u0001', // START OF HEADING (SOH) 'S', 'X', '\u0002', // START OF TEXT (STX) @@ -445,10 +188,10 @@ open class VimDigraphGroupBase() : VimDigraphGroup { 'B', 'L', '\u0007', // BELL (BEL) 'B', 'S', '\u0008', // BACKSPACE (BS) 'H', 'T', '\u0009', // CHARACTER TABULATION (HT) - 'L', 'F', 0x000a.toChar(), // LINE FEED (LF) + 'L', 'F', '\u000a', // LINE FEED (LF) 'V', 'T', '\u000b', // LINE TABULATION (VT) 'F', 'F', '\u000c', // FORM FEED (FF) - 'C', 'R', 0x000d.toChar(), // CARRIAGE RETURN (CR) + 'C', 'R', '\u000d', // CARRIAGE RETURN (CR) 'S', 'O', '\u000e', // SHIFT OUT (SO) 'S', 'I', '\u000f', // SHIFT IN (SI) 'D', 'L', '\u0010', // DATALINK ESCAPE (DLE) @@ -472,7 +215,7 @@ open class VimDigraphGroupBase() : VimDigraphGroup { 'D', 'O', '\u0024', // DOLLAR SIGN 'A', 't', '\u0040', // COMMERCIAL AT '<', '(', '\u005b', // LEFT SQUARE BRACKET - '/', '/', 0x005c.toChar(), // REVERSE SOLIDUS + '/', '/', '\u005c', // REVERSE SOLIDUS ')', '>', '\u005d', // RIGHT SQUARE BRACKET '\'', '>', '\u005e', // CIRCUMFLEX ACCENT '\'', '!', '\u0060', // GRAVE ACCENT From 073920ce0f071fd768b6204a88d2fa98ab2e889a Mon Sep 17 00:00:00 2001 From: Matt Ellis Date: Tue, 3 Sep 2024 01:41:42 +0100 Subject: [PATCH 08/17] Update comments for default digraphs --- .../idea/vim/api/VimDigraphGroupBase.kt | 2678 ++++++++--------- 1 file changed, 1339 insertions(+), 1339 deletions(-) diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt index 7a4d6daae8..bdf89c5e19 100644 --- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt +++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt @@ -178,1345 +178,1345 @@ open class VimDigraphGroupBase() : VimDigraphGroup { @Suppress("GrazieInspection", "SpellCheckingInspection") private val defaultDigraphs = charArrayOf( - 'N', 'U', '\u0000', // NULL (NUL) - 'S', 'H', '\u0001', // START OF HEADING (SOH) - 'S', 'X', '\u0002', // START OF TEXT (STX) - 'E', 'X', '\u0003', // END OF TEXT (ETX) - 'E', 'T', '\u0004', // END OF TRANSMISSION (EOT) - 'E', 'Q', '\u0005', // ENQUIRY (ENQ) - 'A', 'K', '\u0006', // ACKNOWLEDGE (ACK) - 'B', 'L', '\u0007', // BELL (BEL) - 'B', 'S', '\u0008', // BACKSPACE (BS) - 'H', 'T', '\u0009', // CHARACTER TABULATION (HT) - 'L', 'F', '\u000a', // LINE FEED (LF) - 'V', 'T', '\u000b', // LINE TABULATION (VT) - 'F', 'F', '\u000c', // FORM FEED (FF) - 'C', 'R', '\u000d', // CARRIAGE RETURN (CR) - 'S', 'O', '\u000e', // SHIFT OUT (SO) - 'S', 'I', '\u000f', // SHIFT IN (SI) - 'D', 'L', '\u0010', // DATALINK ESCAPE (DLE) - 'D', '1', '\u0011', // DEVICE CONTROL ONE (DC1) - 'D', '2', '\u0012', // DEVICE CONTROL TWO (DC2) - 'D', '3', '\u0013', // DEVICE CONTROL THREE (DC3) - 'D', '4', '\u0014', // DEVICE CONTROL FOUR (DC4) - 'N', 'K', '\u0015', // NEGATIVE ACKNOWLEDGE (NAK) - 'S', 'Y', '\u0016', // SYNCRONOUS IDLE (SYN) - 'E', 'B', '\u0017', // END OF TRANSMISSION BLOCK (ETB) - 'C', 'N', '\u0018', // CANCEL (CAN) - 'E', 'M', '\u0019', // END OF MEDIUM (EM) - 'S', 'B', '\u001a', // SUBSTITUTE (SUB) - 'E', 'C', '\u001b', // ESCAPE (ESC) - 'F', 'S', '\u001c', // FILE SEPARATOR (IS4) - 'G', 'S', '\u001d', // GROUP SEPARATOR (IS3) - 'R', 'S', '\u001e', // RECORD SEPARATOR (IS2) - 'U', 'S', '\u001f', // UNIT SEPARATOR (IS1) - 'S', 'P', '\u0020', // SPACE - 'N', 'b', '\u0023', // NUMBER SIGN - 'D', 'O', '\u0024', // DOLLAR SIGN - 'A', 't', '\u0040', // COMMERCIAL AT - '<', '(', '\u005b', // LEFT SQUARE BRACKET - '/', '/', '\u005c', // REVERSE SOLIDUS - ')', '>', '\u005d', // RIGHT SQUARE BRACKET - '\'', '>', '\u005e', // CIRCUMFLEX ACCENT - '\'', '!', '\u0060', // GRAVE ACCENT - '(', '!', '\u007b', // LEFT CURLY BRACKET - '!', '!', '\u007c', // VERTICAL LINE - '!', ')', '\u007d', // RIGHT CURLY BRACKET - '\'', '?', '\u007e', // TILDE - 'D', 'T', '\u007f', // DELETE (DEL) - 'P', 'A', '\u0080', // PADDING CHARACTER (PAD) - 'H', 'O', '\u0081', // HIGH OCTET PRESET (HOP) - 'B', 'H', '\u0082', // BREAK PERMITTED HERE (BPH) - 'N', 'H', '\u0083', // NO BREAK HERE (NBH) - 'I', 'N', '\u0084', // INDEX (IND) - 'N', 'L', '\u0085', // NEXT LINE (NEL) - 'S', 'A', '\u0086', // START OF SELECTED AREA (SSA) - 'E', 'S', '\u0087', // END OF SELECTED AREA (ESA) - 'H', 'S', '\u0088', // CHARACTER TABULATION SET (HTS) - 'H', 'J', '\u0089', // CHARACTER TABULATION WITH JUSTIFICATION (HTJ) - 'V', 'S', '\u008a', // LINE TABULATION SET (VTS) - 'P', 'D', '\u008b', // PARTIAL LINE FORWARD (PLD) - 'P', 'U', '\u008c', // PARTIAL LINE BACKWARD (PLU) - 'R', 'I', '\u008d', // REVERSE LINE FEED (RI) - 'S', '2', '\u008e', // SINGLE-SHIFT TWO (SS2) - 'S', '3', '\u008f', // SINGLE-SHIFT THREE (SS3) - 'D', 'C', '\u0090', // DEVICE CONTROL STRING (DCS) - 'P', '1', '\u0091', // PRIVATE USE ONE (PU1) - 'P', '2', '\u0092', // PRIVATE USE TWO (PU2) - 'T', 'S', '\u0093', // SET TRANSMIT STATE (STS) - 'C', 'C', '\u0094', // CANCEL CHARACTER (CCH) - 'M', 'W', '\u0095', // MESSAGE WAITING (MW) - 'S', 'G', '\u0096', // START OF GUARDED AREA (SPA) - 'E', 'G', '\u0097', // END OF GUARDED AREA (EPA) - 'S', 'S', '\u0098', // START OF STRING (SOS) - 'G', 'C', '\u0099', // SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI) - 'S', 'C', '\u009a', // SINGLE CHARACTER INTRODUCER (SCI) - 'C', 'I', '\u009b', // CONTROL SEQUENCE INTRODUCER (CSI) - 'S', 'T', '\u009c', // STRING TERMINATOR (ST) - 'O', 'C', '\u009d', // OPERATING SYSTEM COMMAND (OSC) - 'P', 'M', '\u009e', // PRIVACY MESSAGE (PM) - 'A', 'C', '\u009f', // APPLICATION PROGRAM COMMAND (APC) - 'N', 'S', '\u00a0', // NO-BREAK SPACE - '!', 'I', '\u00a1', // INVERTED EXCLAMATION MARK - 'C', 't', '\u00a2', // CENT SIGN - 'P', 'd', '\u00a3', // POUND SIGN - 'C', 'u', '\u00a4', // CURRENCY SIGN - 'Y', 'e', '\u00a5', // YEN SIGN - 'B', 'B', '\u00a6', // BROKEN BAR - 'S', 'E', '\u00a7', // SECTION SIGN - '\'', ':', '\u00a8', // DIAERESIS - 'C', 'o', '\u00a9', // COPYRIGHT SIGN - '-', 'a', '\u00aa', // FEMININE ORDINAL INDICATOR - '<', '<', '\u00ab', // LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 'N', 'O', '\u00ac', // NOT SIGN - '-', '-', '\u00ad', // SOFT HYPHEN - 'R', 'g', '\u00ae', // REGISTERED SIGN - '\'', 'm', '\u00af', // MACRON - 'D', 'G', '\u00b0', // DEGREE SIGN - '+', '-', '\u00b1', // PLUS-MINUS SIGN - '2', 'S', '\u00b2', // SUPERSCRIPT TWO - '3', 'S', '\u00b3', // SUPERSCRIPT THREE - '\'', '\'', '\u00b4', // ACUTE ACCENT - 'M', 'y', '\u00b5', // MICRO SIGN - 'P', 'I', '\u00b6', // PILCROW SIGN - '.', 'M', '\u00b7', // MIDDLE DOT - '\'', ',', '\u00b8', // CEDILLA - '1', 'S', '\u00b9', // SUPERSCRIPT ONE - '-', 'o', '\u00ba', // MASCULINE ORDINAL INDICATOR - '>', '>', '\u00bb', // RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - '1', '4', '\u00bc', // VULGAR FRACTION ONE QUARTER - '1', '2', '\u00bd', // VULGAR FRACTION ONE HALF - '3', '4', '\u00be', // VULGAR FRACTION THREE QUARTERS - '?', 'I', '\u00bf', // INVERTED QUESTION MARK - 'A', '!', '\u00c0', // LATIN CAPITAL LETTER A WITH GRAVE - 'A', '\'', '\u00c1', // LATIN CAPITAL LETTER A WITH ACUTE - 'A', '>', '\u00c2', // LATIN CAPITAL LETTER A WITH CIRCUMFLEX - 'A', '?', '\u00c3', // LATIN CAPITAL LETTER A WITH TILDE - 'A', ':', '\u00c4', // LATIN CAPITAL LETTER A WITH DIAERESIS - 'A', 'A', '\u00c5', // LATIN CAPITAL LETTER A WITH RING ABOVE - 'A', 'E', '\u00c6', // LATIN CAPITAL LETTER AE - 'C', ',', '\u00c7', // LATIN CAPITAL LETTER C WITH CEDILLA - 'E', '!', '\u00c8', // LATIN CAPITAL LETTER E WITH GRAVE - 'E', '\'', '\u00c9', // LATIN CAPITAL LETTER E WITH ACUTE - 'E', '>', '\u00ca', // LATIN CAPITAL LETTER E WITH CIRCUMFLEX - 'E', ':', '\u00cb', // LATIN CAPITAL LETTER E WITH DIAERESIS - 'I', '!', '\u00cc', // LATIN CAPITAL LETTER I WITH GRAVE - 'I', '\'', '\u00cd', // LATIN CAPITAL LETTER I WITH ACUTE - 'I', '>', '\u00ce', // LATIN CAPITAL LETTER I WITH CIRCUMFLEX - 'I', ':', '\u00cf', // LATIN CAPITAL LETTER I WITH DIAERESIS - 'D', '-', '\u00d0', // LATIN CAPITAL LETTER ETH (Icelandic) - 'N', '?', '\u00d1', // LATIN CAPITAL LETTER N WITH TILDE - 'O', '!', '\u00d2', // LATIN CAPITAL LETTER O WITH GRAVE - 'O', '\'', '\u00d3', // LATIN CAPITAL LETTER O WITH ACUTE - 'O', '>', '\u00d4', // LATIN CAPITAL LETTER O WITH CIRCUMFLEX - 'O', '?', '\u00d5', // LATIN CAPITAL LETTER O WITH TILDE - 'O', ':', '\u00d6', // LATIN CAPITAL LETTER O WITH DIAERESIS - '*', 'X', '\u00d7', // MULTIPLICATION SIGN - 'O', '/', '\u00d8', // LATIN CAPITAL LETTER O WITH STROKE - 'U', '!', '\u00d9', // LATIN CAPITAL LETTER U WITH GRAVE - 'U', '\'', '\u00da', // LATIN CAPITAL LETTER U WITH ACUTE - 'U', '>', '\u00db', // LATIN CAPITAL LETTER U WITH CIRCUMFLEX - 'U', ':', '\u00dc', // LATIN CAPITAL LETTER U WITH DIAERESIS - 'Y', '\'', '\u00dd', // LATIN CAPITAL LETTER Y WITH ACUTE - 'T', 'H', '\u00de', // LATIN CAPITAL LETTER THORN (Icelandic) - 's', 's', '\u00df', // LATIN SMALL LETTER SHARP S (German) - 'a', '!', '\u00e0', // LATIN SMALL LETTER A WITH GRAVE - 'a', '\'', '\u00e1', // LATIN SMALL LETTER A WITH ACUTE - 'a', '>', '\u00e2', // LATIN SMALL LETTER A WITH CIRCUMFLEX - 'a', '?', '\u00e3', // LATIN SMALL LETTER A WITH TILDE - 'a', ':', '\u00e4', // LATIN SMALL LETTER A WITH DIAERESIS - 'a', 'a', '\u00e5', // LATIN SMALL LETTER A WITH RING ABOVE - 'a', 'e', '\u00e6', // LATIN SMALL LETTER AE - 'c', ',', '\u00e7', // LATIN SMALL LETTER C WITH CEDILLA - 'e', '!', '\u00e8', // LATIN SMALL LETTER E WITH GRAVE - 'e', '\'', '\u00e9', // LATIN SMALL LETTER E WITH ACUTE - 'e', '>', '\u00ea', // LATIN SMALL LETTER E WITH CIRCUMFLEX - 'e', ':', '\u00eb', // LATIN SMALL LETTER E WITH DIAERESIS - 'i', '!', '\u00ec', // LATIN SMALL LETTER I WITH GRAVE - 'i', '\'', '\u00ed', // LATIN SMALL LETTER I WITH ACUTE - 'i', '>', '\u00ee', // LATIN SMALL LETTER I WITH CIRCUMFLEX - 'i', ':', '\u00ef', // LATIN SMALL LETTER I WITH DIAERESIS - 'd', '-', '\u00f0', // LATIN SMALL LETTER ETH (Icelandic) - 'n', '?', '\u00f1', // LATIN SMALL LETTER N WITH TILDE - 'o', '!', '\u00f2', // LATIN SMALL LETTER O WITH GRAVE - 'o', '\'', '\u00f3', // LATIN SMALL LETTER O WITH ACUTE - 'o', '>', '\u00f4', // LATIN SMALL LETTER O WITH CIRCUMFLEX - 'o', '?', '\u00f5', // LATIN SMALL LETTER O WITH TILDE - 'o', ':', '\u00f6', // LATIN SMALL LETTER O WITH DIAERESIS - '-', ':', '\u00f7', // DIVISION SIGN - 'o', '/', '\u00f8', // LATIN SMALL LETTER O WITH STROKE - 'u', '!', '\u00f9', // LATIN SMALL LETTER U WITH GRAVE - 'u', '\'', '\u00fa', // LATIN SMALL LETTER U WITH ACUTE - 'u', '>', '\u00fb', // LATIN SMALL LETTER U WITH CIRCUMFLEX - 'u', ':', '\u00fc', // LATIN SMALL LETTER U WITH DIAERESIS - 'y', '\'', '\u00fd', // LATIN SMALL LETTER Y WITH ACUTE - 't', 'h', '\u00fe', // LATIN SMALL LETTER THORN (Icelandic) - 'y', ':', '\u00ff', // LATIN SMALL LETTER Y WITH DIAERESIS - 'A', '-', '\u0100', // LATIN CAPITAL LETTER A WITH MACRON - 'a', '-', '\u0101', // LATIN SMALL LETTER A WITH MACRON - 'A', '(', '\u0102', // LATIN CAPITAL LETTER A WITH BREVE - 'a', '(', '\u0103', // LATIN SMALL LETTER A WITH BREVE - 'A', ';', '\u0104', // LATIN CAPITAL LETTER A WITH OGONEK - 'a', ';', '\u0105', // LATIN SMALL LETTER A WITH OGONEK - 'C', '\'', '\u0106', // LATIN CAPITAL LETTER C WITH ACUTE - 'c', '\'', '\u0107', // LATIN SMALL LETTER C WITH ACUTE - 'C', '>', '\u0108', // LATIN CAPITAL LETTER C WITH CIRCUMFLEX - 'c', '>', '\u0109', // LATIN SMALL LETTER C WITH CIRCUMFLEX - 'C', '.', '\u010a', // LATIN CAPITAL LETTER C WITH DOT ABOVE - 'c', '.', '\u010b', // LATIN SMALL LETTER C WITH DOT ABOVE - 'C', '<', '\u010c', // LATIN CAPITAL LETTER C WITH CARON - 'c', '<', '\u010d', // LATIN SMALL LETTER C WITH CARON - 'D', '<', '\u010e', // LATIN CAPITAL LETTER D WITH CARON - 'd', '<', '\u010f', // LATIN SMALL LETTER D WITH CARON - 'D', '/', '\u0110', // LATIN CAPITAL LETTER D WITH STROKE - 'd', '/', '\u0111', // LATIN SMALL LETTER D WITH STROKE - 'E', '-', '\u0112', // LATIN CAPITAL LETTER E WITH MACRON - 'e', '-', '\u0113', // LATIN SMALL LETTER E WITH MACRON - 'E', '(', '\u0114', // LATIN CAPITAL LETTER E WITH BREVE - 'e', '(', '\u0115', // LATIN SMALL LETTER E WITH BREVE - 'E', '.', '\u0116', // LATIN CAPITAL LETTER E WITH DOT ABOVE - 'e', '.', '\u0117', // LATIN SMALL LETTER E WITH DOT ABOVE - 'E', ';', '\u0118', // LATIN CAPITAL LETTER E WITH OGONEK - 'e', ';', '\u0119', // LATIN SMALL LETTER E WITH OGONEK - 'E', '<', '\u011a', // LATIN CAPITAL LETTER E WITH CARON - 'e', '<', '\u011b', // LATIN SMALL LETTER E WITH CARON - 'G', '>', '\u011c', // LATIN CAPITAL LETTER G WITH CIRCUMFLEX - 'g', '>', '\u011d', // LATIN SMALL LETTER G WITH CIRCUMFLEX - 'G', '(', '\u011e', // LATIN CAPITAL LETTER G WITH BREVE - 'g', '(', '\u011f', // LATIN SMALL LETTER G WITH BREVE - 'G', '.', '\u0120', // LATIN CAPITAL LETTER G WITH DOT ABOVE - 'g', '.', '\u0121', // LATIN SMALL LETTER G WITH DOT ABOVE - 'G', ',', '\u0122', // LATIN CAPITAL LETTER G WITH CEDILLA - 'g', ',', '\u0123', // LATIN SMALL LETTER G WITH CEDILLA - 'H', '>', '\u0124', // LATIN CAPITAL LETTER H WITH CIRCUMFLEX - 'h', '>', '\u0125', // LATIN SMALL LETTER H WITH CIRCUMFLEX - 'H', '/', '\u0126', // LATIN CAPITAL LETTER H WITH STROKE - 'h', '/', '\u0127', // LATIN SMALL LETTER H WITH STROKE - 'I', '?', '\u0128', // LATIN CAPITAL LETTER I WITH TILDE - 'i', '?', '\u0129', // LATIN SMALL LETTER I WITH TILDE - 'I', '-', '\u012a', // LATIN CAPITAL LETTER I WITH MACRON - 'i', '-', '\u012b', // LATIN SMALL LETTER I WITH MACRON - 'I', '(', '\u012c', // LATIN CAPITAL LETTER I WITH BREVE - 'i', '(', '\u012d', // LATIN SMALL LETTER I WITH BREVE - 'I', ';', '\u012e', // LATIN CAPITAL LETTER I WITH OGONEK - 'i', ';', '\u012f', // LATIN SMALL LETTER I WITH OGONEK - 'I', '.', '\u0130', // LATIN CAPITAL LETTER I WITH DOT ABOVE - 'i', '.', '\u0131', // LATIN SMALL LETTER I DOTLESS - 'I', 'J', '\u0132', // LATIN CAPITAL LIGATURE IJ - 'i', 'j', '\u0133', // LATIN SMALL LIGATURE IJ - 'J', '>', '\u0134', // LATIN CAPITAL LETTER J WITH CIRCUMFLEX - 'j', '>', '\u0135', // LATIN SMALL LETTER J WITH CIRCUMFLEX - 'K', ',', '\u0136', // LATIN CAPITAL LETTER K WITH CEDILLA - 'k', ',', '\u0137', // LATIN SMALL LETTER K WITH CEDILLA - 'k', 'k', '\u0138', // LATIN SMALL LETTER KRA (Greenlandic) - 'L', '\'', '\u0139', // LATIN CAPITAL LETTER L WITH ACUTE - 'l', '\'', '\u013a', // LATIN SMALL LETTER L WITH ACUTE - 'L', ',', '\u013b', // LATIN CAPITAL LETTER L WITH CEDILLA - 'l', ',', '\u013c', // LATIN SMALL LETTER L WITH CEDILLA - 'L', '<', '\u013d', // LATIN CAPITAL LETTER L WITH CARON - 'l', '<', '\u013e', // LATIN SMALL LETTER L WITH CARON - 'L', '.', '\u013f', // LATIN CAPITAL LETTER L WITH MIDDLE DOT - 'l', '.', '\u0140', // LATIN SMALL LETTER L WITH MIDDLE DOT - 'L', '/', '\u0141', // LATIN CAPITAL LETTER L WITH STROKE - 'l', '/', '\u0142', // LATIN SMALL LETTER L WITH STROKE - 'N', '\'', '\u0143', // LATIN CAPITAL LETTER N WITH ACUTE - 'n', '\'', '\u0144', // LATIN SMALL LETTER N WITH ACUTE - 'N', ',', '\u0145', // LATIN CAPITAL LETTER N WITH CEDILLA - 'n', ',', '\u0146', // LATIN SMALL LETTER N WITH CEDILLA - 'N', '<', '\u0147', // LATIN CAPITAL LETTER N WITH CARON - 'n', '<', '\u0148', // LATIN SMALL LETTER N WITH CARON - '\'', 'n', '\u0149', // LATIN SMALL LETTER N PRECEDED BY APOSTROPHE - 'N', 'G', '\u014a', // LATIN CAPITAL LETTER ENG (Lappish) - 'n', 'g', '\u014b', // LATIN SMALL LETTER ENG (Lappish) - 'O', '-', '\u014c', // LATIN CAPITAL LETTER O WITH MACRON - 'o', '-', '\u014d', // LATIN SMALL LETTER O WITH MACRON - 'O', '(', '\u014e', // LATIN CAPITAL LETTER O WITH BREVE - 'o', '(', '\u014f', // LATIN SMALL LETTER O WITH BREVE - 'O', '"', '\u0150', // LATIN CAPITAL LETTER O WITH DOUBLE ACUTE - 'o', '"', '\u0151', // LATIN SMALL LETTER O WITH DOUBLE ACUTE - 'O', 'E', '\u0152', // LATIN CAPITAL LIGATURE OE - 'o', 'e', '\u0153', // LATIN SMALL LIGATURE OE - 'R', '\'', '\u0154', // LATIN CAPITAL LETTER R WITH ACUTE - 'r', '\'', '\u0155', // LATIN SMALL LETTER R WITH ACUTE - 'R', ',', '\u0156', // LATIN CAPITAL LETTER R WITH CEDILLA - 'r', ',', '\u0157', // LATIN SMALL LETTER R WITH CEDILLA - 'R', '<', '\u0158', // LATIN CAPITAL LETTER R WITH CARON - 'r', '<', '\u0159', // LATIN SMALL LETTER R WITH CARON - 'S', '\'', '\u015a', // LATIN CAPITAL LETTER S WITH ACUTE - 's', '\'', '\u015b', // LATIN SMALL LETTER S WITH ACUTE - 'S', '>', '\u015c', // LATIN CAPITAL LETTER S WITH CIRCUMFLEX - 's', '>', '\u015d', // LATIN SMALL LETTER S WITH CIRCUMFLEX - 'S', ',', '\u015e', // LATIN CAPITAL LETTER S WITH CEDILLA - 's', ',', '\u015f', // LATIN SMALL LETTER S WITH CEDILLA - 'S', '<', '\u0160', // LATIN CAPITAL LETTER S WITH CARON - 's', '<', '\u0161', // LATIN SMALL LETTER S WITH CARON - 'T', ',', '\u0162', // LATIN CAPITAL LETTER T WITH CEDILLA - 't', ',', '\u0163', // LATIN SMALL LETTER T WITH CEDILLA - 'T', '<', '\u0164', // LATIN CAPITAL LETTER T WITH CARON - 't', '<', '\u0165', // LATIN SMALL LETTER T WITH CARON - 'T', '/', '\u0166', // LATIN CAPITAL LETTER T WITH STROKE - 't', '/', '\u0167', // LATIN SMALL LETTER T WITH STROKE - 'U', '?', '\u0168', // LATIN CAPITAL LETTER U WITH TILDE - 'u', '?', '\u0169', // LATIN SMALL LETTER U WITH TILDE - 'U', '-', '\u016a', // LATIN CAPITAL LETTER U WITH MACRON - 'u', '-', '\u016b', // LATIN SMALL LETTER U WITH MACRON - 'U', '(', '\u016c', // LATIN CAPITAL LETTER U WITH BREVE - 'u', '(', '\u016d', // LATIN SMALL LETTER U WITH BREVE - 'U', '0', '\u016e', // LATIN CAPITAL LETTER U WITH RING ABOVE - 'u', '0', '\u016f', // LATIN SMALL LETTER U WITH RING ABOVE - 'U', '"', '\u0170', // LATIN CAPITAL LETTER U WITH DOUBLE ACUTE - 'u', '"', '\u0171', // LATIN SMALL LETTER U WITH DOUBLE ACUTE - 'U', ';', '\u0172', // LATIN CAPITAL LETTER U WITH OGONEK - 'u', ';', '\u0173', // LATIN SMALL LETTER U WITH OGONEK - 'W', '>', '\u0174', // LATIN CAPITAL LETTER W WITH CIRCUMFLEX - 'w', '>', '\u0175', // LATIN SMALL LETTER W WITH CIRCUMFLEX - 'Y', '>', '\u0176', // LATIN CAPITAL LETTER Y WITH CIRCUMFLEX - 'y', '>', '\u0177', // LATIN SMALL LETTER Y WITH CIRCUMFLEX - 'Y', ':', '\u0178', // LATIN CAPITAL LETTER Y WITH DIAERESIS - 'Z', '\'', '\u0179', // LATIN CAPITAL LETTER Z WITH ACUTE - 'z', '\'', '\u017a', // LATIN SMALL LETTER Z WITH ACUTE - 'Z', '.', '\u017b', // LATIN CAPITAL LETTER Z WITH DOT ABOVE - 'z', '.', '\u017c', // LATIN SMALL LETTER Z WITH DOT ABOVE - 'Z', '<', '\u017d', // LATIN CAPITAL LETTER Z WITH CARON - 'z', '<', '\u017e', // LATIN SMALL LETTER Z WITH CARON - 'O', '9', '\u01a0', // LATIN CAPITAL LETTER O WITH HORN - 'o', '9', '\u01a1', // LATIN SMALL LETTER O WITH HORN - 'O', 'I', '\u01a2', // LATIN CAPITAL LETTER OI - 'o', 'i', '\u01a3', // LATIN SMALL LETTER OI - 'y', 'r', '\u01a6', // LATIN LETTER YR - 'U', '9', '\u01af', // LATIN CAPITAL LETTER U WITH HORN - 'u', '9', '\u01b0', // LATIN SMALL LETTER U WITH HORN - 'Z', '/', '\u01b5', // LATIN CAPITAL LETTER Z WITH STROKE - 'z', '/', '\u01b6', // LATIN SMALL LETTER Z WITH STROKE - 'E', 'D', '\u01b7', // LATIN CAPITAL LETTER EZH - 'A', '<', '\u01cd', // LATIN CAPITAL LETTER A WITH CARON - 'a', '<', '\u01ce', // LATIN SMALL LETTER A WITH CARON - 'I', '<', '\u01cf', // LATIN CAPITAL LETTER I WITH CARON - 'i', '<', '\u01d0', // LATIN SMALL LETTER I WITH CARON - 'O', '<', '\u01d1', // LATIN CAPITAL LETTER O WITH CARON - 'o', '<', '\u01d2', // LATIN SMALL LETTER O WITH CARON - 'U', '<', '\u01d3', // LATIN CAPITAL LETTER U WITH CARON - 'u', '<', '\u01d4', // LATIN SMALL LETTER U WITH CARON - 'A', '1', '\u01de', // LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON - 'a', '1', '\u01df', // LATIN SMALL LETTER A WITH DIAERESIS AND MACRON - 'A', '7', '\u01e0', // LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON - 'a', '7', '\u01e1', // LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON - 'A', '3', '\u01e2', // LATIN CAPITAL LETTER AE WITH MACRON - 'a', '3', '\u01e3', // LATIN SMALL LETTER AE WITH MACRON - 'G', '/', '\u01e4', // LATIN CAPITAL LETTER G WITH STROKE - 'g', '/', '\u01e5', // LATIN SMALL LETTER G WITH STROKE - 'G', '<', '\u01e6', // LATIN CAPITAL LETTER G WITH CARON - 'g', '<', '\u01e7', // LATIN SMALL LETTER G WITH CARON - 'K', '<', '\u01e8', // LATIN CAPITAL LETTER K WITH CARON - 'k', '<', '\u01e9', // LATIN SMALL LETTER K WITH CARON - 'O', ';', '\u01ea', // LATIN CAPITAL LETTER O WITH OGONEK - 'o', ';', '\u01eb', // LATIN SMALL LETTER O WITH OGONEK - 'O', '1', '\u01ec', // LATIN CAPITAL LETTER O WITH OGONEK AND MACRON - 'o', '1', '\u01ed', // LATIN SMALL LETTER O WITH OGONEK AND MACRON - 'E', 'Z', '\u01ee', // LATIN CAPITAL LETTER EZH WITH CARON - 'e', 'z', '\u01ef', // LATIN SMALL LETTER EZH WITH CARON - 'j', '<', '\u01f0', // LATIN SMALL LETTER J WITH CARON - 'G', '\'', '\u01f4', // LATIN CAPITAL LETTER G WITH ACUTE - 'g', '\'', '\u01f5', // LATIN SMALL LETTER G WITH ACUTE - ';', 'S', '\u02bf', // MODIFIER LETTER LEFT HALF RING - '\'', '<', '\u02c7', // CARON - '\'', '(', '\u02d8', // BREVE - '\'', '.', '\u02d9', // DOT ABOVE - '\'', '0', '\u02da', // RING ABOVE - '\'', ';', '\u02db', // OGONEK - '\'', '"', '\u02dd', // DOUBLE ACUTE ACCENT - 'A', '%', '\u0386', // GREEK CAPITAL LETTER ALPHA WITH ACUTE - 'E', '%', '\u0388', // GREEK CAPITAL LETTER EPSILON WITH ACUTE - 'Y', '%', '\u0389', // GREEK CAPITAL LETTER ETA WITH ACUTE - 'I', '%', '\u038a', // GREEK CAPITAL LETTER IOTA WITH ACUTE - 'O', '%', '\u038c', // GREEK CAPITAL LETTER OMICRON WITH ACUTE - 'U', '%', '\u038e', // GREEK CAPITAL LETTER UPSILON WITH ACUTE - 'W', '%', '\u038f', // GREEK CAPITAL LETTER OMEGA WITH ACUTE - 'i', '3', '\u0390', // GREEK SMALL LETTER IOTA WITH ACUTE AND DIAERESIS - 'A', '*', '\u0391', // GREEK CAPITAL LETTER ALPHA - 'B', '*', '\u0392', // GREEK CAPITAL LETTER BETA - 'G', '*', '\u0393', // GREEK CAPITAL LETTER GAMMA - 'D', '*', '\u0394', // GREEK CAPITAL LETTER DELTA - 'E', '*', '\u0395', // GREEK CAPITAL LETTER EPSILON - 'Z', '*', '\u0396', // GREEK CAPITAL LETTER ZETA - 'Y', '*', '\u0397', // GREEK CAPITAL LETTER ETA - 'H', '*', '\u0398', // GREEK CAPITAL LETTER THETA - 'I', '*', '\u0399', // GREEK CAPITAL LETTER IOTA - 'K', '*', '\u039a', // GREEK CAPITAL LETTER KAPPA - 'L', '*', '\u039b', // GREEK CAPITAL LETTER LAMDA - 'M', '*', '\u039c', // GREEK CAPITAL LETTER MU - 'N', '*', '\u039d', // GREEK CAPITAL LETTER NU - 'C', '*', '\u039e', // GREEK CAPITAL LETTER XI - 'O', '*', '\u039f', // GREEK CAPITAL LETTER OMICRON - 'P', '*', '\u03a0', // GREEK CAPITAL LETTER PI - 'R', '*', '\u03a1', // GREEK CAPITAL LETTER RHO - 'S', '*', '\u03a3', // GREEK CAPITAL LETTER SIGMA - 'T', '*', '\u03a4', // GREEK CAPITAL LETTER TAU - 'U', '*', '\u03a5', // GREEK CAPITAL LETTER UPSILON - 'F', '*', '\u03a6', // GREEK CAPITAL LETTER PHI - 'X', '*', '\u03a7', // GREEK CAPITAL LETTER CHI - 'Q', '*', '\u03a8', // GREEK CAPITAL LETTER PSI - 'W', '*', '\u03a9', // GREEK CAPITAL LETTER OMEGA - 'J', '*', '\u03aa', // GREEK CAPITAL LETTER IOTA WITH DIAERESIS - 'V', '*', '\u03ab', // GREEK CAPITAL LETTER UPSILON WITH DIAERESIS - 'a', '%', '\u03ac', // GREEK SMALL LETTER ALPHA WITH ACUTE - 'e', '%', '\u03ad', // GREEK SMALL LETTER EPSILON WITH ACUTE - 'y', '%', '\u03ae', // GREEK SMALL LETTER ETA WITH ACUTE - 'i', '%', '\u03af', // GREEK SMALL LETTER IOTA WITH ACUTE - 'u', '3', '\u03b0', // GREEK SMALL LETTER UPSILON WITH ACUTE AND DIAERESIS - 'a', '*', '\u03b1', // GREEK SMALL LETTER ALPHA - 'b', '*', '\u03b2', // GREEK SMALL LETTER BETA - 'g', '*', '\u03b3', // GREEK SMALL LETTER GAMMA - 'd', '*', '\u03b4', // GREEK SMALL LETTER DELTA - 'e', '*', '\u03b5', // GREEK SMALL LETTER EPSILON - 'z', '*', '\u03b6', // GREEK SMALL LETTER ZETA - 'y', '*', '\u03b7', // GREEK SMALL LETTER ETA - 'h', '*', '\u03b8', // GREEK SMALL LETTER THETA - 'i', '*', '\u03b9', // GREEK SMALL LETTER IOTA - 'k', '*', '\u03ba', // GREEK SMALL LETTER KAPPA - 'l', '*', '\u03bb', // GREEK SMALL LETTER LAMDA - 'm', '*', '\u03bc', // GREEK SMALL LETTER MU - 'n', '*', '\u03bd', // GREEK SMALL LETTER NU - 'c', '*', '\u03be', // GREEK SMALL LETTER XI - 'o', '*', '\u03bf', // GREEK SMALL LETTER OMICRON - 'p', '*', '\u03c0', // GREEK SMALL LETTER PI - 'r', '*', '\u03c1', // GREEK SMALL LETTER RHO - '*', 's', '\u03c2', // GREEK SMALL LETTER FINAL SIGMA - 's', '*', '\u03c3', // GREEK SMALL LETTER SIGMA - 't', '*', '\u03c4', // GREEK SMALL LETTER TAU - 'u', '*', '\u03c5', // GREEK SMALL LETTER UPSILON - 'f', '*', '\u03c6', // GREEK SMALL LETTER PHI - 'x', '*', '\u03c7', // GREEK SMALL LETTER CHI - 'q', '*', '\u03c8', // GREEK SMALL LETTER PSI - 'w', '*', '\u03c9', // GREEK SMALL LETTER OMEGA - 'j', '*', '\u03ca', // GREEK SMALL LETTER IOTA WITH DIAERESIS - 'v', '*', '\u03cb', // GREEK SMALL LETTER UPSILON WITH DIAERESIS - 'o', '%', '\u03cc', // GREEK SMALL LETTER OMICRON WITH ACUTE - 'u', '%', '\u03cd', // GREEK SMALL LETTER UPSILON WITH ACUTE - 'w', '%', '\u03ce', // GREEK SMALL LETTER OMEGA WITH ACUTE - '\'', 'G', '\u03d8', // GREEK NUMERAL SIGN - ',', 'G', '\u03d9', // GREEK LOWER NUMERAL SIGN - 'T', '3', '\u03da', // GREEK CAPITAL LETTER STIGMA - 't', '3', '\u03db', // GREEK SMALL LETTER STIGMA - 'M', '3', '\u03dc', // GREEK CAPITAL LETTER DIGAMMA - 'm', '3', '\u03dd', // GREEK SMALL LETTER DIGAMMA - 'K', '3', '\u03de', // GREEK CAPITAL LETTER KOPPA - 'k', '3', '\u03df', // GREEK SMALL LETTER KOPPA - 'P', '3', '\u03e0', // GREEK CAPITAL LETTER SAMPI - 'p', '3', '\u03e1', // GREEK SMALL LETTER SAMPI - '\'', '%', '\u03f4', // ACUTE ACCENT AND DIAERESIS (Tonos and Dialytika) - 'j', '3', '\u03f5', // GREEK IOTA BELOW - 'I', 'O', '\u0401', // CYRILLIC CAPITAL LETTER IO - 'D', '%', '\u0402', // CYRILLIC CAPITAL LETTER DJE (Serbocroatian) - 'G', '%', '\u0403', // CYRILLIC CAPITAL LETTER GJE (Macedonian) - 'I', 'E', '\u0404', // CYRILLIC CAPITAL LETTER UKRAINIAN IE - 'D', 'S', '\u0405', // CYRILLIC CAPITAL LETTER DZE (Macedonian) - 'I', 'I', '\u0406', // CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I - 'Y', 'I', '\u0407', // CYRILLIC CAPITAL LETTER YI (Ukrainian) - 'J', '%', '\u0408', // CYRILLIC CAPITAL LETTER JE - 'L', 'J', '\u0409', // CYRILLIC CAPITAL LETTER LJE - 'N', 'J', '\u040a', // CYRILLIC CAPITAL LETTER NJE - 'T', 's', '\u040b', // CYRILLIC CAPITAL LETTER TSHE (Serbocroatian) - 'K', 'J', '\u040c', // CYRILLIC CAPITAL LETTER KJE (Macedonian) - 'V', '%', '\u040e', // CYRILLIC CAPITAL LETTER SHORT U (Byelorussian) - 'D', 'Z', '\u040f', // CYRILLIC CAPITAL LETTER DZHE - 'A', '=', '\u0410', // CYRILLIC CAPITAL LETTER A - 'B', '=', '\u0411', // CYRILLIC CAPITAL LETTER BE - 'V', '=', '\u0412', // CYRILLIC CAPITAL LETTER VE - 'G', '=', '\u0413', // CYRILLIC CAPITAL LETTER GHE - 'D', '=', '\u0414', // CYRILLIC CAPITAL LETTER DE - 'E', '=', '\u0415', // CYRILLIC CAPITAL LETTER IE - 'Z', '%', '\u0416', // CYRILLIC CAPITAL LETTER ZHE - 'Z', '=', '\u0417', // CYRILLIC CAPITAL LETTER ZE - 'I', '=', '\u0418', // CYRILLIC CAPITAL LETTER I - 'J', '=', '\u0419', // CYRILLIC CAPITAL LETTER SHORT I - 'K', '=', '\u041a', // CYRILLIC CAPITAL LETTER KA - 'L', '=', '\u041b', // CYRILLIC CAPITAL LETTER EL - 'M', '=', '\u041c', // CYRILLIC CAPITAL LETTER EM - 'N', '=', '\u041d', // CYRILLIC CAPITAL LETTER EN - 'O', '=', '\u041e', // CYRILLIC CAPITAL LETTER O - 'P', '=', '\u041f', // CYRILLIC CAPITAL LETTER PE - 'R', '=', '\u0420', // CYRILLIC CAPITAL LETTER ER - 'S', '=', '\u0421', // CYRILLIC CAPITAL LETTER ES - 'T', '=', '\u0422', // CYRILLIC CAPITAL LETTER TE - 'U', '=', '\u0423', // CYRILLIC CAPITAL LETTER U - 'F', '=', '\u0424', // CYRILLIC CAPITAL LETTER EF - 'H', '=', '\u0425', // CYRILLIC CAPITAL LETTER HA - 'C', '=', '\u0426', // CYRILLIC CAPITAL LETTER TSE - 'C', '%', '\u0427', // CYRILLIC CAPITAL LETTER CHE - 'S', '%', '\u0428', // CYRILLIC CAPITAL LETTER SHA - 'S', 'c', '\u0429', // CYRILLIC CAPITAL LETTER SHCHA - '=', '"', '\u042a', // CYRILLIC CAPITAL LETTER HARD SIGN - 'Y', '=', '\u042b', // CYRILLIC CAPITAL LETTER YERU - '%', '"', '\u042c', // CYRILLIC CAPITAL LETTER SOFT SIGN - 'J', 'E', '\u042d', // CYRILLIC CAPITAL LETTER E - 'J', 'U', '\u042e', // CYRILLIC CAPITAL LETTER YU - 'J', 'A', '\u042f', // CYRILLIC CAPITAL LETTER YA - 'a', '=', '\u0430', // CYRILLIC SMALL LETTER A - 'b', '=', '\u0431', // CYRILLIC SMALL LETTER BE - 'v', '=', '\u0432', // CYRILLIC SMALL LETTER VE - 'g', '=', '\u0433', // CYRILLIC SMALL LETTER GHE - 'd', '=', '\u0434', // CYRILLIC SMALL LETTER DE - 'e', '=', '\u0435', // CYRILLIC SMALL LETTER IE - 'z', '%', '\u0436', // CYRILLIC SMALL LETTER ZHE - 'z', '=', '\u0437', // CYRILLIC SMALL LETTER ZE - 'i', '=', '\u0438', // CYRILLIC SMALL LETTER I - 'j', '=', '\u0439', // CYRILLIC SMALL LETTER SHORT I - 'k', '=', '\u043a', // CYRILLIC SMALL LETTER KA - 'l', '=', '\u043b', // CYRILLIC SMALL LETTER EL - 'm', '=', '\u043c', // CYRILLIC SMALL LETTER EM - 'n', '=', '\u043d', // CYRILLIC SMALL LETTER EN - 'o', '=', '\u043e', // CYRILLIC SMALL LETTER O - 'p', '=', '\u043f', // CYRILLIC SMALL LETTER PE - 'r', '=', '\u0440', // CYRILLIC SMALL LETTER ER - 's', '=', '\u0441', // CYRILLIC SMALL LETTER ES - 't', '=', '\u0442', // CYRILLIC SMALL LETTER TE - 'u', '=', '\u0443', // CYRILLIC SMALL LETTER U - 'f', '=', '\u0444', // CYRILLIC SMALL LETTER EF - 'h', '=', '\u0445', // CYRILLIC SMALL LETTER HA - 'c', '=', '\u0446', // CYRILLIC SMALL LETTER TSE - 'c', '%', '\u0447', // CYRILLIC SMALL LETTER CHE - 's', '%', '\u0448', // CYRILLIC SMALL LETTER SHA - 's', 'c', '\u0449', // CYRILLIC SMALL LETTER SHCHA - '=', '\'', '\u044a', // CYRILLIC SMALL LETTER HARD SIGN - 'y', '=', '\u044b', // CYRILLIC SMALL LETTER YERU - '%', '\'', '\u044c', // CYRILLIC SMALL LETTER SOFT SIGN - 'j', 'e', '\u044d', // CYRILLIC SMALL LETTER E - 'j', 'u', '\u044e', // CYRILLIC SMALL LETTER YU - 'j', 'a', '\u044f', // CYRILLIC SMALL LETTER YA - 'i', 'o', '\u0451', // CYRILLIC SMALL LETTER IO - 'd', '%', '\u0452', // CYRILLIC SMALL LETTER DJE (Serbocroatian) - 'g', '%', '\u0453', // CYRILLIC SMALL LETTER GJE (Macedonian) - 'i', 'e', '\u0454', // CYRILLIC SMALL LETTER UKRAINIAN IE - 'd', 's', '\u0455', // CYRILLIC SMALL LETTER DZE (Macedonian) - 'i', 'i', '\u0456', // CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I - 'y', 'i', '\u0457', // CYRILLIC SMALL LETTER YI (Ukrainian) - 'j', '%', '\u0458', // CYRILLIC SMALL LETTER JE - 'l', 'j', '\u0459', // CYRILLIC SMALL LETTER LJE - 'n', 'j', '\u045a', // CYRILLIC SMALL LETTER NJE - 't', 's', '\u045b', // CYRILLIC SMALL LETTER TSHE (Serbocroatian) - 'k', 'j', '\u045c', // CYRILLIC SMALL LETTER KJE (Macedonian) - 'v', '%', '\u045e', // CYRILLIC SMALL LETTER SHORT U (Byelorussian) - 'd', 'z', '\u045f', // CYRILLIC SMALL LETTER DZHE - 'Y', '3', '\u0462', // CYRILLIC CAPITAL LETTER YAT - 'y', '3', '\u0463', // CYRILLIC SMALL LETTER YAT - 'O', '3', '\u046a', // CYRILLIC CAPITAL LETTER BIG YUS - 'o', '3', '\u046b', // CYRILLIC SMALL LETTER BIG YUS - 'F', '3', '\u0472', // CYRILLIC CAPITAL LETTER FITA - 'f', '3', '\u0473', // CYRILLIC SMALL LETTER FITA - 'V', '3', '\u0474', // CYRILLIC CAPITAL LETTER IZHITSA - 'v', '3', '\u0475', // CYRILLIC SMALL LETTER IZHITSA - 'C', '3', '\u0480', // CYRILLIC CAPITAL LETTER KOPPA - 'c', '3', '\u0481', // CYRILLIC SMALL LETTER KOPPA - 'G', '3', '\u0490', // CYRILLIC CAPITAL LETTER GHE WITH UPTURN - 'g', '3', '\u0491', // CYRILLIC SMALL LETTER GHE WITH UPTURN - 'A', '+', '\u05d0', // HEBREW LETTER ALEF - 'B', '+', '\u05d1', // HEBREW LETTER BET - 'G', '+', '\u05d2', // HEBREW LETTER GIMEL - 'D', '+', '\u05d3', // HEBREW LETTER DALET - 'H', '+', '\u05d4', // HEBREW LETTER HE - 'W', '+', '\u05d5', // HEBREW LETTER VAV - 'Z', '+', '\u05d6', // HEBREW LETTER ZAYIN - 'X', '+', '\u05d7', // HEBREW LETTER HET - 'T', 'j', '\u05d8', // HEBREW LETTER TET - 'J', '+', '\u05d9', // HEBREW LETTER YOD - 'K', '%', '\u05da', // HEBREW LETTER FINAL KAF - 'K', '+', '\u05db', // HEBREW LETTER KAF - 'L', '+', '\u05dc', // HEBREW LETTER LAMED - 'M', '%', '\u05dd', // HEBREW LETTER FINAL MEM - 'M', '+', '\u05de', // HEBREW LETTER MEM - 'N', '%', '\u05df', // HEBREW LETTER FINAL NUN - 'N', '+', '\u05e0', // HEBREW LETTER NUN - 'S', '+', '\u05e1', // HEBREW LETTER SAMEKH - 'E', '+', '\u05e2', // HEBREW LETTER AYIN - 'P', '%', '\u05e3', // HEBREW LETTER FINAL PE - 'P', '+', '\u05e4', // HEBREW LETTER PE - 'Z', 'j', '\u05e5', // HEBREW LETTER FINAL TSADI - 'Z', 'J', '\u05e6', // HEBREW LETTER TSADI - 'Q', '+', '\u05e7', // HEBREW LETTER QOF - 'R', '+', '\u05e8', // HEBREW LETTER RESH - 'S', 'h', '\u05e9', // HEBREW LETTER SHIN - 'T', '+', '\u05ea', // HEBREW LETTER TAV - ',', '+', '\u060c', // ARABIC COMMA - ';', '+', '\u061b', // ARABIC SEMICOLON - '?', '+', '\u061f', // ARABIC QUESTION MARK - 'H', '\'', '\u0621', // ARABIC LETTER HAMZA - 'a', 'M', '\u0622', // ARABIC LETTER ALEF WITH MADDA ABOVE - 'a', 'H', '\u0623', // ARABIC LETTER ALEF WITH HAMZA ABOVE - 'w', 'H', '\u0624', // ARABIC LETTER WAW WITH HAMZA ABOVE - 'a', 'h', '\u0625', // ARABIC LETTER ALEF WITH HAMZA BELOW - 'y', 'H', '\u0626', // ARABIC LETTER YEH WITH HAMZA ABOVE - 'a', '+', '\u0627', // ARABIC LETTER ALEF - 'b', '+', '\u0628', // ARABIC LETTER BEH - 't', 'm', '\u0629', // ARABIC LETTER TEH MARBUTA - 't', '+', '\u062a', // ARABIC LETTER TEH - 't', 'k', '\u062b', // ARABIC LETTER THEH - 'g', '+', '\u062c', // ARABIC LETTER JEEM - 'h', 'k', '\u062d', // ARABIC LETTER HAH - 'x', '+', '\u062e', // ARABIC LETTER KHAH - 'd', '+', '\u062f', // ARABIC LETTER DAL - 'd', 'k', '\u0630', // ARABIC LETTER THAL - 'r', '+', '\u0631', // ARABIC LETTER REH - 'z', '+', '\u0632', // ARABIC LETTER ZAIN - 's', '+', '\u0633', // ARABIC LETTER SEEN - 's', 'n', '\u0634', // ARABIC LETTER SHEEN - 'c', '+', '\u0635', // ARABIC LETTER SAD - 'd', 'd', '\u0636', // ARABIC LETTER DAD - 't', 'j', '\u0637', // ARABIC LETTER TAH - 'z', 'H', '\u0638', // ARABIC LETTER ZAH - 'e', '+', '\u0639', // ARABIC LETTER AIN - 'i', '+', '\u063a', // ARABIC LETTER GHAIN - '+', '+', '\u0640', // ARABIC TATWEEL - 'f', '+', '\u0641', // ARABIC LETTER FEH - 'q', '+', '\u0642', // ARABIC LETTER QAF - 'k', '+', '\u0643', // ARABIC LETTER KAF - 'l', '+', '\u0644', // ARABIC LETTER LAM - 'm', '+', '\u0645', // ARABIC LETTER MEEM - 'n', '+', '\u0646', // ARABIC LETTER NOON - 'h', '+', '\u0647', // ARABIC LETTER HEH - 'w', '+', '\u0648', // ARABIC LETTER WAW - 'j', '+', '\u0649', // ARABIC LETTER ALEF MAKSURA - 'y', '+', '\u064a', // ARABIC LETTER YEH - ':', '+', '\u064b', // ARABIC FATHATAN - '"', '+', '\u064c', // ARABIC DAMMATAN - '=', '+', '\u064d', // ARABIC KASRATAN - '/', '+', '\u064e', // ARABIC FATHA - '\'', '+', '\u064f', // ARABIC DAMMA - '1', '+', '\u0650', // ARABIC KASRA - '3', '+', '\u0651', // ARABIC SHADDA - '0', '+', '\u0652', // ARABIC SUKUN - 'a', 'S', '\u0670', // SUPERSCRIPT ARABIC LETTER ALEF - 'p', '+', '\u067e', // ARABIC LETTER PEH - 'v', '+', '\u06a4', // ARABIC LETTER VEH - 'g', 'f', '\u06af', // ARABIC LETTER GAF - '0', 'a', '\u06f0', // EASTERN ARABIC-INDIC DIGIT ZERO - '1', 'a', '\u06f1', // EASTERN ARABIC-INDIC DIGIT ONE - '2', 'a', '\u06f2', // EASTERN ARABIC-INDIC DIGIT TWO - '3', 'a', '\u06f3', // EASTERN ARABIC-INDIC DIGIT THREE - '4', 'a', '\u06f4', // EASTERN ARABIC-INDIC DIGIT FOUR - '5', 'a', '\u06f5', // EASTERN ARABIC-INDIC DIGIT FIVE - '6', 'a', '\u06f6', // EASTERN ARABIC-INDIC DIGIT SIX - '7', 'a', '\u06f7', // EASTERN ARABIC-INDIC DIGIT SEVEN - '8', 'a', '\u06f8', // EASTERN ARABIC-INDIC DIGIT EIGHT - '9', 'a', '\u06f9', // EASTERN ARABIC-INDIC DIGIT NINE - 'B', '.', '\u1e02', // LATIN CAPITAL LETTER B WITH DOT ABOVE - 'b', '.', '\u1e03', // LATIN SMALL LETTER B WITH DOT ABOVE - 'B', '_', '\u1e06', // LATIN CAPITAL LETTER B WITH LINE BELOW - 'b', '_', '\u1e07', // LATIN SMALL LETTER B WITH LINE BELOW - 'D', '.', '\u1e0a', // LATIN CAPITAL LETTER D WITH DOT ABOVE - 'd', '.', '\u1e0b', // LATIN SMALL LETTER D WITH DOT ABOVE - 'D', '_', '\u1e0e', // LATIN CAPITAL LETTER D WITH LINE BELOW - 'd', '_', '\u1e0f', // LATIN SMALL LETTER D WITH LINE BELOW - 'D', ',', '\u1e10', // LATIN CAPITAL LETTER D WITH CEDILLA - 'd', ',', '\u1e11', // LATIN SMALL LETTER D WITH CEDILLA - 'F', '.', '\u1e1e', // LATIN CAPITAL LETTER F WITH DOT ABOVE - 'f', '.', '\u1e1f', // LATIN SMALL LETTER F WITH DOT ABOVE - 'G', '-', '\u1e20', // LATIN CAPITAL LETTER G WITH MACRON - 'g', '-', '\u1e21', // LATIN SMALL LETTER G WITH MACRON - 'H', '.', '\u1e22', // LATIN CAPITAL LETTER H WITH DOT ABOVE - 'h', '.', '\u1e23', // LATIN SMALL LETTER H WITH DOT ABOVE - 'H', ':', '\u1e26', // LATIN CAPITAL LETTER H WITH DIAERESIS - 'h', ':', '\u1e27', // LATIN SMALL LETTER H WITH DIAERESIS - 'H', ',', '\u1e28', // LATIN CAPITAL LETTER H WITH CEDILLA - 'h', ',', '\u1e29', // LATIN SMALL LETTER H WITH CEDILLA - 'K', '\'', '\u1e30', // LATIN CAPITAL LETTER K WITH ACUTE - 'k', '\'', '\u1e31', // LATIN SMALL LETTER K WITH ACUTE - 'K', '_', '\u1e34', // LATIN CAPITAL LETTER K WITH LINE BELOW - 'k', '_', '\u1e35', // LATIN SMALL LETTER K WITH LINE BELOW - 'L', '_', '\u1e3a', // LATIN CAPITAL LETTER L WITH LINE BELOW - 'l', '_', '\u1e3b', // LATIN SMALL LETTER L WITH LINE BELOW - 'M', '\'', '\u1e3e', // LATIN CAPITAL LETTER M WITH ACUTE - 'm', '\'', '\u1e3f', // LATIN SMALL LETTER M WITH ACUTE - 'M', '.', '\u1e40', // LATIN CAPITAL LETTER M WITH DOT ABOVE - 'm', '.', '\u1e41', // LATIN SMALL LETTER M WITH DOT ABOVE - 'N', '.', '\u1e44', // LATIN CAPITAL LETTER N WITH DOT ABOVE - 'n', '.', '\u1e45', // LATIN SMALL LETTER N WITH DOT ABOVE - 'N', '_', '\u1e48', // LATIN CAPITAL LETTER N WITH LINE BELOW - 'n', '_', '\u1e49', // LATIN SMALL LETTER N WITH LINE BELOW - 'P', '\'', '\u1e54', // LATIN CAPITAL LETTER P WITH ACUTE - 'p', '\'', '\u1e55', // LATIN SMALL LETTER P WITH ACUTE - 'P', '.', '\u1e56', // LATIN CAPITAL LETTER P WITH DOT ABOVE - 'p', '.', '\u1e57', // LATIN SMALL LETTER P WITH DOT ABOVE - 'R', '.', '\u1e58', // LATIN CAPITAL LETTER R WITH DOT ABOVE - 'r', '.', '\u1e59', // LATIN SMALL LETTER R WITH DOT ABOVE - 'R', '_', '\u1e5e', // LATIN CAPITAL LETTER R WITH LINE BELOW - 'r', '_', '\u1e5f', // LATIN SMALL LETTER R WITH LINE BELOW - 'S', '.', '\u1e60', // LATIN CAPITAL LETTER S WITH DOT ABOVE - 's', '.', '\u1e61', // LATIN SMALL LETTER S WITH DOT ABOVE - 'T', '.', '\u1e6a', // LATIN CAPITAL LETTER T WITH DOT ABOVE - 't', '.', '\u1e6b', // LATIN SMALL LETTER T WITH DOT ABOVE - 'T', '_', '\u1e6e', // LATIN CAPITAL LETTER T WITH LINE BELOW - 't', '_', '\u1e6f', // LATIN SMALL LETTER T WITH LINE BELOW - 'V', '?', '\u1e7c', // LATIN CAPITAL LETTER V WITH TILDE - 'v', '?', '\u1e7d', // LATIN SMALL LETTER V WITH TILDE - 'W', '!', '\u1e80', // LATIN CAPITAL LETTER W WITH GRAVE - 'w', '!', '\u1e81', // LATIN SMALL LETTER W WITH GRAVE - 'W', '\'', '\u1e82', // LATIN CAPITAL LETTER W WITH ACUTE - 'w', '\'', '\u1e83', // LATIN SMALL LETTER W WITH ACUTE - 'W', ':', '\u1e84', // LATIN CAPITAL LETTER W WITH DIAERESIS - 'w', ':', '\u1e85', // LATIN SMALL LETTER W WITH DIAERESIS - 'W', '.', '\u1e86', // LATIN CAPITAL LETTER W WITH DOT ABOVE - 'w', '.', '\u1e87', // LATIN SMALL LETTER W WITH DOT ABOVE - 'X', '.', '\u1e8a', // LATIN CAPITAL LETTER X WITH DOT ABOVE - 'x', '.', '\u1e8b', // LATIN SMALL LETTER X WITH DOT ABOVE - 'X', ':', '\u1e8c', // LATIN CAPITAL LETTER X WITH DIAERESIS - 'x', ':', '\u1e8d', // LATIN SMALL LETTER X WITH DIAERESIS - 'Y', '.', '\u1e8e', // LATIN CAPITAL LETTER Y WITH DOT ABOVE - 'y', '.', '\u1e8f', // LATIN SMALL LETTER Y WITH DOT ABOVE - 'Z', '>', '\u1e90', // LATIN CAPITAL LETTER Z WITH CIRCUMFLEX - 'z', '>', '\u1e91', // LATIN SMALL LETTER Z WITH CIRCUMFLEX - 'Z', '_', '\u1e94', // LATIN CAPITAL LETTER Z WITH LINE BELOW - 'z', '_', '\u1e95', // LATIN SMALL LETTER Z WITH LINE BELOW - 'h', '_', '\u1e96', // LATIN SMALL LETTER H WITH LINE BELOW - 't', ':', '\u1e97', // LATIN SMALL LETTER T WITH DIAERESIS - 'w', '0', '\u1e98', // LATIN SMALL LETTER W WITH RING ABOVE - 'y', '0', '\u1e99', // LATIN SMALL LETTER Y WITH RING ABOVE - 'A', '2', '\u1ea2', // LATIN CAPITAL LETTER A WITH HOOK ABOVE - 'a', '2', '\u1ea3', // LATIN SMALL LETTER A WITH HOOK ABOVE - 'E', '2', '\u1eba', // LATIN CAPITAL LETTER E WITH HOOK ABOVE - 'e', '2', '\u1ebb', // LATIN SMALL LETTER E WITH HOOK ABOVE - 'E', '?', '\u1ebc', // LATIN CAPITAL LETTER E WITH TILDE - 'e', '?', '\u1ebd', // LATIN SMALL LETTER E WITH TILDE - 'I', '2', '\u1ec8', // LATIN CAPITAL LETTER I WITH HOOK ABOVE - 'i', '2', '\u1ec9', // LATIN SMALL LETTER I WITH HOOK ABOVE - 'O', '2', '\u1ece', // LATIN CAPITAL LETTER O WITH HOOK ABOVE - 'o', '2', '\u1ecf', // LATIN SMALL LETTER O WITH HOOK ABOVE - 'U', '2', '\u1ee6', // LATIN CAPITAL LETTER U WITH HOOK ABOVE - 'u', '2', '\u1ee7', // LATIN SMALL LETTER U WITH HOOK ABOVE - 'Y', '!', '\u1ef2', // LATIN CAPITAL LETTER Y WITH GRAVE - 'y', '!', '\u1ef3', // LATIN SMALL LETTER Y WITH GRAVE - 'Y', '2', '\u1ef6', // LATIN CAPITAL LETTER Y WITH HOOK ABOVE - 'y', '2', '\u1ef7', // LATIN SMALL LETTER Y WITH HOOK ABOVE - 'Y', '?', '\u1ef8', // LATIN CAPITAL LETTER Y WITH TILDE - 'y', '?', '\u1ef9', // LATIN SMALL LETTER Y WITH TILDE - ';', '\'', '\u1f00', // GREEK DASIA AND ACUTE ACCENT - ',', '\'', '\u1f01', // GREEK PSILI AND ACUTE ACCENT - ';', '!', '\u1f02', // GREEK DASIA AND VARIA - ',', '!', '\u1f03', // GREEK PSILI AND VARIA - '?', ';', '\u1f04', // GREEK DASIA AND PERISPOMENI - '?', ',', '\u1f05', // GREEK PSILI AND PERISPOMENI - '!', ':', '\u1f06', // GREEK DIAERESIS AND VARIA - '?', ':', '\u1f07', // GREEK DIAERESIS AND PERISPOMENI - '1', 'N', '\u2002', // EN SPACE - '1', 'M', '\u2003', // EM SPACE - '3', 'M', '\u2004', // THREE-PER-EM SPACE - '4', 'M', '\u2005', // FOUR-PER-EM SPACE - '6', 'M', '\u2006', // SIX-PER-EM SPACE - '1', 'T', '\u2009', // THIN SPACE - '1', 'H', '\u200a', // HAIR SPACE - '-', '1', '\u2010', // HYPHEN - '-', 'N', '\u2013', // EN DASH - '-', 'M', '\u2014', // EM DASH - '-', '3', '\u2015', // HORIZONTAL BAR - '!', '2', '\u2016', // DOUBLE VERTICAL LINE - '=', '2', '\u2017', // DOUBLE LOW LINE - '\'', '6', '\u2018', // LEFT SINGLE QUOTATION MARK - '\'', '9', '\u2019', // RIGHT SINGLE QUOTATION MARK - '.', '9', '\u201a', // SINGLE LOW-9 QUOTATION MARK - '9', '\'', '\u201b', // SINGLE HIGH-REVERSED-9 QUOTATION MARK - '"', '6', '\u201c', // LEFT DOUBLE QUOTATION MARK - '"', '9', '\u201d', // RIGHT DOUBLE QUOTATION MARK - ':', '9', '\u201e', // DOUBLE LOW-9 QUOTATION MARK - '9', '"', '\u201f', // DOUBLE HIGH-REVERSED-9 QUOTATION MARK - '/', '-', '\u2020', // DAGGER - '/', '=', '\u2021', // DOUBLE DAGGER - '.', '.', '\u2025', // TWO DOT LEADER - ',', '.', '\u2026', // ELLIPSIS - '%', '0', '\u2030', // PER MILLE SIGN - '1', '\'', '\u2032', // PRIME - '2', '\'', '\u2033', // DOUBLE PRIME - '3', '\'', '\u2034', // TRIPLE PRIME - '1', '"', '\u2035', // REVERSED PRIME - '2', '"', '\u2036', // REVERSED DOUBLE PRIME - '3', '"', '\u2037', // REVERSED TRIPLE PRIME - 'C', 'a', '\u2038', // CARET - '<', '1', '\u2039', // SINGLE LEFT-POINTING ANGLE QUOTATION MARK - '>', '1', '\u203a', // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - ':', 'X', '\u203b', // REFERENCE MARK - '\'', '-', '\u203e', // OVERLINE - '/', 'f', '\u2044', // FRACTION SLASH - '0', 'S', '\u2070', // SUPERSCRIPT DIGIT ZERO - '4', 'S', '\u2074', // SUPERSCRIPT DIGIT FOUR - '5', 'S', '\u2075', // SUPERSCRIPT DIGIT FIVE - '6', 'S', '\u2076', // SUPERSCRIPT DIGIT SIX - '7', 'S', '\u2077', // SUPERSCRIPT DIGIT SEVEN - '8', 'S', '\u2078', // SUPERSCRIPT DIGIT EIGHT - '9', 'S', '\u2079', // SUPERSCRIPT DIGIT NINE - '+', 'S', '\u207a', // SUPERSCRIPT PLUS SIGN - '-', 'S', '\u207b', // SUPERSCRIPT MINUS - '=', 'S', '\u207c', // SUPERSCRIPT EQUALS SIGN - '(', 'S', '\u207d', // SUPERSCRIPT LEFT PARENTHESIS - ')', 'S', '\u207e', // SUPERSCRIPT RIGHT PARENTHESIS - 'n', 'S', '\u207f', // SUPERSCRIPT LATIN SMALL LETTER N - '0', 's', '\u2080', // SUBSCRIPT DIGIT ZERO - '1', 's', '\u2081', // SUBSCRIPT DIGIT ONE - '2', 's', '\u2082', // SUBSCRIPT DIGIT TWO - '3', 's', '\u2083', // SUBSCRIPT DIGIT THREE - '4', 's', '\u2084', // SUBSCRIPT DIGIT FOUR - '5', 's', '\u2085', // SUBSCRIPT DIGIT FIVE - '6', 's', '\u2086', // SUBSCRIPT DIGIT SIX - '7', 's', '\u2087', // SUBSCRIPT DIGIT SEVEN - '8', 's', '\u2088', // SUBSCRIPT DIGIT EIGHT - '9', 's', '\u2089', // SUBSCRIPT DIGIT NINE - '+', 's', '\u208a', // SUBSCRIPT PLUS SIGN - '-', 's', '\u208b', // SUBSCRIPT MINUS - '=', 's', '\u208c', // SUBSCRIPT EQUALS SIGN - '(', 's', '\u208d', // SUBSCRIPT LEFT PARENTHESIS - ')', 's', '\u208e', // SUBSCRIPT RIGHT PARENTHESIS - 'L', 'i', '\u20a4', // LIRA SIGN - 'P', 't', '\u20a7', // PESETA SIGN - 'W', '=', '\u20a9', // WON SIGN - 'o', 'C', '\u2103', // DEGREE CENTIGRADE - 'c', 'o', '\u2105', // CARE OF - 'o', 'F', '\u2109', // DEGREE FAHRENHEIT - 'N', '0', '\u2116', // NUMERO SIGN - 'P', 'O', '\u2117', // SOUND RECORDING COPYRIGHT - 'R', 'x', '\u211e', // PRESCRIPTION TAKE - 'S', 'M', '\u2120', // SERVICE MARK - 'T', 'M', '\u2122', // TRADE MARK SIGN - 'O', 'm', '\u2126', // OHM SIGN - 'A', 'O', '\u212b', // ANGSTROEM SIGN - '1', '3', '\u2153', // VULGAR FRACTION ONE THIRD - '2', '3', '\u2154', // VULGAR FRACTION TWO THIRDS - '1', '5', '\u2155', // VULGAR FRACTION ONE FIFTH - '2', '5', '\u2156', // VULGAR FRACTION TWO FIFTHS - '3', '5', '\u2157', // VULGAR FRACTION THREE FIFTHS - '4', '5', '\u2158', // VULGAR FRACTION FOUR FIFTHS - '1', '6', '\u2159', // VULGAR FRACTION ONE SIXTH - '5', '6', '\u215a', // VULGAR FRACTION FIVE SIXTHS - '1', '8', '\u215b', // VULGAR FRACTION ONE EIGHTH - '3', '8', '\u215c', // VULGAR FRACTION THREE EIGHTHS - '5', '8', '\u215d', // VULGAR FRACTION FIVE EIGHTHS - '7', '8', '\u215e', // VULGAR FRACTION SEVEN EIGHTHS - '1', 'R', '\u2160', // ROMAN NUMERAL ONE - '2', 'R', '\u2161', // ROMAN NUMERAL TWO - '3', 'R', '\u2162', // ROMAN NUMERAL THREE - '4', 'R', '\u2163', // ROMAN NUMERAL FOUR - '5', 'R', '\u2164', // ROMAN NUMERAL FIVE - '6', 'R', '\u2165', // ROMAN NUMERAL SIX - '7', 'R', '\u2166', // ROMAN NUMERAL SEVEN - '8', 'R', '\u2167', // ROMAN NUMERAL EIGHT - '9', 'R', '\u2168', // ROMAN NUMERAL NINE - 'a', 'R', '\u2169', // ROMAN NUMERAL TEN - 'b', 'R', '\u216a', // ROMAN NUMERAL ELEVEN - 'c', 'R', '\u216b', // ROMAN NUMERAL TWELVE - '1', 'r', '\u2170', // SMALL ROMAN NUMERAL ONE - '2', 'r', '\u2171', // SMALL ROMAN NUMERAL TWO - '3', 'r', '\u2172', // SMALL ROMAN NUMERAL THREE - '4', 'r', '\u2173', // SMALL ROMAN NUMERAL FOUR - '5', 'r', '\u2174', // SMALL ROMAN NUMERAL FIVE - '6', 'r', '\u2175', // SMALL ROMAN NUMERAL SIX - '7', 'r', '\u2176', // SMALL ROMAN NUMERAL SEVEN - '8', 'r', '\u2177', // SMALL ROMAN NUMERAL EIGHT - '9', 'r', '\u2178', // SMALL ROMAN NUMERAL NINE - 'a', 'r', '\u2179', // SMALL ROMAN NUMERAL TEN - 'b', 'r', '\u217a', // SMALL ROMAN NUMERAL ELEVEN - 'c', 'r', '\u217b', // SMALL ROMAN NUMERAL TWELVE - '<', '-', '\u2190', // LEFTWARDS ARROW - '-', '!', '\u2191', // UPWARDS ARROW - '-', '>', '\u2192', // RIGHTWARDS ARROW - '-', 'v', '\u2193', // DOWNWARDS ARROW - '<', '>', '\u2194', // LEFT RIGHT ARROW - 'U', 'D', '\u2195', // UP DOWN ARROW - '<', '=', '\u21d0', // LEFTWARDS DOUBLE ARROW - '=', '>', '\u21d2', // RIGHTWARDS DOUBLE ARROW - '=', '=', '\u21d4', // LEFT RIGHT DOUBLE ARROW - 'F', 'A', '\u2200', // FOR ALL - 'd', 'P', '\u2202', // PARTIAL DIFFERENTIAL - 'T', 'E', '\u2203', // THERE EXISTS - '/', '0', '\u2205', // EMPTY SET - 'D', 'E', '\u2206', // INCREMENT - 'N', 'B', '\u2207', // NABLA - '(', '-', '\u2208', // ELEMENT OF - '-', ')', '\u220b', // CONTAINS AS MEMBER - '*', 'P', '\u220f', // N-ARY PRODUCT - '+', 'Z', '\u2211', // N-ARY SUMMATION - '-', '2', '\u2212', // MINUS SIGN - '-', '+', '\u2213', // MINUS-OR-PLUS SIGN - '*', '-', '\u2217', // ASTERISK OPERATOR - 'O', 'b', '\u2218', // RING OPERATOR - 'S', 'b', '\u2219', // BULLET OPERATOR - 'R', 'T', '\u221a', // SQUARE ROOT - '0', '(', '\u221d', // PROPORTIONAL TO - '0', '0', '\u221e', // INFINITY - '-', 'L', '\u221f', // RIGHT ANGLE - '-', 'V', '\u2220', // ANGLE - 'P', 'P', '\u2225', // PARALLEL TO - 'A', 'N', '\u2227', // LOGICAL AND - 'O', 'R', '\u2228', // LOGICAL OR - '(', 'U', '\u2229', // INTERSECTION - ')', 'U', '\u222a', // UNION - 'I', 'n', '\u222b', // INTEGRAL - 'D', 'I', '\u222c', // DOUBLE INTEGRAL - 'I', 'o', '\u222e', // CONTOUR INTEGRAL - '.', ':', '\u2234', // THEREFORE - ':', '.', '\u2235', // BECAUSE - ':', 'R', '\u2236', // RATIO - ':', ':', '\u2237', // PROPORTION - '?', '1', '\u223c', // TILDE OPERATOR - 'C', 'G', '\u223e', // INVERTED LAZY S - '?', '-', '\u2243', // ASYMPTOTICALLY EQUAL TO - '?', '=', '\u2245', // APPROXIMATELY EQUAL TO - '?', '2', '\u2248', // ALMOST EQUAL TO - '=', '?', '\u224c', // ALL EQUAL TO - 'H', 'I', '\u2253', // IMAGE OF OR APPROXIMATELY EQUAL TO - '!', '=', '\u2260', // NOT EQUAL TO - '=', '3', '\u2261', // IDENTICAL TO - '=', '<', '\u2264', // LESS-THAN OR EQUAL TO - '>', '=', '\u2265', // GREATER-THAN OR EQUAL TO - '<', '*', '\u226a', // MUCH LESS-THAN - '*', '>', '\u226b', // MUCH GREATER-THAN - '!', '<', '\u226e', // NOT LESS-THAN - '!', '>', '\u226f', // NOT GREATER-THAN - '(', 'C', '\u2282', // SUBSET OF - ')', 'C', '\u2283', // SUPERSET OF - '(', '_', '\u2286', // SUBSET OF OR EQUAL TO - ')', '_', '\u2287', // SUPERSET OF OR EQUAL TO - '0', '.', '\u2299', // CIRCLED DOT OPERATOR - '0', '2', '\u229a', // CIRCLED RING OPERATOR - '-', 'T', '\u22a5', // UP TACK - '.', 'P', '\u22c5', // DOT OPERATOR - ':', '3', '\u22ee', // VERTICAL ELLIPSIS - '.', '3', '\u22ef', // MIDLINE HORIZONTAL ELLIPSIS - 'E', 'h', '\u2302', // HOUSE - '<', '7', '\u2308', // LEFT CEILING - '>', '7', '\u2309', // RIGHT CEILING - '7', '<', '\u230a', // LEFT FLOOR - '7', '>', '\u230b', // RIGHT FLOOR - 'N', 'I', '\u2310', // REVERSED NOT SIGN - '(', 'A', '\u2312', // ARC - 'T', 'R', '\u2315', // TELEPHONE RECORDER - 'I', 'u', '\u2320', // TOP HALF INTEGRAL - 'I', 'l', '\u2321', // BOTTOM HALF INTEGRAL - '<', '/', '\u2329', // LEFT-POINTING ANGLE BRACKET - '/', '>', '\u232a', // RIGHT-POINTING ANGLE BRACKET - 'V', 's', '\u2423', // OPEN BOX - '1', 'h', '\u2440', // OCR HOOK - '3', 'h', '\u2441', // OCR CHAIR - '2', 'h', '\u2442', // OCR FORK - '4', 'h', '\u2443', // OCR INVERTED FORK - '1', 'j', '\u2446', // OCR BRANCH BANK IDENTIFICATION - '2', 'j', '\u2447', // OCR AMOUNT OF CHECK - '3', 'j', '\u2448', // OCR DASH - '4', 'j', '\u2449', // OCR CUSTOMER ACCOUNT NUMBER - '1', '.', '\u2488', // DIGIT ONE FULL STOP - '2', '.', '\u2489', // DIGIT TWO FULL STOP - '3', '.', '\u248a', // DIGIT THREE FULL STOP - '4', '.', '\u248b', // DIGIT FOUR FULL STOP - '5', '.', '\u248c', // DIGIT FIVE FULL STOP - '6', '.', '\u248d', // DIGIT SIX FULL STOP - '7', '.', '\u248e', // DIGIT SEVEN FULL STOP - '8', '.', '\u248f', // DIGIT EIGHT FULL STOP - '9', '.', '\u2490', // DIGIT NINE FULL STOP - 'h', 'h', '\u2500', // BOX DRAWINGS LIGHT HORIZONTAL - 'H', 'H', '\u2501', // BOX DRAWINGS HEAVY HORIZONTAL - 'v', 'v', '\u2502', // BOX DRAWINGS LIGHT VERTICAL - 'V', 'V', '\u2503', // BOX DRAWINGS HEAVY VERTICAL - '3', '-', '\u2504', // BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL - '3', '_', '\u2505', // BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL - '3', '!', '\u2506', // BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL - '3', '/', '\u2507', // BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL - '4', '-', '\u2508', // BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL - '4', '_', '\u2509', // BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL - '4', '!', '\u250a', // BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL - '4', '/', '\u250b', // BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL - 'd', 'r', '\u250c', // BOX DRAWINGS LIGHT DOWN AND RIGHT - 'd', 'R', '\u250d', // BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY - 'D', 'r', '\u250e', // BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT - 'D', 'R', '\u250f', // BOX DRAWINGS HEAVY DOWN AND RIGHT - 'd', 'l', '\u2510', // BOX DRAWINGS LIGHT DOWN AND LEFT - 'd', 'L', '\u2511', // BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY - 'D', 'l', '\u2512', // BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT - 'L', 'D', '\u2513', // BOX DRAWINGS HEAVY DOWN AND LEFT - 'u', 'r', '\u2514', // BOX DRAWINGS LIGHT UP AND RIGHT - 'u', 'R', '\u2515', // BOX DRAWINGS UP LIGHT AND RIGHT HEAVY - 'U', 'r', '\u2516', // BOX DRAWINGS UP HEAVY AND RIGHT LIGHT - 'U', 'R', '\u2517', // BOX DRAWINGS HEAVY UP AND RIGHT - 'u', 'l', '\u2518', // BOX DRAWINGS LIGHT UP AND LEFT - 'u', 'L', '\u2519', // BOX DRAWINGS UP LIGHT AND LEFT HEAVY - 'U', 'l', '\u251a', // BOX DRAWINGS UP HEAVY AND LEFT LIGHT - 'U', 'L', '\u251b', // BOX DRAWINGS HEAVY UP AND LEFT - 'v', 'r', '\u251c', // BOX DRAWINGS LIGHT VERTICAL AND RIGHT - 'v', 'R', '\u251d', // BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY - 'V', 'r', '\u2520', // BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT - 'V', 'R', '\u2523', // BOX DRAWINGS HEAVY VERTICAL AND RIGHT - 'v', 'l', '\u2524', // BOX DRAWINGS LIGHT VERTICAL AND LEFT - 'v', 'L', '\u2525', // BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY - 'V', 'l', '\u2528', // BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT - 'V', 'L', '\u252b', // BOX DRAWINGS HEAVY VERTICAL AND LEFT - 'd', 'h', '\u252c', // BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - 'd', 'H', '\u252f', // BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY - 'D', 'h', '\u2530', // BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT - 'D', 'H', '\u2533', // BOX DRAWINGS HEAVY DOWN AND HORIZONTAL - 'u', 'h', '\u2534', // BOX DRAWINGS LIGHT UP AND HORIZONTAL - 'u', 'H', '\u2537', // BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY - 'U', 'h', '\u2538', // BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT - 'U', 'H', '\u253b', // BOX DRAWINGS HEAVY UP AND HORIZONTAL - 'v', 'h', '\u253c', // BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - 'v', 'H', '\u253f', // BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY - 'V', 'h', '\u2542', // BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT - 'V', 'H', '\u254b', // BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL - 'F', 'D', '\u2571', // BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT - 'B', 'D', '\u2572', // BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT - 'T', 'B', '\u2580', // UPPER HALF BLOCK - 'L', 'B', '\u2584', // LOWER HALF BLOCK - 'F', 'B', '\u2588', // FULL BLOCK - 'l', 'B', '\u258c', // LEFT HALF BLOCK - 'R', 'B', '\u2590', // RIGHT HALF BLOCK - '.', 'S', '\u2591', // LIGHT SHADE - ':', 'S', '\u2592', // MEDIUM SHADE - '?', 'S', '\u2593', // DARK SHADE - 'f', 'S', '\u25a0', // BLACK SQUARE - 'O', 'S', '\u25a1', // WHITE SQUARE - 'R', 'O', '\u25a2', // WHITE SQUARE WITH ROUNDED CORNERS - 'R', 'r', '\u25a3', // WHITE SQUARE CONTAINING BLACK SMALL SQUARE - 'R', 'F', '\u25a4', // SQUARE WITH HORIZONTAL FILL - 'R', 'Y', '\u25a5', // SQUARE WITH VERTICAL FILL - 'R', 'H', '\u25a6', // SQUARE WITH ORTHOGONAL CROSSHATCH FILL - 'R', 'Z', '\u25a7', // SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL - 'R', 'K', '\u25a8', // SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL - 'R', 'X', '\u25a9', // SQUARE WITH DIAGONAL CROSSHATCH FILL - 's', 'B', '\u25aa', // BLACK SMALL SQUARE - 'S', 'R', '\u25ac', // BLACK RECTANGLE - 'O', 'r', '\u25ad', // WHITE RECTANGLE - 'U', 'T', '\u25b2', // BLACK UP-POINTING TRIANGLE - 'u', 'T', '\u25b3', // WHITE UP-POINTING TRIANGLE - 'P', 'R', '\u25b6', // BLACK RIGHT-POINTING TRIANGLE - 'T', 'r', '\u25b7', // WHITE RIGHT-POINTING TRIANGLE - 'D', 't', '\u25bc', // BLACK DOWN-POINTING TRIANGLE - 'd', 'T', '\u25bd', // WHITE DOWN-POINTING TRIANGLE - 'P', 'L', '\u25c0', // BLACK LEFT-POINTING TRIANGLE - 'T', 'l', '\u25c1', // WHITE LEFT-POINTING TRIANGLE - 'D', 'b', '\u25c6', // BLACK DIAMOND - 'D', 'w', '\u25c7', // WHITE DIAMOND - 'L', 'Z', '\u25ca', // LOZENGE - '0', 'm', '\u25cb', // WHITE CIRCLE - '0', 'o', '\u25ce', // BULLSEYE - '0', 'M', '\u25cf', // BLACK CIRCLE - '0', 'L', '\u25d0', // CIRCLE WITH LEFT HALF BLACK - '0', 'R', '\u25d1', // CIRCLE WITH RIGHT HALF BLACK - 'S', 'n', '\u25d8', // INVERSE BULLET - 'I', 'c', '\u25d9', // INVERSE WHITE CIRCLE - 'F', 'd', '\u25e2', // BLACK LOWER RIGHT TRIANGLE - 'B', 'd', '\u25e3', // BLACK LOWER LEFT TRIANGLE - '*', '2', '\u2605', // BLACK STAR - '*', '1', '\u2606', // WHITE STAR - '<', 'H', '\u261c', // WHITE LEFT POINTING INDEX - '>', 'H', '\u261e', // WHITE RIGHT POINTING INDEX - '0', 'u', '\u263a', // WHITE SMILING FACE - '0', 'U', '\u263b', // BLACK SMILING FACE - 'S', 'U', '\u263c', // WHITE SUN WITH RAYS - 'F', 'm', '\u2640', // FEMALE SIGN - 'M', 'l', '\u2642', // MALE SIGN - 'c', 'S', '\u2660', // BLACK SPADE SUIT - 'c', 'H', '\u2661', // WHITE HEART SUIT - 'c', 'D', '\u2662', // WHITE DIAMOND SUIT - 'c', 'C', '\u2663', // BLACK CLUB SUIT - 'M', 'd', '\u2669', // QUARTER NOTE - 'M', '8', '\u266a', // EIGHTH NOTE - 'M', '2', '\u266b', // BARRED EIGHTH NOTES - 'M', 'b', '\u266d', // MUSIC FLAT SIGN - 'M', 'x', '\u266e', // MUSIC NATURAL SIGN - 'M', 'X', '\u266f', // MUSIC SHARP SIGN - 'O', 'K', '\u2713', // CHECK MARK - 'X', 'X', '\u2717', // BALLOT X - '-', 'X', '\u2720', // MALTESE CROSS - 'I', 'S', '\u3000', // IDEOGRAPHIC SPACE - ',', '_', '\u3001', // IDEOGRAPHIC COMMA - '.', '_', '\u3002', // IDEOGRAPHIC PERIOD - '+', '"', '\u3003', // DITTO MARK - '+', '_', '\u3004', // IDEOGRAPHIC DITTO MARK - '*', '_', '\u3005', // IDEOGRAPHIC ITERATION MARK - ';', '_', '\u3006', // IDEOGRAPHIC CLOSING MARK - '0', '_', '\u3007', // IDEOGRAPHIC NUMBER ZERO - '<', '+', '\u300a', // LEFT DOUBLE ANGLE BRACKET - '>', '+', '\u300b', // RIGHT DOUBLE ANGLE BRACKET - '<', '\'', '\u300c', // LEFT CORNER BRACKET - '>', '\'', '\u300d', // RIGHT CORNER BRACKET - '<', '"', '\u300e', // LEFT WHITE CORNER BRACKET - '>', '"', '\u300f', // RIGHT WHITE CORNER BRACKET - '(', '"', '\u3010', // LEFT BLACK LENTICULAR BRACKET - ')', '"', '\u3011', // RIGHT BLACK LENTICULAR BRACKET - '=', 'T', '\u3012', // POSTAL MARK - '=', '_', '\u3013', // GETA MARK - '(', '\'', '\u3014', // LEFT TORTOISE SHELL BRACKET - ')', '\'', '\u3015', // RIGHT TORTOISE SHELL BRACKET - '(', 'I', '\u3016', // LEFT WHITE LENTICULAR BRACKET - ')', 'I', '\u3017', // RIGHT WHITE LENTICULAR BRACKET - '-', '?', '\u301c', // WAVE DASH - 'A', '5', '\u3041', // HIRAGANA LETTER SMALL A - 'a', '5', '\u3042', // HIRAGANA LETTER A - 'I', '5', '\u3043', // HIRAGANA LETTER SMALL I - 'i', '5', '\u3044', // HIRAGANA LETTER I - 'U', '5', '\u3045', // HIRAGANA LETTER SMALL U - 'u', '5', '\u3046', // HIRAGANA LETTER U - 'E', '5', '\u3047', // HIRAGANA LETTER SMALL E - 'e', '5', '\u3048', // HIRAGANA LETTER E - 'O', '5', '\u3049', // HIRAGANA LETTER SMALL O - 'o', '5', '\u304a', // HIRAGANA LETTER O - 'k', 'a', '\u304b', // HIRAGANA LETTER KA - 'g', 'a', '\u304c', // HIRAGANA LETTER GA - 'k', 'i', '\u304d', // HIRAGANA LETTER KI - 'g', 'i', '\u304e', // HIRAGANA LETTER GI - 'k', 'u', '\u304f', // HIRAGANA LETTER KU - 'g', 'u', '\u3050', // HIRAGANA LETTER GU - 'k', 'e', '\u3051', // HIRAGANA LETTER KE - 'g', 'e', '\u3052', // HIRAGANA LETTER GE - 'k', 'o', '\u3053', // HIRAGANA LETTER KO - 'g', 'o', '\u3054', // HIRAGANA LETTER GO - 's', 'a', '\u3055', // HIRAGANA LETTER SA - 'z', 'a', '\u3056', // HIRAGANA LETTER ZA - 's', 'i', '\u3057', // HIRAGANA LETTER SI - 'z', 'i', '\u3058', // HIRAGANA LETTER ZI - 's', 'u', '\u3059', // HIRAGANA LETTER SU - 'z', 'u', '\u305a', // HIRAGANA LETTER ZU - 's', 'e', '\u305b', // HIRAGANA LETTER SE - 'z', 'e', '\u305c', // HIRAGANA LETTER ZE - 's', 'o', '\u305d', // HIRAGANA LETTER SO - 'z', 'o', '\u305e', // HIRAGANA LETTER ZO - 't', 'a', '\u305f', // HIRAGANA LETTER TA - 'd', 'a', '\u3060', // HIRAGANA LETTER DA - 't', 'i', '\u3061', // HIRAGANA LETTER TI - 'd', 'i', '\u3062', // HIRAGANA LETTER DI - 't', 'U', '\u3063', // HIRAGANA LETTER SMALL TU - 't', 'u', '\u3064', // HIRAGANA LETTER TU - 'd', 'u', '\u3065', // HIRAGANA LETTER DU - 't', 'e', '\u3066', // HIRAGANA LETTER TE - 'd', 'e', '\u3067', // HIRAGANA LETTER DE - 't', 'o', '\u3068', // HIRAGANA LETTER TO - 'd', 'o', '\u3069', // HIRAGANA LETTER DO - 'n', 'a', '\u306a', // HIRAGANA LETTER NA - 'n', 'i', '\u306b', // HIRAGANA LETTER NI - 'n', 'u', '\u306c', // HIRAGANA LETTER NU - 'n', 'e', '\u306d', // HIRAGANA LETTER NE - 'n', 'o', '\u306e', // HIRAGANA LETTER NO - 'h', 'a', '\u306f', // HIRAGANA LETTER HA - 'b', 'a', '\u3070', // HIRAGANA LETTER BA - 'p', 'a', '\u3071', // HIRAGANA LETTER PA - 'h', 'i', '\u3072', // HIRAGANA LETTER HI - 'b', 'i', '\u3073', // HIRAGANA LETTER BI - 'p', 'i', '\u3074', // HIRAGANA LETTER PI - 'h', 'u', '\u3075', // HIRAGANA LETTER HU - 'b', 'u', '\u3076', // HIRAGANA LETTER BU - 'p', 'u', '\u3077', // HIRAGANA LETTER PU - 'h', 'e', '\u3078', // HIRAGANA LETTER HE - 'b', 'e', '\u3079', // HIRAGANA LETTER BE - 'p', 'e', '\u307a', // HIRAGANA LETTER PE - 'h', 'o', '\u307b', // HIRAGANA LETTER HO - 'b', 'o', '\u307c', // HIRAGANA LETTER BO - 'p', 'o', '\u307d', // HIRAGANA LETTER PO - 'm', 'a', '\u307e', // HIRAGANA LETTER MA - 'm', 'i', '\u307f', // HIRAGANA LETTER MI - 'm', 'u', '\u3080', // HIRAGANA LETTER MU - 'm', 'e', '\u3081', // HIRAGANA LETTER ME - 'm', 'o', '\u3082', // HIRAGANA LETTER MO - 'y', 'A', '\u3083', // HIRAGANA LETTER SMALL YA - 'y', 'a', '\u3084', // HIRAGANA LETTER YA - 'y', 'U', '\u3085', // HIRAGANA LETTER SMALL YU - 'y', 'u', '\u3086', // HIRAGANA LETTER YU - 'y', 'O', '\u3087', // HIRAGANA LETTER SMALL YO - 'y', 'o', '\u3088', // HIRAGANA LETTER YO - 'r', 'a', '\u3089', // HIRAGANA LETTER RA - 'r', 'i', '\u308a', // HIRAGANA LETTER RI - 'r', 'u', '\u308b', // HIRAGANA LETTER RU - 'r', 'e', '\u308c', // HIRAGANA LETTER RE - 'r', 'o', '\u308d', // HIRAGANA LETTER RO - 'w', 'A', '\u308e', // HIRAGANA LETTER SMALL WA - 'w', 'a', '\u308f', // HIRAGANA LETTER WA - 'w', 'i', '\u3090', // HIRAGANA LETTER WI - 'w', 'e', '\u3091', // HIRAGANA LETTER WE - 'w', 'o', '\u3092', // HIRAGANA LETTER WO - 'n', '5', '\u3093', // HIRAGANA LETTER N - 'v', 'u', '\u3094', // HIRAGANA LETTER VU - '"', '5', '\u309b', // KATAKANA-HIRAGANA VOICED SOUND MARK - '0', '5', '\u309c', // KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK - '*', '5', '\u309d', // HIRAGANA ITERATION MARK - '+', '5', '\u309e', // HIRAGANA VOICED ITERATION MARK - 'a', '6', '\u30a1', // KATAKANA LETTER SMALL A - 'A', '6', '\u30a2', // KATAKANA LETTER A - 'i', '6', '\u30a3', // KATAKANA LETTER SMALL I - 'I', '6', '\u30a4', // KATAKANA LETTER I - 'u', '6', '\u30a5', // KATAKANA LETTER SMALL U - 'U', '6', '\u30a6', // KATAKANA LETTER U - 'e', '6', '\u30a7', // KATAKANA LETTER SMALL E - 'E', '6', '\u30a8', // KATAKANA LETTER E - 'o', '6', '\u30a9', // KATAKANA LETTER SMALL O - 'O', '6', '\u30aa', // KATAKANA LETTER O - 'K', 'a', '\u30ab', // KATAKANA LETTER KA - 'G', 'a', '\u30ac', // KATAKANA LETTER GA - 'K', 'i', '\u30ad', // KATAKANA LETTER KI - 'G', 'i', '\u30ae', // KATAKANA LETTER GI - 'K', 'u', '\u30af', // KATAKANA LETTER KU - 'G', 'u', '\u30b0', // KATAKANA LETTER GU - 'K', 'e', '\u30b1', // KATAKANA LETTER KE - 'G', 'e', '\u30b2', // KATAKANA LETTER GE - 'K', 'o', '\u30b3', // KATAKANA LETTER KO - 'G', 'o', '\u30b4', // KATAKANA LETTER GO - 'S', 'a', '\u30b5', // KATAKANA LETTER SA - 'Z', 'a', '\u30b6', // KATAKANA LETTER ZA - 'S', 'i', '\u30b7', // KATAKANA LETTER SI - 'Z', 'i', '\u30b8', // KATAKANA LETTER ZI - 'S', 'u', '\u30b9', // KATAKANA LETTER SU - 'Z', 'u', '\u30ba', // KATAKANA LETTER ZU - 'S', 'e', '\u30bb', // KATAKANA LETTER SE - 'Z', 'e', '\u30bc', // KATAKANA LETTER ZE - 'S', 'o', '\u30bd', // KATAKANA LETTER SO - 'Z', 'o', '\u30be', // KATAKANA LETTER ZO - 'T', 'a', '\u30bf', // KATAKANA LETTER TA - 'D', 'a', '\u30c0', // KATAKANA LETTER DA - 'T', 'i', '\u30c1', // KATAKANA LETTER TI - 'D', 'i', '\u30c2', // KATAKANA LETTER DI - 'T', 'U', '\u30c3', // KATAKANA LETTER SMALL TU - 'T', 'u', '\u30c4', // KATAKANA LETTER TU - 'D', 'u', '\u30c5', // KATAKANA LETTER DU - 'T', 'e', '\u30c6', // KATAKANA LETTER TE - 'D', 'e', '\u30c7', // KATAKANA LETTER DE - 'T', 'o', '\u30c8', // KATAKANA LETTER TO - 'D', 'o', '\u30c9', // KATAKANA LETTER DO - 'N', 'a', '\u30ca', // KATAKANA LETTER NA - 'N', 'i', '\u30cb', // KATAKANA LETTER NI - 'N', 'u', '\u30cc', // KATAKANA LETTER NU - 'N', 'e', '\u30cd', // KATAKANA LETTER NE - 'N', 'o', '\u30ce', // KATAKANA LETTER NO - 'H', 'a', '\u30cf', // KATAKANA LETTER HA - 'B', 'a', '\u30d0', // KATAKANA LETTER BA - 'P', 'a', '\u30d1', // KATAKANA LETTER PA - 'H', 'i', '\u30d2', // KATAKANA LETTER HI - 'B', 'i', '\u30d3', // KATAKANA LETTER BI - 'P', 'i', '\u30d4', // KATAKANA LETTER PI - 'H', 'u', '\u30d5', // KATAKANA LETTER HU - 'B', 'u', '\u30d6', // KATAKANA LETTER BU - 'P', 'u', '\u30d7', // KATAKANA LETTER PU - 'H', 'e', '\u30d8', // KATAKANA LETTER HE - 'B', 'e', '\u30d9', // KATAKANA LETTER BE - 'P', 'e', '\u30da', // KATAKANA LETTER PE - 'H', 'o', '\u30db', // KATAKANA LETTER HO - 'B', 'o', '\u30dc', // KATAKANA LETTER BO - 'P', 'o', '\u30dd', // KATAKANA LETTER PO - 'M', 'a', '\u30de', // KATAKANA LETTER MA - 'M', 'i', '\u30df', // KATAKANA LETTER MI - 'M', 'u', '\u30e0', // KATAKANA LETTER MU - 'M', 'e', '\u30e1', // KATAKANA LETTER ME - 'M', 'o', '\u30e2', // KATAKANA LETTER MO - 'Y', 'A', '\u30e3', // KATAKANA LETTER SMALL YA - 'Y', 'a', '\u30e4', // KATAKANA LETTER YA - 'Y', 'U', '\u30e5', // KATAKANA LETTER SMALL YU - 'Y', 'u', '\u30e6', // KATAKANA LETTER YU - 'Y', 'O', '\u30e7', // KATAKANA LETTER SMALL YO - 'Y', 'o', '\u30e8', // KATAKANA LETTER YO - 'R', 'a', '\u30e9', // KATAKANA LETTER RA - 'R', 'i', '\u30ea', // KATAKANA LETTER RI - 'R', 'u', '\u30eb', // KATAKANA LETTER RU - 'R', 'e', '\u30ec', // KATAKANA LETTER RE - 'R', 'o', '\u30ed', // KATAKANA LETTER RO - 'W', 'A', '\u30ee', // KATAKANA LETTER SMALL WA - 'W', 'a', '\u30ef', // KATAKANA LETTER WA - 'W', 'i', '\u30f0', // KATAKANA LETTER WI - 'W', 'e', '\u30f1', // KATAKANA LETTER WE - 'W', 'o', '\u30f2', // KATAKANA LETTER WO - 'N', '6', '\u30f3', // KATAKANA LETTER N - 'V', 'u', '\u30f4', // KATAKANA LETTER VU - 'K', 'A', '\u30f5', // KATAKANA LETTER SMALL KA - 'K', 'E', '\u30f6', // KATAKANA LETTER SMALL KE - 'V', 'a', '\u30f7', // KATAKANA LETTER VA - 'V', 'i', '\u30f8', // KATAKANA LETTER VI - 'V', 'e', '\u30f9', // KATAKANA LETTER VE - 'V', 'o', '\u30fa', // KATAKANA LETTER VO - '.', '6', '\u30fb', // KATAKANA MIDDLE DOT - '-', '6', '\u30fc', // KATAKANA-HIRAGANA PROLONGED SOUND MARK - '*', '6', '\u30fd', // KATAKANA ITERATION MARK - '+', '6', '\u30fe', // KATAKANA VOICED ITERATION MARK - 'b', '4', '\u3105', // BOPOMOFO LETTER B - 'p', '4', '\u3106', // BOPOMOFO LETTER P - 'm', '4', '\u3107', // BOPOMOFO LETTER M - 'f', '4', '\u3108', // BOPOMOFO LETTER F - 'd', '4', '\u3109', // BOPOMOFO LETTER D - 't', '4', '\u310a', // BOPOMOFO LETTER T - 'n', '4', '\u310b', // BOPOMOFO LETTER N - 'l', '4', '\u310c', // BOPOMOFO LETTER L - 'g', '4', '\u310d', // BOPOMOFO LETTER G - 'k', '4', '\u310e', // BOPOMOFO LETTER K - 'h', '4', '\u310f', // BOPOMOFO LETTER H - 'j', '4', '\u3110', // BOPOMOFO LETTER J - 'q', '4', '\u3111', // BOPOMOFO LETTER Q - 'x', '4', '\u3112', // BOPOMOFO LETTER X - 'z', 'h', '\u3113', // BOPOMOFO LETTER ZH - 'c', 'h', '\u3114', // BOPOMOFO LETTER CH - 's', 'h', '\u3115', // BOPOMOFO LETTER SH - 'r', '4', '\u3116', // BOPOMOFO LETTER R - 'z', '4', '\u3117', // BOPOMOFO LETTER Z - 'c', '4', '\u3118', // BOPOMOFO LETTER C - 's', '4', '\u3119', // BOPOMOFO LETTER S - 'a', '4', '\u311a', // BOPOMOFO LETTER A - 'o', '4', '\u311b', // BOPOMOFO LETTER O - 'e', '4', '\u311c', // BOPOMOFO LETTER E - 'a', 'i', '\u311e', // BOPOMOFO LETTER AI - 'e', 'i', '\u311f', // BOPOMOFO LETTER EI - 'a', 'u', '\u3120', // BOPOMOFO LETTER AU - 'o', 'u', '\u3121', // BOPOMOFO LETTER OU - 'a', 'n', '\u3122', // BOPOMOFO LETTER AN - 'e', 'n', '\u3123', // BOPOMOFO LETTER EN - 'a', 'N', '\u3124', // BOPOMOFO LETTER ANG - 'e', 'N', '\u3125', // BOPOMOFO LETTER ENG - 'e', 'r', '\u3126', // BOPOMOFO LETTER ER - 'i', '4', '\u3127', // BOPOMOFO LETTER I - 'u', '4', '\u3128', // BOPOMOFO LETTER U - 'i', 'u', '\u3129', // BOPOMOFO LETTER IU - 'v', '4', '\u312a', // BOPOMOFO LETTER V - 'n', 'G', '\u312b', // BOPOMOFO LETTER NG - 'g', 'n', '\u312c', // BOPOMOFO LETTER GN - '1', 'c', '\u3220', // PARENTHESIZED IDEOGRAPH ONE - '2', 'c', '\u3221', // PARENTHESIZED IDEOGRAPH TWO - '3', 'c', '\u3222', // PARENTHESIZED IDEOGRAPH THREE - '4', 'c', '\u3223', // PARENTHESIZED IDEOGRAPH FOUR - '5', 'c', '\u3224', // PARENTHESIZED IDEOGRAPH FIVE - '6', 'c', '\u3225', // PARENTHESIZED IDEOGRAPH SIX - '7', 'c', '\u3226', // PARENTHESIZED IDEOGRAPH SEVEN - '8', 'c', '\u3227', // PARENTHESIZED IDEOGRAPH EIGHT - '9', 'c', '\u3228', // PARENTHESIZED IDEOGRAPH NINE - '/', 'c', '\ue001', // JOIN THIS LINE WITH NEXT LINE (Mnemonic) - 'U', 'A', '\ue002', // Unit space A (ISO-IR-8-1 064) - 'U', 'B', '\ue003', // Unit space B (ISO-IR-8-1 096) - '"', '3', '\ue004', // NON-SPACING UMLAUT (ISO-IR-38 201) (character part) - '"', '1', '\ue005', // NON-SPACING DIAERESIS WITH ACCENT (ISO-IR-70 192) (character part) - '"', '!', '\ue006', // NON-SPACING GRAVE ACCENT (ISO-IR-103 193) (character part) - '"', '\'', '\ue007', // NON-SPACING ACUTE ACCENT (ISO-IR-103 194) (character part) - '"', '>', '\ue008', // NON-SPACING CIRCUMFLEX ACCENT (ISO-IR-103 195) (character part) - '"', '?', '\ue009', // NON-SPACING TILDE (ISO-IR-103 196) (character part) - '"', '-', '\ue00a', // NON-SPACING MACRON (ISO-IR-103 197) (character part) - '"', '(', '\ue00b', // NON-SPACING BREVE (ISO-IR-103 198) (character part) - '"', '.', '\ue00c', // NON-SPACING DOT ABOVE (ISO-IR-103 199) (character part) - '"', ':', '\ue00d', // NON-SPACING DIAERESIS (ISO-IR-103 200) (character part) - '"', '0', '\ue00e', // NON-SPACING RING ABOVE (ISO-IR-103 202) (character part) - '"', '"', '\ue00f', // NON-SPACING DOUBLE ACCUTE (ISO-IR-103 204) (character part) - '"', '<', '\ue010', // NON-SPACING CARON (ISO-IR-103 206) (character part) - '"', ',', '\ue011', // NON-SPACING CEDILLA (ISO-IR-103 203) (character part) - '"', ';', '\ue012', // NON-SPACING OGONEK (ISO-IR-103 206) (character part) - '"', '_', '\ue013', // NON-SPACING LOW LINE (ISO-IR-103 204) (character part) - '"', '=', '\ue014', // NON-SPACING DOUBLE LOW LINE (ISO-IR-38 217) (character part) - '"', '/', '\ue015', // NON-SPACING LONG SOLIDUS (ISO-IR-128 201) (character part) - '"', 'i', '\ue016', // GREEK NON-SPACING IOTA BELOW (ISO-IR-55 39) (character part) - '"', 'd', '\ue017', // GREEK NON-SPACING DASIA PNEUMATA (ISO-IR-55 38) (character part) - '"', 'p', '\ue018', // GREEK NON-SPACING PSILI PNEUMATA (ISO-IR-55 37) (character part) - ';', ';', '\ue019', // GREEK DASIA PNEUMATA (ISO-IR-18 92) - ',', ',', '\ue01a', // GREEK PSILI PNEUMATA (ISO-IR-18 124) - 'b', '3', '\ue01b', // GREEK SMALL LETTER MIDDLE BETA (ISO-IR-18 99) - 'C', 'i', '\ue01c', // CIRCLE (ISO-IR-83 0294) - 'f', '(', '\ue01d', // FUNCTION SIGN (ISO-IR-143 221) - 'e', 'd', '\ue01e', // LATIN SMALL LETTER EZH (ISO-IR-158 142) - 'a', 'm', '\ue01f', // ANTE MERIDIAM SIGN (ISO-IR-149 0267) - 'p', 'm', '\ue020', // POST MERIDIAM SIGN (ISO-IR-149 0268) - 'F', 'l', '\ue023', // DUTCH GUILDER SIGN (IBM437 159) - 'G', 'F', '\ue024', // GAMMA FUNCTION SIGN (ISO-10646-1DIS 032/032/037/122) - '>', 'V', '\ue025', // RIGHTWARDS VECTOR ABOVE (ISO-10646-1DIS 032/032/038/046) - '!', '*', '\ue026', // GREEK VARIA (ISO-10646-1DIS 032/032/042/164) - '?', '*', '\ue027', // GREEK PERISPOMENI (ISO-10646-1DIS 032/032/042/165) - 'J', '<', '\ue028', // LATIN CAPITAL LETTER J WITH CARON (lowercase: 000/000/001/240) - 'f', 'f', '\ufb00', // LATIN SMALL LIGATURE FF - 'f', 'i', '\ufb01', // LATIN SMALL LIGATURE FI - 'f', 'l', '\ufb02', // LATIN SMALL LIGATURE FL - 'f', 't', '\ufb05', // LATIN SMALL LIGATURE FT - 's', 't', '\ufb06', + 'N', 'U', '\u0000', // 0 ^@ NULL (NUL) + 'S', 'H', '\u0001', // 1 ^A START OF HEADING (SOH) + 'S', 'X', '\u0002', // 2 ^B START OF TEXT (STX) + 'E', 'X', '\u0003', // 3 ^C END OF TEXT (ETX) + 'E', 'T', '\u0004', // 4 ^D END OF TRANSMISSION (EOT) + 'E', 'Q', '\u0005', // 5 ^E ENQUIRY (ENQ) + 'A', 'K', '\u0006', // 6 ^F ACKNOWLEDGE (ACK) + 'B', 'L', '\u0007', // 7 ^G BELL (BEL) + 'B', 'S', '\u0008', // 8 ^H BACKSPACE (BS) + 'H', 'T', '\u0009', // 9 ^I CHARACTER TABULATION (HT) + 'L', 'F', '\u000a', // 10 ^@ LINE FEED (LF) + 'V', 'T', '\u000b', // 11 ^K LINE TABULATION (VT) + 'F', 'F', '\u000c', // 12 ^L FORM FEED (FF) + 'C', 'R', '\u000d', // 13 ^M CARRIAGE RETURN (CR) + 'S', 'O', '\u000e', // 14 ^N SHIFT OUT (SO) + 'S', 'I', '\u000f', // 15 ^O SHIFT IN (SI) + 'D', 'L', '\u0010', // 16 ^P DATALINK ESCAPE (DLE) + 'D', '1', '\u0011', // 17 ^Q DEVICE CONTROL ONE (DC1) + 'D', '2', '\u0012', // 18 ^R DEVICE CONTROL TWO (DC2) + 'D', '3', '\u0013', // 19 ^S DEVICE CONTROL THREE (DC3) + 'D', '4', '\u0014', // 20 ^T DEVICE CONTROL FOUR (DC4) + 'N', 'K', '\u0015', // 21 ^U NEGATIVE ACKNOWLEDGE (NAK) + 'S', 'Y', '\u0016', // 22 ^V SYNCRONOUS IDLE (SYN) + 'E', 'B', '\u0017', // 23 ^W END OF TRANSMISSION BLOCK (ETB) + 'C', 'N', '\u0018', // 24 ^X CANCEL (CAN) + 'E', 'M', '\u0019', // 25 ^Y END OF MEDIUM (EM) + 'S', 'B', '\u001a', // 26 ^Z SUBSTITUTE (SUB) + 'E', 'C', '\u001b', // 27 ^[ ESCAPE (ESC) + 'F', 'S', '\u001c', // 28 ^\ FILE SEPARATOR (IS4) + 'G', 'S', '\u001d', // 29 ^] GROUP SEPARATOR (IS3) + 'R', 'S', '\u001e', // 30 ^^ RECORD SEPARATOR (IS2) + 'U', 'S', '\u001f', // 31 ^_ UNIT SEPARATOR (IS1) + 'S', 'P', '\u0020', // 32 SPACE + 'N', 'b', '\u0023', // 35 # NUMBER SIGN + 'D', 'O', '\u0024', // 36 $ DOLLAR SIGN + 'A', 't', '\u0040', // 64 @ COMMERCIAL AT + '<', '(', '\u005b', // 91 [ LEFT SQUARE BRACKET + '/', '/', '\u005c', // 92 \ REVERSE SOLIDUS + ')', '>', '\u005d', // 93 ] RIGHT SQUARE BRACKET + '\'', '>', '\u005e', // 94 ^ CIRCUMFLEX ACCENT + '\'', '!', '\u0060', // 96 ` GRAVE ACCENT + '(', '!', '\u007b', // 123 { LEFT CURLY BRACKET + '!', '!', '\u007c', // 124 | VERTICAL LINE + '!', ')', '\u007d', // 125 } RIGHT CURLY BRACKET + '\'', '?', '\u007e', // 126 ~ TILDE + 'D', 'T', '\u007f', // 127 ^? DELETE (DEL) + 'P', 'A', '\u0080', // 128 ~@ PADDING CHARACTER (PAD) + 'H', 'O', '\u0081', // 129 ~A HIGH OCTET PRESET (HOP) + 'B', 'H', '\u0082', // 130 ~B BREAK PERMITTED HERE (BPH) + 'N', 'H', '\u0083', // 131 ~C NO BREAK HERE (NBH) + 'I', 'N', '\u0084', // 132 ~D INDEX (IND) + 'N', 'L', '\u0085', // 133 ~E NEXT LINE (NEL) + 'S', 'A', '\u0086', // 134 ~F START OF SELECTED AREA (SSA) + 'E', 'S', '\u0087', // 135 ~G END OF SELECTED AREA (ESA) + 'H', 'S', '\u0088', // 136 ~H CHARACTER TABULATION SET (HTS) + 'H', 'J', '\u0089', // 137 ~I CHARACTER TABULATION WITH JUSTIFICATION (HTJ) + 'V', 'S', '\u008a', // 138 ~J LINE TABULATION SET (VTS) + 'P', 'D', '\u008b', // 139 ~K PARTIAL LINE FORWARD (PLD) + 'P', 'U', '\u008c', // 140 ~L PARTIAL LINE BACKWARD (PLU) + 'R', 'I', '\u008d', // 141 ~M REVERSE LINE FEED (RI) + 'S', '2', '\u008e', // 142 ~N SINGLE-SHIFT TWO (SS2) + 'S', '3', '\u008f', // 143 ~O SINGLE-SHIFT THREE (SS3) + 'D', 'C', '\u0090', // 144 ~P DEVICE CONTROL STRING (DCS) + 'P', '1', '\u0091', // 145 ~Q PRIVATE USE ONE (PU1) + 'P', '2', '\u0092', // 146 ~R PRIVATE USE TWO (PU2) + 'T', 'S', '\u0093', // 147 ~S SET TRANSMIT STATE (STS) + 'C', 'C', '\u0094', // 148 ~T CANCEL CHARACTER (CCH) + 'M', 'W', '\u0095', // 149 ~U MESSAGE WAITING (MW) + 'S', 'G', '\u0096', // 150 ~V START OF GUARDED AREA (SPA) + 'E', 'G', '\u0097', // 151 ~W END OF GUARDED AREA (EPA) + 'S', 'S', '\u0098', // 152 ~X START OF STRING (SOS) + 'G', 'C', '\u0099', // 153 ~Y SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI) + 'S', 'C', '\u009a', // 154 ~Z SINGLE CHARACTER INTRODUCER (SCI) + 'C', 'I', '\u009b', // 155 ~[ CONTROL SEQUENCE INTRODUCER (CSI) + 'S', 'T', '\u009c', // 156 ~\ STRING TERMINATOR (ST) + 'O', 'C', '\u009d', // 157 ~] OPERATING SYSTEM COMMAND (OSC) + 'P', 'M', '\u009e', // 158 ~^ PRIVACY MESSAGE (PM) + 'A', 'C', '\u009f', // 159 ~_ APPLICATION PROGRAM COMMAND (APC) + 'N', 'S', '\u00a0', // 160 | NO-BREAK SPACE + '!', 'I', '\u00a1', // 161 ¡ INVERTED EXCLAMATION MARK + 'C', 't', '\u00a2', // 162 ¢ CENT SIGN + 'P', 'd', '\u00a3', // 163 £ POUND SIGN + 'C', 'u', '\u00a4', // 164 ¤ CURRENCY SIGN + 'Y', 'e', '\u00a5', // 165 ¥ YEN SIGN + 'B', 'B', '\u00a6', // 166 ¦ BROKEN BAR + 'S', 'E', '\u00a7', // 167 § SECTION SIGN + '\'', ':', '\u00a8', // 168 ¨ DIAERESIS + 'C', 'o', '\u00a9', // 169 © COPYRIGHT SIGN + '-', 'a', '\u00aa', // 170 ª FEMININE ORDINAL INDICATOR + '<', '<', '\u00ab', // 171 « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 'N', 'O', '\u00ac', // 172 ¬ NOT SIGN + '-', '-', '\u00ad', // 173 ­ SOFT HYPHEN + 'R', 'g', '\u00ae', // 174 ® REGISTERED SIGN + '\'', 'm', '\u00af', // 175 ¯ MACRON + 'D', 'G', '\u00b0', // 176 ° DEGREE SIGN + '+', '-', '\u00b1', // 177 ± PLUS-MINUS SIGN + '2', 'S', '\u00b2', // 178 ² SUPERSCRIPT TWO + '3', 'S', '\u00b3', // 179 ³ SUPERSCRIPT THREE + '\'', '\'', '\u00b4', // 180 ´ ACUTE ACCENT + 'M', 'y', '\u00b5', // 181 µ MICRO SIGN + 'P', 'I', '\u00b6', // 182 ¶ PILCROW SIGN + '.', 'M', '\u00b7', // 183 · MIDDLE DOT + '\'', ',', '\u00b8', // 184 ¸ CEDILLA + '1', 'S', '\u00b9', // 185 ¹ SUPERSCRIPT ONE + '-', 'o', '\u00ba', // 186 º MASCULINE ORDINAL INDICATOR + '>', '>', '\u00bb', // 187 » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '1', '4', '\u00bc', // 188 ¼ VULGAR FRACTION ONE QUARTER + '1', '2', '\u00bd', // 189 ½ VULGAR FRACTION ONE HALF + '3', '4', '\u00be', // 190 ¾ VULGAR FRACTION THREE QUARTERS + '?', 'I', '\u00bf', // 191 ¿ INVERTED QUESTION MARK + 'A', '!', '\u00c0', // 192 À LATIN CAPITAL LETTER A WITH GRAVE + 'A', '\'', '\u00c1', // 193 Á LATIN CAPITAL LETTER A WITH ACUTE + 'A', '>', '\u00c2', // 194  LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 'A', '?', '\u00c3', // 195 à LATIN CAPITAL LETTER A WITH TILDE + 'A', ':', '\u00c4', // 196 Ä LATIN CAPITAL LETTER A WITH DIAERESIS + 'A', 'A', '\u00c5', // 197 Å LATIN CAPITAL LETTER A WITH RING ABOVE + 'A', 'E', '\u00c6', // 198 Æ LATIN CAPITAL LETTER AE + 'C', ',', '\u00c7', // 199 Ç LATIN CAPITAL LETTER C WITH CEDILLA + 'E', '!', '\u00c8', // 200 È LATIN CAPITAL LETTER E WITH GRAVE + 'E', '\'', '\u00c9', // 201 É LATIN CAPITAL LETTER E WITH ACUTE + 'E', '>', '\u00ca', // 202 Ê LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 'E', ':', '\u00cb', // 203 Ë LATIN CAPITAL LETTER E WITH DIAERESIS + 'I', '!', '\u00cc', // 204 Ì LATIN CAPITAL LETTER I WITH GRAVE + 'I', '\'', '\u00cd', // 205 Í LATIN CAPITAL LETTER I WITH ACUTE + 'I', '>', '\u00ce', // 206 Î LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 'I', ':', '\u00cf', // 207 Ï LATIN CAPITAL LETTER I WITH DIAERESIS + 'D', '-', '\u00d0', // 208 Ð LATIN CAPITAL LETTER ETH (Icelandic) + 'N', '?', '\u00d1', // 209 Ñ LATIN CAPITAL LETTER N WITH TILDE + 'O', '!', '\u00d2', // 210 Ò LATIN CAPITAL LETTER O WITH GRAVE + 'O', '\'', '\u00d3', // 211 Ó LATIN CAPITAL LETTER O WITH ACUTE + 'O', '>', '\u00d4', // 212 Ô LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 'O', '?', '\u00d5', // 213 Õ LATIN CAPITAL LETTER O WITH TILDE + 'O', ':', '\u00d6', // 214 Ö LATIN CAPITAL LETTER O WITH DIAERESIS + '*', 'X', '\u00d7', // 215 × MULTIPLICATION SIGN + 'O', '/', '\u00d8', // 216 Ø LATIN CAPITAL LETTER O WITH STROKE + 'U', '!', '\u00d9', // 217 Ù LATIN CAPITAL LETTER U WITH GRAVE + 'U', '\'', '\u00da', // 218 Ú LATIN CAPITAL LETTER U WITH ACUTE + 'U', '>', '\u00db', // 219 Û LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 'U', ':', '\u00dc', // 220 Ü LATIN CAPITAL LETTER U WITH DIAERESIS + 'Y', '\'', '\u00dd', // 221 Ý LATIN CAPITAL LETTER Y WITH ACUTE + 'T', 'H', '\u00de', // 222 Þ LATIN CAPITAL LETTER THORN (Icelandic) + 's', 's', '\u00df', // 223 ß LATIN SMALL LETTER SHARP S (German) + 'a', '!', '\u00e0', // 224 à LATIN SMALL LETTER A WITH GRAVE + 'a', '\'', '\u00e1', // 225 á LATIN SMALL LETTER A WITH ACUTE + 'a', '>', '\u00e2', // 226 â LATIN SMALL LETTER A WITH CIRCUMFLEX + 'a', '?', '\u00e3', // 227 ã LATIN SMALL LETTER A WITH TILDE + 'a', ':', '\u00e4', // 228 ä LATIN SMALL LETTER A WITH DIAERESIS + 'a', 'a', '\u00e5', // 229 å LATIN SMALL LETTER A WITH RING ABOVE + 'a', 'e', '\u00e6', // 230 æ LATIN SMALL LETTER AE + 'c', ',', '\u00e7', // 231 ç LATIN SMALL LETTER C WITH CEDILLA + 'e', '!', '\u00e8', // 232 è LATIN SMALL LETTER E WITH GRAVE + 'e', '\'', '\u00e9', // 233 é LATIN SMALL LETTER E WITH ACUTE + 'e', '>', '\u00ea', // 234 ê LATIN SMALL LETTER E WITH CIRCUMFLEX + 'e', ':', '\u00eb', // 235 ë LATIN SMALL LETTER E WITH DIAERESIS + 'i', '!', '\u00ec', // 236 ì LATIN SMALL LETTER I WITH GRAVE + 'i', '\'', '\u00ed', // 237 í LATIN SMALL LETTER I WITH ACUTE + 'i', '>', '\u00ee', // 238 î LATIN SMALL LETTER I WITH CIRCUMFLEX + 'i', ':', '\u00ef', // 239 ï LATIN SMALL LETTER I WITH DIAERESIS + 'd', '-', '\u00f0', // 240 ð LATIN SMALL LETTER ETH (Icelandic) + 'n', '?', '\u00f1', // 241 ñ LATIN SMALL LETTER N WITH TILDE + 'o', '!', '\u00f2', // 242 ò LATIN SMALL LETTER O WITH GRAVE + 'o', '\'', '\u00f3', // 243 ó LATIN SMALL LETTER O WITH ACUTE + 'o', '>', '\u00f4', // 244 ô LATIN SMALL LETTER O WITH CIRCUMFLEX + 'o', '?', '\u00f5', // 245 õ LATIN SMALL LETTER O WITH TILDE + 'o', ':', '\u00f6', // 246 ö LATIN SMALL LETTER O WITH DIAERESIS + '-', ':', '\u00f7', // 247 ÷ DIVISION SIGN + 'o', '/', '\u00f8', // 248 ø LATIN SMALL LETTER O WITH STROKE + 'u', '!', '\u00f9', // 249 ù LATIN SMALL LETTER U WITH GRAVE + 'u', '\'', '\u00fa', // 250 ú LATIN SMALL LETTER U WITH ACUTE + 'u', '>', '\u00fb', // 251 û LATIN SMALL LETTER U WITH CIRCUMFLEX + 'u', ':', '\u00fc', // 252 ü LATIN SMALL LETTER U WITH DIAERESIS + 'y', '\'', '\u00fd', // 253 ý LATIN SMALL LETTER Y WITH ACUTE + 't', 'h', '\u00fe', // 254 þ LATIN SMALL LETTER THORN (Icelandic) + 'y', ':', '\u00ff', // 255 ÿ LATIN SMALL LETTER Y WITH DIAERESIS + 'A', '-', '\u0100', // 256 Ā LATIN CAPITAL LETTER A WITH MACRON + 'a', '-', '\u0101', // 257 ā LATIN SMALL LETTER A WITH MACRON + 'A', '(', '\u0102', // 258 Ă LATIN CAPITAL LETTER A WITH BREVE + 'a', '(', '\u0103', // 259 ă LATIN SMALL LETTER A WITH BREVE + 'A', ';', '\u0104', // 260 Ą LATIN CAPITAL LETTER A WITH OGONEK + 'a', ';', '\u0105', // 261 ą LATIN SMALL LETTER A WITH OGONEK + 'C', '\'', '\u0106', // 262 Ć LATIN CAPITAL LETTER C WITH ACUTE + 'c', '\'', '\u0107', // 263 ć LATIN SMALL LETTER C WITH ACUTE + 'C', '>', '\u0108', // 264 Ĉ LATIN CAPITAL LETTER C WITH CIRCUMFLEX + 'c', '>', '\u0109', // 265 ĉ LATIN SMALL LETTER C WITH CIRCUMFLEX + 'C', '.', '\u010a', // 266 Ċ LATIN CAPITAL LETTER C WITH DOT ABOVE + 'c', '.', '\u010b', // 267 ċ LATIN SMALL LETTER C WITH DOT ABOVE + 'C', '<', '\u010c', // 268 Č LATIN CAPITAL LETTER C WITH CARON + 'c', '<', '\u010d', // 269 č LATIN SMALL LETTER C WITH CARON + 'D', '<', '\u010e', // 270 Ď LATIN CAPITAL LETTER D WITH CARON + 'd', '<', '\u010f', // 271 ď LATIN SMALL LETTER D WITH CARON + 'D', '/', '\u0110', // 272 Đ LATIN CAPITAL LETTER D WITH STROKE + 'd', '/', '\u0111', // 273 đ LATIN SMALL LETTER D WITH STROKE + 'E', '-', '\u0112', // 274 Ē LATIN CAPITAL LETTER E WITH MACRON + 'e', '-', '\u0113', // 275 ē LATIN SMALL LETTER E WITH MACRON + 'E', '(', '\u0114', // 276 Ĕ LATIN CAPITAL LETTER E WITH BREVE + 'e', '(', '\u0115', // 277 ĕ LATIN SMALL LETTER E WITH BREVE + 'E', '.', '\u0116', // 278 Ė LATIN CAPITAL LETTER E WITH DOT ABOVE + 'e', '.', '\u0117', // 279 ė LATIN SMALL LETTER E WITH DOT ABOVE + 'E', ';', '\u0118', // 280 Ę LATIN CAPITAL LETTER E WITH OGONEK + 'e', ';', '\u0119', // 281 ę LATIN SMALL LETTER E WITH OGONEK + 'E', '<', '\u011a', // 282 Ě LATIN CAPITAL LETTER E WITH CARON + 'e', '<', '\u011b', // 283 ě LATIN SMALL LETTER E WITH CARON + 'G', '>', '\u011c', // 284 Ĝ LATIN CAPITAL LETTER G WITH CIRCUMFLEX + 'g', '>', '\u011d', // 285 ĝ LATIN SMALL LETTER G WITH CIRCUMFLEX + 'G', '(', '\u011e', // 286 Ğ LATIN CAPITAL LETTER G WITH BREVE + 'g', '(', '\u011f', // 287 ğ LATIN SMALL LETTER G WITH BREVE + 'G', '.', '\u0120', // 288 Ġ LATIN CAPITAL LETTER G WITH DOT ABOVE + 'g', '.', '\u0121', // 289 ġ LATIN SMALL LETTER G WITH DOT ABOVE + 'G', ',', '\u0122', // 290 Ģ LATIN CAPITAL LETTER G WITH CEDILLA + 'g', ',', '\u0123', // 291 ģ LATIN SMALL LETTER G WITH CEDILLA + 'H', '>', '\u0124', // 292 Ĥ LATIN CAPITAL LETTER H WITH CIRCUMFLEX + 'h', '>', '\u0125', // 293 ĥ LATIN SMALL LETTER H WITH CIRCUMFLEX + 'H', '/', '\u0126', // 294 Ħ LATIN CAPITAL LETTER H WITH STROKE + 'h', '/', '\u0127', // 295 ħ LATIN SMALL LETTER H WITH STROKE + 'I', '?', '\u0128', // 296 Ĩ LATIN CAPITAL LETTER I WITH TILDE + 'i', '?', '\u0129', // 297 ĩ LATIN SMALL LETTER I WITH TILDE + 'I', '-', '\u012a', // 298 Ī LATIN CAPITAL LETTER I WITH MACRON + 'i', '-', '\u012b', // 299 ī LATIN SMALL LETTER I WITH MACRON + 'I', '(', '\u012c', // 300 Ĭ LATIN CAPITAL LETTER I WITH BREVE + 'i', '(', '\u012d', // 301 ĭ LATIN SMALL LETTER I WITH BREVE + 'I', ';', '\u012e', // 302 Į LATIN CAPITAL LETTER I WITH OGONEK + 'i', ';', '\u012f', // 303 į LATIN SMALL LETTER I WITH OGONEK + 'I', '.', '\u0130', // 304 İ LATIN CAPITAL LETTER I WITH DOT ABOVE + 'i', '.', '\u0131', // 305 ı LATIN SMALL LETTER I DOTLESS + 'I', 'J', '\u0132', // 306 IJ LATIN CAPITAL LIGATURE IJ + 'i', 'j', '\u0133', // 307 ij LATIN SMALL LIGATURE IJ + 'J', '>', '\u0134', // 308 Ĵ LATIN CAPITAL LETTER J WITH CIRCUMFLEX + 'j', '>', '\u0135', // 309 ĵ LATIN SMALL LETTER J WITH CIRCUMFLEX + 'K', ',', '\u0136', // 310 Ķ LATIN CAPITAL LETTER K WITH CEDILLA + 'k', ',', '\u0137', // 311 ķ LATIN SMALL LETTER K WITH CEDILLA + 'k', 'k', '\u0138', // 312 ĸ LATIN SMALL LETTER KRA (Greenlandic) + 'L', '\'', '\u0139', // 313 Ĺ LATIN CAPITAL LETTER L WITH ACUTE + 'l', '\'', '\u013a', // 314 ĺ LATIN SMALL LETTER L WITH ACUTE + 'L', ',', '\u013b', // 315 Ļ LATIN CAPITAL LETTER L WITH CEDILLA + 'l', ',', '\u013c', // 316 ļ LATIN SMALL LETTER L WITH CEDILLA + 'L', '<', '\u013d', // 317 Ľ LATIN CAPITAL LETTER L WITH CARON + 'l', '<', '\u013e', // 318 ľ LATIN SMALL LETTER L WITH CARON + 'L', '.', '\u013f', // 319 Ŀ LATIN CAPITAL LETTER L WITH MIDDLE DOT + 'l', '.', '\u0140', // 320 ŀ LATIN SMALL LETTER L WITH MIDDLE DOT + 'L', '/', '\u0141', // 321 Ł LATIN CAPITAL LETTER L WITH STROKE + 'l', '/', '\u0142', // 322 ł LATIN SMALL LETTER L WITH STROKE + 'N', '\'', '\u0143', // 323 Ń LATIN CAPITAL LETTER N WITH ACUTE + 'n', '\'', '\u0144', // 324 ń LATIN SMALL LETTER N WITH ACUTE + 'N', ',', '\u0145', // 325 Ņ LATIN CAPITAL LETTER N WITH CEDILLA + 'n', ',', '\u0146', // 326 ņ LATIN SMALL LETTER N WITH CEDILLA + 'N', '<', '\u0147', // 327 Ň LATIN CAPITAL LETTER N WITH CARON + 'n', '<', '\u0148', // 328 ň LATIN SMALL LETTER N WITH CARON + '\'', 'n', '\u0149', // 329 ʼn LATIN SMALL LETTER N PRECEDED BY APOSTROPHE + 'N', 'G', '\u014a', // 330 Ŋ LATIN CAPITAL LETTER ENG (Lappish) + 'n', 'g', '\u014b', // 331 ŋ LATIN SMALL LETTER ENG (Lappish) + 'O', '-', '\u014c', // 332 Ō LATIN CAPITAL LETTER O WITH MACRON + 'o', '-', '\u014d', // 333 ō LATIN SMALL LETTER O WITH MACRON + 'O', '(', '\u014e', // 334 Ŏ LATIN CAPITAL LETTER O WITH BREVE + 'o', '(', '\u014f', // 335 ŏ LATIN SMALL LETTER O WITH BREVE + 'O', '"', '\u0150', // 336 Ő LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + 'o', '"', '\u0151', // 337 ő LATIN SMALL LETTER O WITH DOUBLE ACUTE + 'O', 'E', '\u0152', // 338 Œ LATIN CAPITAL LIGATURE OE + 'o', 'e', '\u0153', // 339 œ LATIN SMALL LIGATURE OE + 'R', '\'', '\u0154', // 340 Ŕ LATIN CAPITAL LETTER R WITH ACUTE + 'r', '\'', '\u0155', // 341 ŕ LATIN SMALL LETTER R WITH ACUTE + 'R', ',', '\u0156', // 342 Ŗ LATIN CAPITAL LETTER R WITH CEDILLA + 'r', ',', '\u0157', // 343 ŗ LATIN SMALL LETTER R WITH CEDILLA + 'R', '<', '\u0158', // 344 Ř LATIN CAPITAL LETTER R WITH CARON + 'r', '<', '\u0159', // 345 ř LATIN SMALL LETTER R WITH CARON + 'S', '\'', '\u015a', // 346 Ś LATIN CAPITAL LETTER S WITH ACUTE + 's', '\'', '\u015b', // 347 ś LATIN SMALL LETTER S WITH ACUTE + 'S', '>', '\u015c', // 348 Ŝ LATIN CAPITAL LETTER S WITH CIRCUMFLEX + 's', '>', '\u015d', // 349 ŝ LATIN SMALL LETTER S WITH CIRCUMFLEX + 'S', ',', '\u015e', // 350 Ş LATIN CAPITAL LETTER S WITH CEDILLA + 's', ',', '\u015f', // 351 ş LATIN SMALL LETTER S WITH CEDILLA + 'S', '<', '\u0160', // 352 Š LATIN CAPITAL LETTER S WITH CARON + 's', '<', '\u0161', // 353 š LATIN SMALL LETTER S WITH CARON + 'T', ',', '\u0162', // 354 Ţ LATIN CAPITAL LETTER T WITH CEDILLA + 't', ',', '\u0163', // 355 ţ LATIN SMALL LETTER T WITH CEDILLA + 'T', '<', '\u0164', // 356 Ť LATIN CAPITAL LETTER T WITH CARON + 't', '<', '\u0165', // 357 ť LATIN SMALL LETTER T WITH CARON + 'T', '/', '\u0166', // 358 Ŧ LATIN CAPITAL LETTER T WITH STROKE + 't', '/', '\u0167', // 359 ŧ LATIN SMALL LETTER T WITH STROKE + 'U', '?', '\u0168', // 360 Ũ LATIN CAPITAL LETTER U WITH TILDE + 'u', '?', '\u0169', // 361 ũ LATIN SMALL LETTER U WITH TILDE + 'U', '-', '\u016a', // 362 Ū LATIN CAPITAL LETTER U WITH MACRON + 'u', '-', '\u016b', // 363 ū LATIN SMALL LETTER U WITH MACRON + 'U', '(', '\u016c', // 364 Ŭ LATIN CAPITAL LETTER U WITH BREVE + 'u', '(', '\u016d', // 365 ŭ LATIN SMALL LETTER U WITH BREVE + 'U', '0', '\u016e', // 366 Ů LATIN CAPITAL LETTER U WITH RING ABOVE + 'u', '0', '\u016f', // 367 ů LATIN SMALL LETTER U WITH RING ABOVE + 'U', '"', '\u0170', // 368 Ű LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + 'u', '"', '\u0171', // 369 ű LATIN SMALL LETTER U WITH DOUBLE ACUTE + 'U', ';', '\u0172', // 370 Ų LATIN CAPITAL LETTER U WITH OGONEK + 'u', ';', '\u0173', // 371 ų LATIN SMALL LETTER U WITH OGONEK + 'W', '>', '\u0174', // 372 Ŵ LATIN CAPITAL LETTER W WITH CIRCUMFLEX + 'w', '>', '\u0175', // 373 ŵ LATIN SMALL LETTER W WITH CIRCUMFLEX + 'Y', '>', '\u0176', // 374 Ŷ LATIN CAPITAL LETTER Y WITH CIRCUMFLEX + 'y', '>', '\u0177', // 375 ŷ LATIN SMALL LETTER Y WITH CIRCUMFLEX + 'Y', ':', '\u0178', // 376 Ÿ LATIN CAPITAL LETTER Y WITH DIAERESIS + 'Z', '\'', '\u0179', // 377 Ź LATIN CAPITAL LETTER Z WITH ACUTE + 'z', '\'', '\u017a', // 378 ź LATIN SMALL LETTER Z WITH ACUTE + 'Z', '.', '\u017b', // 379 Ż LATIN CAPITAL LETTER Z WITH DOT ABOVE + 'z', '.', '\u017c', // 380 ż LATIN SMALL LETTER Z WITH DOT ABOVE + 'Z', '<', '\u017d', // 381 Ž LATIN CAPITAL LETTER Z WITH CARON + 'z', '<', '\u017e', // 382 ž LATIN SMALL LETTER Z WITH CARON + 'O', '9', '\u01a0', // 416 Ơ LATIN CAPITAL LETTER O WITH HORN + 'o', '9', '\u01a1', // 417 ơ LATIN SMALL LETTER O WITH HORN + 'O', 'I', '\u01a2', // 418 Ƣ LATIN CAPITAL LETTER OI + 'o', 'i', '\u01a3', // 419 ƣ LATIN SMALL LETTER OI + 'y', 'r', '\u01a6', // 422 Ʀ LATIN LETTER YR + 'U', '9', '\u01af', // 431 Ư LATIN CAPITAL LETTER U WITH HORN + 'u', '9', '\u01b0', // 432 ư LATIN SMALL LETTER U WITH HORN + 'Z', '/', '\u01b5', // 437 Ƶ LATIN CAPITAL LETTER Z WITH STROKE + 'z', '/', '\u01b6', // 438 ƶ LATIN SMALL LETTER Z WITH STROKE + 'E', 'D', '\u01b7', // 439 Ʒ LATIN CAPITAL LETTER EZH + 'A', '<', '\u01cd', // 461 Ǎ LATIN CAPITAL LETTER A WITH CARON + 'a', '<', '\u01ce', // 462 ǎ LATIN SMALL LETTER A WITH CARON + 'I', '<', '\u01cf', // 463 Ǐ LATIN CAPITAL LETTER I WITH CARON + 'i', '<', '\u01d0', // 464 ǐ LATIN SMALL LETTER I WITH CARON + 'O', '<', '\u01d1', // 465 Ǒ LATIN CAPITAL LETTER O WITH CARON + 'o', '<', '\u01d2', // 466 ǒ LATIN SMALL LETTER O WITH CARON + 'U', '<', '\u01d3', // 467 Ǔ LATIN CAPITAL LETTER U WITH CARON + 'u', '<', '\u01d4', // 468 ǔ LATIN SMALL LETTER U WITH CARON + 'A', '1', '\u01de', // 478 Ǟ LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON + 'a', '1', '\u01df', // 479 ǟ LATIN SMALL LETTER A WITH DIAERESIS AND MACRON + 'A', '7', '\u01e0', // 480 Ǡ LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON + 'a', '7', '\u01e1', // 481 ǡ LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON + 'A', '3', '\u01e2', // 482 Ǣ LATIN CAPITAL LETTER AE WITH MACRON + 'a', '3', '\u01e3', // 483 ǣ LATIN SMALL LETTER AE WITH MACRON + 'G', '/', '\u01e4', // 484 Ǥ LATIN CAPITAL LETTER G WITH STROKE + 'g', '/', '\u01e5', // 485 ǥ LATIN SMALL LETTER G WITH STROKE + 'G', '<', '\u01e6', // 486 Ǧ LATIN CAPITAL LETTER G WITH CARON + 'g', '<', '\u01e7', // 487 ǧ LATIN SMALL LETTER G WITH CARON + 'K', '<', '\u01e8', // 488 Ǩ LATIN CAPITAL LETTER K WITH CARON + 'k', '<', '\u01e9', // 489 ǩ LATIN SMALL LETTER K WITH CARON + 'O', ';', '\u01ea', // 490 Ǫ LATIN CAPITAL LETTER O WITH OGONEK + 'o', ';', '\u01eb', // 491 ǫ LATIN SMALL LETTER O WITH OGONEK + 'O', '1', '\u01ec', // 492 Ǭ LATIN CAPITAL LETTER O WITH OGONEK AND MACRON + 'o', '1', '\u01ed', // 493 ǭ LATIN SMALL LETTER O WITH OGONEK AND MACRON + 'E', 'Z', '\u01ee', // 494 Ǯ LATIN CAPITAL LETTER EZH WITH CARON + 'e', 'z', '\u01ef', // 495 ǯ LATIN SMALL LETTER EZH WITH CARON + 'j', '<', '\u01f0', // 496 ǰ LATIN SMALL LETTER J WITH CARON + 'G', '\'', '\u01f4', // 500 Ǵ LATIN CAPITAL LETTER G WITH ACUTE + 'g', '\'', '\u01f5', // 501 ǵ LATIN SMALL LETTER G WITH ACUTE + ';', 'S', '\u02bf', // 703 ʿ MODIFIER LETTER LEFT HALF RING + '\'', '<', '\u02c7', // 711 ˇ CARON + '\'', '(', '\u02d8', // 728 ˘ BREVE + '\'', '.', '\u02d9', // 729 ˙ DOT ABOVE + '\'', '0', '\u02da', // 730 ˚ RING ABOVE + '\'', ';', '\u02db', // 731 ˛ OGONEK + '\'', '"', '\u02dd', // 733 ˝ DOUBLE ACUTE ACCENT + 'A', '%', '\u0386', // 902 Ά GREEK CAPITAL LETTER ALPHA WITH ACUTE + 'E', '%', '\u0388', // 904 Έ GREEK CAPITAL LETTER EPSILON WITH ACUTE + 'Y', '%', '\u0389', // 905 Ή GREEK CAPITAL LETTER ETA WITH ACUTE + 'I', '%', '\u038a', // 906 Ί GREEK CAPITAL LETTER IOTA WITH ACUTE + 'O', '%', '\u038c', // 908 Ό GREEK CAPITAL LETTER OMICRON WITH ACUTE + 'U', '%', '\u038e', // 910 Ύ GREEK CAPITAL LETTER UPSILON WITH ACUTE + 'W', '%', '\u038f', // 911 Ώ GREEK CAPITAL LETTER OMEGA WITH ACUTE + 'i', '3', '\u0390', // 912 ΐ GREEK SMALL LETTER IOTA WITH ACUTE AND DIAERESIS + 'A', '*', '\u0391', // 913 Α GREEK CAPITAL LETTER ALPHA + 'B', '*', '\u0392', // 914 Β GREEK CAPITAL LETTER BETA + 'G', '*', '\u0393', // 915 Γ GREEK CAPITAL LETTER GAMMA + 'D', '*', '\u0394', // 916 Δ GREEK CAPITAL LETTER DELTA + 'E', '*', '\u0395', // 917 Ε GREEK CAPITAL LETTER EPSILON + 'Z', '*', '\u0396', // 918 Ζ GREEK CAPITAL LETTER ZETA + 'Y', '*', '\u0397', // 919 Η GREEK CAPITAL LETTER ETA + 'H', '*', '\u0398', // 920 Θ GREEK CAPITAL LETTER THETA + 'I', '*', '\u0399', // 921 Ι GREEK CAPITAL LETTER IOTA + 'K', '*', '\u039a', // 922 Κ GREEK CAPITAL LETTER KAPPA + 'L', '*', '\u039b', // 923 Λ GREEK CAPITAL LETTER LAMDA + 'M', '*', '\u039c', // 924 Μ GREEK CAPITAL LETTER MU + 'N', '*', '\u039d', // 925 Ν GREEK CAPITAL LETTER NU + 'C', '*', '\u039e', // 926 Ξ GREEK CAPITAL LETTER XI + 'O', '*', '\u039f', // 927 Ο GREEK CAPITAL LETTER OMICRON + 'P', '*', '\u03a0', // 928 Π GREEK CAPITAL LETTER PI + 'R', '*', '\u03a1', // 929 Ρ GREEK CAPITAL LETTER RHO + 'S', '*', '\u03a3', // 931 Σ GREEK CAPITAL LETTER SIGMA + 'T', '*', '\u03a4', // 932 Τ GREEK CAPITAL LETTER TAU + 'U', '*', '\u03a5', // 933 Υ GREEK CAPITAL LETTER UPSILON + 'F', '*', '\u03a6', // 934 Φ GREEK CAPITAL LETTER PHI + 'X', '*', '\u03a7', // 935 Χ GREEK CAPITAL LETTER CHI + 'Q', '*', '\u03a8', // 936 Ψ GREEK CAPITAL LETTER PSI + 'W', '*', '\u03a9', // 937 Ω GREEK CAPITAL LETTER OMEGA + 'J', '*', '\u03aa', // 938 Ϊ GREEK CAPITAL LETTER IOTA WITH DIAERESIS + 'V', '*', '\u03ab', // 939 Ϋ GREEK CAPITAL LETTER UPSILON WITH DIAERESIS + 'a', '%', '\u03ac', // 940 ά GREEK SMALL LETTER ALPHA WITH ACUTE + 'e', '%', '\u03ad', // 941 έ GREEK SMALL LETTER EPSILON WITH ACUTE + 'y', '%', '\u03ae', // 942 ή GREEK SMALL LETTER ETA WITH ACUTE + 'i', '%', '\u03af', // 943 ί GREEK SMALL LETTER IOTA WITH ACUTE + 'u', '3', '\u03b0', // 944 ΰ GREEK SMALL LETTER UPSILON WITH ACUTE AND DIAERESIS + 'a', '*', '\u03b1', // 945 α GREEK SMALL LETTER ALPHA + 'b', '*', '\u03b2', // 946 β GREEK SMALL LETTER BETA + 'g', '*', '\u03b3', // 947 γ GREEK SMALL LETTER GAMMA + 'd', '*', '\u03b4', // 948 δ GREEK SMALL LETTER DELTA + 'e', '*', '\u03b5', // 949 ε GREEK SMALL LETTER EPSILON + 'z', '*', '\u03b6', // 950 ζ GREEK SMALL LETTER ZETA + 'y', '*', '\u03b7', // 951 η GREEK SMALL LETTER ETA + 'h', '*', '\u03b8', // 952 θ GREEK SMALL LETTER THETA + 'i', '*', '\u03b9', // 953 ι GREEK SMALL LETTER IOTA + 'k', '*', '\u03ba', // 954 κ GREEK SMALL LETTER KAPPA + 'l', '*', '\u03bb', // 955 λ GREEK SMALL LETTER LAMDA + 'm', '*', '\u03bc', // 956 μ GREEK SMALL LETTER MU + 'n', '*', '\u03bd', // 957 ν GREEK SMALL LETTER NU + 'c', '*', '\u03be', // 958 ξ GREEK SMALL LETTER XI + 'o', '*', '\u03bf', // 959 ο GREEK SMALL LETTER OMICRON + 'p', '*', '\u03c0', // 960 π GREEK SMALL LETTER PI + 'r', '*', '\u03c1', // 961 ρ GREEK SMALL LETTER RHO + '*', 's', '\u03c2', // 962 ς GREEK SMALL LETTER FINAL SIGMA + 's', '*', '\u03c3', // 963 σ GREEK SMALL LETTER SIGMA + 't', '*', '\u03c4', // 964 τ GREEK SMALL LETTER TAU + 'u', '*', '\u03c5', // 965 υ GREEK SMALL LETTER UPSILON + 'f', '*', '\u03c6', // 966 φ GREEK SMALL LETTER PHI + 'x', '*', '\u03c7', // 967 χ GREEK SMALL LETTER CHI + 'q', '*', '\u03c8', // 968 ψ GREEK SMALL LETTER PSI + 'w', '*', '\u03c9', // 969 ω GREEK SMALL LETTER OMEGA + 'j', '*', '\u03ca', // 970 ϊ GREEK SMALL LETTER IOTA WITH DIAERESIS + 'v', '*', '\u03cb', // 971 ϋ GREEK SMALL LETTER UPSILON WITH DIAERESIS + 'o', '%', '\u03cc', // 972 ό GREEK SMALL LETTER OMICRON WITH ACUTE + 'u', '%', '\u03cd', // 973 ύ GREEK SMALL LETTER UPSILON WITH ACUTE + 'w', '%', '\u03ce', // 974 ώ GREEK SMALL LETTER OMEGA WITH ACUTE + '\'', 'G', '\u03d8', // 984 Ϙ GREEK NUMERAL SIGN + ',', 'G', '\u03d9', // 985 ϙ GREEK LOWER NUMERAL SIGN + 'T', '3', '\u03da', // 986 Ϛ GREEK CAPITAL LETTER STIGMA + 't', '3', '\u03db', // 987 ϛ GREEK SMALL LETTER STIGMA + 'M', '3', '\u03dc', // 988 Ϝ GREEK CAPITAL LETTER DIGAMMA + 'm', '3', '\u03dd', // 989 ϝ GREEK SMALL LETTER DIGAMMA + 'K', '3', '\u03de', // 990 Ϟ GREEK CAPITAL LETTER KOPPA + 'k', '3', '\u03df', // 991 ϟ GREEK SMALL LETTER KOPPA + 'P', '3', '\u03e0', // 992 Ϡ GREEK CAPITAL LETTER SAMPI + 'p', '3', '\u03e1', // 993 ϡ GREEK SMALL LETTER SAMPI + '\'', '%', '\u03f4', // 1012 ϴ ACUTE ACCENT AND DIAERESIS (Tonos and Dialytika) + 'j', '3', '\u03f5', // 1013 ϵ GREEK IOTA BELOW + 'I', 'O', '\u0401', // 1025 Ё CYRILLIC CAPITAL LETTER IO + 'D', '%', '\u0402', // 1026 Ђ CYRILLIC CAPITAL LETTER DJE (Serbocroatian) + 'G', '%', '\u0403', // 1027 Ѓ CYRILLIC CAPITAL LETTER GJE (Macedonian) + 'I', 'E', '\u0404', // 1028 Є CYRILLIC CAPITAL LETTER UKRAINIAN IE + 'D', 'S', '\u0405', // 1029 Ѕ CYRILLIC CAPITAL LETTER DZE (Macedonian) + 'I', 'I', '\u0406', // 1030 І CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + 'Y', 'I', '\u0407', // 1031 Ї CYRILLIC CAPITAL LETTER YI (Ukrainian) + 'J', '%', '\u0408', // 1032 Ј CYRILLIC CAPITAL LETTER JE + 'L', 'J', '\u0409', // 1033 Љ CYRILLIC CAPITAL LETTER LJE + 'N', 'J', '\u040a', // 1034 Њ CYRILLIC CAPITAL LETTER NJE + 'T', 's', '\u040b', // 1035 Ћ CYRILLIC CAPITAL LETTER TSHE (Serbocroatian) + 'K', 'J', '\u040c', // 1036 Ќ CYRILLIC CAPITAL LETTER KJE (Macedonian) + 'V', '%', '\u040e', // 1038 Ў CYRILLIC CAPITAL LETTER SHORT U (Byelorussian) + 'D', 'Z', '\u040f', // 1039 Џ CYRILLIC CAPITAL LETTER DZHE + 'A', '=', '\u0410', // 1040 А CYRILLIC CAPITAL LETTER A + 'B', '=', '\u0411', // 1041 Б CYRILLIC CAPITAL LETTER BE + 'V', '=', '\u0412', // 1042 В CYRILLIC CAPITAL LETTER VE + 'G', '=', '\u0413', // 1043 Г CYRILLIC CAPITAL LETTER GHE + 'D', '=', '\u0414', // 1044 Д CYRILLIC CAPITAL LETTER DE + 'E', '=', '\u0415', // 1045 Е CYRILLIC CAPITAL LETTER IE + 'Z', '%', '\u0416', // 1046 Ж CYRILLIC CAPITAL LETTER ZHE + 'Z', '=', '\u0417', // 1047 З CYRILLIC CAPITAL LETTER ZE + 'I', '=', '\u0418', // 1048 И CYRILLIC CAPITAL LETTER I + 'J', '=', '\u0419', // 1049 Й CYRILLIC CAPITAL LETTER SHORT I + 'K', '=', '\u041a', // 1050 К CYRILLIC CAPITAL LETTER KA + 'L', '=', '\u041b', // 1051 Л CYRILLIC CAPITAL LETTER EL + 'M', '=', '\u041c', // 1052 М CYRILLIC CAPITAL LETTER EM + 'N', '=', '\u041d', // 1053 Н CYRILLIC CAPITAL LETTER EN + 'O', '=', '\u041e', // 1054 О CYRILLIC CAPITAL LETTER O + 'P', '=', '\u041f', // 1055 П CYRILLIC CAPITAL LETTER PE + 'R', '=', '\u0420', // 1056 Р CYRILLIC CAPITAL LETTER ER + 'S', '=', '\u0421', // 1057 С CYRILLIC CAPITAL LETTER ES + 'T', '=', '\u0422', // 1058 Т CYRILLIC CAPITAL LETTER TE + 'U', '=', '\u0423', // 1059 У CYRILLIC CAPITAL LETTER U + 'F', '=', '\u0424', // 1060 Ф CYRILLIC CAPITAL LETTER EF + 'H', '=', '\u0425', // 1061 Х CYRILLIC CAPITAL LETTER HA + 'C', '=', '\u0426', // 1062 Ц CYRILLIC CAPITAL LETTER TSE + 'C', '%', '\u0427', // 1063 Ч CYRILLIC CAPITAL LETTER CHE + 'S', '%', '\u0428', // 1064 Ш CYRILLIC CAPITAL LETTER SHA + 'S', 'c', '\u0429', // 1065 Щ CYRILLIC CAPITAL LETTER SHCHA + '=', '"', '\u042a', // 1066 Ъ CYRILLIC CAPITAL LETTER HARD SIGN + 'Y', '=', '\u042b', // 1067 Ы CYRILLIC CAPITAL LETTER YERU + '%', '"', '\u042c', // 1068 Ь CYRILLIC CAPITAL LETTER SOFT SIGN + 'J', 'E', '\u042d', // 1069 Э CYRILLIC CAPITAL LETTER E + 'J', 'U', '\u042e', // 1070 Ю CYRILLIC CAPITAL LETTER YU + 'J', 'A', '\u042f', // 1071 Я CYRILLIC CAPITAL LETTER YA + 'a', '=', '\u0430', // 1072 а CYRILLIC SMALL LETTER A + 'b', '=', '\u0431', // 1073 б CYRILLIC SMALL LETTER BE + 'v', '=', '\u0432', // 1074 в CYRILLIC SMALL LETTER VE + 'g', '=', '\u0433', // 1075 г CYRILLIC SMALL LETTER GHE + 'd', '=', '\u0434', // 1076 д CYRILLIC SMALL LETTER DE + 'e', '=', '\u0435', // 1077 е CYRILLIC SMALL LETTER IE + 'z', '%', '\u0436', // 1078 ж CYRILLIC SMALL LETTER ZHE + 'z', '=', '\u0437', // 1079 з CYRILLIC SMALL LETTER ZE + 'i', '=', '\u0438', // 1080 и CYRILLIC SMALL LETTER I + 'j', '=', '\u0439', // 1081 й CYRILLIC SMALL LETTER SHORT I + 'k', '=', '\u043a', // 1082 к CYRILLIC SMALL LETTER KA + 'l', '=', '\u043b', // 1083 л CYRILLIC SMALL LETTER EL + 'm', '=', '\u043c', // 1084 м CYRILLIC SMALL LETTER EM + 'n', '=', '\u043d', // 1085 н CYRILLIC SMALL LETTER EN + 'o', '=', '\u043e', // 1086 о CYRILLIC SMALL LETTER O + 'p', '=', '\u043f', // 1087 п CYRILLIC SMALL LETTER PE + 'r', '=', '\u0440', // 1088 р CYRILLIC SMALL LETTER ER + 's', '=', '\u0441', // 1089 с CYRILLIC SMALL LETTER ES + 't', '=', '\u0442', // 1090 т CYRILLIC SMALL LETTER TE + 'u', '=', '\u0443', // 1091 у CYRILLIC SMALL LETTER U + 'f', '=', '\u0444', // 1092 ф CYRILLIC SMALL LETTER EF + 'h', '=', '\u0445', // 1093 х CYRILLIC SMALL LETTER HA + 'c', '=', '\u0446', // 1094 ц CYRILLIC SMALL LETTER TSE + 'c', '%', '\u0447', // 1095 ч CYRILLIC SMALL LETTER CHE + 's', '%', '\u0448', // 1096 ш CYRILLIC SMALL LETTER SHA + 's', 'c', '\u0449', // 1097 щ CYRILLIC SMALL LETTER SHCHA + '=', '\'', '\u044a', // 1098 ъ CYRILLIC SMALL LETTER HARD SIGN + 'y', '=', '\u044b', // 1099 ы CYRILLIC SMALL LETTER YERU + '%', '\'', '\u044c', // 1100 ь CYRILLIC SMALL LETTER SOFT SIGN + 'j', 'e', '\u044d', // 1101 э CYRILLIC SMALL LETTER E + 'j', 'u', '\u044e', // 1102 ю CYRILLIC SMALL LETTER YU + 'j', 'a', '\u044f', // 1103 я CYRILLIC SMALL LETTER YA + 'i', 'o', '\u0451', // 1105 ё CYRILLIC SMALL LETTER IO + 'd', '%', '\u0452', // 1106 ђ CYRILLIC SMALL LETTER DJE (Serbocroatian) + 'g', '%', '\u0453', // 1107 ѓ CYRILLIC SMALL LETTER GJE (Macedonian) + 'i', 'e', '\u0454', // 1108 є CYRILLIC SMALL LETTER UKRAINIAN IE + 'd', 's', '\u0455', // 1109 ѕ CYRILLIC SMALL LETTER DZE (Macedonian) + 'i', 'i', '\u0456', // 1110 і CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + 'y', 'i', '\u0457', // 1111 ї CYRILLIC SMALL LETTER YI (Ukrainian) + 'j', '%', '\u0458', // 1112 ј CYRILLIC SMALL LETTER JE + 'l', 'j', '\u0459', // 1113 љ CYRILLIC SMALL LETTER LJE + 'n', 'j', '\u045a', // 1114 њ CYRILLIC SMALL LETTER NJE + 't', 's', '\u045b', // 1115 ћ CYRILLIC SMALL LETTER TSHE (Serbocroatian) + 'k', 'j', '\u045c', // 1116 ќ CYRILLIC SMALL LETTER KJE (Macedonian) + 'v', '%', '\u045e', // 1118 ў CYRILLIC SMALL LETTER SHORT U (Byelorussian) + 'd', 'z', '\u045f', // 1119 џ CYRILLIC SMALL LETTER DZHE + 'Y', '3', '\u0462', // 1122 Ѣ CYRILLIC CAPITAL LETTER YAT + 'y', '3', '\u0463', // 1123 ѣ CYRILLIC SMALL LETTER YAT + 'O', '3', '\u046a', // 1130 Ѫ CYRILLIC CAPITAL LETTER BIG YUS + 'o', '3', '\u046b', // 1131 ѫ CYRILLIC SMALL LETTER BIG YUS + 'F', '3', '\u0472', // 1138 Ѳ CYRILLIC CAPITAL LETTER FITA + 'f', '3', '\u0473', // 1139 ѳ CYRILLIC SMALL LETTER FITA + 'V', '3', '\u0474', // 1140 Ѵ CYRILLIC CAPITAL LETTER IZHITSA + 'v', '3', '\u0475', // 1141 ѵ CYRILLIC SMALL LETTER IZHITSA + 'C', '3', '\u0480', // 1152 Ҁ CYRILLIC CAPITAL LETTER KOPPA + 'c', '3', '\u0481', // 1153 ҁ CYRILLIC SMALL LETTER KOPPA + 'G', '3', '\u0490', // 1168 Ґ CYRILLIC CAPITAL LETTER GHE WITH UPTURN + 'g', '3', '\u0491', // 1169 ґ CYRILLIC SMALL LETTER GHE WITH UPTURN + 'A', '+', '\u05d0', // 1488 א HEBREW LETTER ALEF + 'B', '+', '\u05d1', // 1489 ב HEBREW LETTER BET + 'G', '+', '\u05d2', // 1490 ג HEBREW LETTER GIMEL + 'D', '+', '\u05d3', // 1491 ד HEBREW LETTER DALET + 'H', '+', '\u05d4', // 1492 ה HEBREW LETTER HE + 'W', '+', '\u05d5', // 1493 ו HEBREW LETTER VAV + 'Z', '+', '\u05d6', // 1494 ז HEBREW LETTER ZAYIN + 'X', '+', '\u05d7', // 1495 ח HEBREW LETTER HET + 'T', 'j', '\u05d8', // 1496 ט HEBREW LETTER TET + 'J', '+', '\u05d9', // 1497 י HEBREW LETTER YOD + 'K', '%', '\u05da', // 1498 ך HEBREW LETTER FINAL KAF + 'K', '+', '\u05db', // 1499 כ HEBREW LETTER KAF + 'L', '+', '\u05dc', // 1500 ל HEBREW LETTER LAMED + 'M', '%', '\u05dd', // 1501 ם HEBREW LETTER FINAL MEM + 'M', '+', '\u05de', // 1502 מ HEBREW LETTER MEM + 'N', '%', '\u05df', // 1503 ן HEBREW LETTER FINAL NUN ` + 'N', '+', '\u05e0', // 1504 נ HEBREW LETTER NUN ` + 'S', '+', '\u05e1', // 1505 ס HEBREW LETTER SAMEKH + 'E', '+', '\u05e2', // 1506 ע HEBREW LETTER AYIN + 'P', '%', '\u05e3', // 1507 ף HEBREW LETTER FINAL PE + 'P', '+', '\u05e4', // 1508 פ HEBREW LETTER PE + 'Z', 'j', '\u05e5', // 1509 ץ HEBREW LETTER FINAL TSADI + 'Z', 'J', '\u05e6', // 1510 צ HEBREW LETTER TSADI + 'Q', '+', '\u05e7', // 1511 ק HEBREW LETTER QOF + 'R', '+', '\u05e8', // 1512 ר HEBREW LETTER RESH + 'S', 'h', '\u05e9', // 1513 ש HEBREW LETTER SHIN + 'T', '+', '\u05ea', // 1514 ת HEBREW LETTER TAV + ',', '+', '\u060c', // 1548 ، ARABIC COMMA + ';', '+', '\u061b', // 1563 ؛ ARABIC SEMICOLON + '?', '+', '\u061f', // 1567 ؟ ARABIC QUESTION MARK + 'H', '\'', '\u0621', // 1569 ء ARABIC LETTER HAMZA + 'a', 'M', '\u0622', // 1570 آ ARABIC LETTER ALEF WITH MADDA ABOVE + 'a', 'H', '\u0623', // 1571 أ ARABIC LETTER ALEF WITH HAMZA ABOVE + 'w', 'H', '\u0624', // 1572 ؤ ARABIC LETTER WAW WITH HAMZA ABOVE + 'a', 'h', '\u0625', // 1573 إ ARABIC LETTER ALEF WITH HAMZA BELOW + 'y', 'H', '\u0626', // 1574 ئ ARABIC LETTER YEH WITH HAMZA ABOVE + 'a', '+', '\u0627', // 1575 ا ARABIC LETTER ALEF + 'b', '+', '\u0628', // 1576 ب ARABIC LETTER BEH + 't', 'm', '\u0629', // 1577 ة ARABIC LETTER TEH MARBUTA + 't', '+', '\u062a', // 1578 ت ARABIC LETTER TEH + 't', 'k', '\u062b', // 1579 ث ARABIC LETTER THEH + 'g', '+', '\u062c', // 1580 ج ARABIC LETTER JEEM + 'h', 'k', '\u062d', // 1581 ح ARABIC LETTER HAH + 'x', '+', '\u062e', // 1582 خ ARABIC LETTER KHAH + 'd', '+', '\u062f', // 1583 د ARABIC LETTER DAL + 'd', 'k', '\u0630', // 1584 ذ ARABIC LETTER THAL + 'r', '+', '\u0631', // 1585 ر ARABIC LETTER REH + 'z', '+', '\u0632', // 1586 ز ARABIC LETTER ZAIN + 's', '+', '\u0633', // 1587 س ARABIC LETTER SEEN + 's', 'n', '\u0634', // 1588 ش ARABIC LETTER SHEEN + 'c', '+', '\u0635', // 1589 ص ARABIC LETTER SAD + 'd', 'd', '\u0636', // 1590 ض ARABIC LETTER DAD + 't', 'j', '\u0637', // 1591 ط ARABIC LETTER TAH + 'z', 'H', '\u0638', // 1592 ظ ARABIC LETTER ZAH + 'e', '+', '\u0639', // 1593 ع ARABIC LETTER AIN + 'i', '+', '\u063a', // 1594 غ ARABIC LETTER GHAIN + '+', '+', '\u0640', // 1600 ـ ARABIC TATWEEL + 'f', '+', '\u0641', // 1601 ف ARABIC LETTER FEH + 'q', '+', '\u0642', // 1602 ق ARABIC LETTER QAF + 'k', '+', '\u0643', // 1603 ك ARABIC LETTER KAF + 'l', '+', '\u0644', // 1604 ل ARABIC LETTER LAM + 'm', '+', '\u0645', // 1605 م ARABIC LETTER MEEM + 'n', '+', '\u0646', // 1606 ن ARABIC LETTER NOON + 'h', '+', '\u0647', // 1607 ه ARABIC LETTER HEH + 'w', '+', '\u0648', // 1608 و ARABIC LETTER WAW + 'j', '+', '\u0649', // 1609 ى ARABIC LETTER ALEF MAKSURA + 'y', '+', '\u064a', // 1610 ي ARABIC LETTER YEH + ':', '+', '\u064b', // 1611 ً ARABIC FATHATAN + '"', '+', '\u064c', // 1612 ٌ ARABIC DAMMATAN + '=', '+', '\u064d', // 1613 ٍ ARABIC KASRATAN + '/', '+', '\u064e', // 1614 َ ARABIC FATHA + '\'', '+', '\u064f', // 1615 ُ ARABIC DAMMA + '1', '+', '\u0650', // 1616 ِ ARABIC KASRA + '3', '+', '\u0651', // 1617 ّ ARABIC SHADDA + '0', '+', '\u0652', // 1618 ْ ARABIC SUKUN + 'a', 'S', '\u0670', // 1648 ٰ SUPERSCRIPT ARABIC LETTER ALEF + 'p', '+', '\u067e', // 1662 پ ARABIC LETTER PEH + 'v', '+', '\u06a4', // 1700 ڤ ARABIC LETTER VEH + 'g', 'f', '\u06af', // 1711 گ ARABIC LETTER GAF + '0', 'a', '\u06f0', // 1776 ۰ EASTERN ARABIC-INDIC DIGIT ZERO + '1', 'a', '\u06f1', // 1777 ۱ EASTERN ARABIC-INDIC DIGIT ONE + '2', 'a', '\u06f2', // 1778 ۲ EASTERN ARABIC-INDIC DIGIT TWO + '3', 'a', '\u06f3', // 1779 ۳ EASTERN ARABIC-INDIC DIGIT THREE + '4', 'a', '\u06f4', // 1780 ۴ EASTERN ARABIC-INDIC DIGIT FOUR + '5', 'a', '\u06f5', // 1781 ۵ EASTERN ARABIC-INDIC DIGIT FIVE + '6', 'a', '\u06f6', // 1782 ۶ EASTERN ARABIC-INDIC DIGIT SIX + '7', 'a', '\u06f7', // 1783 ۷ EASTERN ARABIC-INDIC DIGIT SEVEN + '8', 'a', '\u06f8', // 1784 ۸ EASTERN ARABIC-INDIC DIGIT EIGHT + '9', 'a', '\u06f9', // 1785 ۹ EASTERN ARABIC-INDIC DIGIT NINE + 'B', '.', '\u1e02', // 7682 Ḃ LATIN CAPITAL LETTER B WITH DOT ABOVE + 'b', '.', '\u1e03', // 7683 ḃ LATIN SMALL LETTER B WITH DOT ABOVE + 'B', '_', '\u1e06', // 7686 Ḇ LATIN CAPITAL LETTER B WITH LINE BELOW + 'b', '_', '\u1e07', // 7687 ḇ LATIN SMALL LETTER B WITH LINE BELOW + 'D', '.', '\u1e0a', // 7690 Ḋ LATIN CAPITAL LETTER D WITH DOT ABOVE + 'd', '.', '\u1e0b', // 7691 ḋ LATIN SMALL LETTER D WITH DOT ABOVE + 'D', '_', '\u1e0e', // 7694 Ḏ LATIN CAPITAL LETTER D WITH LINE BELOW + 'd', '_', '\u1e0f', // 7695 ḏ LATIN SMALL LETTER D WITH LINE BELOW + 'D', ',', '\u1e10', // 7696 Ḑ LATIN CAPITAL LETTER D WITH CEDILLA + 'd', ',', '\u1e11', // 7697 ḑ LATIN SMALL LETTER D WITH CEDILLA + 'F', '.', '\u1e1e', // 7710 Ḟ LATIN CAPITAL LETTER F WITH DOT ABOVE + 'f', '.', '\u1e1f', // 7711 ḟ LATIN SMALL LETTER F WITH DOT ABOVE + 'G', '-', '\u1e20', // 7712 Ḡ LATIN CAPITAL LETTER G WITH MACRON + 'g', '-', '\u1e21', // 7713 ḡ LATIN SMALL LETTER G WITH MACRON + 'H', '.', '\u1e22', // 7714 Ḣ LATIN CAPITAL LETTER H WITH DOT ABOVE + 'h', '.', '\u1e23', // 7715 ḣ LATIN SMALL LETTER H WITH DOT ABOVE + 'H', ':', '\u1e26', // 7718 Ḧ LATIN CAPITAL LETTER H WITH DIAERESIS + 'h', ':', '\u1e27', // 7719 ḧ LATIN SMALL LETTER H WITH DIAERESIS + 'H', ',', '\u1e28', // 7720 Ḩ LATIN CAPITAL LETTER H WITH CEDILLA + 'h', ',', '\u1e29', // 7721 ḩ LATIN SMALL LETTER H WITH CEDILLA + 'K', '\'', '\u1e30', // 7728 Ḱ LATIN CAPITAL LETTER K WITH ACUTE + 'k', '\'', '\u1e31', // 7729 ḱ LATIN SMALL LETTER K WITH ACUTE + 'K', '_', '\u1e34', // 7732 Ḵ LATIN CAPITAL LETTER K WITH LINE BELOW + 'k', '_', '\u1e35', // 7733 ḵ LATIN SMALL LETTER K WITH LINE BELOW + 'L', '_', '\u1e3a', // 7738 Ḻ LATIN CAPITAL LETTER L WITH LINE BELOW + 'l', '_', '\u1e3b', // 7739 ḻ LATIN SMALL LETTER L WITH LINE BELOW + 'M', '\'', '\u1e3e', // 7742 Ḿ LATIN CAPITAL LETTER M WITH ACUTE + 'm', '\'', '\u1e3f', // 7743 ḿ LATIN SMALL LETTER M WITH ACUTE + 'M', '.', '\u1e40', // 7744 Ṁ LATIN CAPITAL LETTER M WITH DOT ABOVE + 'm', '.', '\u1e41', // 7745 ṁ LATIN SMALL LETTER M WITH DOT ABOVE + 'N', '.', '\u1e44', // 7748 Ṅ LATIN CAPITAL LETTER N WITH DOT ABOVE + 'n', '.', '\u1e45', // 7749 ṅ LATIN SMALL LETTER N WITH DOT ABOVE + 'N', '_', '\u1e48', // 7752 Ṉ LATIN CAPITAL LETTER N WITH LINE BELOW + 'n', '_', '\u1e49', // 7753 ṉ LATIN SMALL LETTER N WITH LINE BELOW + 'P', '\'', '\u1e54', // 7764 Ṕ LATIN CAPITAL LETTER P WITH ACUTE + 'p', '\'', '\u1e55', // 7765 ṕ LATIN SMALL LETTER P WITH ACUTE + 'P', '.', '\u1e56', // 7766 Ṗ LATIN CAPITAL LETTER P WITH DOT ABOVE + 'p', '.', '\u1e57', // 7767 ṗ LATIN SMALL LETTER P WITH DOT ABOVE + 'R', '.', '\u1e58', // 7768 Ṙ LATIN CAPITAL LETTER R WITH DOT ABOVE + 'r', '.', '\u1e59', // 7769 ṙ LATIN SMALL LETTER R WITH DOT ABOVE + 'R', '_', '\u1e5e', // 7774 Ṟ LATIN CAPITAL LETTER R WITH LINE BELOW + 'r', '_', '\u1e5f', // 7775 ṟ LATIN SMALL LETTER R WITH LINE BELOW + 'S', '.', '\u1e60', // 7776 Ṡ LATIN CAPITAL LETTER S WITH DOT ABOVE + 's', '.', '\u1e61', // 7777 ṡ LATIN SMALL LETTER S WITH DOT ABOVE + 'T', '.', '\u1e6a', // 7786 Ṫ LATIN CAPITAL LETTER T WITH DOT ABOVE + 't', '.', '\u1e6b', // 7787 ṫ LATIN SMALL LETTER T WITH DOT ABOVE + 'T', '_', '\u1e6e', // 7790 Ṯ LATIN CAPITAL LETTER T WITH LINE BELOW + 't', '_', '\u1e6f', // 7791 ṯ LATIN SMALL LETTER T WITH LINE BELOW + 'V', '?', '\u1e7c', // 7804 Ṽ LATIN CAPITAL LETTER V WITH TILDE + 'v', '?', '\u1e7d', // 7805 ṽ LATIN SMALL LETTER V WITH TILDE + 'W', '!', '\u1e80', // 7808 Ẁ LATIN CAPITAL LETTER W WITH GRAVE + 'w', '!', '\u1e81', // 7809 ẁ LATIN SMALL LETTER W WITH GRAVE + 'W', '\'', '\u1e82', // 7810 Ẃ LATIN CAPITAL LETTER W WITH ACUTE + 'w', '\'', '\u1e83', // 7811 ẃ LATIN SMALL LETTER W WITH ACUTE + 'W', ':', '\u1e84', // 7812 Ẅ LATIN CAPITAL LETTER W WITH DIAERESIS + 'w', ':', '\u1e85', // 7813 ẅ LATIN SMALL LETTER W WITH DIAERESIS + 'W', '.', '\u1e86', // 7814 Ẇ LATIN CAPITAL LETTER W WITH DOT ABOVE + 'w', '.', '\u1e87', // 7815 ẇ LATIN SMALL LETTER W WITH DOT ABOVE + 'X', '.', '\u1e8a', // 7818 Ẋ LATIN CAPITAL LETTER X WITH DOT ABOVE + 'x', '.', '\u1e8b', // 7819 ẋ LATIN SMALL LETTER X WITH DOT ABOVE + 'X', ':', '\u1e8c', // 7820 Ẍ LATIN CAPITAL LETTER X WITH DIAERESIS + 'x', ':', '\u1e8d', // 7821 ẍ LATIN SMALL LETTER X WITH DIAERESIS + 'Y', '.', '\u1e8e', // 7822 Ẏ LATIN CAPITAL LETTER Y WITH DOT ABOVE + 'y', '.', '\u1e8f', // 7823 ẏ LATIN SMALL LETTER Y WITH DOT ABOVE + 'Z', '>', '\u1e90', // 7824 Ẑ LATIN CAPITAL LETTER Z WITH CIRCUMFLEX + 'z', '>', '\u1e91', // 7825 ẑ LATIN SMALL LETTER Z WITH CIRCUMFLEX + 'Z', '_', '\u1e94', // 7828 Ẕ LATIN CAPITAL LETTER Z WITH LINE BELOW + 'z', '_', '\u1e95', // 7829 ẕ LATIN SMALL LETTER Z WITH LINE BELOW + 'h', '_', '\u1e96', // 7830 ẖ LATIN SMALL LETTER H WITH LINE BELOW + 't', ':', '\u1e97', // 7831 ẗ LATIN SMALL LETTER T WITH DIAERESIS + 'w', '0', '\u1e98', // 7832 ẘ LATIN SMALL LETTER W WITH RING ABOVE + 'y', '0', '\u1e99', // 7833 ẙ LATIN SMALL LETTER Y WITH RING ABOVE + 'A', '2', '\u1ea2', // 7842 Ả LATIN CAPITAL LETTER A WITH HOOK ABOVE + 'a', '2', '\u1ea3', // 7843 ả LATIN SMALL LETTER A WITH HOOK ABOVE + 'E', '2', '\u1eba', // 7866 Ẻ LATIN CAPITAL LETTER E WITH HOOK ABOVE + 'e', '2', '\u1ebb', // 7867 ẻ LATIN SMALL LETTER E WITH HOOK ABOVE + 'E', '?', '\u1ebc', // 7868 Ẽ LATIN CAPITAL LETTER E WITH TILDE + 'e', '?', '\u1ebd', // 7869 ẽ LATIN SMALL LETTER E WITH TILDE + 'I', '2', '\u1ec8', // 7880 Ỉ LATIN CAPITAL LETTER I WITH HOOK ABOVE + 'i', '2', '\u1ec9', // 7881 ỉ LATIN SMALL LETTER I WITH HOOK ABOVE + 'O', '2', '\u1ece', // 7886 Ỏ LATIN CAPITAL LETTER O WITH HOOK ABOVE + 'o', '2', '\u1ecf', // 7887 ỏ LATIN SMALL LETTER O WITH HOOK ABOVE + 'U', '2', '\u1ee6', // 7910 Ủ LATIN CAPITAL LETTER U WITH HOOK ABOVE + 'u', '2', '\u1ee7', // 7911 ủ LATIN SMALL LETTER U WITH HOOK ABOVE + 'Y', '!', '\u1ef2', // 7922 Ỳ LATIN CAPITAL LETTER Y WITH GRAVE + 'y', '!', '\u1ef3', // 7923 ỳ LATIN SMALL LETTER Y WITH GRAVE + 'Y', '2', '\u1ef6', // 7926 Ỷ LATIN CAPITAL LETTER Y WITH HOOK ABOVE + 'y', '2', '\u1ef7', // 7927 ỷ LATIN SMALL LETTER Y WITH HOOK ABOVE + 'Y', '?', '\u1ef8', // 7928 Ỹ LATIN CAPITAL LETTER Y WITH TILDE + 'y', '?', '\u1ef9', // 7929 ỹ LATIN SMALL LETTER Y WITH TILDE + ';', '\'', '\u1f00', // 7936 ἀ GREEK DASIA AND ACUTE ACCENT + ',', '\'', '\u1f01', // 7937 ἁ GREEK PSILI AND ACUTE ACCENT + ';', '!', '\u1f02', // 7938 ἂ GREEK DASIA AND VARIA + ',', '!', '\u1f03', // 7939 ἃ GREEK PSILI AND VARIA + '?', ';', '\u1f04', // 7940 ἄ GREEK DASIA AND PERISPOMENI + '?', ',', '\u1f05', // 7941 ἅ GREEK PSILI AND PERISPOMENI + '!', ':', '\u1f06', // 7942 ἆ GREEK DIAERESIS AND VARIA + '?', ':', '\u1f07', // 7943 ἇ GREEK DIAERESIS AND PERISPOMENI + '1', 'N', '\u2002', // 8194   EN SPACE + '1', 'M', '\u2003', // 8195   EM SPACE + '3', 'M', '\u2004', // 8196   THREE-PER-EM SPACE + '4', 'M', '\u2005', // 8197   FOUR-PER-EM SPACE + '6', 'M', '\u2006', // 8198   SIX-PER-EM SPACE + '1', 'T', '\u2009', // 8201   THIN SPACE + '1', 'H', '\u200a', // 8202   HAIR SPACE + '-', '1', '\u2010', // 8208 ‐ HYPHEN + '-', 'N', '\u2013', // 8211 – EN DASH + '-', 'M', '\u2014', // 8212 — EM DASH + '-', '3', '\u2015', // 8213 ― HORIZONTAL BAR + '!', '2', '\u2016', // 8214 ‖ DOUBLE VERTICAL LINE + '=', '2', '\u2017', // 8215 ‗ DOUBLE LOW LINE + '\'', '6', '\u2018', // 8216 ‘ LEFT SINGLE QUOTATION MARK + '\'', '9', '\u2019', // 8217 ’ RIGHT SINGLE QUOTATION MARK + '.', '9', '\u201a', // 8218 ‚ SINGLE LOW-9 QUOTATION MARK + '9', '\'', '\u201b', // 8219 ‛ SINGLE HIGH-REVERSED-9 QUOTATION MARK + '"', '6', '\u201c', // 8220 “ LEFT DOUBLE QUOTATION MARK + '"', '9', '\u201d', // 8221 ” RIGHT DOUBLE QUOTATION MARK + ':', '9', '\u201e', // 8222 „ DOUBLE LOW-9 QUOTATION MARK + '9', '"', '\u201f', // 8223 ‟ DOUBLE HIGH-REVERSED-9 QUOTATION MARK + '/', '-', '\u2020', // 8224 † DAGGER + '/', '=', '\u2021', // 8225 ‡ DOUBLE DAGGER + '.', '.', '\u2025', // 8229 ‥ TWO DOT LEADER + ',', '.', '\u2026', // 8230 … ELLIPSIS + '%', '0', '\u2030', // 8240 ‰ PER MILLE SIGN + '1', '\'', '\u2032', // 8242 ′ PRIME + '2', '\'', '\u2033', // 8243 ″ DOUBLE PRIME + '3', '\'', '\u2034', // 8244 ‴ TRIPLE PRIME + '1', '"', '\u2035', // 8245 ‵ REVERSED PRIME + '2', '"', '\u2036', // 8246 ‶ REVERSED DOUBLE PRIME + '3', '"', '\u2037', // 8247 ‷ REVERSED TRIPLE PRIME + 'C', 'a', '\u2038', // 8248 ‸ CARET + '<', '1', '\u2039', // 8249 ‹ SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '>', '1', '\u203a', // 8250 › SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + ':', 'X', '\u203b', // 8251 ※ REFERENCE MARK + '\'', '-', '\u203e', // 8254 ‾ OVERLINE + '/', 'f', '\u2044', // 8260 ⁄ FRACTION SLASH + '0', 'S', '\u2070', // 8304 ⁰ SUPERSCRIPT DIGIT ZERO + '4', 'S', '\u2074', // 8308 ⁴ SUPERSCRIPT DIGIT FOUR + '5', 'S', '\u2075', // 8309 ⁵ SUPERSCRIPT DIGIT FIVE + '6', 'S', '\u2076', // 8310 ⁶ SUPERSCRIPT DIGIT SIX + '7', 'S', '\u2077', // 8311 ⁷ SUPERSCRIPT DIGIT SEVEN + '8', 'S', '\u2078', // 8312 ⁸ SUPERSCRIPT DIGIT EIGHT + '9', 'S', '\u2079', // 8313 ⁹ SUPERSCRIPT DIGIT NINE + '+', 'S', '\u207a', // 8314 ⁺ SUPERSCRIPT PLUS SIGN + '-', 'S', '\u207b', // 8315 ⁻ SUPERSCRIPT MINUS + '=', 'S', '\u207c', // 8316 ⁼ SUPERSCRIPT EQUALS SIGN + '(', 'S', '\u207d', // 8317 ⁽ SUPERSCRIPT LEFT PARENTHESIS + ')', 'S', '\u207e', // 8318 ⁾ SUPERSCRIPT RIGHT PARENTHESIS + 'n', 'S', '\u207f', // 8319 ⁿ SUPERSCRIPT LATIN SMALL LETTER N + '0', 's', '\u2080', // 8320 ₀ SUBSCRIPT DIGIT ZERO + '1', 's', '\u2081', // 8321 ₁ SUBSCRIPT DIGIT ONE + '2', 's', '\u2082', // 8322 ₂ SUBSCRIPT DIGIT TWO + '3', 's', '\u2083', // 8323 ₃ SUBSCRIPT DIGIT THREE + '4', 's', '\u2084', // 8324 ₄ SUBSCRIPT DIGIT FOUR + '5', 's', '\u2085', // 8325 ₅ SUBSCRIPT DIGIT FIVE + '6', 's', '\u2086', // 8326 ₆ SUBSCRIPT DIGIT SIX + '7', 's', '\u2087', // 8327 ₇ SUBSCRIPT DIGIT SEVEN + '8', 's', '\u2088', // 8328 ₈ SUBSCRIPT DIGIT EIGHT + '9', 's', '\u2089', // 8329 ₉ SUBSCRIPT DIGIT NINE + '+', 's', '\u208a', // 8330 ₊ SUBSCRIPT PLUS SIGN + '-', 's', '\u208b', // 8331 ₋ SUBSCRIPT MINUS + '=', 's', '\u208c', // 8332 ₌ SUBSCRIPT EQUALS SIGN + '(', 's', '\u208d', // 8333 ₍ SUBSCRIPT LEFT PARENTHESIS + ')', 's', '\u208e', // 8334 ₎ SUBSCRIPT RIGHT PARENTHESIS + 'L', 'i', '\u20a4', // 8356 ₤ LIRA SIGN + 'P', 't', '\u20a7', // 8359 ₧ PESETA SIGN + 'W', '=', '\u20a9', // 8361 ₩ WON SIGN + 'o', 'C', '\u2103', // 8451 ℃ DEGREE CENTIGRADE + 'c', 'o', '\u2105', // 8453 ℅ CARE OF + 'o', 'F', '\u2109', // 8457 ℉ DEGREE FAHRENHEIT + 'N', '0', '\u2116', // 8470 № NUMERO SIGN + 'P', 'O', '\u2117', // 8471 ℗ SOUND RECORDING COPYRIGHT + 'R', 'x', '\u211e', // 8478 ℞ PRESCRIPTION TAKE + 'S', 'M', '\u2120', // 8480 ℠ SERVICE MARK + 'T', 'M', '\u2122', // 8482 ™ TRADE MARK SIGN + 'O', 'm', '\u2126', // 8486 Ω OHM SIGN + 'A', 'O', '\u212b', // 8491 Å ANGSTROEM SIGN + '1', '3', '\u2153', // 8531 ⅓ VULGAR FRACTION ONE THIRD + '2', '3', '\u2154', // 8532 ⅔ VULGAR FRACTION TWO THIRDS + '1', '5', '\u2155', // 8533 ⅕ VULGAR FRACTION ONE FIFTH + '2', '5', '\u2156', // 8534 ⅖ VULGAR FRACTION TWO FIFTHS + '3', '5', '\u2157', // 8535 ⅗ VULGAR FRACTION THREE FIFTHS + '4', '5', '\u2158', // 8536 ⅘ VULGAR FRACTION FOUR FIFTHS + '1', '6', '\u2159', // 8537 ⅙ VULGAR FRACTION ONE SIXTH + '5', '6', '\u215a', // 8538 ⅚ VULGAR FRACTION FIVE SIXTHS + '1', '8', '\u215b', // 8539 ⅛ VULGAR FRACTION ONE EIGHTH + '3', '8', '\u215c', // 8540 ⅜ VULGAR FRACTION THREE EIGHTHS + '5', '8', '\u215d', // 8541 ⅝ VULGAR FRACTION FIVE EIGHTHS + '7', '8', '\u215e', // 8542 ⅞ VULGAR FRACTION SEVEN EIGHTHS + '1', 'R', '\u2160', // 8544 Ⅰ ROMAN NUMERAL ONE + '2', 'R', '\u2161', // 8545 Ⅱ ROMAN NUMERAL TWO + '3', 'R', '\u2162', // 8546 Ⅲ ROMAN NUMERAL THREE + '4', 'R', '\u2163', // 8547 Ⅳ ROMAN NUMERAL FOUR + '5', 'R', '\u2164', // 8548 Ⅴ ROMAN NUMERAL FIVE + '6', 'R', '\u2165', // 8549 Ⅵ ROMAN NUMERAL SIX + '7', 'R', '\u2166', // 8550 Ⅶ ROMAN NUMERAL SEVEN + '8', 'R', '\u2167', // 8551 Ⅷ ROMAN NUMERAL EIGHT + '9', 'R', '\u2168', // 8552 Ⅸ ROMAN NUMERAL NINE + 'a', 'R', '\u2169', // 8553 Ⅹ ROMAN NUMERAL TEN + 'b', 'R', '\u216a', // 8554 Ⅺ ROMAN NUMERAL ELEVEN + 'c', 'R', '\u216b', // 8555 Ⅻ ROMAN NUMERAL TWELVE + '1', 'r', '\u2170', // 8560 ⅰ SMALL ROMAN NUMERAL ONE + '2', 'r', '\u2171', // 8561 ⅱ SMALL ROMAN NUMERAL TWO + '3', 'r', '\u2172', // 8562 ⅲ SMALL ROMAN NUMERAL THREE + '4', 'r', '\u2173', // 8563 ⅳ SMALL ROMAN NUMERAL FOUR + '5', 'r', '\u2174', // 8564 ⅴ SMALL ROMAN NUMERAL FIVE + '6', 'r', '\u2175', // 8565 ⅵ SMALL ROMAN NUMERAL SIX + '7', 'r', '\u2176', // 8566 ⅶ SMALL ROMAN NUMERAL SEVEN + '8', 'r', '\u2177', // 8567 ⅷ SMALL ROMAN NUMERAL EIGHT + '9', 'r', '\u2178', // 8568 ⅸ SMALL ROMAN NUMERAL NINE + 'a', 'r', '\u2179', // 8569 ⅹ SMALL ROMAN NUMERAL TEN + 'b', 'r', '\u217a', // 8570 ⅺ SMALL ROMAN NUMERAL ELEVEN + 'c', 'r', '\u217b', // 8571 ⅻ SMALL ROMAN NUMERAL TWELVE + '<', '-', '\u2190', // 8592 ← LEFTWARDS ARROW + '-', '!', '\u2191', // 8593 ↑ UPWARDS ARROW + '-', '>', '\u2192', // 8594 → RIGHTWARDS ARROW + '-', 'v', '\u2193', // 8595 ↓ DOWNWARDS ARROW + '<', '>', '\u2194', // 8596 ↔ LEFT RIGHT ARROW + 'U', 'D', '\u2195', // 8597 ↕ UP DOWN ARROW + '<', '=', '\u21d0', // 8656 ⇐ LEFTWARDS DOUBLE ARROW + '=', '>', '\u21d2', // 8658 ⇒ RIGHTWARDS DOUBLE ARROW + '=', '=', '\u21d4', // 8660 ⇔ LEFT RIGHT DOUBLE ARROW + 'F', 'A', '\u2200', // 8704 ∀ FOR ALL + 'd', 'P', '\u2202', // 8706 ∂ PARTIAL DIFFERENTIAL + 'T', 'E', '\u2203', // 8707 ∃ THERE EXISTS + '/', '0', '\u2205', // 8709 ∅ EMPTY SET + 'D', 'E', '\u2206', // 8710 ∆ INCREMENT + 'N', 'B', '\u2207', // 8711 ∇ NABLA + '(', '-', '\u2208', // 8712 ∈ ELEMENT OF + '-', ')', '\u220b', // 8715 ∋ CONTAINS AS MEMBER + '*', 'P', '\u220f', // 8719 ∏ N-ARY PRODUCT + '+', 'Z', '\u2211', // 8721 ∑ N-ARY SUMMATION + '-', '2', '\u2212', // 8722 − MINUS SIGN + '-', '+', '\u2213', // 8723 ∓ MINUS-OR-PLUS SIGN + '*', '-', '\u2217', // 8727 ∗ ASTERISK OPERATOR + 'O', 'b', '\u2218', // 8728 ∘ RING OPERATOR + 'S', 'b', '\u2219', // 8729 ∙ BULLET OPERATOR + 'R', 'T', '\u221a', // 8730 √ SQUARE ROOT + '0', '(', '\u221d', // 8733 ∝ PROPORTIONAL TO + '0', '0', '\u221e', // 8734 ∞ INFINITY + '-', 'L', '\u221f', // 8735 ∟ RIGHT ANGLE + '-', 'V', '\u2220', // 8736 ∠ ANGLE + 'P', 'P', '\u2225', // 8741 ∥ PARALLEL TO + 'A', 'N', '\u2227', // 8743 ∧ LOGICAL AND + 'O', 'R', '\u2228', // 8744 ∨ LOGICAL OR + '(', 'U', '\u2229', // 8745 ∩ INTERSECTION + ')', 'U', '\u222a', // 8746 ∪ UNION + 'I', 'n', '\u222b', // 8747 ∫ INTEGRAL + 'D', 'I', '\u222c', // 8748 ∬ DOUBLE INTEGRAL + 'I', 'o', '\u222e', // 8750 ∮ CONTOUR INTEGRAL + '.', ':', '\u2234', // 8756 ∴ THEREFORE + ':', '.', '\u2235', // 8757 ∵ BECAUSE + ':', 'R', '\u2236', // 8758 ∶ RATIO + ':', ':', '\u2237', // 8759 ∷ PROPORTION + '?', '1', '\u223c', // 8764 ∼ TILDE OPERATOR + 'C', 'G', '\u223e', // 8766 ∾ INVERTED LAZY S + '?', '-', '\u2243', // 8771 ≃ ASYMPTOTICALLY EQUAL TO + '?', '=', '\u2245', // 8773 ≅ APPROXIMATELY EQUAL TO + '?', '2', '\u2248', // 8776 ≈ ALMOST EQUAL TO + '=', '?', '\u224c', // 8780 ≌ ALL EQUAL TO + 'H', 'I', '\u2253', // 8787 ≓ IMAGE OF OR APPROXIMATELY EQUAL TO + '!', '=', '\u2260', // 8800 ≠ NOT EQUAL TO + '=', '3', '\u2261', // 8801 ≡ IDENTICAL TO + '=', '<', '\u2264', // 8804 ≤ LESS-THAN OR EQUAL TO + '>', '=', '\u2265', // 8805 ≥ GREATER-THAN OR EQUAL TO + '<', '*', '\u226a', // 8810 ≪ MUCH LESS-THAN + '*', '>', '\u226b', // 8811 ≫ MUCH GREATER-THAN + '!', '<', '\u226e', // 8814 ≮ NOT LESS-THAN + '!', '>', '\u226f', // 8815 ≯ NOT GREATER-THAN + '(', 'C', '\u2282', // 8834 ⊂ SUBSET OF + ')', 'C', '\u2283', // 8835 ⊃ SUPERSET OF + '(', '_', '\u2286', // 8838 ⊆ SUBSET OF OR EQUAL TO + ')', '_', '\u2287', // 8839 ⊇ SUPERSET OF OR EQUAL TO + '0', '.', '\u2299', // 8857 ⊙ CIRCLED DOT OPERATOR + '0', '2', '\u229a', // 8858 ⊚ CIRCLED RING OPERATOR + '-', 'T', '\u22a5', // 8869 ⊥ UP TACK + '.', 'P', '\u22c5', // 8901 ⋅ DOT OPERATOR + ':', '3', '\u22ee', // 8942 ⋮ VERTICAL ELLIPSIS + '.', '3', '\u22ef', // 8943 ⋯ MIDLINE HORIZONTAL ELLIPSIS + 'E', 'h', '\u2302', // 8962 ⌂ HOUSE + '<', '7', '\u2308', // 8968 ⌈ LEFT CEILING + '>', '7', '\u2309', // 8969 ⌉ RIGHT CEILING + '7', '<', '\u230a', // 8970 ⌊ LEFT FLOOR + '7', '>', '\u230b', // 8971 ⌋ RIGHT FLOOR + 'N', 'I', '\u2310', // 8976 ⌐ REVERSED NOT SIGN + '(', 'A', '\u2312', // 8978 ⌒ ARC + 'T', 'R', '\u2315', // 8981 ⌕ TELEPHONE RECORDER + 'I', 'u', '\u2320', // 8992 ⌠ TOP HALF INTEGRAL + 'I', 'l', '\u2321', // 8993 ⌡ BOTTOM HALF INTEGRAL + '<', '/', '\u2329', // 9001 〈 LEFT-POINTING ANGLE BRACKET + '/', '>', '\u232a', // 9002 〉 RIGHT-POINTING ANGLE BRACKET + 'V', 's', '\u2423', // 9251 ␣ OPEN BOX + '1', 'h', '\u2440', // 9280 ⑀ OCR HOOK + '3', 'h', '\u2441', // 9281 ⑁ OCR CHAIR + '2', 'h', '\u2442', // 9282 ⑂ OCR FORK + '4', 'h', '\u2443', // 9283 ⑃ OCR INVERTED FORK + '1', 'j', '\u2446', // 9286 ⑆ OCR BRANCH BANK IDENTIFICATION + '2', 'j', '\u2447', // 9287 ⑇ OCR AMOUNT OF CHECK + '3', 'j', '\u2448', // 9288 ⑈ OCR DASH + '4', 'j', '\u2449', // 9289 ⑉ OCR CUSTOMER ACCOUNT NUMBER + '1', '.', '\u2488', // 9352 ⒈ DIGIT ONE FULL STOP + '2', '.', '\u2489', // 9353 ⒉ DIGIT TWO FULL STOP + '3', '.', '\u248a', // 9354 ⒊ DIGIT THREE FULL STOP + '4', '.', '\u248b', // 9355 ⒋ DIGIT FOUR FULL STOP + '5', '.', '\u248c', // 9356 ⒌ DIGIT FIVE FULL STOP + '6', '.', '\u248d', // 9357 ⒍ DIGIT SIX FULL STOP + '7', '.', '\u248e', // 9358 ⒎ DIGIT SEVEN FULL STOP + '8', '.', '\u248f', // 9359 ⒏ DIGIT EIGHT FULL STOP + '9', '.', '\u2490', // 9360 ⒐ DIGIT NINE FULL STOP + 'h', 'h', '\u2500', // 9472 ─ BOX DRAWINGS LIGHT HORIZONTAL + 'H', 'H', '\u2501', // 9473 ━ BOX DRAWINGS HEAVY HORIZONTAL + 'v', 'v', '\u2502', // 9474 │ BOX DRAWINGS LIGHT VERTICAL + 'V', 'V', '\u2503', // 9475 ┃ BOX DRAWINGS HEAVY VERTICAL + '3', '-', '\u2504', // 9476 ┄ BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL + '3', '_', '\u2505', // 9477 ┅ BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL + '3', '!', '\u2506', // 9478 ┆ BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL + '3', '/', '\u2507', // 9479 ┇ BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL + '4', '-', '\u2508', // 9480 ┈ BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL + '4', '_', '\u2509', // 9481 ┉ BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL + '4', '!', '\u250a', // 9482 ┊ BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL + '4', '/', '\u250b', // 9483 ┋ BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL + 'd', 'r', '\u250c', // 9484 ┌ BOX DRAWINGS LIGHT DOWN AND RIGHT + 'd', 'R', '\u250d', // 9485 ┍ BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY + 'D', 'r', '\u250e', // 9486 ┎ BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT + 'D', 'R', '\u250f', // 9487 ┏ BOX DRAWINGS HEAVY DOWN AND RIGHT + 'd', 'l', '\u2510', // 9488 ┐ BOX DRAWINGS LIGHT DOWN AND LEFT + 'd', 'L', '\u2511', // 9489 ┑ BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY + 'D', 'l', '\u2512', // 9490 ┒ BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT + 'L', 'D', '\u2513', // 9491 ┓ BOX DRAWINGS HEAVY DOWN AND LEFT + 'u', 'r', '\u2514', // 9492 └ BOX DRAWINGS LIGHT UP AND RIGHT + 'u', 'R', '\u2515', // 9493 ┕ BOX DRAWINGS UP LIGHT AND RIGHT HEAVY + 'U', 'r', '\u2516', // 9494 ┖ BOX DRAWINGS UP HEAVY AND RIGHT LIGHT + 'U', 'R', '\u2517', // 9495 ┗ BOX DRAWINGS HEAVY UP AND RIGHT + 'u', 'l', '\u2518', // 9496 ┘ BOX DRAWINGS LIGHT UP AND LEFT + 'u', 'L', '\u2519', // 9497 ┙ BOX DRAWINGS UP LIGHT AND LEFT HEAVY + 'U', 'l', '\u251a', // 9498 ┚ BOX DRAWINGS UP HEAVY AND LEFT LIGHT + 'U', 'L', '\u251b', // 9499 ┛ BOX DRAWINGS HEAVY UP AND LEFT + 'v', 'r', '\u251c', // 9500 ├ BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 'v', 'R', '\u251d', // 9501 ┝ BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY + 'V', 'r', '\u2520', // 9504 ┠ BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT + 'V', 'R', '\u2523', // 9507 ┣ BOX DRAWINGS HEAVY VERTICAL AND RIGHT + 'v', 'l', '\u2524', // 9508 ┤ BOX DRAWINGS LIGHT VERTICAL AND LEFT + 'v', 'L', '\u2525', // 9509 ┥ BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY + 'V', 'l', '\u2528', // 9512 ┨ BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT + 'V', 'L', '\u252b', // 9515 ┫ BOX DRAWINGS HEAVY VERTICAL AND LEFT + 'd', 'h', '\u252c', // 9516 ┬ BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 'd', 'H', '\u252f', // 9519 ┯ BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY + 'D', 'h', '\u2530', // 9520 ┰ BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT + 'D', 'H', '\u2533', // 9523 ┳ BOX DRAWINGS HEAVY DOWN AND HORIZONTAL + 'u', 'h', '\u2534', // 9524 ┴ BOX DRAWINGS LIGHT UP AND HORIZONTAL + 'u', 'H', '\u2537', // 9527 ┷ BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY + 'U', 'h', '\u2538', // 9528 ┸ BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT + 'U', 'H', '\u253b', // 9531 ┻ BOX DRAWINGS HEAVY UP AND HORIZONTAL + 'v', 'h', '\u253c', // 9532 ┼ BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 'v', 'H', '\u253f', // 9535 ┿ BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY + 'V', 'h', '\u2542', // 9538 ╂ BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT + 'V', 'H', '\u254b', // 9547 ╋ BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL + 'F', 'D', '\u2571', // 9585 ╱ BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT + 'B', 'D', '\u2572', // 9586 ╲ BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT + 'T', 'B', '\u2580', // 9600 ▀ UPPER HALF BLOCK + 'L', 'B', '\u2584', // 9604 ▄ LOWER HALF BLOCK + 'F', 'B', '\u2588', // 9608 █ FULL BLOCK + 'l', 'B', '\u258c', // 9612 ▌ LEFT HALF BLOCK + 'R', 'B', '\u2590', // 9616 ▐ RIGHT HALF BLOCK + '.', 'S', '\u2591', // 9617 ░ LIGHT SHADE + ':', 'S', '\u2592', // 9618 ▒ MEDIUM SHADE + '?', 'S', '\u2593', // 9619 ▓ DARK SHADE + 'f', 'S', '\u25a0', // 9632 ■ BLACK SQUARE + 'O', 'S', '\u25a1', // 9633 □ WHITE SQUARE + 'R', 'O', '\u25a2', // 9634 ▢ WHITE SQUARE WITH ROUNDED CORNERS + 'R', 'r', '\u25a3', // 9635 ▣ WHITE SQUARE CONTAINING BLACK SMALL SQUARE + 'R', 'F', '\u25a4', // 9636 ▤ SQUARE WITH HORIZONTAL FILL + 'R', 'Y', '\u25a5', // 9637 ▥ SQUARE WITH VERTICAL FILL + 'R', 'H', '\u25a6', // 9638 ▦ SQUARE WITH ORTHOGONAL CROSSHATCH FILL + 'R', 'Z', '\u25a7', // 9639 ▧ SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL + 'R', 'K', '\u25a8', // 9640 ▨ SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL + 'R', 'X', '\u25a9', // 9641 ▩ SQUARE WITH DIAGONAL CROSSHATCH FILL + 's', 'B', '\u25aa', // 9642 ▪ BLACK SMALL SQUARE + 'S', 'R', '\u25ac', // 9644 ▬ BLACK RECTANGLE + 'O', 'r', '\u25ad', // 9645 ▭ WHITE RECTANGLE + 'U', 'T', '\u25b2', // 9650 ▲ BLACK UP-POINTING TRIANGLE + 'u', 'T', '\u25b3', // 9651 △ WHITE UP-POINTING TRIANGLE + 'P', 'R', '\u25b6', // 9654 ▶ BLACK RIGHT-POINTING TRIANGLE + 'T', 'r', '\u25b7', // 9655 ▷ WHITE RIGHT-POINTING TRIANGLE + 'D', 't', '\u25bc', // 9660 ▼ BLACK DOWN-POINTING TRIANGLE + 'd', 'T', '\u25bd', // 9661 ▽ WHITE DOWN-POINTING TRIANGLE + 'P', 'L', '\u25c0', // 9664 ◀ BLACK LEFT-POINTING TRIANGLE + 'T', 'l', '\u25c1', // 9665 ◁ WHITE LEFT-POINTING TRIANGLE + 'D', 'b', '\u25c6', // 9670 ◆ BLACK DIAMOND + 'D', 'w', '\u25c7', // 9671 ◇ WHITE DIAMOND + 'L', 'Z', '\u25ca', // 9674 ◊ LOZENGE + '0', 'm', '\u25cb', // 9675 ○ WHITE CIRCLE + '0', 'o', '\u25ce', // 9678 ◎ BULLSEYE + '0', 'M', '\u25cf', // 9679 ● BLACK CIRCLE + '0', 'L', '\u25d0', // 9680 ◐ CIRCLE WITH LEFT HALF BLACK + '0', 'R', '\u25d1', // 9681 ◑ CIRCLE WITH RIGHT HALF BLACK + 'S', 'n', '\u25d8', // 9688 ◘ INVERSE BULLET + 'I', 'c', '\u25d9', // 9689 ◙ INVERSE WHITE CIRCLE + 'F', 'd', '\u25e2', // 9698 ◢ BLACK LOWER RIGHT TRIANGLE + 'B', 'd', '\u25e3', // 9699 ◣ BLACK LOWER LEFT TRIANGLE + '*', '2', '\u2605', // 9733 ★ BLACK STAR + '*', '1', '\u2606', // 9734 ☆ WHITE STAR + '<', 'H', '\u261c', // 9756 ☜ WHITE LEFT POINTING INDEX + '>', 'H', '\u261e', // 9758 ☞ WHITE RIGHT POINTING INDEX + '0', 'u', '\u263a', // 9786 ☺ WHITE SMILING FACE + '0', 'U', '\u263b', // 9787 ☻ BLACK SMILING FACE + 'S', 'U', '\u263c', // 9788 ☼ WHITE SUN WITH RAYS + 'F', 'm', '\u2640', // 9792 ♀ FEMALE SIGN + 'M', 'l', '\u2642', // 9794 ♂ MALE SIGN + 'c', 'S', '\u2660', // 9824 ♠ BLACK SPADE SUIT + 'c', 'H', '\u2661', // 9825 ♡ WHITE HEART SUIT + 'c', 'D', '\u2662', // 9826 ♢ WHITE DIAMOND SUIT + 'c', 'C', '\u2663', // 9827 ♣ BLACK CLUB SUIT + 'M', 'd', '\u2669', // 9833 ♩ QUARTER NOTE + 'M', '8', '\u266a', // 9834 ♪ EIGHTH NOTE + 'M', '2', '\u266b', // 9835 ♫ BARRED EIGHTH NOTES + 'M', 'b', '\u266d', // 9837 ♭ MUSIC FLAT SIGN + 'M', 'x', '\u266e', // 9838 ♮ MUSIC NATURAL SIGN + 'M', 'X', '\u266f', // 9839 ♯ MUSIC SHARP SIGN + 'O', 'K', '\u2713', // 10003 ✓ CHECK MARK + 'X', 'X', '\u2717', // 10007 ✗ BALLOT X + '-', 'X', '\u2720', // 10016 ✠ MALTESE CROSS + 'I', 'S', '\u3000', // 12288   IDEOGRAPHIC SPACE + ',', '_', '\u3001', // 12289 、 IDEOGRAPHIC COMMA + '.', '_', '\u3002', // 12290 。 IDEOGRAPHIC PERIOD + '+', '"', '\u3003', // 12291 〃 DITTO MARK + '+', '_', '\u3004', // 12292 〄 IDEOGRAPHIC DITTO MARK + '*', '_', '\u3005', // 12293 々 IDEOGRAPHIC ITERATION MARK + ';', '_', '\u3006', // 12294 〆 IDEOGRAPHIC CLOSING MARK + '0', '_', '\u3007', // 12295 〇 IDEOGRAPHIC NUMBER ZERO + '<', '+', '\u300a', // 12298 《 LEFT DOUBLE ANGLE BRACKET + '>', '+', '\u300b', // 12299 》 RIGHT DOUBLE ANGLE BRACKET + '<', '\'', '\u300c', // 12300 「 LEFT CORNER BRACKET + '>', '\'', '\u300d', // 12301 」 RIGHT CORNER BRACKET + '<', '"', '\u300e', // 12302 『 LEFT WHITE CORNER BRACKET + '>', '"', '\u300f', // 12303 』 RIGHT WHITE CORNER BRACKET + '(', '"', '\u3010', // 12304 【 LEFT BLACK LENTICULAR BRACKET + ')', '"', '\u3011', // 12305 】 RIGHT BLACK LENTICULAR BRACKET + '=', 'T', '\u3012', // 12306 〒 POSTAL MARK + '=', '_', '\u3013', // 12307 〓 GETA MARK + '(', '\'', '\u3014', // 12308 〔 LEFT TORTOISE SHELL BRACKET + ')', '\'', '\u3015', // 12309 〕 RIGHT TORTOISE SHELL BRACKET + '(', 'I', '\u3016', // 12310 〖 LEFT WHITE LENTICULAR BRACKET + ')', 'I', '\u3017', // 12311 〗 RIGHT WHITE LENTICULAR BRACKET + '-', '?', '\u301c', // 12316 〜 WAVE DASH + 'A', '5', '\u3041', // 12353 ぁ HIRAGANA LETTER SMALL A + 'a', '5', '\u3042', // 12354 あ HIRAGANA LETTER A + 'I', '5', '\u3043', // 12355 ぃ HIRAGANA LETTER SMALL I + 'i', '5', '\u3044', // 12356 い HIRAGANA LETTER I + 'U', '5', '\u3045', // 12357 ぅ HIRAGANA LETTER SMALL U + 'u', '5', '\u3046', // 12358 う HIRAGANA LETTER U + 'E', '5', '\u3047', // 12359 ぇ HIRAGANA LETTER SMALL E + 'e', '5', '\u3048', // 12360 え HIRAGANA LETTER E + 'O', '5', '\u3049', // 12361 ぉ HIRAGANA LETTER SMALL O + 'o', '5', '\u304a', // 12362 お HIRAGANA LETTER O + 'k', 'a', '\u304b', // 12363 か HIRAGANA LETTER KA + 'g', 'a', '\u304c', // 12364 が HIRAGANA LETTER GA + 'k', 'i', '\u304d', // 12365 き HIRAGANA LETTER KI + 'g', 'i', '\u304e', // 12366 ぎ HIRAGANA LETTER GI + 'k', 'u', '\u304f', // 12367 く HIRAGANA LETTER KU + 'g', 'u', '\u3050', // 12368 ぐ HIRAGANA LETTER GU + 'k', 'e', '\u3051', // 12369 け HIRAGANA LETTER KE + 'g', 'e', '\u3052', // 12370 げ HIRAGANA LETTER GE + 'k', 'o', '\u3053', // 12371 こ HIRAGANA LETTER KO + 'g', 'o', '\u3054', // 12372 ご HIRAGANA LETTER GO + 's', 'a', '\u3055', // 12373 さ HIRAGANA LETTER SA + 'z', 'a', '\u3056', // 12374 ざ HIRAGANA LETTER ZA + 's', 'i', '\u3057', // 12375 し HIRAGANA LETTER SI + 'z', 'i', '\u3058', // 12376 じ HIRAGANA LETTER ZI + 's', 'u', '\u3059', // 12377 す HIRAGANA LETTER SU + 'z', 'u', '\u305a', // 12378 ず HIRAGANA LETTER ZU + 's', 'e', '\u305b', // 12379 せ HIRAGANA LETTER SE + 'z', 'e', '\u305c', // 12380 ぜ HIRAGANA LETTER ZE + 's', 'o', '\u305d', // 12381 そ HIRAGANA LETTER SO + 'z', 'o', '\u305e', // 12382 ぞ HIRAGANA LETTER ZO + 't', 'a', '\u305f', // 12383 た HIRAGANA LETTER TA + 'd', 'a', '\u3060', // 12384 だ HIRAGANA LETTER DA + 't', 'i', '\u3061', // 12385 ち HIRAGANA LETTER TI + 'd', 'i', '\u3062', // 12386 ぢ HIRAGANA LETTER DI + 't', 'U', '\u3063', // 12387 っ HIRAGANA LETTER SMALL TU + 't', 'u', '\u3064', // 12388 つ HIRAGANA LETTER TU + 'd', 'u', '\u3065', // 12389 づ HIRAGANA LETTER DU + 't', 'e', '\u3066', // 12390 て HIRAGANA LETTER TE + 'd', 'e', '\u3067', // 12391 で HIRAGANA LETTER DE + 't', 'o', '\u3068', // 12392 と HIRAGANA LETTER TO + 'd', 'o', '\u3069', // 12393 ど HIRAGANA LETTER DO + 'n', 'a', '\u306a', // 12394 な HIRAGANA LETTER NA + 'n', 'i', '\u306b', // 12395 に HIRAGANA LETTER NI + 'n', 'u', '\u306c', // 12396 ぬ HIRAGANA LETTER NU + 'n', 'e', '\u306d', // 12397 ね HIRAGANA LETTER NE + 'n', 'o', '\u306e', // 12398 の HIRAGANA LETTER NO + 'h', 'a', '\u306f', // 12399 は HIRAGANA LETTER HA + 'b', 'a', '\u3070', // 12400 ば HIRAGANA LETTER BA + 'p', 'a', '\u3071', // 12401 ぱ HIRAGANA LETTER PA + 'h', 'i', '\u3072', // 12402 ひ HIRAGANA LETTER HI + 'b', 'i', '\u3073', // 12403 び HIRAGANA LETTER BI + 'p', 'i', '\u3074', // 12404 ぴ HIRAGANA LETTER PI + 'h', 'u', '\u3075', // 12405 ふ HIRAGANA LETTER HU + 'b', 'u', '\u3076', // 12406 ぶ HIRAGANA LETTER BU + 'p', 'u', '\u3077', // 12407 ぷ HIRAGANA LETTER PU + 'h', 'e', '\u3078', // 12408 へ HIRAGANA LETTER HE + 'b', 'e', '\u3079', // 12409 べ HIRAGANA LETTER BE + 'p', 'e', '\u307a', // 12410 ぺ HIRAGANA LETTER PE + 'h', 'o', '\u307b', // 12411 ほ HIRAGANA LETTER HO + 'b', 'o', '\u307c', // 12412 ぼ HIRAGANA LETTER BO + 'p', 'o', '\u307d', // 12413 ぽ HIRAGANA LETTER PO + 'm', 'a', '\u307e', // 12414 ま HIRAGANA LETTER MA + 'm', 'i', '\u307f', // 12415 み HIRAGANA LETTER MI + 'm', 'u', '\u3080', // 12416 む HIRAGANA LETTER MU + 'm', 'e', '\u3081', // 12417 め HIRAGANA LETTER ME + 'm', 'o', '\u3082', // 12418 も HIRAGANA LETTER MO + 'y', 'A', '\u3083', // 12419 ゃ HIRAGANA LETTER SMALL YA + 'y', 'a', '\u3084', // 12420 や HIRAGANA LETTER YA + 'y', 'U', '\u3085', // 12421 ゅ HIRAGANA LETTER SMALL YU + 'y', 'u', '\u3086', // 12422 ゆ HIRAGANA LETTER YU + 'y', 'O', '\u3087', // 12423 ょ HIRAGANA LETTER SMALL YO + 'y', 'o', '\u3088', // 12424 よ HIRAGANA LETTER YO + 'r', 'a', '\u3089', // 12425 ら HIRAGANA LETTER RA + 'r', 'i', '\u308a', // 12426 り HIRAGANA LETTER RI + 'r', 'u', '\u308b', // 12427 る HIRAGANA LETTER RU + 'r', 'e', '\u308c', // 12428 れ HIRAGANA LETTER RE + 'r', 'o', '\u308d', // 12429 ろ HIRAGANA LETTER RO + 'w', 'A', '\u308e', // 12430 ゎ HIRAGANA LETTER SMALL WA + 'w', 'a', '\u308f', // 12431 わ HIRAGANA LETTER WA + 'w', 'i', '\u3090', // 12432 ゐ HIRAGANA LETTER WI + 'w', 'e', '\u3091', // 12433 ゑ HIRAGANA LETTER WE + 'w', 'o', '\u3092', // 12434 を HIRAGANA LETTER WO + 'n', '5', '\u3093', // 12435 ん HIRAGANA LETTER N + 'v', 'u', '\u3094', // 12436 ゔ HIRAGANA LETTER VU + '"', '5', '\u309b', // 12443 ゛ KATAKANA-HIRAGANA VOICED SOUND MARK + '0', '5', '\u309c', // 12444 ゜ KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK + '*', '5', '\u309d', // 12445 ゝ HIRAGANA ITERATION MARK + '+', '5', '\u309e', // 12446 ゞ HIRAGANA VOICED ITERATION MARK + 'a', '6', '\u30a1', // 12449 ァ KATAKANA LETTER SMALL A + 'A', '6', '\u30a2', // 12450 ア KATAKANA LETTER A + 'i', '6', '\u30a3', // 12451 ィ KATAKANA LETTER SMALL I + 'I', '6', '\u30a4', // 12452 イ KATAKANA LETTER I + 'u', '6', '\u30a5', // 12453 ゥ KATAKANA LETTER SMALL U + 'U', '6', '\u30a6', // 12454 ウ KATAKANA LETTER U + 'e', '6', '\u30a7', // 12455 ェ KATAKANA LETTER SMALL E + 'E', '6', '\u30a8', // 12456 エ KATAKANA LETTER E + 'o', '6', '\u30a9', // 12457 ォ KATAKANA LETTER SMALL O + 'O', '6', '\u30aa', // 12458 オ KATAKANA LETTER O + 'K', 'a', '\u30ab', // 12459 カ KATAKANA LETTER KA + 'G', 'a', '\u30ac', // 12460 ガ KATAKANA LETTER GA + 'K', 'i', '\u30ad', // 12461 キ KATAKANA LETTER KI + 'G', 'i', '\u30ae', // 12462 ギ KATAKANA LETTER GI + 'K', 'u', '\u30af', // 12463 ク KATAKANA LETTER KU + 'G', 'u', '\u30b0', // 12464 グ KATAKANA LETTER GU + 'K', 'e', '\u30b1', // 12465 ケ KATAKANA LETTER KE + 'G', 'e', '\u30b2', // 12466 ゲ KATAKANA LETTER GE + 'K', 'o', '\u30b3', // 12467 コ KATAKANA LETTER KO + 'G', 'o', '\u30b4', // 12468 ゴ KATAKANA LETTER GO + 'S', 'a', '\u30b5', // 12469 サ KATAKANA LETTER SA + 'Z', 'a', '\u30b6', // 12470 ザ KATAKANA LETTER ZA + 'S', 'i', '\u30b7', // 12471 シ KATAKANA LETTER SI + 'Z', 'i', '\u30b8', // 12472 ジ KATAKANA LETTER ZI + 'S', 'u', '\u30b9', // 12473 ス KATAKANA LETTER SU + 'Z', 'u', '\u30ba', // 12474 ズ KATAKANA LETTER ZU + 'S', 'e', '\u30bb', // 12475 セ KATAKANA LETTER SE + 'Z', 'e', '\u30bc', // 12476 ゼ KATAKANA LETTER ZE + 'S', 'o', '\u30bd', // 12477 ソ KATAKANA LETTER SO + 'Z', 'o', '\u30be', // 12478 ゾ KATAKANA LETTER ZO + 'T', 'a', '\u30bf', // 12479 タ KATAKANA LETTER TA + 'D', 'a', '\u30c0', // 12480 ダ KATAKANA LETTER DA + 'T', 'i', '\u30c1', // 12481 チ KATAKANA LETTER TI + 'D', 'i', '\u30c2', // 12482 ヂ KATAKANA LETTER DI + 'T', 'U', '\u30c3', // 12483 ッ KATAKANA LETTER SMALL TU + 'T', 'u', '\u30c4', // 12484 ツ KATAKANA LETTER TU + 'D', 'u', '\u30c5', // 12485 ヅ KATAKANA LETTER DU + 'T', 'e', '\u30c6', // 12486 テ KATAKANA LETTER TE + 'D', 'e', '\u30c7', // 12487 デ KATAKANA LETTER DE + 'T', 'o', '\u30c8', // 12488 ト KATAKANA LETTER TO + 'D', 'o', '\u30c9', // 12489 ド KATAKANA LETTER DO + 'N', 'a', '\u30ca', // 12490 ナ KATAKANA LETTER NA + 'N', 'i', '\u30cb', // 12491 ニ KATAKANA LETTER NI + 'N', 'u', '\u30cc', // 12492 ヌ KATAKANA LETTER NU + 'N', 'e', '\u30cd', // 12493 ネ KATAKANA LETTER NE + 'N', 'o', '\u30ce', // 12494 ノ KATAKANA LETTER NO + 'H', 'a', '\u30cf', // 12495 ハ KATAKANA LETTER HA + 'B', 'a', '\u30d0', // 12496 バ KATAKANA LETTER BA + 'P', 'a', '\u30d1', // 12497 パ KATAKANA LETTER PA + 'H', 'i', '\u30d2', // 12498 ヒ KATAKANA LETTER HI + 'B', 'i', '\u30d3', // 12499 ビ KATAKANA LETTER BI + 'P', 'i', '\u30d4', // 12500 ピ KATAKANA LETTER PI + 'H', 'u', '\u30d5', // 12501 フ KATAKANA LETTER HU + 'B', 'u', '\u30d6', // 12502 ブ KATAKANA LETTER BU + 'P', 'u', '\u30d7', // 12503 プ KATAKANA LETTER PU + 'H', 'e', '\u30d8', // 12504 ヘ KATAKANA LETTER HE + 'B', 'e', '\u30d9', // 12505 ベ KATAKANA LETTER BE + 'P', 'e', '\u30da', // 12506 ペ KATAKANA LETTER PE + 'H', 'o', '\u30db', // 12507 ホ KATAKANA LETTER HO + 'B', 'o', '\u30dc', // 12508 ボ KATAKANA LETTER BO + 'P', 'o', '\u30dd', // 12509 ポ KATAKANA LETTER PO + 'M', 'a', '\u30de', // 12510 マ KATAKANA LETTER MA + 'M', 'i', '\u30df', // 12511 ミ KATAKANA LETTER MI + 'M', 'u', '\u30e0', // 12512 ム KATAKANA LETTER MU + 'M', 'e', '\u30e1', // 12513 メ KATAKANA LETTER ME + 'M', 'o', '\u30e2', // 12514 モ KATAKANA LETTER MO + 'Y', 'A', '\u30e3', // 12515 ャ KATAKANA LETTER SMALL YA + 'Y', 'a', '\u30e4', // 12516 ヤ KATAKANA LETTER YA + 'Y', 'U', '\u30e5', // 12517 ュ KATAKANA LETTER SMALL YU + 'Y', 'u', '\u30e6', // 12518 ユ KATAKANA LETTER YU + 'Y', 'O', '\u30e7', // 12519 ョ KATAKANA LETTER SMALL YO + 'Y', 'o', '\u30e8', // 12520 ヨ KATAKANA LETTER YO + 'R', 'a', '\u30e9', // 12521 ラ KATAKANA LETTER RA + 'R', 'i', '\u30ea', // 12522 リ KATAKANA LETTER RI + 'R', 'u', '\u30eb', // 12523 ル KATAKANA LETTER RU + 'R', 'e', '\u30ec', // 12524 レ KATAKANA LETTER RE + 'R', 'o', '\u30ed', // 12525 ロ KATAKANA LETTER RO + 'W', 'A', '\u30ee', // 12526 ヮ KATAKANA LETTER SMALL WA + 'W', 'a', '\u30ef', // 12527 ワ KATAKANA LETTER WA + 'W', 'i', '\u30f0', // 12528 ヰ KATAKANA LETTER WI + 'W', 'e', '\u30f1', // 12529 ヱ KATAKANA LETTER WE + 'W', 'o', '\u30f2', // 12530 ヲ KATAKANA LETTER WO + 'N', '6', '\u30f3', // 12531 ン KATAKANA LETTER N + 'V', 'u', '\u30f4', // 12532 ヴ KATAKANA LETTER VU + 'K', 'A', '\u30f5', // 12533 ヵ KATAKANA LETTER SMALL KA + 'K', 'E', '\u30f6', // 12534 ヶ KATAKANA LETTER SMALL KE + 'V', 'a', '\u30f7', // 12535 ヷ KATAKANA LETTER VA + 'V', 'i', '\u30f8', // 12536 ヸ KATAKANA LETTER VI + 'V', 'e', '\u30f9', // 12537 ヹ KATAKANA LETTER VE + 'V', 'o', '\u30fa', // 12538 ヺ KATAKANA LETTER VO + '.', '6', '\u30fb', // 12539 ・ KATAKANA MIDDLE DOT + '-', '6', '\u30fc', // 12540 ー KATAKANA-HIRAGANA PROLONGED SOUND MARK + '*', '6', '\u30fd', // 12541 ヽ KATAKANA ITERATION MARK + '+', '6', '\u30fe', // 12542 ヾ KATAKANA VOICED ITERATION MARK + 'b', '4', '\u3105', // 12549 ㄅ BOPOMOFO LETTER B + 'p', '4', '\u3106', // 12550 ㄆ BOPOMOFO LETTER P + 'm', '4', '\u3107', // 12551 ㄇ BOPOMOFO LETTER M + 'f', '4', '\u3108', // 12552 ㄈ BOPOMOFO LETTER F + 'd', '4', '\u3109', // 12553 ㄉ BOPOMOFO LETTER D + 't', '4', '\u310a', // 12554 ㄊ BOPOMOFO LETTER T + 'n', '4', '\u310b', // 12555 ㄋ BOPOMOFO LETTER N + 'l', '4', '\u310c', // 12556 ㄌ BOPOMOFO LETTER L + 'g', '4', '\u310d', // 12557 ㄍ BOPOMOFO LETTER G + 'k', '4', '\u310e', // 12558 ㄎ BOPOMOFO LETTER K + 'h', '4', '\u310f', // 12559 ㄏ BOPOMOFO LETTER H + 'j', '4', '\u3110', // 12560 ㄐ BOPOMOFO LETTER J + 'q', '4', '\u3111', // 12561 ㄑ BOPOMOFO LETTER Q + 'x', '4', '\u3112', // 12562 ㄒ BOPOMOFO LETTER X + 'z', 'h', '\u3113', // 12563 ㄓ BOPOMOFO LETTER ZH + 'c', 'h', '\u3114', // 12564 ㄔ BOPOMOFO LETTER CH + 's', 'h', '\u3115', // 12565 ㄕ BOPOMOFO LETTER SH + 'r', '4', '\u3116', // 12566 ㄖ BOPOMOFO LETTER R + 'z', '4', '\u3117', // 12567 ㄗ BOPOMOFO LETTER Z + 'c', '4', '\u3118', // 12568 ㄘ BOPOMOFO LETTER C + 's', '4', '\u3119', // 12569 ㄙ BOPOMOFO LETTER S + 'a', '4', '\u311a', // 12570 ㄚ BOPOMOFO LETTER A + 'o', '4', '\u311b', // 12571 ㄛ BOPOMOFO LETTER O + 'e', '4', '\u311c', // 12572 ㄜ BOPOMOFO LETTER E + 'a', 'i', '\u311e', // 12574 ㄞ BOPOMOFO LETTER AI + 'e', 'i', '\u311f', // 12575 ㄟ BOPOMOFO LETTER EI + 'a', 'u', '\u3120', // 12576 ㄠ BOPOMOFO LETTER AU + 'o', 'u', '\u3121', // 12577 ㄡ BOPOMOFO LETTER OU + 'a', 'n', '\u3122', // 12578 ㄢ BOPOMOFO LETTER AN + 'e', 'n', '\u3123', // 12579 ㄣ BOPOMOFO LETTER EN + 'a', 'N', '\u3124', // 12580 ㄤ BOPOMOFO LETTER ANG + 'e', 'N', '\u3125', // 12581 ㄥ BOPOMOFO LETTER ENG + 'e', 'r', '\u3126', // 12582 ㄦ BOPOMOFO LETTER ER + 'i', '4', '\u3127', // 12583 ㄧ BOPOMOFO LETTER I + 'u', '4', '\u3128', // 12584 ㄨ BOPOMOFO LETTER U + 'i', 'u', '\u3129', // 12585 ㄩ BOPOMOFO LETTER IU + 'v', '4', '\u312a', // 12586 ㄪ BOPOMOFO LETTER V + 'n', 'G', '\u312b', // 12587 ㄫ BOPOMOFO LETTER NG + 'g', 'n', '\u312c', // 12588 ㄬ BOPOMOFO LETTER GN + '1', 'c', '\u3220', // 12832 ㈠ PARENTHESIZED IDEOGRAPH ONE + '2', 'c', '\u3221', // 12833 ㈡ PARENTHESIZED IDEOGRAPH TWO + '3', 'c', '\u3222', // 12834 ㈢ PARENTHESIZED IDEOGRAPH THREE + '4', 'c', '\u3223', // 12835 ㈣ PARENTHESIZED IDEOGRAPH FOUR + '5', 'c', '\u3224', // 12836 ㈤ PARENTHESIZED IDEOGRAPH FIVE + '6', 'c', '\u3225', // 12837 ㈥ PARENTHESIZED IDEOGRAPH SIX + '7', 'c', '\u3226', // 12838 ㈦ PARENTHESIZED IDEOGRAPH SEVEN + '8', 'c', '\u3227', // 12839 ㈧ PARENTHESIZED IDEOGRAPH EIGHT + '9', 'c', '\u3228', // 12840 ㈨ PARENTHESIZED IDEOGRAPH NINE + '/', 'c', '\ue001', // 57345  JOIN THIS LINE WITH NEXT LINE (Mnemonic) + 'U', 'A', '\ue002', // 57346 Unit space A (ISO-IR-8-1 064) + 'U', 'B', '\ue003', // 57347  Unit space B (ISO-IR-8-1 096) + '"', '3', '\ue004', // 57348  NON-SPACING UMLAUT (ISO-IR-38 201) (character part) + '"', '1', '\ue005', // 57349  NON-SPACING DIAERESIS WITH ACCENT (ISO-IR-70 192) (character part) + '"', '!', '\ue006', // 57350  NON-SPACING GRAVE ACCENT (ISO-IR-103 193) (character part) + '"', '\'', '\ue007', // 57351  NON-SPACING ACUTE ACCENT (ISO-IR-103 194) (character part) + '"', '>', '\ue008', // 57352  NON-SPACING CIRCUMFLEX ACCENT (ISO-IR-103 195) (character part) + '"', '?', '\ue009', // 57353  NON-SPACING TILDE (ISO-IR-103 196) (character part) + '"', '-', '\ue00a', // 57354  NON-SPACING MACRON (ISO-IR-103 197) (character part) + '"', '(', '\ue00b', // 57355  NON-SPACING BREVE (ISO-IR-103 198) (character part) + '"', '.', '\ue00c', // 57356  NON-SPACING DOT ABOVE (ISO-IR-103 199) (character part) + '"', ':', '\ue00d', // 57357  NON-SPACING DIAERESIS (ISO-IR-103 200) (character part) + '"', '0', '\ue00e', // 57358  NON-SPACING RING ABOVE (ISO-IR-103 202) (character part) + '"', '"', '\ue00f', // 57359  NON-SPACING DOUBLE ACCUTE (ISO-IR-103 204) (character part) + '"', '<', '\ue010', // 57360  NON-SPACING CARON (ISO-IR-103 206) (character part) + '"', ',', '\ue011', // 57361  NON-SPACING CEDILLA (ISO-IR-103 203) (character part) + '"', ';', '\ue012', // 57362  NON-SPACING OGONEK (ISO-IR-103 206) (character part) + '"', '_', '\ue013', // 57363  NON-SPACING LOW LINE (ISO-IR-103 204) (character part) + '"', '=', '\ue014', // 57364  NON-SPACING DOUBLE LOW LINE (ISO-IR-38 217) (character part) + '"', '/', '\ue015', // 57365  NON-SPACING LONG SOLIDUS (ISO-IR-128 201) (character part) + '"', 'i', '\ue016', // 57366  GREEK NON-SPACING IOTA BELOW (ISO-IR-55 39) (character part) + '"', 'd', '\ue017', // 57367  GREEK NON-SPACING DASIA PNEUMATA (ISO-IR-55 38) (character part) + '"', 'p', '\ue018', // 57368  GREEK NON-SPACING PSILI PNEUMATA (ISO-IR-55 37) (character part) + ';', ';', '\ue019', // 57369  GREEK DASIA PNEUMATA (ISO-IR-18 92) + ',', ',', '\ue01a', // 57370  GREEK PSILI PNEUMATA (ISO-IR-18 124) + 'b', '3', '\ue01b', // 57371  GREEK SMALL LETTER MIDDLE BETA (ISO-IR-18 99) + 'C', 'i', '\ue01c', // 57372  CIRCLE (ISO-IR-83 0294) + 'f', '(', '\ue01d', // 57373  FUNCTION SIGN (ISO-IR-143 221) + 'e', 'd', '\ue01e', // 57374  LATIN SMALL LETTER EZH (ISO-IR-158 142) + 'a', 'm', '\ue01f', // 57375  ANTE MERIDIAM SIGN (ISO-IR-149 0267) + 'p', 'm', '\ue020', // 57376  POST MERIDIAM SIGN (ISO-IR-149 0268) + 'F', 'l', '\ue023', // 57379  DUTCH GUILDER SIGN (IBM437 159) + 'G', 'F', '\ue024', // 57380  GAMMA FUNCTION SIGN (ISO-10646-1DIS 032/032/037/122) + '>', 'V', '\ue025', // 57381  RIGHTWARDS VECTOR ABOVE (ISO-10646-1DIS 032/032/038/046) + '!', '*', '\ue026', // 57382  GREEK VARIA (ISO-10646-1DIS 032/032/042/164) + '?', '*', '\ue027', // 57383  GREEK PERISPOMENI (ISO-10646-1DIS 032/032/042/165) + 'J', '<', '\ue028', // 57384  LATIN CAPITAL LETTER J WITH CARON (lowercase: 000/000/001/240) + 'f', 'f', '\ufb00', // 64256 ff LATIN SMALL LIGATURE FF + 'f', 'i', '\ufb01', // 64257 fi LATIN SMALL LIGATURE FI + 'f', 'l', '\ufb02', // 64258 fl LATIN SMALL LIGATURE FL + 'f', 't', '\ufb05', // 64261 ſt LATIN SMALL LIGATURE FT + 's', 't', '\ufb06', // 64262 st LATIN SMALL LIGATURE ST ) protected val digraphs: HashMap = HashMap(defaultDigraphs.size) From ccff3996c3c573e604a3d127758b80dce7bac79a Mon Sep 17 00:00:00 2001 From: Matt Ellis Date: Tue, 3 Sep 2024 09:25:18 +0100 Subject: [PATCH 09/17] Suppress language download inspection --- .../kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt index bdf89c5e19..70831c7c73 100644 --- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt +++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt @@ -6,6 +6,8 @@ * https://opensource.org/licenses/MIT. */ +@file:Suppress("LanguageDetectionInspection") + package com.maddyhome.idea.vim.api import com.maddyhome.idea.vim.diagnostic.vimLogger From ce1389d266b439ffc458a0aea37c680c5cf2757e Mon Sep 17 00:00:00 2001 From: Matt Ellis Date: Tue, 3 Sep 2024 02:10:07 +0100 Subject: [PATCH 10/17] Update default digraphs to match current Vim List is based on Vim's documentation, although not all digraphs are documented. Additional digraphs are added based on the output of `:digraphs`. These additional digraphs include some digraphs that produce the same character, so the code is updated to handle duplicates, with the same ordering/priority as Vim. Extra digraphs include the Euro symbol (`=e` and `Eu`), quadruple prime (`4'`) and bullet (`oo`), amongst others. Also removes a number of non-standard digraphs. The symbols generated don't match the descriptions. The code appears to be private use, so are not reliable. Once custom digraphs are implemented, they can be easily added back in `~/.ideavimrc` --- .../InsertCompletedDigraphActionTest.kt | 24 + .../commands/AsciiCommandTest.kt | 22 +- .../commands/DigraphsCommandTest.kt | 428 +++++++++--------- .../idea/vim/api/VimDigraphGroupBase.kt | 364 +++++++++------ 4 files changed, 479 insertions(+), 359 deletions(-) create mode 100644 src/test/java/org/jetbrains/plugins/ideavim/action/change/insert/InsertCompletedDigraphActionTest.kt diff --git a/src/test/java/org/jetbrains/plugins/ideavim/action/change/insert/InsertCompletedDigraphActionTest.kt b/src/test/java/org/jetbrains/plugins/ideavim/action/change/insert/InsertCompletedDigraphActionTest.kt new file mode 100644 index 0000000000..80b68fca6a --- /dev/null +++ b/src/test/java/org/jetbrains/plugins/ideavim/action/change/insert/InsertCompletedDigraphActionTest.kt @@ -0,0 +1,24 @@ +/* + * Copyright 2003-2024 The IdeaVim authors + * + * Use of this source code is governed by an MIT-style + * license that can be found in the LICENSE.txt file or at + * https://opensource.org/licenses/MIT. + */ + +package org.jetbrains.plugins.ideavim.action.change.insert + +import org.jetbrains.plugins.ideavim.VimTestCase +import org.junit.jupiter.api.Test + +class InsertCompletedDigraphActionTest : VimTestCase() { + @Test + fun `test insert digraph`() { + doTest("iOK", "", "✓") + } + + @Test + fun `test insert same character with different digraphs`() { + doTest(listOf("i", "Ct", "c|", ""), "", "¢¢") + } +} diff --git a/src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/commands/AsciiCommandTest.kt b/src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/commands/AsciiCommandTest.kt index e0a37b0a67..2efbf05871 100644 --- a/src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/commands/AsciiCommandTest.kt +++ b/src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/commands/AsciiCommandTest.kt @@ -11,54 +11,62 @@ package org.jetbrains.plugins.ideavim.ex.implementation.commands import com.maddyhome.idea.vim.VimPlugin import org.jetbrains.plugins.ideavim.VimTestCase import org.junit.jupiter.api.Test +import kotlin.test.assertEquals class AsciiCommandTest : VimTestCase() { @Test fun `test shows ascii value under caret`() { configureByText("${c}Hello world") enterCommand("ascii") - kotlin.test.assertEquals(" 72, Hex 48, Oct 110", VimPlugin.getMessage()) + assertEquals(" 72, Hex 48, Oct 110", VimPlugin.getMessage()) } @Test fun `test show ascii for space`() { configureByText("$c ") enterCommand("ascii") - kotlin.test.assertEquals("< > 32, Hex 20, Oct 040, Digr SP", VimPlugin.getMessage()) + assertEquals("< > 32, Hex 20, Oct 040, Digr SP", VimPlugin.getMessage()) } @Test fun `test shows unprintable ascii code`() { configureByText("${c}\u0009") enterCommand("ascii") - kotlin.test.assertEquals("<^I> 9, Hex 09, Oct 011, Digr HT", VimPlugin.getMessage()) + assertEquals("<^I> 9, Hex 09, Oct 011, Digr HT", VimPlugin.getMessage()) } @Test fun `test shows unprintable ascii code 2`() { configureByText("${c}\u007f") enterCommand("ascii") - kotlin.test.assertEquals("<^?> 127, Hex 7f, Oct 177, Digr DT", VimPlugin.getMessage()) + assertEquals("<^?> 127, Hex 7f, Oct 177, Digr DT", VimPlugin.getMessage()) } @Test fun `test shows unprintable ascii code 3`() { configureByText("${c}\u0006") enterCommand("ascii") - kotlin.test.assertEquals("<^F> 6, Hex 06, Oct 006, Digr AK", VimPlugin.getMessage()) + assertEquals("<^F> 6, Hex 06, Oct 006, Digr AK", VimPlugin.getMessage()) } @Test fun `test unicode char with 3 hex digits`() { configureByText("${c}œ") enterCommand("ascii") - kotlin.test.assertEquals("<œ> 339, Hex 0153, Oct 523, Digr oe", VimPlugin.getMessage()) + assertEquals("<œ> 339, Hex 0153, Oct 523, Digr oe", VimPlugin.getMessage()) } @Test fun `test unicode char with 4 hex digits`() { configureByText("✓") enterCommand("ascii") - kotlin.test.assertEquals("<✓> 10003, Hex 2713, Oct 23423, Digr OK", VimPlugin.getMessage()) + assertEquals("<✓> 10003, Hex 2713, Oct 23423, Digr OK", VimPlugin.getMessage()) + } + + @Test + fun `test shows correct digraph for character that can be created from multiple digraphs`() { + configureByText("¢") // Can be entered with Ct and c|, should show Ct as the first digraph + enterCommand("ascii") + assertEquals("<¢> 162, Hex a2, Oct 242, Digr Ct", VimPlugin.getMessage()) } } diff --git a/src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/commands/DigraphsCommandTest.kt b/src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/commands/DigraphsCommandTest.kt index e7406f4eea..0bc94bbc0e 100644 --- a/src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/commands/DigraphsCommandTest.kt +++ b/src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/commands/DigraphsCommandTest.kt @@ -32,11 +32,17 @@ class DigraphsCommandTest : VimTestCase() { @Test fun `test digraph output`() { // Note that the following text has some control characters in, notably Unicode's RLI and PDI characters to isolate - // RTL characters and then reset the isolation - // Other control characters are either encoded or left as-is, matching Vim behaviour + // RTL characters and then reset the isolation. + // Other control characters are either encoded or left as-is, matching Vim behaviour. + // This output is a very close match to Vim's output as captured with `redir @">|silent digraphs|redir END|enew|put` + // Differences: + // * Unexpected changes in column width in Vim's output (goes from 13 to 12?) + // * `LF` is represented by `^@` in Vim, although it's output as a LF. Weird Vim NL/null handling + // * Additional Unicode control characters to ensure that RTL doesn't affect the rest of the line. We add the RLI + // RIGHT_TO_LEFT_ISOLATE code to start an isolated run of RTL chars, then POP_DIRECTIONAL_ISOLATE to restore assertCommandOutput("digraphs", """ - |NU ^@ 0 SH ^A 1 SX ^B 2 EX ^C 3 ET ^D 4 EQ ^E 5 + |NU ^@ 10 SH ^A 1 SX ^B 2 EX ^C 3 ET ^D 4 EQ ^E 5 |AK ^F 6 BL ^G 7 BS ^H 8 HT ^I 9 LF ^J 10 VT ^K 11 |FF ^L 12 CR ^M 13 SO ^N 14 SI ^O 15 DL ^P 16 D1 ^Q 17 |D2 ^R 18 D3 ^S 19 D4 ^T 20 NK ^U 21 SY ^V 22 EB ^W 23 @@ -49,216 +55,220 @@ class DigraphsCommandTest : VimTestCase() { |S2 <8e> 142 S3 <8f> 143 DC <90> 144 P1 <91> 145 P2 <92> 146 TS <93> 147 |CC <94> 148 MW <95> 149 SG <96> 150 EG <97> 151 SS <98> 152 GC <99> 153 |SC <9a> 154 CI <9b> 155 ST <9c> 156 OC <9d> 157 PM <9e> 158 AC <9f> 159 - |NS   160 !I ¡ 161 Ct ¢ 162 Pd £ 163 Cu ¤ 164 Ye ¥ 165 - |BB ¦ 166 SE § 167 ': ¨ 168 Co © 169 -a ª 170 << « 171 - |NO ¬ 172 -- 173 Rg ® 174 'm ¯ 175 DG ° 176 +- ± 177 - |2S ² 178 3S ³ 179 '' ´ 180 My µ 181 PI ¶ 182 .M · 183 - |', ¸ 184 1S ¹ 185 -o º 186 >> » 187 14 ¼ 188 12 ½ 189 - |34 ¾ 190 ?I ¿ 191 A! À 192 A' Á 193 A>  194 A? à 195 - |A: Ä 196 AA Å 197 AE Æ 198 C, Ç 199 E! È 200 E' É 201 - |E> Ê 202 E: Ë 203 I! Ì 204 I' Í 205 I> Î 206 I: Ï 207 - |D- Ð 208 N? Ñ 209 O! Ò 210 O' Ó 211 O> Ô 212 O? Õ 213 - |O: Ö 214 *X × 215 O/ Ø 216 U! Ù 217 U' Ú 218 U> Û 219 - |U: Ü 220 Y' Ý 221 TH Þ 222 ss ß 223 a! à 224 a' á 225 - |a> â 226 a? ã 227 a: ä 228 aa å 229 ae æ 230 c, ç 231 - |e! è 232 e' é 233 e> ê 234 e: ë 235 i! ì 236 i' í 237 - |i> î 238 i: ï 239 d- ð 240 n? ñ 241 o! ò 242 o' ó 243 - |o> ô 244 o? õ 245 o: ö 246 -: ÷ 247 o/ ø 248 u! ù 249 - |u' ú 250 u> û 251 u: ü 252 y' ý 253 th þ 254 y: ÿ 255 - |A- Ā 256 a- ā 257 A( Ă 258 a( ă 259 A; Ą 260 a; ą 261 - |C' Ć 262 c' ć 263 C> Ĉ 264 c> ĉ 265 C. Ċ 266 c. ċ 267 - |C< Č 268 c< č 269 D< Ď 270 d< ď 271 D/ Đ 272 d/ đ 273 - |E- Ē 274 e- ē 275 E( Ĕ 276 e( ĕ 277 E. Ė 278 e. ė 279 - |E; Ę 280 e; ę 281 E< Ě 282 e< ě 283 G> Ĝ 284 g> ĝ 285 - |G( Ğ 286 g( ğ 287 G. Ġ 288 g. ġ 289 G, Ģ 290 g, ģ 291 - |H> Ĥ 292 h> ĥ 293 H/ Ħ 294 h/ ħ 295 I? Ĩ 296 i? ĩ 297 - |I- Ī 298 i- ī 299 I( Ĭ 300 i( ĭ 301 I; Į 302 i; į 303 - |I. İ 304 i. ı 305 IJ IJ 306 ij ij 307 J> Ĵ 308 j> ĵ 309 - |K, Ķ 310 k, ķ 311 kk ĸ 312 L' Ĺ 313 l' ĺ 314 L, Ļ 315 - |l, ļ 316 L< Ľ 317 l< ľ 318 L. Ŀ 319 l. ŀ 320 L/ Ł 321 - |l/ ł 322 N' Ń 323 n' ń 324 N, Ņ 325 n, ņ 326 N< Ň 327 - |n< ň 328 'n ʼn 329 NG Ŋ 330 ng ŋ 331 O- Ō 332 o- ō 333 - |O( Ŏ 334 o( ŏ 335 O" Ő 336 o" ő 337 OE Œ 338 oe œ 339 - |R' Ŕ 340 r' ŕ 341 R, Ŗ 342 r, ŗ 343 R< Ř 344 r< ř 345 - |S' Ś 346 s' ś 347 S> Ŝ 348 s> ŝ 349 S, Ş 350 s, ş 351 - |S< Š 352 s< š 353 T, Ţ 354 t, ţ 355 T< Ť 356 t< ť 357 - |T/ Ŧ 358 t/ ŧ 359 U? Ũ 360 u? ũ 361 U- Ū 362 u- ū 363 - |U( Ŭ 364 u( ŭ 365 U0 Ů 366 u0 ů 367 U" Ű 368 u" ű 369 - |U; Ų 370 u; ų 371 W> Ŵ 372 w> ŵ 373 Y> Ŷ 374 y> ŷ 375 - |Y: Ÿ 376 Z' Ź 377 z' ź 378 Z. Ż 379 z. ż 380 Z< Ž 381 - |z< ž 382 O9 Ơ 416 o9 ơ 417 OI Ƣ 418 oi ƣ 419 yr Ʀ 422 - |U9 Ư 431 u9 ư 432 Z/ Ƶ 437 z/ ƶ 438 ED Ʒ 439 A< Ǎ 461 - |a< ǎ 462 I< Ǐ 463 i< ǐ 464 O< Ǒ 465 o< ǒ 466 U< Ǔ 467 - |u< ǔ 468 A1 Ǟ 478 a1 ǟ 479 A7 Ǡ 480 a7 ǡ 481 A3 Ǣ 482 - |a3 ǣ 483 G/ Ǥ 484 g/ ǥ 485 G< Ǧ 486 g< ǧ 487 K< Ǩ 488 - |k< ǩ 489 O; Ǫ 490 o; ǫ 491 O1 Ǭ 492 o1 ǭ 493 EZ Ǯ 494 - |ez ǯ 495 j< ǰ 496 G' Ǵ 500 g' ǵ 501 ;S ʿ 703 '< ˇ 711 - |'( ˘ 728 '. ˙ 729 '0 ˚ 730 '; ˛ 731 '" ˝ 733 A% Ά 902 - |E% Έ 904 Y% Ή 905 I% Ί 906 O% Ό 908 U% Ύ 910 W% Ώ 911 - |i3 ΐ 912 A* Α 913 B* Β 914 G* Γ 915 D* Δ 916 E* Ε 917 - |Z* Ζ 918 Y* Η 919 H* Θ 920 I* Ι 921 K* Κ 922 L* Λ 923 - |M* Μ 924 N* Ν 925 C* Ξ 926 O* Ο 927 P* Π 928 R* Ρ 929 - |S* Σ 931 T* Τ 932 U* Υ 933 F* Φ 934 X* Χ 935 Q* Ψ 936 - |W* Ω 937 J* Ϊ 938 V* Ϋ 939 a% ά 940 e% έ 941 y% ή 942 - |i% ί 943 u3 ΰ 944 a* α 945 b* β 946 g* γ 947 d* δ 948 - |e* ε 949 z* ζ 950 y* η 951 h* θ 952 i* ι 953 k* κ 954 - |l* λ 955 m* μ 956 n* ν 957 c* ξ 958 o* ο 959 p* π 960 - |r* ρ 961 *s ς 962 s* σ 963 t* τ 964 u* υ 965 f* φ 966 - |x* χ 967 q* ψ 968 w* ω 969 j* ϊ 970 v* ϋ 971 o% ό 972 - |u% ύ 973 w% ώ 974 'G Ϙ 984 ,G ϙ 985 T3 Ϛ 986 t3 ϛ 987 - |M3 Ϝ 988 m3 ϝ 989 K3 Ϟ 990 k3 ϟ 991 P3 Ϡ 992 p3 ϡ 993 - |'% ϴ 1012 j3 ϵ 1013 IO Ё 1025 D% Ђ 1026 G% Ѓ 1027 IE Є 1028 - |DS Ѕ 1029 II І 1030 YI Ї 1031 J% Ј 1032 LJ Љ 1033 NJ Њ 1034 - |Ts Ћ 1035 KJ Ќ 1036 V% Ў 1038 DZ Џ 1039 A= А 1040 B= Б 1041 - |V= В 1042 G= Г 1043 D= Д 1044 E= Е 1045 Z% Ж 1046 Z= З 1047 - |I= И 1048 J= Й 1049 K= К 1050 L= Л 1051 M= М 1052 N= Н 1053 - |O= О 1054 P= П 1055 R= Р 1056 S= С 1057 T= Т 1058 U= У 1059 - |F= Ф 1060 H= Х 1061 C= Ц 1062 C% Ч 1063 S% Ш 1064 Sc Щ 1065 - |=" Ъ 1066 Y= Ы 1067 %" Ь 1068 JE Э 1069 JU Ю 1070 JA Я 1071 - |a= а 1072 b= б 1073 v= в 1074 g= г 1075 d= д 1076 e= е 1077 - |z% ж 1078 z= з 1079 i= и 1080 j= й 1081 k= к 1082 l= л 1083 - |m= м 1084 n= н 1085 o= о 1086 p= п 1087 r= р 1088 s= с 1089 - |t= т 1090 u= у 1091 f= ф 1092 h= х 1093 c= ц 1094 c% ч 1095 - |s% ш 1096 sc щ 1097 =' ъ 1098 y= ы 1099 %' ь 1100 je э 1101 - |ju ю 1102 ja я 1103 io ё 1105 d% ђ 1106 g% ѓ 1107 ie є 1108 - |ds ѕ 1109 ii і 1110 yi ї 1111 j% ј 1112 lj љ 1113 nj њ 1114 - |ts ћ 1115 kj ќ 1116 v% ў 1118 dz џ 1119 Y3 Ѣ 1122 y3 ѣ 1123 - |O3 Ѫ 1130 o3 ѫ 1131 F3 Ѳ 1138 f3 ѳ 1139 V3 Ѵ 1140 v3 ѵ 1141 - |C3 Ҁ 1152 c3 ҁ 1153 G3 Ґ 1168 g3 ґ 1169 A+ ⁧א⁩ 1488 B+ ⁧ב⁩ 1489 - |G+ ⁧ג⁩ 1490 D+ ⁧ד⁩ 1491 H+ ⁧ה⁩ 1492 W+ ⁧ו⁩ 1493 Z+ ⁧ז⁩ 1494 X+ ⁧ח⁩ 1495 - |Tj ⁧ט⁩ 1496 J+ ⁧י⁩ 1497 K% ⁧ך⁩ 1498 K+ ⁧כ⁩ 1499 L+ ⁧ל⁩ 1500 M% ⁧ם⁩ 1501 - |M+ ⁧מ⁩ 1502 N% ⁧ן⁩ 1503 N+ ⁧נ⁩ 1504 S+ ⁧ס⁩ 1505 E+ ⁧ע⁩ 1506 P% ⁧ף⁩ 1507 - |P+ ⁧פ⁩ 1508 Zj ⁧ץ⁩ 1509 ZJ ⁧צ⁩ 1510 Q+ ⁧ק⁩ 1511 R+ ⁧ר⁩ 1512 Sh ⁧ש⁩ 1513 - |T+ ⁧ת⁩ 1514 ,+ ، 1548 ;+ ⁧؛⁩ 1563 ?+ ⁧؟⁩ 1567 H' ⁧ء⁩ 1569 aM ⁧آ⁩ 1570 - |aH ⁧أ⁩ 1571 wH ⁧ؤ⁩ 1572 ah ⁧إ⁩ 1573 yH ⁧ئ⁩ 1574 a+ ⁧ا⁩ 1575 b+ ⁧ب⁩ 1576 - |tm ⁧ة⁩ 1577 t+ ⁧ت⁩ 1578 tk ⁧ث⁩ 1579 g+ ⁧ج⁩ 1580 hk ⁧ح⁩ 1581 x+ ⁧خ⁩ 1582 - |d+ ⁧د⁩ 1583 dk ⁧ذ⁩ 1584 r+ ⁧ر⁩ 1585 z+ ⁧ز⁩ 1586 s+ ⁧س⁩ 1587 sn ⁧ش⁩ 1588 - |c+ ⁧ص⁩ 1589 dd ⁧ض⁩ 1590 tj ⁧ط⁩ 1591 zH ⁧ظ⁩ 1592 e+ ⁧ع⁩ 1593 i+ ⁧غ⁩ 1594 - |++ ⁧ـ⁩ 1600 f+ ⁧ف⁩ 1601 q+ ⁧ق⁩ 1602 k+ ⁧ك⁩ 1603 l+ ⁧ل⁩ 1604 m+ ⁧م⁩ 1605 - |n+ ⁧ن⁩ 1606 h+ ⁧ه⁩ 1607 w+ ⁧و⁩ 1608 j+ ⁧ى⁩ 1609 y+ ⁧ي⁩ 1610 :+ ً 1611 - |"+ ٌ 1612 =+ ٍ 1613 /+ َ 1614 '+ ُ 1615 1+ ِ 1616 3+ ّ 1617 - |0+ ْ 1618 aS ٰ 1648 p+ ⁧پ⁩ 1662 v+ ⁧ڤ⁩ 1700 gf ⁧گ⁩ 1711 0a ۰ 1776 - |1a ۱ 1777 2a ۲ 1778 3a ۳ 1779 4a ۴ 1780 5a ۵ 1781 6a ۶ 1782 - |7a ۷ 1783 8a ۸ 1784 9a ۹ 1785 B. Ḃ 7682 b. ḃ 7683 B_ Ḇ 7686 - |b_ ḇ 7687 D. Ḋ 7690 d. ḋ 7691 D_ Ḏ 7694 d_ ḏ 7695 D, Ḑ 7696 - |d, ḑ 7697 F. Ḟ 7710 f. ḟ 7711 G- Ḡ 7712 g- ḡ 7713 H. Ḣ 7714 - |h. ḣ 7715 H: Ḧ 7718 h: ḧ 7719 H, Ḩ 7720 h, ḩ 7721 K' Ḱ 7728 - |k' ḱ 7729 K_ Ḵ 7732 k_ ḵ 7733 L_ Ḻ 7738 l_ ḻ 7739 M' Ḿ 7742 - |m' ḿ 7743 M. Ṁ 7744 m. ṁ 7745 N. Ṅ 7748 n. ṅ 7749 N_ Ṉ 7752 - |n_ ṉ 7753 P' Ṕ 7764 p' ṕ 7765 P. Ṗ 7766 p. ṗ 7767 R. Ṙ 7768 - |r. ṙ 7769 R_ Ṟ 7774 r_ ṟ 7775 S. Ṡ 7776 s. ṡ 7777 T. Ṫ 7786 - |t. ṫ 7787 T_ Ṯ 7790 t_ ṯ 7791 V? Ṽ 7804 v? ṽ 7805 W! Ẁ 7808 - |w! ẁ 7809 W' Ẃ 7810 w' ẃ 7811 W: Ẅ 7812 w: ẅ 7813 W. Ẇ 7814 + |NS   160 !I ¡ 161 ~! ¡ 161 Ct ¢ 162 c| ¢ 162 Pd £ 163 + |$$ £ 163 Cu ¤ 164 ox ¤ 164 Ye ¥ 165 Y- ¥ 165 BB ¦ 166 + ||| ¦ 166 SE § 167 ': ¨ 168 Co © 169 cO © 169 -a ª 170 + |<< « 171 NO ¬ 172 -, ¬ 172 -- 173 Rg ® 174 'm ¯ 175 + |-= ¯ 175 DG ° 176 ~o ° 176 +- ± 177 2S ² 178 22 ² 178 + |3S ³ 179 33 ³ 179 '' ´ 180 My µ 181 PI ¶ 182 pp ¶ 182 + |.M · 183 ~. · 183 ', ¸ 184 1S ¹ 185 11 ¹ 185 -o º 186 + |>> » 187 14 ¼ 188 12 ½ 189 34 ¾ 190 ?I ¿ 191 ~? ¿ 191 + |A! À 192 A` À 192 A' Á 193 A>  194 A^  194 A? à 195 + |A~ à 195 A: Ä 196 A" Ä 196 AA Å 197 A@ Å 197 AE Æ 198 + |C, Ç 199 E! È 200 E` È 200 E' É 201 E> Ê 202 E^ Ê 202 + |E: Ë 203 E" Ë 203 I! Ì 204 I` Ì 204 I' Í 205 I> Î 206 + |I^ Î 206 I: Ï 207 I" Ï 207 D- Ð 208 N? Ñ 209 N~ Ñ 209 + |O! Ò 210 O` Ò 210 O' Ó 211 O> Ô 212 O^ Ô 212 O? Õ 213 + |O~ Õ 213 O: Ö 214 *X × 215 /\ × 215 O/ Ø 216 U! Ù 217 + |U` Ù 217 U' Ú 218 U> Û 219 U^ Û 219 U: Ü 220 Y' Ý 221 + |TH Þ 222 Ip Þ 222 ss ß 223 a! à 224 a` à 224 a' á 225 + |a> â 226 a^ â 226 a? ã 227 a~ ã 227 a: ä 228 a" ä 228 + |aa å 229 a@ å 229 ae æ 230 c, ç 231 e! è 232 e` è 232 + |e' é 233 e> ê 234 e^ ê 234 e: ë 235 e" ë 235 i! ì 236 + |i` ì 236 i' í 237 i> î 238 i^ î 238 i: ï 239 d- ð 240 + |n? ñ 241 n~ ñ 241 o! ò 242 o` ò 242 o' ó 243 o> ô 244 + |o^ ô 244 o? õ 245 o~ õ 245 o: ö 246 -: ÷ 247 o/ ø 248 + |u! ù 249 u` ù 249 u' ú 250 u> û 251 u^ û 251 u: ü 252 + |y' ý 253 th þ 254 y: ÿ 255 y" ÿ 255 A- Ā 256 a- ā 257 + |A( Ă 258 a( ă 259 A; Ą 260 a; ą 261 C' Ć 262 c' ć 263 + |C> Ĉ 264 c> ĉ 265 C. Ċ 266 c. ċ 267 C< Č 268 c< č 269 + |D< Ď 270 d< ď 271 D/ Đ 272 d/ đ 273 E- Ē 274 e- ē 275 + |E( Ĕ 276 e( ĕ 277 E. Ė 278 e. ė 279 E; Ę 280 e; ę 281 + |E< Ě 282 e< ě 283 G> Ĝ 284 g> ĝ 285 G( Ğ 286 g( ğ 287 + |G. Ġ 288 g. ġ 289 G, Ģ 290 g, ģ 291 H> Ĥ 292 h> ĥ 293 + |H/ Ħ 294 h/ ħ 295 I? Ĩ 296 i? ĩ 297 I- Ī 298 i- ī 299 + |I( Ĭ 300 i( ĭ 301 I; Į 302 i; į 303 I. İ 304 i. ı 305 + |IJ IJ 306 ij ij 307 J> Ĵ 308 j> ĵ 309 K, Ķ 310 k, ķ 311 + |kk ĸ 312 L' Ĺ 313 l' ĺ 314 L, Ļ 315 l, ļ 316 L< Ľ 317 + |l< ľ 318 L. Ŀ 319 l. ŀ 320 L/ Ł 321 l/ ł 322 N' Ń 323 + |n' ń 324 N, Ņ 325 n, ņ 326 N< Ň 327 n< ň 328 'n ʼn 329 + |NG Ŋ 330 ng ŋ 331 O- Ō 332 o- ō 333 O( Ŏ 334 o( ŏ 335 + |O" Ő 336 o" ő 337 OE Œ 338 oe œ 339 R' Ŕ 340 r' ŕ 341 + |R, Ŗ 342 r, ŗ 343 R< Ř 344 r< ř 345 S' Ś 346 s' ś 347 + |S> Ŝ 348 s> ŝ 349 S, Ş 350 s, ş 351 S< Š 352 s< š 353 + |T, Ţ 354 t, ţ 355 T< Ť 356 t< ť 357 T/ Ŧ 358 t/ ŧ 359 + |U? Ũ 360 u? ũ 361 U- Ū 362 u- ū 363 U( Ŭ 364 u( ŭ 365 + |U0 Ů 366 u0 ů 367 U" Ű 368 u" ű 369 U; Ų 370 u; ų 371 + |W> Ŵ 372 w> ŵ 373 Y> Ŷ 374 y> ŷ 375 Y: Ÿ 376 Z' Ź 377 + |z' ź 378 Z. Ż 379 z. ż 380 Z< Ž 381 z< ž 382 O9 Ơ 416 + |o9 ơ 417 OI Ƣ 418 oi ƣ 419 yr Ʀ 422 U9 Ư 431 u9 ư 432 + |Z/ Ƶ 437 z/ ƶ 438 ED Ʒ 439 A< Ǎ 461 a< ǎ 462 I< Ǐ 463 + |i< ǐ 464 O< Ǒ 465 o< ǒ 466 U< Ǔ 467 u< ǔ 468 A1 Ǟ 478 + |a1 ǟ 479 A7 Ǡ 480 a7 ǡ 481 A3 Ǣ 482 a3 ǣ 483 G/ Ǥ 484 + |g/ ǥ 485 G< Ǧ 486 g< ǧ 487 K< Ǩ 488 k< ǩ 489 O; Ǫ 490 + |o; ǫ 491 O1 Ǭ 492 o1 ǭ 493 EZ Ǯ 494 ez ǯ 495 j< ǰ 496 + |G' Ǵ 500 g' ǵ 501 ;S ʿ 703 '< ˇ 711 '( ˘ 728 '. ˙ 729 + |'0 ˚ 730 '; ˛ 731 '" ˝ 733 A% Ά 902 E% Έ 904 Y% Ή 905 + |I% Ί 906 O% Ό 908 U% Ύ 910 W% Ώ 911 i3 ΐ 912 A* Α 913 + |B* Β 914 G* Γ 915 D* Δ 916 E* Ε 917 Z* Ζ 918 Y* Η 919 + |H* Θ 920 I* Ι 921 K* Κ 922 L* Λ 923 M* Μ 924 N* Ν 925 + |C* Ξ 926 O* Ο 927 P* Π 928 R* Ρ 929 S* Σ 931 T* Τ 932 + |U* Υ 933 F* Φ 934 X* Χ 935 Q* Ψ 936 W* Ω 937 J* Ϊ 938 + |V* Ϋ 939 a% ά 940 e% έ 941 y% ή 942 i% ί 943 u3 ΰ 944 + |a* α 945 b* β 946 g* γ 947 d* δ 948 e* ε 949 z* ζ 950 + |y* η 951 h* θ 952 i* ι 953 k* κ 954 l* λ 955 m* μ 956 + |n* ν 957 c* ξ 958 o* ο 959 p* π 960 r* ρ 961 *s ς 962 + |s* σ 963 t* τ 964 u* υ 965 f* φ 966 x* χ 967 q* ψ 968 + |w* ω 969 j* ϊ 970 v* ϋ 971 o% ό 972 u% ύ 973 w% ώ 974 + |'G Ϙ 984 ,G ϙ 985 T3 Ϛ 986 t3 ϛ 987 M3 Ϝ 988 m3 ϝ 989 + |K3 Ϟ 990 k3 ϟ 991 P3 Ϡ 992 p3 ϡ 993 '% ϴ 1012 j3 ϵ 1013 + |IO Ё 1025 D% Ђ 1026 G% Ѓ 1027 IE Є 1028 DS Ѕ 1029 II І 1030 + |YI Ї 1031 J% Ј 1032 LJ Љ 1033 NJ Њ 1034 Ts Ћ 1035 KJ Ќ 1036 + |V% Ў 1038 DZ Џ 1039 A= А 1040 B= Б 1041 V= В 1042 G= Г 1043 + |D= Д 1044 E= Е 1045 Z% Ж 1046 Z= З 1047 I= И 1048 J= Й 1049 + |K= К 1050 L= Л 1051 M= М 1052 N= Н 1053 O= О 1054 P= П 1055 + |R= Р 1056 S= С 1057 T= Т 1058 U= У 1059 F= Ф 1060 H= Х 1061 + |C= Ц 1062 C% Ч 1063 S% Ш 1064 Sc Щ 1065 =" Ъ 1066 Y= Ы 1067 + |%" Ь 1068 JE Э 1069 JU Ю 1070 JA Я 1071 a= а 1072 b= б 1073 + |v= в 1074 g= г 1075 d= д 1076 e= е 1077 z% ж 1078 z= з 1079 + |i= и 1080 j= й 1081 k= к 1082 l= л 1083 m= м 1084 n= н 1085 + |o= о 1086 p= п 1087 r= р 1088 s= с 1089 t= т 1090 u= у 1091 + |f= ф 1092 h= х 1093 c= ц 1094 c% ч 1095 s% ш 1096 sc щ 1097 + |=' ъ 1098 y= ы 1099 %' ь 1100 je э 1101 ju ю 1102 ja я 1103 + |io ё 1105 d% ђ 1106 g% ѓ 1107 ie є 1108 ds ѕ 1109 ii і 1110 + |yi ї 1111 j% ј 1112 lj љ 1113 nj њ 1114 ts ћ 1115 kj ќ 1116 + |v% ў 1118 dz џ 1119 Y3 Ѣ 1122 y3 ѣ 1123 O3 Ѫ 1130 o3 ѫ 1131 + |F3 Ѳ 1138 f3 ѳ 1139 V3 Ѵ 1140 v3 ѵ 1141 C3 Ҁ 1152 c3 ҁ 1153 + |G3 Ґ 1168 g3 ґ 1169 A+ ⁧א⁩ 1488 B+ ⁧ב⁩ 1489 G+ ⁧ג⁩ 1490 D+ ⁧ד⁩ 1491 + |H+ ⁧ה⁩ 1492 W+ ⁧ו⁩ 1493 Z+ ⁧ז⁩ 1494 X+ ⁧ח⁩ 1495 Tj ⁧ט⁩ 1496 J+ ⁧י⁩ 1497 + |K% ⁧ך⁩ 1498 K+ ⁧כ⁩ 1499 L+ ⁧ל⁩ 1500 M% ⁧ם⁩ 1501 M+ ⁧מ⁩ 1502 N% ⁧ן⁩ 1503 + |N+ ⁧נ⁩ 1504 S+ ⁧ס⁩ 1505 E+ ⁧ע⁩ 1506 P% ⁧ף⁩ 1507 P+ ⁧פ⁩ 1508 Zj ⁧ץ⁩ 1509 + |ZJ ⁧צ⁩ 1510 Q+ ⁧ק⁩ 1511 R+ ⁧ר⁩ 1512 Sh ⁧ש⁩ 1513 T+ ⁧ת⁩ 1514 ,+ ، 1548 + |;+ ⁧؛⁩ 1563 ?+ ⁧؟⁩ 1567 H' ⁧ء⁩ 1569 aM ⁧آ⁩ 1570 aH ⁧أ⁩ 1571 wH ⁧ؤ⁩ 1572 + |ah ⁧إ⁩ 1573 yH ⁧ئ⁩ 1574 a+ ⁧ا⁩ 1575 b+ ⁧ب⁩ 1576 tm ⁧ة⁩ 1577 t+ ⁧ت⁩ 1578 + |tk ⁧ث⁩ 1579 g+ ⁧ج⁩ 1580 hk ⁧ح⁩ 1581 x+ ⁧خ⁩ 1582 d+ ⁧د⁩ 1583 dk ⁧ذ⁩ 1584 + |r+ ⁧ر⁩ 1585 z+ ⁧ز⁩ 1586 s+ ⁧س⁩ 1587 sn ⁧ش⁩ 1588 c+ ⁧ص⁩ 1589 dd ⁧ض⁩ 1590 + |tj ⁧ط⁩ 1591 zH ⁧ظ⁩ 1592 e+ ⁧ع⁩ 1593 i+ ⁧غ⁩ 1594 ++ ⁧ـ⁩ 1600 f+ ⁧ف⁩ 1601 + |q+ ⁧ق⁩ 1602 k+ ⁧ك⁩ 1603 l+ ⁧ل⁩ 1604 m+ ⁧م⁩ 1605 n+ ⁧ن⁩ 1606 h+ ⁧ه⁩ 1607 + |w+ ⁧و⁩ 1608 j+ ⁧ى⁩ 1609 y+ ⁧ي⁩ 1610 :+ ً 1611 "+ ٌ 1612 =+ ٍ 1613 + |/+ َ 1614 '+ ُ 1615 1+ ِ 1616 3+ ّ 1617 0+ ْ 1618 aS ٰ 1648 + |p+ ⁧پ⁩ 1662 v+ ⁧ڤ⁩ 1700 gf ⁧گ⁩ 1711 0a ۰ 1776 1a ۱ 1777 2a ۲ 1778 + |3a ۳ 1779 4a ۴ 1780 5a ۵ 1781 6a ۶ 1782 7a ۷ 1783 8a ۸ 1784 + |9a ۹ 1785 B. Ḃ 7682 b. ḃ 7683 B_ Ḇ 7686 b_ ḇ 7687 D. Ḋ 7690 + |d. ḋ 7691 D_ Ḏ 7694 d_ ḏ 7695 D, Ḑ 7696 d, ḑ 7697 F. Ḟ 7710 + |f. ḟ 7711 G- Ḡ 7712 g- ḡ 7713 H. Ḣ 7714 h. ḣ 7715 H: Ḧ 7718 + |h: ḧ 7719 H, Ḩ 7720 h, ḩ 7721 K' Ḱ 7728 k' ḱ 7729 K_ Ḵ 7732 + |k_ ḵ 7733 L_ Ḻ 7738 l_ ḻ 7739 M' Ḿ 7742 m' ḿ 7743 M. Ṁ 7744 + |m. ṁ 7745 N. Ṅ 7748 n. ṅ 7749 N_ Ṉ 7752 n_ ṉ 7753 P' Ṕ 7764 + |p' ṕ 7765 P. Ṗ 7766 p. ṗ 7767 R. Ṙ 7768 r. ṙ 7769 R_ Ṟ 7774 + |r_ ṟ 7775 S. Ṡ 7776 s. ṡ 7777 T. Ṫ 7786 t. ṫ 7787 T_ Ṯ 7790 + |t_ ṯ 7791 V? Ṽ 7804 v? ṽ 7805 W! Ẁ 7808 W` Ẁ 7808 w! ẁ 7809 + |w` ẁ 7809 W' Ẃ 7810 w' ẃ 7811 W: Ẅ 7812 w: ẅ 7813 W. Ẇ 7814 |w. ẇ 7815 X. Ẋ 7818 x. ẋ 7819 X: Ẍ 7820 x: ẍ 7821 Y. Ẏ 7822 |y. ẏ 7823 Z> Ẑ 7824 z> ẑ 7825 Z_ Ẕ 7828 z_ ẕ 7829 h_ ẖ 7830 |t: ẗ 7831 w0 ẘ 7832 y0 ẙ 7833 A2 Ả 7842 a2 ả 7843 E2 Ẻ 7866 |e2 ẻ 7867 E? Ẽ 7868 e? ẽ 7869 I2 Ỉ 7880 i2 ỉ 7881 O2 Ỏ 7886 - |o2 ỏ 7887 U2 Ủ 7910 u2 ủ 7911 Y! Ỳ 7922 y! ỳ 7923 Y2 Ỷ 7926 - |y2 ỷ 7927 Y? Ỹ 7928 y? ỹ 7929 ;' ἀ 7936 ,' ἁ 7937 ;! ἂ 7938 - |,! ἃ 7939 ?; ἄ 7940 ?, ἅ 7941 !: ἆ 7942 ?: ἇ 7943 1N   8194 - |1M   8195 3M   8196 4M   8197 6M   8198 1T   8201 1H   8202 - |-1 ‐ 8208 -N – 8211 -M — 8212 -3 ― 8213 !2 ‖ 8214 =2 ‗ 8215 - |'6 ‘ 8216 '9 ’ 8217 .9 ‚ 8218 9' ‛ 8219 "6 “ 8220 "9 ” 8221 - |:9 „ 8222 9" ‟ 8223 /- † 8224 /= ‡ 8225 .. ‥ 8229 ,. … 8230 - |%0 ‰ 8240 1' ′ 8242 2' ″ 8243 3' ‴ 8244 1" ‵ 8245 2" ‶ 8246 - |3" ‷ 8247 Ca ‸ 8248 <1 ‹ 8249 >1 › 8250 :X ※ 8251 '- ‾ 8254 - |/f ⁄ 8260 0S ⁰ 8304 4S ⁴ 8308 5S ⁵ 8309 6S ⁶ 8310 7S ⁷ 8311 - |8S ⁸ 8312 9S ⁹ 8313 +S ⁺ 8314 -S ⁻ 8315 =S ⁼ 8316 (S ⁽ 8317 - |)S ⁾ 8318 nS ⁿ 8319 0s ₀ 8320 1s ₁ 8321 2s ₂ 8322 3s ₃ 8323 - |4s ₄ 8324 5s ₅ 8325 6s ₆ 8326 7s ₇ 8327 8s ₈ 8328 9s ₉ 8329 - |+s ₊ 8330 -s ₋ 8331 =s ₌ 8332 (s ₍ 8333 )s ₎ 8334 Li ₤ 8356 - |Pt ₧ 8359 W= ₩ 8361 oC ℃ 8451 co ℅ 8453 oF ℉ 8457 N0 № 8470 - |PO ℗ 8471 Rx ℞ 8478 SM ℠ 8480 TM ™ 8482 Om Ω 8486 AO Å 8491 - |13 ⅓ 8531 23 ⅔ 8532 15 ⅕ 8533 25 ⅖ 8534 35 ⅗ 8535 45 ⅘ 8536 - |16 ⅙ 8537 56 ⅚ 8538 18 ⅛ 8539 38 ⅜ 8540 58 ⅝ 8541 78 ⅞ 8542 - |1R Ⅰ 8544 2R Ⅱ 8545 3R Ⅲ 8546 4R Ⅳ 8547 5R Ⅴ 8548 6R Ⅵ 8549 - |7R Ⅶ 8550 8R Ⅷ 8551 9R Ⅸ 8552 aR Ⅹ 8553 bR Ⅺ 8554 cR Ⅻ 8555 - |1r ⅰ 8560 2r ⅱ 8561 3r ⅲ 8562 4r ⅳ 8563 5r ⅴ 8564 6r ⅵ 8565 - |7r ⅶ 8566 8r ⅷ 8567 9r ⅸ 8568 ar ⅹ 8569 br ⅺ 8570 cr ⅻ 8571 - |<- ← 8592 -! ↑ 8593 -> → 8594 -v ↓ 8595 <> ↔ 8596 UD ↕ 8597 - |<= ⇐ 8656 => ⇒ 8658 == ⇔ 8660 FA ∀ 8704 dP ∂ 8706 TE ∃ 8707 - |/0 ∅ 8709 DE ∆ 8710 NB ∇ 8711 (- ∈ 8712 -) ∋ 8715 *P ∏ 8719 - |+Z ∑ 8721 -2 − 8722 -+ ∓ 8723 *- ∗ 8727 Ob ∘ 8728 Sb ∙ 8729 - |RT √ 8730 0( ∝ 8733 00 ∞ 8734 -L ∟ 8735 -V ∠ 8736 PP ∥ 8741 - |AN ∧ 8743 OR ∨ 8744 (U ∩ 8745 )U ∪ 8746 In ∫ 8747 DI ∬ 8748 - |Io ∮ 8750 .: ∴ 8756 :. ∵ 8757 :R ∶ 8758 :: ∷ 8759 ?1 ∼ 8764 - |CG ∾ 8766 ?- ≃ 8771 ?= ≅ 8773 ?2 ≈ 8776 =? ≌ 8780 HI ≓ 8787 - |!= ≠ 8800 =3 ≡ 8801 =< ≤ 8804 >= ≥ 8805 <* ≪ 8810 *> ≫ 8811 - |!< ≮ 8814 !> ≯ 8815 (C ⊂ 8834 )C ⊃ 8835 (_ ⊆ 8838 )_ ⊇ 8839 - |0. ⊙ 8857 02 ⊚ 8858 -T ⊥ 8869 .P ⋅ 8901 :3 ⋮ 8942 .3 ⋯ 8943 - |Eh ⌂ 8962 <7 ⌈ 8968 >7 ⌉ 8969 7< ⌊ 8970 7> ⌋ 8971 NI ⌐ 8976 - |(A ⌒ 8978 TR ⌕ 8981 Iu ⌠ 8992 Il ⌡ 8993 〉 9002 - |Vs ␣ 9251 1h ⑀ 9280 3h ⑁ 9281 2h ⑂ 9282 4h ⑃ 9283 1j ⑆ 9286 - |2j ⑇ 9287 3j ⑈ 9288 4j ⑉ 9289 1. ⒈ 9352 2. ⒉ 9353 3. ⒊ 9354 - |4. ⒋ 9355 5. ⒌ 9356 6. ⒍ 9357 7. ⒎ 9358 8. ⒏ 9359 9. ⒐ 9360 - |hh ─ 9472 HH ━ 9473 vv │ 9474 VV ┃ 9475 3- ┄ 9476 3_ ┅ 9477 - |3! ┆ 9478 3/ ┇ 9479 4- ┈ 9480 4_ ┉ 9481 4! ┊ 9482 4/ ┋ 9483 - |dr ┌ 9484 dR ┍ 9485 Dr ┎ 9486 DR ┏ 9487 dl ┐ 9488 dL ┑ 9489 - |Dl ┒ 9490 LD ┓ 9491 ur └ 9492 uR ┕ 9493 Ur ┖ 9494 UR ┗ 9495 - |ul ┘ 9496 uL ┙ 9497 Ul ┚ 9498 UL ┛ 9499 vr ├ 9500 vR ┝ 9501 - |Vr ┠ 9504 VR ┣ 9507 vl ┤ 9508 vL ┥ 9509 Vl ┨ 9512 VL ┫ 9515 - |dh ┬ 9516 dH ┯ 9519 Dh ┰ 9520 DH ┳ 9523 uh ┴ 9524 uH ┷ 9527 - |Uh ┸ 9528 UH ┻ 9531 vh ┼ 9532 vH ┿ 9535 Vh ╂ 9538 VH ╋ 9547 - |FD ╱ 9585 BD ╲ 9586 TB ▀ 9600 LB ▄ 9604 FB █ 9608 lB ▌ 9612 - |RB ▐ 9616 .S ░ 9617 :S ▒ 9618 ?S ▓ 9619 fS ■ 9632 OS □ 9633 - |RO ▢ 9634 Rr ▣ 9635 RF ▤ 9636 RY ▥ 9637 RH ▦ 9638 RZ ▧ 9639 - |RK ▨ 9640 RX ▩ 9641 sB ▪ 9642 SR ▬ 9644 Or ▭ 9645 UT ▲ 9650 - |uT △ 9651 PR ▶ 9654 Tr ▷ 9655 Dt ▼ 9660 dT ▽ 9661 PL ◀ 9664 - |Tl ◁ 9665 Db ◆ 9670 Dw ◇ 9671 LZ ◊ 9674 0m ○ 9675 0o ◎ 9678 - |0M ● 9679 0L ◐ 9680 0R ◑ 9681 Sn ◘ 9688 Ic ◙ 9689 Fd ◢ 9698 - |Bd ◣ 9699 *2 ★ 9733 *1 ☆ 9734 H ☞ 9758 0u ☺ 9786 - |0U ☻ 9787 SU ☼ 9788 Fm ♀ 9792 Ml ♂ 9794 cS ♠ 9824 cH ♡ 9825 - |cD ♢ 9826 cC ♣ 9827 Md ♩ 9833 M8 ♪ 9834 M2 ♫ 9835 Mb ♭ 9837 - |Mx ♮ 9838 MX ♯ 9839 OK ✓ 10003 XX ✗ 10007 -X ✠ 10016 IS   12288 - |,_ 、 12289 ._ 。 12290 +" 〃 12291 +_ 〄 12292 *_ 々 12293 ;_ 〆 12294 - |0_ 〇 12295 <+ 《 12298 >+ 》 12299 <' 「 12300 >' 」 12301 <" 『 12302 - |>" 』 12303 (" 【 12304 )" 】 12305 =T 〒 12306 =_ 〓 12307 (' 〔 12308 - |)' 〕 12309 (I 〖 12310 )I 〗 12311 -? 〜 12316 A5 ぁ 12353 a5 あ 12354 - |I5 ぃ 12355 i5 い 12356 U5 ぅ 12357 u5 う 12358 E5 ぇ 12359 e5 え 12360 - |O5 ぉ 12361 o5 お 12362 ka か 12363 ga が 12364 ki き 12365 gi ぎ 12366 - |ku く 12367 gu ぐ 12368 ke け 12369 ge げ 12370 ko こ 12371 go ご 12372 - |sa さ 12373 za ざ 12374 si し 12375 zi じ 12376 su す 12377 zu ず 12378 - |se せ 12379 ze ぜ 12380 so そ 12381 zo ぞ 12382 ta た 12383 da だ 12384 - |ti ち 12385 di ぢ 12386 tU っ 12387 tu つ 12388 du づ 12389 te て 12390 - |de で 12391 to と 12392 do ど 12393 na な 12394 ni に 12395 nu ぬ 12396 - |ne ね 12397 no の 12398 ha は 12399 ba ば 12400 pa ぱ 12401 hi ひ 12402 - |bi び 12403 pi ぴ 12404 hu ふ 12405 bu ぶ 12406 pu ぷ 12407 he へ 12408 - |be べ 12409 pe ぺ 12410 ho ほ 12411 bo ぼ 12412 po ぽ 12413 ma ま 12414 - |mi み 12415 mu む 12416 me め 12417 mo も 12418 yA ゃ 12419 ya や 12420 - |yU ゅ 12421 yu ゆ 12422 yO ょ 12423 yo よ 12424 ra ら 12425 ri り 12426 - |ru る 12427 re れ 12428 ro ろ 12429 wA ゎ 12430 wa わ 12431 wi ゐ 12432 - |we ゑ 12433 wo を 12434 n5 ん 12435 vu ゔ 12436 "5 ゛ 12443 05 ゜ 12444 - |*5 ゝ 12445 +5 ゞ 12446 a6 ァ 12449 A6 ア 12450 i6 ィ 12451 I6 イ 12452 - |u6 ゥ 12453 U6 ウ 12454 e6 ェ 12455 E6 エ 12456 o6 ォ 12457 O6 オ 12458 - |Ka カ 12459 Ga ガ 12460 Ki キ 12461 Gi ギ 12462 Ku ク 12463 Gu グ 12464 - |Ke ケ 12465 Ge ゲ 12466 Ko コ 12467 Go ゴ 12468 Sa サ 12469 Za ザ 12470 - |Si シ 12471 Zi ジ 12472 Su ス 12473 Zu ズ 12474 Se セ 12475 Ze ゼ 12476 - |So ソ 12477 Zo ゾ 12478 Ta タ 12479 Da ダ 12480 Ti チ 12481 Di ヂ 12482 - |TU ッ 12483 Tu ツ 12484 Du ヅ 12485 Te テ 12486 De デ 12487 To ト 12488 - |Do ド 12489 Na ナ 12490 Ni ニ 12491 Nu ヌ 12492 Ne ネ 12493 No ノ 12494 - |Ha ハ 12495 Ba バ 12496 Pa パ 12497 Hi ヒ 12498 Bi ビ 12499 Pi ピ 12500 - |Hu フ 12501 Bu ブ 12502 Pu プ 12503 He ヘ 12504 Be ベ 12505 Pe ペ 12506 - |Ho ホ 12507 Bo ボ 12508 Po ポ 12509 Ma マ 12510 Mi ミ 12511 Mu ム 12512 - |Me メ 12513 Mo モ 12514 YA ャ 12515 Ya ヤ 12516 YU ュ 12517 Yu ユ 12518 - |YO ョ 12519 Yo ヨ 12520 Ra ラ 12521 Ri リ 12522 Ru ル 12523 Re レ 12524 - |Ro ロ 12525 WA ヮ 12526 Wa ワ 12527 Wi ヰ 12528 We ヱ 12529 Wo ヲ 12530 - |N6 ン 12531 Vu ヴ 12532 KA ヵ 12533 KE ヶ 12534 Va ヷ 12535 Vi ヸ 12536 - |Ve ヹ 12537 Vo ヺ 12538 .6 ・ 12539 -6 ー 12540 *6 ヽ 12541 +6 ヾ 12542 - |b4 ㄅ 12549 p4 ㄆ 12550 m4 ㄇ 12551 f4 ㄈ 12552 d4 ㄉ 12553 t4 ㄊ 12554 - |n4 ㄋ 12555 l4 ㄌ 12556 g4 ㄍ 12557 k4 ㄎ 12558 h4 ㄏ 12559 j4 ㄐ 12560 - |q4 ㄑ 12561 x4 ㄒ 12562 zh ㄓ 12563 ch ㄔ 12564 sh ㄕ 12565 r4 ㄖ 12566 - |z4 ㄗ 12567 c4 ㄘ 12568 s4 ㄙ 12569 a4 ㄚ 12570 o4 ㄛ 12571 e4 ㄜ 12572 - |ai ㄞ 12574 ei ㄟ 12575 au ㄠ 12576 ou ㄡ 12577 an ㄢ 12578 en ㄣ 12579 - |aN ㄤ 12580 eN ㄥ 12581 er ㄦ 12582 i4 ㄧ 12583 u4 ㄨ 12584 iu ㄩ 12585 - |v4 ㄪ 12586 nG ㄫ 12587 gn ㄬ 12588 1c ㈠ 12832 2c ㈡ 12833 3c ㈢ 12834 - |4c ㈣ 12835 5c ㈤ 12836 6c ㈥ 12837 7c ㈦ 12838 8c ㈧ 12839 9c ㈨ 12840 - |/c 57345 UA 57346 UB 57347 "3 57348 "1 57349 "! 57350 - |"' 57351 "> 57352 "? 57353 "- 57354 "( 57355 ". 57356 - |": 57357 "0 57358 "" 57359 "< 57360 ", 57361 "; 57362 - |"_ 57363 "= 57364 "/ 57365 "i 57366 "d 57367 "p 57368 - |;; 57369 ,, 57370 b3 57371 Ci 57372 f( 57373 ed 57374 - |am 57375 pm 57376 Fl 57379 GF 57380 >V 57381 !* 57382 - |?* 57383 J< 57384 ff ff 64256 fi fi 64257 fl fl 64258 ft ſt 64261 + |o2 ỏ 7887 U2 Ủ 7910 u2 ủ 7911 Y! Ỳ 7922 Y` Ỳ 7922 y! ỳ 7923 + |y` ỳ 7923 Y2 Ỷ 7926 y2 ỷ 7927 Y? Ỹ 7928 y? ỹ 7929 ;' ἀ 7936 + |,' ἁ 7937 ;! ἂ 7938 ,! ἃ 7939 ?; ἄ 7940 ?, ἅ 7941 !: ἆ 7942 + |?: ἇ 7943 1N   8194 1M   8195 3M   8196 4M   8197 6M   8198 + |1T   8201 1H   8202 -1 ‐ 8208 -N – 8211 -M — 8212 -3 ― 8213 + |!2 ‖ 8214 =2 ‗ 8215 '6 ‘ 8216 '9 ’ 8217 .9 ‚ 8218 9' ‛ 8219 + |"6 “ 8220 "9 ” 8221 :9 „ 8222 9" ‟ 8223 /- † 8224 /= ‡ 8225 + |oo • 8226 .. ‥ 8229 ,. … 8230 %0 ‰ 8240 1' ′ 8242 2' ″ 8243 + |3' ‴ 8244 4' ⁗ 8279 1" ‵ 8245 2" ‶ 8246 3" ‷ 8247 Ca ‸ 8248 + |<1 ‹ 8249 >1 › 8250 :X ※ 8251 '- ‾ 8254 /f ⁄ 8260 0S ⁰ 8304 + |4S ⁴ 8308 5S ⁵ 8309 6S ⁶ 8310 7S ⁷ 8311 8S ⁸ 8312 9S ⁹ 8313 + |+S ⁺ 8314 -S ⁻ 8315 =S ⁼ 8316 (S ⁽ 8317 )S ⁾ 8318 nS ⁿ 8319 + |0s ₀ 8320 1s ₁ 8321 2s ₂ 8322 3s ₃ 8323 4s ₄ 8324 5s ₅ 8325 + |6s ₆ 8326 7s ₇ 8327 8s ₈ 8328 9s ₉ 8329 +s ₊ 8330 -s ₋ 8331 + |=s ₌ 8332 (s ₍ 8333 )s ₎ 8334 Li ₤ 8356 Pt ₧ 8359 W= ₩ 8361 + |=e € 8364 Eu € 8364 =R ₽ 8381 =P ₽ 8381 oC ℃ 8451 co ℅ 8453 + |oF ℉ 8457 N0 № 8470 PO ℗ 8471 Rx ℞ 8478 SM ℠ 8480 TM ™ 8482 + |Om Ω 8486 AO Å 8491 13 ⅓ 8531 23 ⅔ 8532 15 ⅕ 8533 25 ⅖ 8534 + |35 ⅗ 8535 45 ⅘ 8536 16 ⅙ 8537 56 ⅚ 8538 18 ⅛ 8539 38 ⅜ 8540 + |58 ⅝ 8541 78 ⅞ 8542 1R Ⅰ 8544 2R Ⅱ 8545 3R Ⅲ 8546 4R Ⅳ 8547 + |5R Ⅴ 8548 6R Ⅵ 8549 7R Ⅶ 8550 8R Ⅷ 8551 9R Ⅸ 8552 aR Ⅹ 8553 + |bR Ⅺ 8554 cR Ⅻ 8555 1r ⅰ 8560 2r ⅱ 8561 3r ⅲ 8562 4r ⅳ 8563 + |5r ⅴ 8564 6r ⅵ 8565 7r ⅶ 8566 8r ⅷ 8567 9r ⅸ 8568 ar ⅹ 8569 + |br ⅺ 8570 cr ⅻ 8571 <- ← 8592 -! ↑ 8593 -> → 8594 -v ↓ 8595 + |<> ↔ 8596 UD ↕ 8597 <= ⇐ 8656 => ⇒ 8658 == ⇔ 8660 FA ∀ 8704 + |dP ∂ 8706 TE ∃ 8707 /0 ∅ 8709 DE ∆ 8710 NB ∇ 8711 (- ∈ 8712 + |-) ∋ 8715 *P ∏ 8719 +Z ∑ 8721 -2 − 8722 -+ ∓ 8723 *- ∗ 8727 + |Ob ∘ 8728 Sb ∙ 8729 RT √ 8730 0( ∝ 8733 00 ∞ 8734 -L ∟ 8735 + |-V ∠ 8736 PP ∥ 8741 AN ∧ 8743 OR ∨ 8744 (U ∩ 8745 )U ∪ 8746 + |In ∫ 8747 DI ∬ 8748 Io ∮ 8750 .: ∴ 8756 :. ∵ 8757 :R ∶ 8758 + |:: ∷ 8759 ?1 ∼ 8764 CG ∾ 8766 ?- ≃ 8771 ?= ≅ 8773 ?2 ≈ 8776 + |=? ≌ 8780 HI ≓ 8787 != ≠ 8800 =3 ≡ 8801 =< ≤ 8804 >= ≥ 8805 + |<* ≪ 8810 *> ≫ 8811 !< ≮ 8814 !> ≯ 8815 (C ⊂ 8834 )C ⊃ 8835 + |(_ ⊆ 8838 )_ ⊇ 8839 0. ⊙ 8857 02 ⊚ 8858 -T ⊥ 8869 .P ⋅ 8901 + |:3 ⋮ 8942 .3 ⋯ 8943 Eh ⌂ 8962 <7 ⌈ 8968 >7 ⌉ 8969 7< ⌊ 8970 + |7> ⌋ 8971 NI ⌐ 8976 (A ⌒ 8978 TR ⌕ 8981 Iu ⌠ 8992 Il ⌡ 8993 + | 〉 9002 Vs ␣ 9251 1h ⑀ 9280 3h ⑁ 9281 2h ⑂ 9282 + |4h ⑃ 9283 1j ⑆ 9286 2j ⑇ 9287 3j ⑈ 9288 4j ⑉ 9289 1. ⒈ 9352 + |2. ⒉ 9353 3. ⒊ 9354 4. ⒋ 9355 5. ⒌ 9356 6. ⒍ 9357 7. ⒎ 9358 + |8. ⒏ 9359 9. ⒐ 9360 hh ─ 9472 HH ━ 9473 vv │ 9474 VV ┃ 9475 + |3- ┄ 9476 3_ ┅ 9477 3! ┆ 9478 3/ ┇ 9479 4- ┈ 9480 4_ ┉ 9481 + |4! ┊ 9482 4/ ┋ 9483 dr ┌ 9484 dR ┍ 9485 Dr ┎ 9486 DR ┏ 9487 + |dl ┐ 9488 dL ┑ 9489 Dl ┒ 9490 LD ┓ 9491 ur └ 9492 uR ┕ 9493 + |Ur ┖ 9494 UR ┗ 9495 ul ┘ 9496 uL ┙ 9497 Ul ┚ 9498 UL ┛ 9499 + |vr ├ 9500 vR ┝ 9501 Vr ┠ 9504 VR ┣ 9507 vl ┤ 9508 vL ┥ 9509 + |Vl ┨ 9512 VL ┫ 9515 dh ┬ 9516 dH ┯ 9519 Dh ┰ 9520 DH ┳ 9523 + |uh ┴ 9524 uH ┷ 9527 Uh ┸ 9528 UH ┻ 9531 vh ┼ 9532 vH ┿ 9535 + |Vh ╂ 9538 VH ╋ 9547 FD ╱ 9585 BD ╲ 9586 TB ▀ 9600 LB ▄ 9604 + |FB █ 9608 lB ▌ 9612 RB ▐ 9616 .S ░ 9617 :S ▒ 9618 ?S ▓ 9619 + |fS ■ 9632 OS □ 9633 RO ▢ 9634 Rr ▣ 9635 RF ▤ 9636 RY ▥ 9637 + |RH ▦ 9638 RZ ▧ 9639 RK ▨ 9640 RX ▩ 9641 sB ▪ 9642 SR ▬ 9644 + |Or ▭ 9645 UT ▲ 9650 uT △ 9651 PR ▶ 9654 Tr ▷ 9655 Dt ▼ 9660 + |dT ▽ 9661 PL ◀ 9664 Tl ◁ 9665 Db ◆ 9670 Dw ◇ 9671 LZ ◊ 9674 + |0m ○ 9675 0o ◎ 9678 0M ● 9679 0L ◐ 9680 0R ◑ 9681 Sn ◘ 9688 + |Ic ◙ 9689 Fd ◢ 9698 Bd ◣ 9699 *2 ★ 9733 *1 ☆ 9734 H ☞ 9758 0u ☺ 9786 0U ☻ 9787 SU ☼ 9788 Fm ♀ 9792 Ml ♂ 9794 + |cS ♠ 9824 cH ♡ 9825 cD ♢ 9826 cC ♣ 9827 Md ♩ 9833 M8 ♪ 9834 + |M2 ♫ 9835 Mb ♭ 9837 Mx ♮ 9838 MX ♯ 9839 OK ✓ 10003 XX ✗ 10007 + |-X ✠ 10016 IS   12288 ,_ 、 12289 ._ 。 12290 +" 〃 12291 +_ 〄 12292 + |*_ 々 12293 ;_ 〆 12294 0_ 〇 12295 <+ 《 12298 >+ 》 12299 <' 「 12300 + |>' 」 12301 <" 『 12302 >" 』 12303 (" 【 12304 )" 】 12305 =T 〒 12306 + |=_ 〓 12307 (' 〔 12308 )' 〕 12309 (I 〖 12310 )I 〗 12311 -? 〜 12316 + |A5 ぁ 12353 a5 あ 12354 I5 ぃ 12355 i5 い 12356 U5 ぅ 12357 u5 う 12358 + |E5 ぇ 12359 e5 え 12360 O5 ぉ 12361 o5 お 12362 ka か 12363 ga が 12364 + |ki き 12365 gi ぎ 12366 ku く 12367 gu ぐ 12368 ke け 12369 ge げ 12370 + |ko こ 12371 go ご 12372 sa さ 12373 za ざ 12374 si し 12375 zi じ 12376 + |su す 12377 zu ず 12378 se せ 12379 ze ぜ 12380 so そ 12381 zo ぞ 12382 + |ta た 12383 da だ 12384 ti ち 12385 di ぢ 12386 tU っ 12387 tu つ 12388 + |du づ 12389 te て 12390 de で 12391 to と 12392 do ど 12393 na な 12394 + |ni に 12395 nu ぬ 12396 ne ね 12397 no の 12398 ha は 12399 ba ば 12400 + |pa ぱ 12401 hi ひ 12402 bi び 12403 pi ぴ 12404 hu ふ 12405 bu ぶ 12406 + |pu ぷ 12407 he へ 12408 be べ 12409 pe ぺ 12410 ho ほ 12411 bo ぼ 12412 + |po ぽ 12413 ma ま 12414 mi み 12415 mu む 12416 me め 12417 mo も 12418 + |yA ゃ 12419 ya や 12420 yU ゅ 12421 yu ゆ 12422 yO ょ 12423 yo よ 12424 + |ra ら 12425 ri り 12426 ru る 12427 re れ 12428 ro ろ 12429 wA ゎ 12430 + |wa わ 12431 wi ゐ 12432 we ゑ 12433 wo を 12434 n5 ん 12435 vu ゔ 12436 + |"5 ゛ 12443 05 ゜ 12444 *5 ゝ 12445 +5 ゞ 12446 a6 ァ 12449 A6 ア 12450 + |i6 ィ 12451 I6 イ 12452 u6 ゥ 12453 U6 ウ 12454 e6 ェ 12455 E6 エ 12456 + |o6 ォ 12457 O6 オ 12458 Ka カ 12459 Ga ガ 12460 Ki キ 12461 Gi ギ 12462 + |Ku ク 12463 Gu グ 12464 Ke ケ 12465 Ge ゲ 12466 Ko コ 12467 Go ゴ 12468 + |Sa サ 12469 Za ザ 12470 Si シ 12471 Zi ジ 12472 Su ス 12473 Zu ズ 12474 + |Se セ 12475 Ze ゼ 12476 So ソ 12477 Zo ゾ 12478 Ta タ 12479 Da ダ 12480 + |Ti チ 12481 Di ヂ 12482 TU ッ 12483 Tu ツ 12484 Du ヅ 12485 Te テ 12486 + |De デ 12487 To ト 12488 Do ド 12489 Na ナ 12490 Ni ニ 12491 Nu ヌ 12492 + |Ne ネ 12493 No ノ 12494 Ha ハ 12495 Ba バ 12496 Pa パ 12497 Hi ヒ 12498 + |Bi ビ 12499 Pi ピ 12500 Hu フ 12501 Bu ブ 12502 Pu プ 12503 He ヘ 12504 + |Be ベ 12505 Pe ペ 12506 Ho ホ 12507 Bo ボ 12508 Po ポ 12509 Ma マ 12510 + |Mi ミ 12511 Mu ム 12512 Me メ 12513 Mo モ 12514 YA ャ 12515 Ya ヤ 12516 + |YU ュ 12517 Yu ユ 12518 YO ョ 12519 Yo ヨ 12520 Ra ラ 12521 Ri リ 12522 + |Ru ル 12523 Re レ 12524 Ro ロ 12525 WA ヮ 12526 Wa ワ 12527 Wi ヰ 12528 + |We ヱ 12529 Wo ヲ 12530 N6 ン 12531 Vu ヴ 12532 KA ヵ 12533 KE ヶ 12534 + |Va ヷ 12535 Vi ヸ 12536 Ve ヹ 12537 Vo ヺ 12538 .6 ・ 12539 -6 ー 12540 + |*6 ヽ 12541 +6 ヾ 12542 b4 ㄅ 12549 p4 ㄆ 12550 m4 ㄇ 12551 f4 ㄈ 12552 + |d4 ㄉ 12553 t4 ㄊ 12554 n4 ㄋ 12555 l4 ㄌ 12556 g4 ㄍ 12557 k4 ㄎ 12558 + |h4 ㄏ 12559 j4 ㄐ 12560 q4 ㄑ 12561 x4 ㄒ 12562 zh ㄓ 12563 ch ㄔ 12564 + |sh ㄕ 12565 r4 ㄖ 12566 z4 ㄗ 12567 c4 ㄘ 12568 s4 ㄙ 12569 a4 ㄚ 12570 + |o4 ㄛ 12571 e4 ㄜ 12572 ai ㄞ 12574 ei ㄟ 12575 au ㄠ 12576 ou ㄡ 12577 + |an ㄢ 12578 en ㄣ 12579 aN ㄤ 12580 eN ㄥ 12581 er ㄦ 12582 i4 ㄧ 12583 + |u4 ㄨ 12584 iu ㄩ 12585 v4 ㄪ 12586 nG ㄫ 12587 gn ㄬ 12588 1c ㈠ 12832 + |2c ㈡ 12833 3c ㈢ 12834 4c ㈣ 12835 5c ㈤ 12836 6c ㈥ 12837 7c ㈦ 12838 + |8c ㈧ 12839 9c ㈨ 12840 ff ff 64256 fi fi 64257 fl fl 64258 ft ſt 64261 |st st 64262 """.trimMargin()) } diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt index 70831c7c73..56e8840fd5 100644 --- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt +++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt @@ -21,11 +21,11 @@ private val logger = vimLogger() open class VimDigraphGroupBase() : VimDigraphGroup { override fun getDigraph(ch1: Char, ch2: Char): Char { - var key = String(charArrayOf(ch1, ch2)) - var ch: Char? = digraphs[key] + var digraph = String(charArrayOf(ch1, ch2)) + var ch: Char? = digraphToCharacter[digraph] if (ch == null) { - key = String(charArrayOf(ch2, ch1)) - ch = digraphs[key] + digraph = String(charArrayOf(ch2, ch1)) + ch = digraphToCharacter[digraph] } return ch ?: ch2 } @@ -36,7 +36,7 @@ open class VimDigraphGroupBase() : VimDigraphGroup { if (charsSequence.isEmpty() || offset >= charsSequence.length) return val ch = charsSequence[offset] - val digraph = keys[ch] + val digraph = characterToDigraph[ch] val digraphText = if (digraph == null) "" else ", Digr $digraph" if (ch.code < 0x100) { @@ -73,8 +73,10 @@ open class VimDigraphGroupBase() : VimDigraphGroup { val ch: Char = defaultDigraphs[i + 2] val key = String(charArrayOf(defaultDigraphs[i], defaultDigraphs[i + 1])) // todo use BiMap instead? - digraphs[key] = ch - keys[ch] = key + digraphToCharacter[key] = ch + if (!characterToDigraph.contains(ch)) { + characterToDigraph[ch] = key + } } i += 3 } @@ -92,9 +94,12 @@ open class VimDigraphGroupBase() : VimDigraphGroup { override fun showDigraphs(editor: VimEditor) { val width = injector.engineEditorHelper.getApproximateScreenWidth(editor).let { if (it < 10) 80 else it } + + // Vim's columns are 13 characters wide, but for some reason, they suddenly switch to 12. It makes no obvious sense, + // and it's a quirk too far to copy. val columnWidth = 13 val columnCount = width / columnWidth - val height = ceil(digraphs.size.toDouble() / columnCount.toDouble()).toInt() + val height = ceil(digraphToCharacter.size.toDouble() / columnCount.toDouble()).toInt() if (logger.isDebug()) { logger.debug("width=$width") @@ -104,13 +109,24 @@ open class VimDigraphGroupBase() : VimDigraphGroup { val output = buildString { var column = 0 - keys.forEach { (char, digraph) -> + + // We cannot guarantee ordering with the dictionaries, so let's use the defaultDigraphs list + for (i in 0 until defaultDigraphs.size step 3) { + val char = defaultDigraphs[i + 2] + val digraph = String(charArrayOf(defaultDigraphs[i], defaultDigraphs[i + 1])) + val start = length append(digraph) append(' ') + // VIM highlights the printable character with HLF_8, which it also uses for special keys in `:map` val printable = EngineStringHelper.toPrintableCharacter(char) val adjustment = when { + // Weird Vim-ism. `NU` (NULL) is set to 10, but displays as `^@` + char == '\u000a' && i == 0 -> { + append(EngineStringHelper.toPrintableCharacter('\u0000')) + 0 + } printable.length == 1 && isRightToLeft(char) -> { append('\u2067') // RIGHT_TO_LEFT_ISOLATE - set RTL and isolate following content from the surrounding text append(printable) @@ -128,7 +144,7 @@ open class VimDigraphGroupBase() : VimDigraphGroup { } } - // Add an extra space if we've only used one text cell + // Add an extra space if we've only used one text cell. // Ideally here, we'd check the EAST_ASIAN_WIDTH Unicode property of the printed character. If it's full width, // it's taken two "cells". I'm not sure this would work for all characters, e.g. Ⅵ seems to be 1.5 "cells" wide. // Perhaps we could set the output panel's tab size to 13, and use tab stops to make things line up? @@ -178,9 +194,34 @@ open class VimDigraphGroupBase() : VimDigraphGroup { || type == Character.FORMAT } + // Based on the digraphs listed in `:help digraph-table` and `:help digraph-table-mbyte`, which unfortunately doesn't + // list all digraphs. The output of the `:digraphs` command (`redir @">|silent digraphs|redir END|enew|put`) is used + // to fill in the missing entries. (Compare against the output in the tests) + // This awk script will convert these tables into the format we need: + // awk '{ + // char1 = substr($2, 1, 1); + // char2 = substr($2, 2, 1); + // name = substr($0, index($0, $5)) + // sub(/[ \t]+$/, "" name) + // + // gsub(/'\''/, "\\'\''", char1) + // gsub(/'\''/, "\\'\''", char2) + // + // codepoint = $3; + // gsub("0x", "", codepoint); + // unicode = tolower(sprintf("\\u%04s", codepoint)) + // + // printf "'\''%s'\'', '\''%s'\'', '\''%s'\'', // %4d %s %s\n", char1, char2, unicode, $4, $1, name; + //}' $input_file + // + // NOTE: + // * This script fails for `SP` - the space character will have to be updated manually + // * The `NU` digraph is set to `\u000a`. This matches Vim behaviour, which ignores a digraph with a code of 0 + // See `:help i_CTRL-V_digit` for more details (Vim uses `\u000a` internally to represent null) @Suppress("GrazieInspection", "SpellCheckingInspection") private val defaultDigraphs = charArrayOf( - 'N', 'U', '\u0000', // 0 ^@ NULL (NUL) + // See `:help digraph-table` + 'N', 'U', '\u000a', // 10 ^@ NULL (NUL) 'S', 'H', '\u0001', // 1 ^A START OF HEADING (SOH) 'S', 'X', '\u0002', // 2 ^B START OF TEXT (STX) 'E', 'X', '\u0003', // 3 ^C END OF TEXT (ETX) @@ -202,7 +243,7 @@ open class VimDigraphGroupBase() : VimDigraphGroup { 'D', '3', '\u0013', // 19 ^S DEVICE CONTROL THREE (DC3) 'D', '4', '\u0014', // 20 ^T DEVICE CONTROL FOUR (DC4) 'N', 'K', '\u0015', // 21 ^U NEGATIVE ACKNOWLEDGE (NAK) - 'S', 'Y', '\u0016', // 22 ^V SYNCRONOUS IDLE (SYN) + 'S', 'Y', '\u0016', // 22 ^V SYNCHRONOUS IDLE (SYN) 'E', 'B', '\u0017', // 23 ^W END OF TRANSMISSION BLOCK (ETB) 'C', 'N', '\u0018', // 24 ^X CANCEL (CAN) 'E', 'M', '\u0019', // 25 ^Y END OF MEDIUM (EM) @@ -260,100 +301,154 @@ open class VimDigraphGroupBase() : VimDigraphGroup { 'A', 'C', '\u009f', // 159 ~_ APPLICATION PROGRAM COMMAND (APC) 'N', 'S', '\u00a0', // 160 | NO-BREAK SPACE '!', 'I', '\u00a1', // 161 ¡ INVERTED EXCLAMATION MARK + '~', '!', '\u00a1', // 161 ¡ INVERTED EXCLAMATION MARK (Vim 5.x compatible) 'C', 't', '\u00a2', // 162 ¢ CENT SIGN + 'c', '|', '\u00a2', // 162 ¢ CENT SIGN (Vim 5.x compatible) 'P', 'd', '\u00a3', // 163 £ POUND SIGN + '$', '$', '\u00a3', // 163 £ POUND SIGN (Vim 5.x compatible) 'C', 'u', '\u00a4', // 164 ¤ CURRENCY SIGN + 'o', 'x', '\u00a4', // 164 ¤ CURRENCY SIGN (Vim 5.x compatible) 'Y', 'e', '\u00a5', // 165 ¥ YEN SIGN + 'Y', '-', '\u00a5', // 165 ¥ YEN SIGN (Vim 5.x compatible) 'B', 'B', '\u00a6', // 166 ¦ BROKEN BAR + '|', '|', '\u00a6', // 166 ¦ BROKEN BAR (Vim 5.x compatible) 'S', 'E', '\u00a7', // 167 § SECTION SIGN '\'', ':', '\u00a8', // 168 ¨ DIAERESIS 'C', 'o', '\u00a9', // 169 © COPYRIGHT SIGN + 'c', 'O', '\u00a9', // 169 © COPYRIGHT SIGN (Vim 5.x compatible) '-', 'a', '\u00aa', // 170 ª FEMININE ORDINAL INDICATOR '<', '<', '\u00ab', // 171 « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK 'N', 'O', '\u00ac', // 172 ¬ NOT SIGN + '-', ',', '\u00ac', // 172 ¬ NOT SIGN (Vim 5.x compatible) '-', '-', '\u00ad', // 173 ­ SOFT HYPHEN 'R', 'g', '\u00ae', // 174 ® REGISTERED SIGN '\'', 'm', '\u00af', // 175 ¯ MACRON + '-', '=', '\u00af', // 175 ¯ MACRON (Vim 5.x compatible) 'D', 'G', '\u00b0', // 176 ° DEGREE SIGN + '~', 'o', '\u00b0', // 176 ° DEGREE SIGN (Vim 5.x compatible) '+', '-', '\u00b1', // 177 ± PLUS-MINUS SIGN '2', 'S', '\u00b2', // 178 ² SUPERSCRIPT TWO + '2', '2', '\u00b2', // 178 ² SUPERSCRIPT TWO (Vim 5.x compatible) '3', 'S', '\u00b3', // 179 ³ SUPERSCRIPT THREE + '3', '3', '\u00b3', // 179 ³ SUPERSCRIPT THREE (Vim 5.x compatible) '\'', '\'', '\u00b4', // 180 ´ ACUTE ACCENT 'M', 'y', '\u00b5', // 181 µ MICRO SIGN 'P', 'I', '\u00b6', // 182 ¶ PILCROW SIGN + 'p', 'p', '\u00b6', // 182 ¶ PILCROW SIGN (Vim 5.x compatible) '.', 'M', '\u00b7', // 183 · MIDDLE DOT + '~', '.', '\u00b7', // 183 · MIDDLE DOT (Vim 5.x compatible) '\'', ',', '\u00b8', // 184 ¸ CEDILLA '1', 'S', '\u00b9', // 185 ¹ SUPERSCRIPT ONE + '1', '1', '\u00b9', // 185 ¹ SUPERSCRIPT ONE (Vim 5.x compatible) '-', 'o', '\u00ba', // 186 º MASCULINE ORDINAL INDICATOR '>', '>', '\u00bb', // 187 » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK '1', '4', '\u00bc', // 188 ¼ VULGAR FRACTION ONE QUARTER '1', '2', '\u00bd', // 189 ½ VULGAR FRACTION ONE HALF '3', '4', '\u00be', // 190 ¾ VULGAR FRACTION THREE QUARTERS '?', 'I', '\u00bf', // 191 ¿ INVERTED QUESTION MARK + '~', '?', '\u00bf', // 191 ¿ INVERTED QUESTION MARK (Vim 5.x compatible) 'A', '!', '\u00c0', // 192 À LATIN CAPITAL LETTER A WITH GRAVE + 'A', '`', '\u00c0', // 192 À LATIN CAPITAL LETTER A WITH GRAVE (Vim 5.x compatible) 'A', '\'', '\u00c1', // 193 Á LATIN CAPITAL LETTER A WITH ACUTE 'A', '>', '\u00c2', // 194  LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 'A', '^', '\u00c2', // 194  LATIN CAPITAL LETTER A WITH CIRCUMFLEX (Vim 5.x compatible) 'A', '?', '\u00c3', // 195 à LATIN CAPITAL LETTER A WITH TILDE + 'A', '~', '\u00c3', // 195 à LATIN CAPITAL LETTER A WITH TILDE (Vim 5.x compatible) 'A', ':', '\u00c4', // 196 Ä LATIN CAPITAL LETTER A WITH DIAERESIS + 'A', '"', '\u00c4', // 196 Ä LATIN CAPITAL LETTER A WITH DIAERESIS (Vim 5.x compatible) 'A', 'A', '\u00c5', // 197 Å LATIN CAPITAL LETTER A WITH RING ABOVE + 'A', '@', '\u00c5', // 197 Å LATIN CAPITAL LETTER A WITH RING ABOVE (Vim 5.x compatible) 'A', 'E', '\u00c6', // 198 Æ LATIN CAPITAL LETTER AE 'C', ',', '\u00c7', // 199 Ç LATIN CAPITAL LETTER C WITH CEDILLA 'E', '!', '\u00c8', // 200 È LATIN CAPITAL LETTER E WITH GRAVE + 'E', '`', '\u00c8', // 200 È LATIN CAPITAL LETTER E WITH GRAVE (Vim 5.x compatible) 'E', '\'', '\u00c9', // 201 É LATIN CAPITAL LETTER E WITH ACUTE 'E', '>', '\u00ca', // 202 Ê LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 'E', '^', '\u00ca', // 202 Ê LATIN CAPITAL LETTER E WITH CIRCUMFLEX (Vim 5.x compatible) 'E', ':', '\u00cb', // 203 Ë LATIN CAPITAL LETTER E WITH DIAERESIS + 'E', '"', '\u00cb', // 203 Ë LATIN CAPITAL LETTER E WITH DIAERESIS (Vim 5.x compatible) 'I', '!', '\u00cc', // 204 Ì LATIN CAPITAL LETTER I WITH GRAVE + 'I', '`', '\u00cc', // 204 Ì LATIN CAPITAL LETTER I WITH GRAVE (Vim 5.x compatible) 'I', '\'', '\u00cd', // 205 Í LATIN CAPITAL LETTER I WITH ACUTE 'I', '>', '\u00ce', // 206 Î LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 'I', '^', '\u00ce', // 206 Î LATIN CAPITAL LETTER I WITH CIRCUMFLEX (Vim 5.x compatible) 'I', ':', '\u00cf', // 207 Ï LATIN CAPITAL LETTER I WITH DIAERESIS + 'I', '"', '\u00cf', // 207 Ï LATIN CAPITAL LETTER I WITH DIAERESIS (Vim 5.x compatible) 'D', '-', '\u00d0', // 208 Ð LATIN CAPITAL LETTER ETH (Icelandic) 'N', '?', '\u00d1', // 209 Ñ LATIN CAPITAL LETTER N WITH TILDE + 'N', '~', '\u00d1', // 209 Ñ LATIN CAPITAL LETTER N WITH TILDE (Vim 5.x compatible) 'O', '!', '\u00d2', // 210 Ò LATIN CAPITAL LETTER O WITH GRAVE + 'O', '`', '\u00d2', // 210 Ò LATIN CAPITAL LETTER O WITH GRAVE (Vim 5.x compatible) 'O', '\'', '\u00d3', // 211 Ó LATIN CAPITAL LETTER O WITH ACUTE 'O', '>', '\u00d4', // 212 Ô LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 'O', '^', '\u00d4', // 212 Ô LATIN CAPITAL LETTER O WITH CIRCUMFLEX (Vim 5.x compatible) 'O', '?', '\u00d5', // 213 Õ LATIN CAPITAL LETTER O WITH TILDE + 'O', '~', '\u00d5', // 213 Õ LATIN CAPITAL LETTER O WITH TILDE (Vim 5.x compatible) 'O', ':', '\u00d6', // 214 Ö LATIN CAPITAL LETTER O WITH DIAERESIS '*', 'X', '\u00d7', // 215 × MULTIPLICATION SIGN + '/', '\\', '\u00d7', // 215 × MULTIPLICATION SIGN (Vim 5.x compatible) 'O', '/', '\u00d8', // 216 Ø LATIN CAPITAL LETTER O WITH STROKE 'U', '!', '\u00d9', // 217 Ù LATIN CAPITAL LETTER U WITH GRAVE + 'U', '`', '\u00d9', // 217 Ù LATIN CAPITAL LETTER U WITH GRAVE (Vim 5.x compatible) 'U', '\'', '\u00da', // 218 Ú LATIN CAPITAL LETTER U WITH ACUTE 'U', '>', '\u00db', // 219 Û LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 'U', '^', '\u00db', // 219 Û LATIN CAPITAL LETTER U WITH CIRCUMFLEX (Vim 5.x compatible) 'U', ':', '\u00dc', // 220 Ü LATIN CAPITAL LETTER U WITH DIAERESIS 'Y', '\'', '\u00dd', // 221 Ý LATIN CAPITAL LETTER Y WITH ACUTE 'T', 'H', '\u00de', // 222 Þ LATIN CAPITAL LETTER THORN (Icelandic) + 'I', 'p', '\u00de', // 222 Þ LATIN CAPITAL LETTER THORN (Icelandic) (Vim 5.x compatible) 's', 's', '\u00df', // 223 ß LATIN SMALL LETTER SHARP S (German) 'a', '!', '\u00e0', // 224 à LATIN SMALL LETTER A WITH GRAVE + 'a', '`', '\u00e0', // 224 à LATIN SMALL LETTER A WITH GRAVE (Vim 5.x compatible) 'a', '\'', '\u00e1', // 225 á LATIN SMALL LETTER A WITH ACUTE 'a', '>', '\u00e2', // 226 â LATIN SMALL LETTER A WITH CIRCUMFLEX + 'a', '^', '\u00e2', // 226 â LATIN SMALL LETTER A WITH CIRCUMFLEX (Vim 5.x compatible) 'a', '?', '\u00e3', // 227 ã LATIN SMALL LETTER A WITH TILDE + 'a', '~', '\u00e3', // 227 ã LATIN SMALL LETTER A WITH TILDE (Vim 5.x compatible) 'a', ':', '\u00e4', // 228 ä LATIN SMALL LETTER A WITH DIAERESIS + 'a', '"', '\u00e4', // 228 ä LATIN SMALL LETTER A WITH DIAERESIS (Vim 5.x compatible) 'a', 'a', '\u00e5', // 229 å LATIN SMALL LETTER A WITH RING ABOVE + 'a', '@', '\u00e5', // 229 å LATIN SMALL LETTER A WITH RING ABOVE (Vim 5.x compatible) 'a', 'e', '\u00e6', // 230 æ LATIN SMALL LETTER AE 'c', ',', '\u00e7', // 231 ç LATIN SMALL LETTER C WITH CEDILLA 'e', '!', '\u00e8', // 232 è LATIN SMALL LETTER E WITH GRAVE + 'e', '`', '\u00e8', // 232 è LATIN SMALL LETTER E WITH GRAVE (Vim 5.x compatible) 'e', '\'', '\u00e9', // 233 é LATIN SMALL LETTER E WITH ACUTE 'e', '>', '\u00ea', // 234 ê LATIN SMALL LETTER E WITH CIRCUMFLEX + 'e', '^', '\u00ea', // 234 ê LATIN SMALL LETTER E WITH CIRCUMFLEX (Vim 5.x compatible) 'e', ':', '\u00eb', // 235 ë LATIN SMALL LETTER E WITH DIAERESIS + 'e', '"', '\u00eb', // 235 ë LATIN SMALL LETTER E WITH DIAERESIS (Vim 5.x compatible) 'i', '!', '\u00ec', // 236 ì LATIN SMALL LETTER I WITH GRAVE + 'i', '`', '\u00ec', // 236 ì LATIN SMALL LETTER I WITH GRAVE (Vim 5.x compatible) 'i', '\'', '\u00ed', // 237 í LATIN SMALL LETTER I WITH ACUTE 'i', '>', '\u00ee', // 238 î LATIN SMALL LETTER I WITH CIRCUMFLEX + 'i', '^', '\u00ee', // 238 î LATIN SMALL LETTER I WITH CIRCUMFLEX (Vim 5.x compatible) 'i', ':', '\u00ef', // 239 ï LATIN SMALL LETTER I WITH DIAERESIS 'd', '-', '\u00f0', // 240 ð LATIN SMALL LETTER ETH (Icelandic) 'n', '?', '\u00f1', // 241 ñ LATIN SMALL LETTER N WITH TILDE + 'n', '~', '\u00f1', // 241 ñ LATIN SMALL LETTER N WITH TILDE (Vim 5.x compatible) 'o', '!', '\u00f2', // 242 ò LATIN SMALL LETTER O WITH GRAVE + 'o', '`', '\u00f2', // 242 ò LATIN SMALL LETTER O WITH GRAVE (Vim 5.x compatible) 'o', '\'', '\u00f3', // 243 ó LATIN SMALL LETTER O WITH ACUTE 'o', '>', '\u00f4', // 244 ô LATIN SMALL LETTER O WITH CIRCUMFLEX + 'o', '^', '\u00f4', // 244 ô LATIN SMALL LETTER O WITH CIRCUMFLEX (Vim 5.x compatible) 'o', '?', '\u00f5', // 245 õ LATIN SMALL LETTER O WITH TILDE + 'o', '~', '\u00f5', // 245 õ LATIN SMALL LETTER O WITH TILDE (Vim 5.x compatible) 'o', ':', '\u00f6', // 246 ö LATIN SMALL LETTER O WITH DIAERESIS '-', ':', '\u00f7', // 247 ÷ DIVISION SIGN 'o', '/', '\u00f8', // 248 ø LATIN SMALL LETTER O WITH STROKE 'u', '!', '\u00f9', // 249 ù LATIN SMALL LETTER U WITH GRAVE + 'u', '`', '\u00f9', // 249 ù LATIN SMALL LETTER U WITH GRAVE (Vim 5.x compatible) 'u', '\'', '\u00fa', // 250 ú LATIN SMALL LETTER U WITH ACUTE 'u', '>', '\u00fb', // 251 û LATIN SMALL LETTER U WITH CIRCUMFLEX + 'u', '^', '\u00fb', // 251 û LATIN SMALL LETTER U WITH CIRCUMFLEX (Vim 5.x compatible) 'u', ':', '\u00fc', // 252 ü LATIN SMALL LETTER U WITH DIAERESIS 'y', '\'', '\u00fd', // 253 ý LATIN SMALL LETTER Y WITH ACUTE 't', 'h', '\u00fe', // 254 þ LATIN SMALL LETTER THORN (Icelandic) 'y', ':', '\u00ff', // 255 ÿ LATIN SMALL LETTER Y WITH DIAERESIS + 'y', '"', '\u00ff', // 255 ÿ LATIN SMALL LETTER Y WITH DIAERESIS (Vim 5.x compatible) + + // See `:help digraph-table-mbyte` 'A', '-', '\u0100', // 256 Ā LATIN CAPITAL LETTER A WITH MACRON 'a', '-', '\u0101', // 257 ā LATIN SMALL LETTER A WITH MACRON 'A', '(', '\u0102', // 258 Ă LATIN CAPITAL LETTER A WITH BREVE @@ -403,14 +498,14 @@ open class VimDigraphGroupBase() : VimDigraphGroup { 'I', ';', '\u012e', // 302 Į LATIN CAPITAL LETTER I WITH OGONEK 'i', ';', '\u012f', // 303 į LATIN SMALL LETTER I WITH OGONEK 'I', '.', '\u0130', // 304 İ LATIN CAPITAL LETTER I WITH DOT ABOVE - 'i', '.', '\u0131', // 305 ı LATIN SMALL LETTER I DOTLESS + 'i', '.', '\u0131', // 305 ı LATIN SMALL LETTER DOTLESS I 'I', 'J', '\u0132', // 306 IJ LATIN CAPITAL LIGATURE IJ 'i', 'j', '\u0133', // 307 ij LATIN SMALL LIGATURE IJ 'J', '>', '\u0134', // 308 Ĵ LATIN CAPITAL LETTER J WITH CIRCUMFLEX 'j', '>', '\u0135', // 309 ĵ LATIN SMALL LETTER J WITH CIRCUMFLEX 'K', ',', '\u0136', // 310 Ķ LATIN CAPITAL LETTER K WITH CEDILLA 'k', ',', '\u0137', // 311 ķ LATIN SMALL LETTER K WITH CEDILLA - 'k', 'k', '\u0138', // 312 ĸ LATIN SMALL LETTER KRA (Greenlandic) + 'k', 'k', '\u0138', // 312 ĸ LATIN SMALL LETTER KRA 'L', '\'', '\u0139', // 313 Ĺ LATIN CAPITAL LETTER L WITH ACUTE 'l', '\'', '\u013a', // 314 ĺ LATIN SMALL LETTER L WITH ACUTE 'L', ',', '\u013b', // 315 Ļ LATIN CAPITAL LETTER L WITH CEDILLA @@ -428,8 +523,8 @@ open class VimDigraphGroupBase() : VimDigraphGroup { 'N', '<', '\u0147', // 327 Ň LATIN CAPITAL LETTER N WITH CARON 'n', '<', '\u0148', // 328 ň LATIN SMALL LETTER N WITH CARON '\'', 'n', '\u0149', // 329 ʼn LATIN SMALL LETTER N PRECEDED BY APOSTROPHE - 'N', 'G', '\u014a', // 330 Ŋ LATIN CAPITAL LETTER ENG (Lappish) - 'n', 'g', '\u014b', // 331 ŋ LATIN SMALL LETTER ENG (Lappish) + 'N', 'G', '\u014a', // 330 Ŋ LATIN CAPITAL LETTER ENG + 'n', 'g', '\u014b', // 331 ŋ LATIN SMALL LETTER ENG 'O', '-', '\u014c', // 332 Ō LATIN CAPITAL LETTER O WITH MACRON 'o', '-', '\u014d', // 333 ō LATIN SMALL LETTER O WITH MACRON 'O', '(', '\u014e', // 334 Ŏ LATIN CAPITAL LETTER O WITH BREVE @@ -527,14 +622,14 @@ open class VimDigraphGroupBase() : VimDigraphGroup { '\'', '0', '\u02da', // 730 ˚ RING ABOVE '\'', ';', '\u02db', // 731 ˛ OGONEK '\'', '"', '\u02dd', // 733 ˝ DOUBLE ACUTE ACCENT - 'A', '%', '\u0386', // 902 Ά GREEK CAPITAL LETTER ALPHA WITH ACUTE - 'E', '%', '\u0388', // 904 Έ GREEK CAPITAL LETTER EPSILON WITH ACUTE - 'Y', '%', '\u0389', // 905 Ή GREEK CAPITAL LETTER ETA WITH ACUTE - 'I', '%', '\u038a', // 906 Ί GREEK CAPITAL LETTER IOTA WITH ACUTE - 'O', '%', '\u038c', // 908 Ό GREEK CAPITAL LETTER OMICRON WITH ACUTE - 'U', '%', '\u038e', // 910 Ύ GREEK CAPITAL LETTER UPSILON WITH ACUTE - 'W', '%', '\u038f', // 911 Ώ GREEK CAPITAL LETTER OMEGA WITH ACUTE - 'i', '3', '\u0390', // 912 ΐ GREEK SMALL LETTER IOTA WITH ACUTE AND DIAERESIS + 'A', '%', '\u0386', // 902 Ά GREEK CAPITAL LETTER ALPHA WITH TONOS + 'E', '%', '\u0388', // 904 Έ GREEK CAPITAL LETTER EPSILON WITH TONOS + 'Y', '%', '\u0389', // 905 Ή GREEK CAPITAL LETTER ETA WITH TONOS + 'I', '%', '\u038a', // 906 Ί GREEK CAPITAL LETTER IOTA WITH TONOS + 'O', '%', '\u038c', // 908 Ό GREEK CAPITAL LETTER OMICRON WITH TONOS + 'U', '%', '\u038e', // 910 Ύ GREEK CAPITAL LETTER UPSILON WITH TONOS + 'W', '%', '\u038f', // 911 Ώ GREEK CAPITAL LETTER OMEGA WITH TONOS + 'i', '3', '\u0390', // 912 ΐ GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS 'A', '*', '\u0391', // 913 Α GREEK CAPITAL LETTER ALPHA 'B', '*', '\u0392', // 914 Β GREEK CAPITAL LETTER BETA 'G', '*', '\u0393', // 915 Γ GREEK CAPITAL LETTER GAMMA @@ -545,7 +640,7 @@ open class VimDigraphGroupBase() : VimDigraphGroup { 'H', '*', '\u0398', // 920 Θ GREEK CAPITAL LETTER THETA 'I', '*', '\u0399', // 921 Ι GREEK CAPITAL LETTER IOTA 'K', '*', '\u039a', // 922 Κ GREEK CAPITAL LETTER KAPPA - 'L', '*', '\u039b', // 923 Λ GREEK CAPITAL LETTER LAMDA + 'L', '*', '\u039b', // 923 Λ GREEK CAPITAL LETTER LAMDA (aka LAMBDA) 'M', '*', '\u039c', // 924 Μ GREEK CAPITAL LETTER MU 'N', '*', '\u039d', // 925 Ν GREEK CAPITAL LETTER NU 'C', '*', '\u039e', // 926 Ξ GREEK CAPITAL LETTER XI @@ -559,13 +654,13 @@ open class VimDigraphGroupBase() : VimDigraphGroup { 'X', '*', '\u03a7', // 935 Χ GREEK CAPITAL LETTER CHI 'Q', '*', '\u03a8', // 936 Ψ GREEK CAPITAL LETTER PSI 'W', '*', '\u03a9', // 937 Ω GREEK CAPITAL LETTER OMEGA - 'J', '*', '\u03aa', // 938 Ϊ GREEK CAPITAL LETTER IOTA WITH DIAERESIS - 'V', '*', '\u03ab', // 939 Ϋ GREEK CAPITAL LETTER UPSILON WITH DIAERESIS - 'a', '%', '\u03ac', // 940 ά GREEK SMALL LETTER ALPHA WITH ACUTE - 'e', '%', '\u03ad', // 941 έ GREEK SMALL LETTER EPSILON WITH ACUTE - 'y', '%', '\u03ae', // 942 ή GREEK SMALL LETTER ETA WITH ACUTE - 'i', '%', '\u03af', // 943 ί GREEK SMALL LETTER IOTA WITH ACUTE - 'u', '3', '\u03b0', // 944 ΰ GREEK SMALL LETTER UPSILON WITH ACUTE AND DIAERESIS + 'J', '*', '\u03aa', // 938 Ϊ GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + 'V', '*', '\u03ab', // 939 Ϋ GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + 'a', '%', '\u03ac', // 940 ά GREEK SMALL LETTER ALPHA WITH TONOS + 'e', '%', '\u03ad', // 941 έ GREEK SMALL LETTER EPSILON WITH TONOS + 'y', '%', '\u03ae', // 942 ή GREEK SMALL LETTER ETA WITH TONOS + 'i', '%', '\u03af', // 943 ί GREEK SMALL LETTER IOTA WITH TONOS + 'u', '3', '\u03b0', // 944 ΰ GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS 'a', '*', '\u03b1', // 945 α GREEK SMALL LETTER ALPHA 'b', '*', '\u03b2', // 946 β GREEK SMALL LETTER BETA 'g', '*', '\u03b3', // 947 γ GREEK SMALL LETTER GAMMA @@ -576,7 +671,7 @@ open class VimDigraphGroupBase() : VimDigraphGroup { 'h', '*', '\u03b8', // 952 θ GREEK SMALL LETTER THETA 'i', '*', '\u03b9', // 953 ι GREEK SMALL LETTER IOTA 'k', '*', '\u03ba', // 954 κ GREEK SMALL LETTER KAPPA - 'l', '*', '\u03bb', // 955 λ GREEK SMALL LETTER LAMDA + 'l', '*', '\u03bb', // 955 λ GREEK SMALL LETTER LAMDA (aka LAMBDA) 'm', '*', '\u03bc', // 956 μ GREEK SMALL LETTER MU 'n', '*', '\u03bd', // 957 ν GREEK SMALL LETTER NU 'c', '*', '\u03be', // 958 ξ GREEK SMALL LETTER XI @@ -591,36 +686,36 @@ open class VimDigraphGroupBase() : VimDigraphGroup { 'x', '*', '\u03c7', // 967 χ GREEK SMALL LETTER CHI 'q', '*', '\u03c8', // 968 ψ GREEK SMALL LETTER PSI 'w', '*', '\u03c9', // 969 ω GREEK SMALL LETTER OMEGA - 'j', '*', '\u03ca', // 970 ϊ GREEK SMALL LETTER IOTA WITH DIAERESIS - 'v', '*', '\u03cb', // 971 ϋ GREEK SMALL LETTER UPSILON WITH DIAERESIS - 'o', '%', '\u03cc', // 972 ό GREEK SMALL LETTER OMICRON WITH ACUTE - 'u', '%', '\u03cd', // 973 ύ GREEK SMALL LETTER UPSILON WITH ACUTE - 'w', '%', '\u03ce', // 974 ώ GREEK SMALL LETTER OMEGA WITH ACUTE - '\'', 'G', '\u03d8', // 984 Ϙ GREEK NUMERAL SIGN - ',', 'G', '\u03d9', // 985 ϙ GREEK LOWER NUMERAL SIGN - 'T', '3', '\u03da', // 986 Ϛ GREEK CAPITAL LETTER STIGMA + 'j', '*', '\u03ca', // 970 ϊ GREEK SMALL LETTER IOTA WITH DIALYTIKA + 'v', '*', '\u03cb', // 971 ϋ GREEK SMALL LETTER UPSILON WITH DIALYTIKA + 'o', '%', '\u03cc', // 972 ό GREEK SMALL LETTER OMICRON WITH TONOS + 'u', '%', '\u03cd', // 973 ύ GREEK SMALL LETTER UPSILON WITH TONOS + 'w', '%', '\u03ce', // 974 ώ GREEK SMALL LETTER OMEGA WITH TONOS + '\'', 'G', '\u03d8', // 984 Ϙ GREEK LETTER ARCHAIC KOPPA + ',', 'G', '\u03d9', // 985 ϙ GREEK SMALL LETTER ARCHAIC KOPPA + 'T', '3', '\u03da', // 986 Ϛ GREEK LETTER STIGMA 't', '3', '\u03db', // 987 ϛ GREEK SMALL LETTER STIGMA - 'M', '3', '\u03dc', // 988 Ϝ GREEK CAPITAL LETTER DIGAMMA + 'M', '3', '\u03dc', // 988 Ϝ GREEK LETTER DIGAMMA 'm', '3', '\u03dd', // 989 ϝ GREEK SMALL LETTER DIGAMMA - 'K', '3', '\u03de', // 990 Ϟ GREEK CAPITAL LETTER KOPPA + 'K', '3', '\u03de', // 990 Ϟ GREEK LETTER KOPPA 'k', '3', '\u03df', // 991 ϟ GREEK SMALL LETTER KOPPA - 'P', '3', '\u03e0', // 992 Ϡ GREEK CAPITAL LETTER SAMPI + 'P', '3', '\u03e0', // 992 Ϡ GREEK LETTER SAMPI 'p', '3', '\u03e1', // 993 ϡ GREEK SMALL LETTER SAMPI - '\'', '%', '\u03f4', // 1012 ϴ ACUTE ACCENT AND DIAERESIS (Tonos and Dialytika) - 'j', '3', '\u03f5', // 1013 ϵ GREEK IOTA BELOW + '\'', '%', '\u03f4', // 1012 ϴ GREEK CAPITAL THETA SYMBOL + 'j', '3', '\u03f5', // 1013 ϵ GREEK LUNATE EPSILON SYMBOL 'I', 'O', '\u0401', // 1025 Ё CYRILLIC CAPITAL LETTER IO - 'D', '%', '\u0402', // 1026 Ђ CYRILLIC CAPITAL LETTER DJE (Serbocroatian) - 'G', '%', '\u0403', // 1027 Ѓ CYRILLIC CAPITAL LETTER GJE (Macedonian) + 'D', '%', '\u0402', // 1026 Ђ CYRILLIC CAPITAL LETTER DJE + 'G', '%', '\u0403', // 1027 Ѓ CYRILLIC CAPITAL LETTER GJE 'I', 'E', '\u0404', // 1028 Є CYRILLIC CAPITAL LETTER UKRAINIAN IE - 'D', 'S', '\u0405', // 1029 Ѕ CYRILLIC CAPITAL LETTER DZE (Macedonian) + 'D', 'S', '\u0405', // 1029 Ѕ CYRILLIC CAPITAL LETTER DZE 'I', 'I', '\u0406', // 1030 І CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I - 'Y', 'I', '\u0407', // 1031 Ї CYRILLIC CAPITAL LETTER YI (Ukrainian) + 'Y', 'I', '\u0407', // 1031 Ї CYRILLIC CAPITAL LETTER YI 'J', '%', '\u0408', // 1032 Ј CYRILLIC CAPITAL LETTER JE 'L', 'J', '\u0409', // 1033 Љ CYRILLIC CAPITAL LETTER LJE 'N', 'J', '\u040a', // 1034 Њ CYRILLIC CAPITAL LETTER NJE - 'T', 's', '\u040b', // 1035 Ћ CYRILLIC CAPITAL LETTER TSHE (Serbocroatian) - 'K', 'J', '\u040c', // 1036 Ќ CYRILLIC CAPITAL LETTER KJE (Macedonian) - 'V', '%', '\u040e', // 1038 Ў CYRILLIC CAPITAL LETTER SHORT U (Byelorussian) + 'T', 's', '\u040b', // 1035 Ћ CYRILLIC CAPITAL LETTER TSHE + 'K', 'J', '\u040c', // 1036 Ќ CYRILLIC CAPITAL LETTER KJE + 'V', '%', '\u040e', // 1038 Ў CYRILLIC CAPITAL LETTER SHORT U 'D', 'Z', '\u040f', // 1039 Џ CYRILLIC CAPITAL LETTER DZHE 'A', '=', '\u0410', // 1040 А CYRILLIC CAPITAL LETTER A 'B', '=', '\u0411', // 1041 Б CYRILLIC CAPITAL LETTER BE @@ -687,18 +782,18 @@ open class VimDigraphGroupBase() : VimDigraphGroup { 'j', 'u', '\u044e', // 1102 ю CYRILLIC SMALL LETTER YU 'j', 'a', '\u044f', // 1103 я CYRILLIC SMALL LETTER YA 'i', 'o', '\u0451', // 1105 ё CYRILLIC SMALL LETTER IO - 'd', '%', '\u0452', // 1106 ђ CYRILLIC SMALL LETTER DJE (Serbocroatian) - 'g', '%', '\u0453', // 1107 ѓ CYRILLIC SMALL LETTER GJE (Macedonian) + 'd', '%', '\u0452', // 1106 ђ CYRILLIC SMALL LETTER DJE + 'g', '%', '\u0453', // 1107 ѓ CYRILLIC SMALL LETTER GJE 'i', 'e', '\u0454', // 1108 є CYRILLIC SMALL LETTER UKRAINIAN IE - 'd', 's', '\u0455', // 1109 ѕ CYRILLIC SMALL LETTER DZE (Macedonian) + 'd', 's', '\u0455', // 1109 ѕ CYRILLIC SMALL LETTER DZE 'i', 'i', '\u0456', // 1110 і CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I - 'y', 'i', '\u0457', // 1111 ї CYRILLIC SMALL LETTER YI (Ukrainian) + 'y', 'i', '\u0457', // 1111 ї CYRILLIC SMALL LETTER YI 'j', '%', '\u0458', // 1112 ј CYRILLIC SMALL LETTER JE 'l', 'j', '\u0459', // 1113 љ CYRILLIC SMALL LETTER LJE 'n', 'j', '\u045a', // 1114 њ CYRILLIC SMALL LETTER NJE - 't', 's', '\u045b', // 1115 ћ CYRILLIC SMALL LETTER TSHE (Serbocroatian) - 'k', 'j', '\u045c', // 1116 ќ CYRILLIC SMALL LETTER KJE (Macedonian) - 'v', '%', '\u045e', // 1118 ў CYRILLIC SMALL LETTER SHORT U (Byelorussian) + 't', 's', '\u045b', // 1115 ћ CYRILLIC SMALL LETTER TSHE + 'k', 'j', '\u045c', // 1116 ќ CYRILLIC SMALL LETTER KJE + 'v', '%', '\u045e', // 1118 ў CYRILLIC SMALL LETTER SHORT U 'd', 'z', '\u045f', // 1119 џ CYRILLIC SMALL LETTER DZHE 'Y', '3', '\u0462', // 1122 Ѣ CYRILLIC CAPITAL LETTER YAT 'y', '3', '\u0463', // 1123 ѣ CYRILLIC SMALL LETTER YAT @@ -787,20 +882,20 @@ open class VimDigraphGroupBase() : VimDigraphGroup { '1', '+', '\u0650', // 1616 ِ ARABIC KASRA '3', '+', '\u0651', // 1617 ّ ARABIC SHADDA '0', '+', '\u0652', // 1618 ْ ARABIC SUKUN - 'a', 'S', '\u0670', // 1648 ٰ SUPERSCRIPT ARABIC LETTER ALEF + 'a', 'S', '\u0670', // 1648 ٰ ARABIC LETTER SUPERSCRIPT ALEF 'p', '+', '\u067e', // 1662 پ ARABIC LETTER PEH 'v', '+', '\u06a4', // 1700 ڤ ARABIC LETTER VEH 'g', 'f', '\u06af', // 1711 گ ARABIC LETTER GAF - '0', 'a', '\u06f0', // 1776 ۰ EASTERN ARABIC-INDIC DIGIT ZERO - '1', 'a', '\u06f1', // 1777 ۱ EASTERN ARABIC-INDIC DIGIT ONE - '2', 'a', '\u06f2', // 1778 ۲ EASTERN ARABIC-INDIC DIGIT TWO - '3', 'a', '\u06f3', // 1779 ۳ EASTERN ARABIC-INDIC DIGIT THREE - '4', 'a', '\u06f4', // 1780 ۴ EASTERN ARABIC-INDIC DIGIT FOUR - '5', 'a', '\u06f5', // 1781 ۵ EASTERN ARABIC-INDIC DIGIT FIVE - '6', 'a', '\u06f6', // 1782 ۶ EASTERN ARABIC-INDIC DIGIT SIX - '7', 'a', '\u06f7', // 1783 ۷ EASTERN ARABIC-INDIC DIGIT SEVEN - '8', 'a', '\u06f8', // 1784 ۸ EASTERN ARABIC-INDIC DIGIT EIGHT - '9', 'a', '\u06f9', // 1785 ۹ EASTERN ARABIC-INDIC DIGIT NINE + '0', 'a', '\u06f0', // 1776 ۰ EXTENDED ARABIC-INDIC DIGIT ZERO + '1', 'a', '\u06f1', // 1777 ۱ EXTENDED ARABIC-INDIC DIGIT ONE + '2', 'a', '\u06f2', // 1778 ۲ EXTENDED ARABIC-INDIC DIGIT TWO + '3', 'a', '\u06f3', // 1779 ۳ EXTENDED ARABIC-INDIC DIGIT THREE + '4', 'a', '\u06f4', // 1780 ۴ EXTENDED ARABIC-INDIC DIGIT FOUR + '5', 'a', '\u06f5', // 1781 ۵ EXTENDED ARABIC-INDIC DIGIT FIVE + '6', 'a', '\u06f6', // 1782 ۶ EXTENDED ARABIC-INDIC DIGIT SIX + '7', 'a', '\u06f7', // 1783 ۷ EXTENDED ARABIC-INDIC DIGIT SEVEN + '8', 'a', '\u06f8', // 1784 ۸ EXTENDED ARABIC-INDIC DIGIT EIGHT + '9', 'a', '\u06f9', // 1785 ۹ EXTENDED ARABIC-INDIC DIGIT NINE 'B', '.', '\u1e02', // 7682 Ḃ LATIN CAPITAL LETTER B WITH DOT ABOVE 'b', '.', '\u1e03', // 7683 ḃ LATIN SMALL LETTER B WITH DOT ABOVE 'B', '_', '\u1e06', // 7686 Ḇ LATIN CAPITAL LETTER B WITH LINE BELOW @@ -852,7 +947,9 @@ open class VimDigraphGroupBase() : VimDigraphGroup { 'V', '?', '\u1e7c', // 7804 Ṽ LATIN CAPITAL LETTER V WITH TILDE 'v', '?', '\u1e7d', // 7805 ṽ LATIN SMALL LETTER V WITH TILDE 'W', '!', '\u1e80', // 7808 Ẁ LATIN CAPITAL LETTER W WITH GRAVE + 'W', '`', '\u1e80', // 7808 Ẁ LATIN CAPITAL LETTER W WITH GRAVE (Vim 5.x compatible) 'w', '!', '\u1e81', // 7809 ẁ LATIN SMALL LETTER W WITH GRAVE + 'w', '`', '\u1e81', // 7809 ẁ LATIN SMALL LETTER W WITH GRAVE (Vim 5.x compatible) 'W', '\'', '\u1e82', // 7810 Ẃ LATIN CAPITAL LETTER W WITH ACUTE 'w', '\'', '\u1e83', // 7811 ẃ LATIN SMALL LETTER W WITH ACUTE 'W', ':', '\u1e84', // 7812 Ẅ LATIN CAPITAL LETTER W WITH DIAERESIS @@ -886,19 +983,21 @@ open class VimDigraphGroupBase() : VimDigraphGroup { 'U', '2', '\u1ee6', // 7910 Ủ LATIN CAPITAL LETTER U WITH HOOK ABOVE 'u', '2', '\u1ee7', // 7911 ủ LATIN SMALL LETTER U WITH HOOK ABOVE 'Y', '!', '\u1ef2', // 7922 Ỳ LATIN CAPITAL LETTER Y WITH GRAVE + 'Y', '`', '\u1ef2', // 7922 Ỳ LATIN CAPITAL LETTER Y WITH GRAVE (Vim 5.x compatible) 'y', '!', '\u1ef3', // 7923 ỳ LATIN SMALL LETTER Y WITH GRAVE + 'y', '`', '\u1ef3', // 7923 ỳ LATIN SMALL LETTER Y WITH GRAVE (Vim 5.x compatible) 'Y', '2', '\u1ef6', // 7926 Ỷ LATIN CAPITAL LETTER Y WITH HOOK ABOVE 'y', '2', '\u1ef7', // 7927 ỷ LATIN SMALL LETTER Y WITH HOOK ABOVE 'Y', '?', '\u1ef8', // 7928 Ỹ LATIN CAPITAL LETTER Y WITH TILDE 'y', '?', '\u1ef9', // 7929 ỹ LATIN SMALL LETTER Y WITH TILDE - ';', '\'', '\u1f00', // 7936 ἀ GREEK DASIA AND ACUTE ACCENT - ',', '\'', '\u1f01', // 7937 ἁ GREEK PSILI AND ACUTE ACCENT - ';', '!', '\u1f02', // 7938 ἂ GREEK DASIA AND VARIA - ',', '!', '\u1f03', // 7939 ἃ GREEK PSILI AND VARIA - '?', ';', '\u1f04', // 7940 ἄ GREEK DASIA AND PERISPOMENI - '?', ',', '\u1f05', // 7941 ἅ GREEK PSILI AND PERISPOMENI - '!', ':', '\u1f06', // 7942 ἆ GREEK DIAERESIS AND VARIA - '?', ':', '\u1f07', // 7943 ἇ GREEK DIAERESIS AND PERISPOMENI + ';', '\'', '\u1f00', // 7936 ἀ GREEK SMALL LETTER ALPHA WITH PSILI + ',', '\'', '\u1f01', // 7937 ἁ GREEK SMALL LETTER ALPHA WITH DASIA + ';', '!', '\u1f02', // 7938 ἂ GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA + ',', '!', '\u1f03', // 7939 ἃ GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA + '?', ';', '\u1f04', // 7940 ἄ GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA + '?', ',', '\u1f05', // 7941 ἅ GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA + '!', ':', '\u1f06', // 7942 ἆ GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI + '?', ':', '\u1f07', // 7943 ἇ GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI '1', 'N', '\u2002', // 8194   EN SPACE '1', 'M', '\u2003', // 8195   EM SPACE '3', 'M', '\u2004', // 8196   THREE-PER-EM SPACE @@ -922,12 +1021,14 @@ open class VimDigraphGroupBase() : VimDigraphGroup { '9', '"', '\u201f', // 8223 ‟ DOUBLE HIGH-REVERSED-9 QUOTATION MARK '/', '-', '\u2020', // 8224 † DAGGER '/', '=', '\u2021', // 8225 ‡ DOUBLE DAGGER + 'o', 'o', '\u2022', // 8226 • BULLET '.', '.', '\u2025', // 8229 ‥ TWO DOT LEADER - ',', '.', '\u2026', // 8230 … ELLIPSIS + ',', '.', '\u2026', // 8230 … HORIZONTAL ELLIPSIS (Vim 5.x compatible) '%', '0', '\u2030', // 8240 ‰ PER MILLE SIGN '1', '\'', '\u2032', // 8242 ′ PRIME '2', '\'', '\u2033', // 8243 ″ DOUBLE PRIME '3', '\'', '\u2034', // 8244 ‴ TRIPLE PRIME + '4', '\'', '\u2057', // 8279 ⁗ QUADRUPLE PRIME '1', '"', '\u2035', // 8245 ‵ REVERSED PRIME '2', '"', '\u2036', // 8246 ‶ REVERSED DOUBLE PRIME '3', '"', '\u2037', // 8247 ‷ REVERSED TRIPLE PRIME @@ -937,29 +1038,29 @@ open class VimDigraphGroupBase() : VimDigraphGroup { ':', 'X', '\u203b', // 8251 ※ REFERENCE MARK '\'', '-', '\u203e', // 8254 ‾ OVERLINE '/', 'f', '\u2044', // 8260 ⁄ FRACTION SLASH - '0', 'S', '\u2070', // 8304 ⁰ SUPERSCRIPT DIGIT ZERO - '4', 'S', '\u2074', // 8308 ⁴ SUPERSCRIPT DIGIT FOUR - '5', 'S', '\u2075', // 8309 ⁵ SUPERSCRIPT DIGIT FIVE - '6', 'S', '\u2076', // 8310 ⁶ SUPERSCRIPT DIGIT SIX - '7', 'S', '\u2077', // 8311 ⁷ SUPERSCRIPT DIGIT SEVEN - '8', 'S', '\u2078', // 8312 ⁸ SUPERSCRIPT DIGIT EIGHT - '9', 'S', '\u2079', // 8313 ⁹ SUPERSCRIPT DIGIT NINE + '0', 'S', '\u2070', // 8304 ⁰ SUPERSCRIPT ZERO + '4', 'S', '\u2074', // 8308 ⁴ SUPERSCRIPT FOUR + '5', 'S', '\u2075', // 8309 ⁵ SUPERSCRIPT FIVE + '6', 'S', '\u2076', // 8310 ⁶ SUPERSCRIPT SIX + '7', 'S', '\u2077', // 8311 ⁷ SUPERSCRIPT SEVEN + '8', 'S', '\u2078', // 8312 ⁸ SUPERSCRIPT EIGHT + '9', 'S', '\u2079', // 8313 ⁹ SUPERSCRIPT NINE '+', 'S', '\u207a', // 8314 ⁺ SUPERSCRIPT PLUS SIGN '-', 'S', '\u207b', // 8315 ⁻ SUPERSCRIPT MINUS '=', 'S', '\u207c', // 8316 ⁼ SUPERSCRIPT EQUALS SIGN '(', 'S', '\u207d', // 8317 ⁽ SUPERSCRIPT LEFT PARENTHESIS ')', 'S', '\u207e', // 8318 ⁾ SUPERSCRIPT RIGHT PARENTHESIS 'n', 'S', '\u207f', // 8319 ⁿ SUPERSCRIPT LATIN SMALL LETTER N - '0', 's', '\u2080', // 8320 ₀ SUBSCRIPT DIGIT ZERO - '1', 's', '\u2081', // 8321 ₁ SUBSCRIPT DIGIT ONE - '2', 's', '\u2082', // 8322 ₂ SUBSCRIPT DIGIT TWO - '3', 's', '\u2083', // 8323 ₃ SUBSCRIPT DIGIT THREE - '4', 's', '\u2084', // 8324 ₄ SUBSCRIPT DIGIT FOUR - '5', 's', '\u2085', // 8325 ₅ SUBSCRIPT DIGIT FIVE - '6', 's', '\u2086', // 8326 ₆ SUBSCRIPT DIGIT SIX - '7', 's', '\u2087', // 8327 ₇ SUBSCRIPT DIGIT SEVEN - '8', 's', '\u2088', // 8328 ₈ SUBSCRIPT DIGIT EIGHT - '9', 's', '\u2089', // 8329 ₉ SUBSCRIPT DIGIT NINE + '0', 's', '\u2080', // 8320 ₀ SUBSCRIPT ZERO + '1', 's', '\u2081', // 8321 ₁ SUBSCRIPT ONE + '2', 's', '\u2082', // 8322 ₂ SUBSCRIPT TWO + '3', 's', '\u2083', // 8323 ₃ SUBSCRIPT THREE + '4', 's', '\u2084', // 8324 ₄ SUBSCRIPT FOUR + '5', 's', '\u2085', // 8325 ₅ SUBSCRIPT FIVE + '6', 's', '\u2086', // 8326 ₆ SUBSCRIPT SIX + '7', 's', '\u2087', // 8327 ₇ SUBSCRIPT SEVEN + '8', 's', '\u2088', // 8328 ₈ SUBSCRIPT EIGHT + '9', 's', '\u2089', // 8329 ₉ SUBSCRIPT NINE '+', 's', '\u208a', // 8330 ₊ SUBSCRIPT PLUS SIGN '-', 's', '\u208b', // 8331 ₋ SUBSCRIPT MINUS '=', 's', '\u208c', // 8332 ₌ SUBSCRIPT EQUALS SIGN @@ -968,7 +1069,11 @@ open class VimDigraphGroupBase() : VimDigraphGroup { 'L', 'i', '\u20a4', // 8356 ₤ LIRA SIGN 'P', 't', '\u20a7', // 8359 ₧ PESETA SIGN 'W', '=', '\u20a9', // 8361 ₩ WON SIGN - 'o', 'C', '\u2103', // 8451 ℃ DEGREE CENTIGRADE + '=', 'e', '\u20ac', // 8364 € EURO SIGN + 'E', 'u', '\u20ac', // 8364 € EURO SIGN + '=', 'R', '\u20bd', // 8381 ₽ ROUBLE SIGN + '=', 'P', '\u20bd', // 8381 ₽ ROUBLE SIGN + 'o', 'C', '\u2103', // 8451 ℃ DEGREE CELSIUS 'c', 'o', '\u2105', // 8453 ℅ CARE OF 'o', 'F', '\u2109', // 8457 ℉ DEGREE FAHRENHEIT 'N', '0', '\u2116', // 8470 № NUMERO SIGN @@ -977,7 +1082,7 @@ open class VimDigraphGroupBase() : VimDigraphGroup { 'S', 'M', '\u2120', // 8480 ℠ SERVICE MARK 'T', 'M', '\u2122', // 8482 ™ TRADE MARK SIGN 'O', 'm', '\u2126', // 8486 Ω OHM SIGN - 'A', 'O', '\u212b', // 8491 Å ANGSTROEM SIGN + 'A', 'O', '\u212b', // 8491 Å ANGSTROM SIGN '1', '3', '\u2153', // 8531 ⅓ VULGAR FRACTION ONE THIRD '2', '3', '\u2154', // 8532 ⅔ VULGAR FRACTION TWO THIRDS '1', '5', '\u2155', // 8533 ⅕ VULGAR FRACTION ONE FIFTH @@ -1216,7 +1321,7 @@ open class VimDigraphGroupBase() : VimDigraphGroup { 'c', 'C', '\u2663', // 9827 ♣ BLACK CLUB SUIT 'M', 'd', '\u2669', // 9833 ♩ QUARTER NOTE 'M', '8', '\u266a', // 9834 ♪ EIGHTH NOTE - 'M', '2', '\u266b', // 9835 ♫ BARRED EIGHTH NOTES + 'M', '2', '\u266b', // 9835 ♫ BEAMED EIGHTH NOTES 'M', 'b', '\u266d', // 9837 ♭ MUSIC FLAT SIGN 'M', 'x', '\u266e', // 9838 ♮ MUSIC NATURAL SIGN 'M', 'X', '\u266f', // 9839 ♯ MUSIC SHARP SIGN @@ -1225,9 +1330,9 @@ open class VimDigraphGroupBase() : VimDigraphGroup { '-', 'X', '\u2720', // 10016 ✠ MALTESE CROSS 'I', 'S', '\u3000', // 12288   IDEOGRAPHIC SPACE ',', '_', '\u3001', // 12289 、 IDEOGRAPHIC COMMA - '.', '_', '\u3002', // 12290 。 IDEOGRAPHIC PERIOD + '.', '_', '\u3002', // 12290 。 IDEOGRAPHIC FULL STOP '+', '"', '\u3003', // 12291 〃 DITTO MARK - '+', '_', '\u3004', // 12292 〄 IDEOGRAPHIC DITTO MARK + '+', '_', '\u3004', // 12292 〄 JAPANESE INDUSTRIAL STANDARD SYMBOL '*', '_', '\u3005', // 12293 々 IDEOGRAPHIC ITERATION MARK ';', '_', '\u3006', // 12294 〆 IDEOGRAPHIC CLOSING MARK '0', '_', '\u3007', // 12295 〇 IDEOGRAPHIC NUMBER ZERO @@ -1476,53 +1581,26 @@ open class VimDigraphGroupBase() : VimDigraphGroup { '7', 'c', '\u3226', // 12838 ㈦ PARENTHESIZED IDEOGRAPH SEVEN '8', 'c', '\u3227', // 12839 ㈧ PARENTHESIZED IDEOGRAPH EIGHT '9', 'c', '\u3228', // 12840 ㈨ PARENTHESIZED IDEOGRAPH NINE - '/', 'c', '\ue001', // 57345  JOIN THIS LINE WITH NEXT LINE (Mnemonic) - 'U', 'A', '\ue002', // 57346 Unit space A (ISO-IR-8-1 064) - 'U', 'B', '\ue003', // 57347  Unit space B (ISO-IR-8-1 096) - '"', '3', '\ue004', // 57348  NON-SPACING UMLAUT (ISO-IR-38 201) (character part) - '"', '1', '\ue005', // 57349  NON-SPACING DIAERESIS WITH ACCENT (ISO-IR-70 192) (character part) - '"', '!', '\ue006', // 57350  NON-SPACING GRAVE ACCENT (ISO-IR-103 193) (character part) - '"', '\'', '\ue007', // 57351  NON-SPACING ACUTE ACCENT (ISO-IR-103 194) (character part) - '"', '>', '\ue008', // 57352  NON-SPACING CIRCUMFLEX ACCENT (ISO-IR-103 195) (character part) - '"', '?', '\ue009', // 57353  NON-SPACING TILDE (ISO-IR-103 196) (character part) - '"', '-', '\ue00a', // 57354  NON-SPACING MACRON (ISO-IR-103 197) (character part) - '"', '(', '\ue00b', // 57355  NON-SPACING BREVE (ISO-IR-103 198) (character part) - '"', '.', '\ue00c', // 57356  NON-SPACING DOT ABOVE (ISO-IR-103 199) (character part) - '"', ':', '\ue00d', // 57357  NON-SPACING DIAERESIS (ISO-IR-103 200) (character part) - '"', '0', '\ue00e', // 57358  NON-SPACING RING ABOVE (ISO-IR-103 202) (character part) - '"', '"', '\ue00f', // 57359  NON-SPACING DOUBLE ACCUTE (ISO-IR-103 204) (character part) - '"', '<', '\ue010', // 57360  NON-SPACING CARON (ISO-IR-103 206) (character part) - '"', ',', '\ue011', // 57361  NON-SPACING CEDILLA (ISO-IR-103 203) (character part) - '"', ';', '\ue012', // 57362  NON-SPACING OGONEK (ISO-IR-103 206) (character part) - '"', '_', '\ue013', // 57363  NON-SPACING LOW LINE (ISO-IR-103 204) (character part) - '"', '=', '\ue014', // 57364  NON-SPACING DOUBLE LOW LINE (ISO-IR-38 217) (character part) - '"', '/', '\ue015', // 57365  NON-SPACING LONG SOLIDUS (ISO-IR-128 201) (character part) - '"', 'i', '\ue016', // 57366  GREEK NON-SPACING IOTA BELOW (ISO-IR-55 39) (character part) - '"', 'd', '\ue017', // 57367  GREEK NON-SPACING DASIA PNEUMATA (ISO-IR-55 38) (character part) - '"', 'p', '\ue018', // 57368  GREEK NON-SPACING PSILI PNEUMATA (ISO-IR-55 37) (character part) - ';', ';', '\ue019', // 57369  GREEK DASIA PNEUMATA (ISO-IR-18 92) - ',', ',', '\ue01a', // 57370  GREEK PSILI PNEUMATA (ISO-IR-18 124) - 'b', '3', '\ue01b', // 57371  GREEK SMALL LETTER MIDDLE BETA (ISO-IR-18 99) - 'C', 'i', '\ue01c', // 57372  CIRCLE (ISO-IR-83 0294) - 'f', '(', '\ue01d', // 57373  FUNCTION SIGN (ISO-IR-143 221) - 'e', 'd', '\ue01e', // 57374  LATIN SMALL LETTER EZH (ISO-IR-158 142) - 'a', 'm', '\ue01f', // 57375  ANTE MERIDIAM SIGN (ISO-IR-149 0267) - 'p', 'm', '\ue020', // 57376  POST MERIDIAM SIGN (ISO-IR-149 0268) - 'F', 'l', '\ue023', // 57379  DUTCH GUILDER SIGN (IBM437 159) - 'G', 'F', '\ue024', // 57380  GAMMA FUNCTION SIGN (ISO-10646-1DIS 032/032/037/122) - '>', 'V', '\ue025', // 57381  RIGHTWARDS VECTOR ABOVE (ISO-10646-1DIS 032/032/038/046) - '!', '*', '\ue026', // 57382  GREEK VARIA (ISO-10646-1DIS 032/032/042/164) - '?', '*', '\ue027', // 57383  GREEK PERISPOMENI (ISO-10646-1DIS 032/032/042/165) - 'J', '<', '\ue028', // 57384  LATIN CAPITAL LETTER J WITH CARON (lowercase: 000/000/001/240) 'f', 'f', '\ufb00', // 64256 ff LATIN SMALL LIGATURE FF 'f', 'i', '\ufb01', // 64257 fi LATIN SMALL LIGATURE FI 'f', 'l', '\ufb02', // 64258 fl LATIN SMALL LIGATURE FL - 'f', 't', '\ufb05', // 64261 ſt LATIN SMALL LIGATURE FT + 'f', 't', '\ufb05', // 64261 ſt LATIN SMALL LIGATURE LONG S T 's', 't', '\ufb06', // 64262 st LATIN SMALL LIGATURE ST ) - protected val digraphs: HashMap = HashMap(defaultDigraphs.size) - protected val keys: TreeMap = TreeMap() + /** + * A map of digraph to character + * + * Note that this might contain duplicates for the character! + */ + private val digraphToCharacter: MutableMap = HashMap(defaultDigraphs.size) + + /** + * A map of character to digraph, as a concatenated string + * + * Note that when a character has multiple digraphs (e.g. `!I` and `~!`), only the first is kept! + */ + private val characterToDigraph: MutableMap = TreeMap() init { loadDigraphs() From ed0c43b79d82201969ba297474ed3c19efdb560c Mon Sep 17 00:00:00 2001 From: Matt Ellis Date: Tue, 3 Sep 2024 12:37:31 +0100 Subject: [PATCH 11/17] Simplify creating string digraph key --- .../InsertCompletedDigraphActionTest.kt | 7 ++++++- .../idea/vim/api/VimDigraphGroupBase.kt | 19 +++++++++++-------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/test/java/org/jetbrains/plugins/ideavim/action/change/insert/InsertCompletedDigraphActionTest.kt b/src/test/java/org/jetbrains/plugins/ideavim/action/change/insert/InsertCompletedDigraphActionTest.kt index 80b68fca6a..253ea0907a 100644 --- a/src/test/java/org/jetbrains/plugins/ideavim/action/change/insert/InsertCompletedDigraphActionTest.kt +++ b/src/test/java/org/jetbrains/plugins/ideavim/action/change/insert/InsertCompletedDigraphActionTest.kt @@ -14,7 +14,12 @@ import org.junit.jupiter.api.Test class InsertCompletedDigraphActionTest : VimTestCase() { @Test fun `test insert digraph`() { - doTest("iOK", "", "✓") + doTest(listOf("i", "OK", ""), "", "✓") + } + + @Test + fun `test insert digraph with reversed characters`() { + doTest(listOf("i", "KO", ""), "", "✓") } @Test diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt index 56e8840fd5..54e8cc2e77 100644 --- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt +++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt @@ -21,10 +21,13 @@ private val logger = vimLogger() open class VimDigraphGroupBase() : VimDigraphGroup { override fun getDigraph(ch1: Char, ch2: Char): Char { - var digraph = String(charArrayOf(ch1, ch2)) + val chars = charArrayOf(ch1, ch2) + var digraph = String(chars) var ch: Char? = digraphToCharacter[digraph] if (ch == null) { - digraph = String(charArrayOf(ch2, ch1)) + chars[0] = ch2 + chars[1] = ch1 + digraph = String(chars) ch = digraphToCharacter[digraph] } return ch ?: ch2 @@ -70,12 +73,12 @@ open class VimDigraphGroupBase() : VimDigraphGroup { var i = 0 while (i < defaultDigraphs.size) { if (defaultDigraphs[i] != '\u0000' && defaultDigraphs[i + 1] != '\u0000') { - val ch: Char = defaultDigraphs[i + 2] - val key = String(charArrayOf(defaultDigraphs[i], defaultDigraphs[i + 1])) + val character: Char = defaultDigraphs[i + 2] + val digraph = String(defaultDigraphs, i, 2) // todo use BiMap instead? - digraphToCharacter[key] = ch - if (!characterToDigraph.contains(ch)) { - characterToDigraph[ch] = key + digraphToCharacter[digraph] = character + if (!characterToDigraph.contains(character)) { + characterToDigraph[character] = digraph } } i += 3 @@ -113,7 +116,7 @@ open class VimDigraphGroupBase() : VimDigraphGroup { // We cannot guarantee ordering with the dictionaries, so let's use the defaultDigraphs list for (i in 0 until defaultDigraphs.size step 3) { val char = defaultDigraphs[i + 2] - val digraph = String(charArrayOf(defaultDigraphs[i], defaultDigraphs[i + 1])) + val digraph = String(defaultDigraphs, i, 2) val start = length append(digraph) From f5623b3948370c4564904ae1c54a1f02df169ca8 Mon Sep 17 00:00:00 2001 From: Matt Ellis Date: Tue, 3 Sep 2024 13:15:12 +0100 Subject: [PATCH 12/17] Rename getDigraph - it gets a char from a digraph --- .../main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroup.kt | 2 +- .../kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt | 2 +- .../kotlin/com/maddyhome/idea/vim/common/DigraphSequence.kt | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroup.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroup.kt index fbe320df05..657859e272 100644 --- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroup.kt +++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroup.kt @@ -8,7 +8,7 @@ package com.maddyhome.idea.vim.api interface VimDigraphGroup { - fun getDigraph(ch1: Char, ch2: Char): Char + fun getCharacterForDigraph(ch1: Char, ch2: Char): Char fun displayAsciiInfo(editor: VimEditor) fun parseCommandLine(editor: VimEditor, args: String): Boolean fun showDigraphs(editor: VimEditor) diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt index 54e8cc2e77..e7ee1d30ab 100644 --- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt +++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt @@ -20,7 +20,7 @@ private val logger = vimLogger() open class VimDigraphGroupBase() : VimDigraphGroup { - override fun getDigraph(ch1: Char, ch2: Char): Char { + override fun getCharacterForDigraph(ch1: Char, ch2: Char): Char { val chars = charArrayOf(ch1, ch2) var digraph = String(chars) var ch: Char? = digraphToCharacter[digraph] diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/common/DigraphSequence.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/common/DigraphSequence.kt index bf3d94a54e..1ea4e7512c 100644 --- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/common/DigraphSequence.kt +++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/common/DigraphSequence.kt @@ -63,7 +63,7 @@ class DigraphSequence: Cloneable { logger.debug("DIG_STATE_BACK_SPACE") digraphState = DIG_STATE_PENDING if (key.keyChar != KeyEvent.CHAR_UNDEFINED) { - val ch = injector.digraphGroup.getDigraph(digraphChar, key.keyChar) + val ch = injector.digraphGroup.getCharacterForDigraph(digraphChar, key.keyChar) digraphChar = 0.toChar() return done(KeyStroke.getKeyStroke(ch)) } @@ -83,7 +83,7 @@ class DigraphSequence: Cloneable { logger.debug("DIG_STATE_DIG_TWO") digraphState = DIG_STATE_PENDING if (key.keyChar != KeyEvent.CHAR_UNDEFINED) { - val ch = injector.digraphGroup.getDigraph(digraphChar, key.keyChar) + val ch = injector.digraphGroup.getCharacterForDigraph(digraphChar, key.keyChar) return done(KeyStroke.getKeyStroke(ch)) } DigraphResult.Bad From 5c56745300e83dedcd0bcb52d8aa4961e3050515 Mon Sep 17 00:00:00 2001 From: Matt Ellis Date: Tue, 3 Sep 2024 13:51:25 +0100 Subject: [PATCH 13/17] Add a default size for the digraph string builder --- .../kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt index e7ee1d30ab..bf92c5c0ef 100644 --- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt +++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt @@ -110,7 +110,9 @@ open class VimDigraphGroupBase() : VimDigraphGroup { logger.debug("height=$height") } - val output = buildString { + val digraphCount = defaultDigraphs.size / 3 + val capacity = (digraphCount * columnWidth) + (digraphCount / columnCount) // Text + newlines + val output = buildString(capacity) { var column = 0 // We cannot guarantee ordering with the dictionaries, so let's use the defaultDigraphs list From 3cdc90cf30d0e2e1ac3e9ec75431cba769068960 Mon Sep 17 00:00:00 2001 From: Matt Ellis Date: Tue, 3 Sep 2024 16:00:09 +0100 Subject: [PATCH 14/17] Minor refactor outputting digraphs --- .../idea/vim/api/VimDigraphGroupBase.kt | 30 +++++++++---------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt index bf92c5c0ef..eccac036aa 100644 --- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt +++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt @@ -114,19 +114,25 @@ open class VimDigraphGroupBase() : VimDigraphGroup { val capacity = (digraphCount * columnWidth) + (digraphCount / columnCount) // Text + newlines val output = buildString(capacity) { var column = 0 + var columnLength = 0 // We cannot guarantee ordering with the dictionaries, so let's use the defaultDigraphs list for (i in 0 until defaultDigraphs.size step 3) { - val char = defaultDigraphs[i + 2] - val digraph = String(defaultDigraphs, i, 2) + if (column != 0) { + repeat(columnWidth - (columnLength % columnWidth)) { + append(' ') + } + } + columnLength = length - val start = length - append(digraph) + append(defaultDigraphs[i]) + append(defaultDigraphs[i + 1]) append(' ') // VIM highlights the printable character with HLF_8, which it also uses for special keys in `:map` + val char = defaultDigraphs[i + 2] val printable = EngineStringHelper.toPrintableCharacter(char) - val adjustment = when { + val invisibleCharAdjustment = when { // Weird Vim-ism. `NU` (NULL) is set to 10, but displays as `^@` char == '\u000a' && i == 0 -> { append(EngineStringHelper.toPrintableCharacter('\u0000')) @@ -161,23 +167,15 @@ open class VimDigraphGroupBase() : VimDigraphGroup { append(' ') append(char.code.toString().padStart(3)) + columnLength = length - columnLength - invisibleCharAdjustment + column++ if (column == columnCount) { appendLine() column = 0 } - else { - if (length - start > columnWidth) { - append(' ') - } - else { - repeat(columnWidth - ((length - start - adjustment) % columnWidth)) { - append(' ') - } - } - } } - }.trimEnd() // TODO: Try to get rid of this + } val context = injector.executionContextManager.getEditorExecutionContext(editor) injector.outputPanel.output(editor, context, output) From 0a08fbe667cc74d30ebb542bb9de179396495bbd Mon Sep 17 00:00:00 2001 From: Matt Ellis Date: Tue, 3 Sep 2024 17:12:58 +0100 Subject: [PATCH 15/17] Add digraph headers --- .../commands/DigraphsCommandTest.kt | 273 ++++++++++++++++++ .../maddyhome/idea/vim/api/VimDigraphGroup.kt | 2 +- .../idea/vim/api/VimDigraphGroupBase.kt | 86 +++++- 3 files changed, 351 insertions(+), 10 deletions(-) diff --git a/src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/commands/DigraphsCommandTest.kt b/src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/commands/DigraphsCommandTest.kt index 0bc94bbc0e..629b496b67 100644 --- a/src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/commands/DigraphsCommandTest.kt +++ b/src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/commands/DigraphsCommandTest.kt @@ -272,4 +272,277 @@ class DigraphsCommandTest : VimTestCase() { |st st 64262 """.trimMargin()) } + + @Test + fun `test digraph output with headers`() { + assertCommandOutput("digraphs!", + """ + |NU ^@ 10 SH ^A 1 SX ^B 2 EX ^C 3 ET ^D 4 EQ ^E 5 + |AK ^F 6 BL ^G 7 BS ^H 8 HT ^I 9 LF ^J 10 VT ^K 11 + |FF ^L 12 CR ^M 13 SO ^N 14 SI ^O 15 DL ^P 16 D1 ^Q 17 + |D2 ^R 18 D3 ^S 19 D4 ^T 20 NK ^U 21 SY ^V 22 EB ^W 23 + |CN ^X 24 EM ^Y 25 SB ^Z 26 EC ^[ 27 FS ^\ 28 GS ^] 29 + |RS ^^ 30 US ^_ 31 SP 32 Nb # 35 DO $ 36 At @ 64 + |<( [ 91 // \ 92 )> ] 93 '> ^ 94 '! ` 96 (! { 123 + |!! | 124 !) } 125 '? ~ 126 DT ^? 127 PA <80> 128 HO <81> 129 + |BH <82> 130 NH <83> 131 IN <84> 132 NL <85> 133 SA <86> 134 ES <87> 135 + |HS <88> 136 HJ <89> 137 VS <8a> 138 PD <8b> 139 PU <8c> 140 RI <8d> 141 + |S2 <8e> 142 S3 <8f> 143 DC <90> 144 P1 <91> 145 P2 <92> 146 TS <93> 147 + |CC <94> 148 MW <95> 149 SG <96> 150 EG <97> 151 SS <98> 152 GC <99> 153 + |SC <9a> 154 CI <9b> 155 ST <9c> 156 OC <9d> 157 PM <9e> 158 AC <9f> 159 + |NS   160 + |Latin supplement + |!I ¡ 161 ~! ¡ 161 Ct ¢ 162 c| ¢ 162 Pd £ 163 $$ £ 163 + |Cu ¤ 164 ox ¤ 164 Ye ¥ 165 Y- ¥ 165 BB ¦ 166 || ¦ 166 + |SE § 167 ': ¨ 168 Co © 169 cO © 169 -a ª 170 << « 171 + |NO ¬ 172 -, ¬ 172 -- 173 Rg ® 174 'm ¯ 175 -= ¯ 175 + |DG ° 176 ~o ° 176 +- ± 177 2S ² 178 22 ² 178 3S ³ 179 + |33 ³ 179 '' ´ 180 My µ 181 PI ¶ 182 pp ¶ 182 .M · 183 + |~. · 183 ', ¸ 184 1S ¹ 185 11 ¹ 185 -o º 186 >> » 187 + |14 ¼ 188 12 ½ 189 34 ¾ 190 ?I ¿ 191 ~? ¿ 191 A! À 192 + |A` À 192 A' Á 193 A>  194 A^  194 A? à 195 A~ à 195 + |A: Ä 196 A" Ä 196 AA Å 197 A@ Å 197 AE Æ 198 C, Ç 199 + |E! È 200 E` È 200 E' É 201 E> Ê 202 E^ Ê 202 E: Ë 203 + |E" Ë 203 I! Ì 204 I` Ì 204 I' Í 205 I> Î 206 I^ Î 206 + |I: Ï 207 I" Ï 207 D- Ð 208 N? Ñ 209 N~ Ñ 209 O! Ò 210 + |O` Ò 210 O' Ó 211 O> Ô 212 O^ Ô 212 O? Õ 213 O~ Õ 213 + |O: Ö 214 *X × 215 /\ × 215 O/ Ø 216 U! Ù 217 U` Ù 217 + |U' Ú 218 U> Û 219 U^ Û 219 U: Ü 220 Y' Ý 221 TH Þ 222 + |Ip Þ 222 ss ß 223 a! à 224 a` à 224 a' á 225 a> â 226 + |a^ â 226 a? ã 227 a~ ã 227 a: ä 228 a" ä 228 aa å 229 + |a@ å 229 ae æ 230 c, ç 231 e! è 232 e` è 232 e' é 233 + |e> ê 234 e^ ê 234 e: ë 235 e" ë 235 i! ì 236 i` ì 236 + |i' í 237 i> î 238 i^ î 238 i: ï 239 d- ð 240 n? ñ 241 + |n~ ñ 241 o! ò 242 o` ò 242 o' ó 243 o> ô 244 o^ ô 244 + |o? õ 245 o~ õ 245 o: ö 246 -: ÷ 247 o/ ø 248 u! ù 249 + |u` ù 249 u' ú 250 u> û 251 u^ û 251 u: ü 252 y' ý 253 + |th þ 254 y: ÿ 255 y" ÿ 255 A- Ā 256 a- ā 257 A( Ă 258 + |a( ă 259 A; Ą 260 a; ą 261 C' Ć 262 c' ć 263 C> Ĉ 264 + |c> ĉ 265 C. Ċ 266 c. ċ 267 C< Č 268 c< č 269 D< Ď 270 + |d< ď 271 D/ Đ 272 d/ đ 273 E- Ē 274 e- ē 275 E( Ĕ 276 + |e( ĕ 277 E. Ė 278 e. ė 279 E; Ę 280 e; ę 281 E< Ě 282 + |e< ě 283 G> Ĝ 284 g> ĝ 285 G( Ğ 286 g( ğ 287 G. Ġ 288 + |g. ġ 289 G, Ģ 290 g, ģ 291 H> Ĥ 292 h> ĥ 293 H/ Ħ 294 + |h/ ħ 295 I? Ĩ 296 i? ĩ 297 I- Ī 298 i- ī 299 I( Ĭ 300 + |i( ĭ 301 I; Į 302 i; į 303 I. İ 304 i. ı 305 IJ IJ 306 + |ij ij 307 J> Ĵ 308 j> ĵ 309 K, Ķ 310 k, ķ 311 kk ĸ 312 + |L' Ĺ 313 l' ĺ 314 L, Ļ 315 l, ļ 316 L< Ľ 317 l< ľ 318 + |L. Ŀ 319 l. ŀ 320 L/ Ł 321 l/ ł 322 N' Ń 323 n' ń 324 + |N, Ņ 325 n, ņ 326 N< Ň 327 n< ň 328 'n ʼn 329 NG Ŋ 330 + |ng ŋ 331 O- Ō 332 o- ō 333 O( Ŏ 334 o( ŏ 335 O" Ő 336 + |o" ő 337 OE Œ 338 oe œ 339 R' Ŕ 340 r' ŕ 341 R, Ŗ 342 + |r, ŗ 343 R< Ř 344 r< ř 345 S' Ś 346 s' ś 347 S> Ŝ 348 + |s> ŝ 349 S, Ş 350 s, ş 351 S< Š 352 s< š 353 T, Ţ 354 + |t, ţ 355 T< Ť 356 t< ť 357 T/ Ŧ 358 t/ ŧ 359 U? Ũ 360 + |u? ũ 361 U- Ū 362 u- ū 363 U( Ŭ 364 u( ŭ 365 U0 Ů 366 + |u0 ů 367 U" Ű 368 u" ű 369 U; Ų 370 u; ų 371 W> Ŵ 372 + |w> ŵ 373 Y> Ŷ 374 y> ŷ 375 Y: Ÿ 376 Z' Ź 377 z' ź 378 + |Z. Ż 379 z. ż 380 Z< Ž 381 z< ž 382 O9 Ơ 416 o9 ơ 417 + |OI Ƣ 418 oi ƣ 419 yr Ʀ 422 U9 Ư 431 u9 ư 432 Z/ Ƶ 437 + |z/ ƶ 438 ED Ʒ 439 A< Ǎ 461 a< ǎ 462 I< Ǐ 463 i< ǐ 464 + |O< Ǒ 465 o< ǒ 466 U< Ǔ 467 u< ǔ 468 A1 Ǟ 478 a1 ǟ 479 + |A7 Ǡ 480 a7 ǡ 481 A3 Ǣ 482 a3 ǣ 483 G/ Ǥ 484 g/ ǥ 485 + |G< Ǧ 486 g< ǧ 487 K< Ǩ 488 k< ǩ 489 O; Ǫ 490 o; ǫ 491 + |O1 Ǭ 492 o1 ǭ 493 EZ Ǯ 494 ez ǯ 495 j< ǰ 496 G' Ǵ 500 + |g' ǵ 501 ;S ʿ 703 '< ˇ 711 '( ˘ 728 '. ˙ 729 '0 ˚ 730 + |'; ˛ 731 '" ˝ 733 + |Greek and Coptic + |A% Ά 902 E% Έ 904 Y% Ή 905 I% Ί 906 O% Ό 908 U% Ύ 910 + |W% Ώ 911 i3 ΐ 912 A* Α 913 B* Β 914 G* Γ 915 D* Δ 916 + |E* Ε 917 Z* Ζ 918 Y* Η 919 H* Θ 920 I* Ι 921 K* Κ 922 + |L* Λ 923 M* Μ 924 N* Ν 925 C* Ξ 926 O* Ο 927 P* Π 928 + |R* Ρ 929 S* Σ 931 T* Τ 932 U* Υ 933 F* Φ 934 X* Χ 935 + |Q* Ψ 936 W* Ω 937 J* Ϊ 938 V* Ϋ 939 a% ά 940 e% έ 941 + |y% ή 942 i% ί 943 u3 ΰ 944 a* α 945 b* β 946 g* γ 947 + |d* δ 948 e* ε 949 z* ζ 950 y* η 951 h* θ 952 i* ι 953 + |k* κ 954 l* λ 955 m* μ 956 n* ν 957 c* ξ 958 o* ο 959 + |p* π 960 r* ρ 961 *s ς 962 s* σ 963 t* τ 964 u* υ 965 + |f* φ 966 x* χ 967 q* ψ 968 w* ω 969 j* ϊ 970 v* ϋ 971 + |o% ό 972 u% ύ 973 w% ώ 974 'G Ϙ 984 ,G ϙ 985 T3 Ϛ 986 + |t3 ϛ 987 M3 Ϝ 988 m3 ϝ 989 K3 Ϟ 990 k3 ϟ 991 P3 Ϡ 992 + |p3 ϡ 993 '% ϴ 1012 j3 ϵ 1013 + |Cyrillic + |IO Ё 1025 D% Ђ 1026 G% Ѓ 1027 IE Є 1028 DS Ѕ 1029 II І 1030 + |YI Ї 1031 J% Ј 1032 LJ Љ 1033 NJ Њ 1034 Ts Ћ 1035 KJ Ќ 1036 + |V% Ў 1038 DZ Џ 1039 A= А 1040 B= Б 1041 V= В 1042 G= Г 1043 + |D= Д 1044 E= Е 1045 Z% Ж 1046 Z= З 1047 I= И 1048 J= Й 1049 + |K= К 1050 L= Л 1051 M= М 1052 N= Н 1053 O= О 1054 P= П 1055 + |R= Р 1056 S= С 1057 T= Т 1058 U= У 1059 F= Ф 1060 H= Х 1061 + |C= Ц 1062 C% Ч 1063 S% Ш 1064 Sc Щ 1065 =" Ъ 1066 Y= Ы 1067 + |%" Ь 1068 JE Э 1069 JU Ю 1070 JA Я 1071 a= а 1072 b= б 1073 + |v= в 1074 g= г 1075 d= д 1076 e= е 1077 z% ж 1078 z= з 1079 + |i= и 1080 j= й 1081 k= к 1082 l= л 1083 m= м 1084 n= н 1085 + |o= о 1086 p= п 1087 r= р 1088 s= с 1089 t= т 1090 u= у 1091 + |f= ф 1092 h= х 1093 c= ц 1094 c% ч 1095 s% ш 1096 sc щ 1097 + |=' ъ 1098 y= ы 1099 %' ь 1100 je э 1101 ju ю 1102 ja я 1103 + |io ё 1105 d% ђ 1106 g% ѓ 1107 ie є 1108 ds ѕ 1109 ii і 1110 + |yi ї 1111 j% ј 1112 lj љ 1113 nj њ 1114 ts ћ 1115 kj ќ 1116 + |v% ў 1118 dz џ 1119 Y3 Ѣ 1122 y3 ѣ 1123 O3 Ѫ 1130 o3 ѫ 1131 + |F3 Ѳ 1138 f3 ѳ 1139 V3 Ѵ 1140 v3 ѵ 1141 C3 Ҁ 1152 c3 ҁ 1153 + |G3 Ґ 1168 g3 ґ 1169 + |Hebrew + |A+ ⁧א⁩ 1488 B+ ⁧ב⁩ 1489 G+ ⁧ג⁩ 1490 D+ ⁧ד⁩ 1491 H+ ⁧ה⁩ 1492 W+ ⁧ו⁩ 1493 + |Z+ ⁧ז⁩ 1494 X+ ⁧ח⁩ 1495 Tj ⁧ט⁩ 1496 J+ ⁧י⁩ 1497 K% ⁧ך⁩ 1498 K+ ⁧כ⁩ 1499 + |L+ ⁧ל⁩ 1500 M% ⁧ם⁩ 1501 M+ ⁧מ⁩ 1502 N% ⁧ן⁩ 1503 N+ ⁧נ⁩ 1504 S+ ⁧ס⁩ 1505 + |E+ ⁧ע⁩ 1506 P% ⁧ף⁩ 1507 P+ ⁧פ⁩ 1508 Zj ⁧ץ⁩ 1509 ZJ ⁧צ⁩ 1510 Q+ ⁧ק⁩ 1511 + |R+ ⁧ר⁩ 1512 Sh ⁧ש⁩ 1513 T+ ⁧ת⁩ 1514 + |Arabic + |,+ ، 1548 ;+ ⁧؛⁩ 1563 ?+ ⁧؟⁩ 1567 H' ⁧ء⁩ 1569 aM ⁧آ⁩ 1570 aH ⁧أ⁩ 1571 + |wH ⁧ؤ⁩ 1572 ah ⁧إ⁩ 1573 yH ⁧ئ⁩ 1574 a+ ⁧ا⁩ 1575 b+ ⁧ب⁩ 1576 tm ⁧ة⁩ 1577 + |t+ ⁧ت⁩ 1578 tk ⁧ث⁩ 1579 g+ ⁧ج⁩ 1580 hk ⁧ح⁩ 1581 x+ ⁧خ⁩ 1582 d+ ⁧د⁩ 1583 + |dk ⁧ذ⁩ 1584 r+ ⁧ر⁩ 1585 z+ ⁧ز⁩ 1586 s+ ⁧س⁩ 1587 sn ⁧ش⁩ 1588 c+ ⁧ص⁩ 1589 + |dd ⁧ض⁩ 1590 tj ⁧ط⁩ 1591 zH ⁧ظ⁩ 1592 e+ ⁧ع⁩ 1593 i+ ⁧غ⁩ 1594 ++ ⁧ـ⁩ 1600 + |f+ ⁧ف⁩ 1601 q+ ⁧ق⁩ 1602 k+ ⁧ك⁩ 1603 l+ ⁧ل⁩ 1604 m+ ⁧م⁩ 1605 n+ ⁧ن⁩ 1606 + |h+ ⁧ه⁩ 1607 w+ ⁧و⁩ 1608 j+ ⁧ى⁩ 1609 y+ ⁧ي⁩ 1610 :+ ً 1611 "+ ٌ 1612 + |=+ ٍ 1613 /+ َ 1614 '+ ُ 1615 1+ ِ 1616 3+ ّ 1617 0+ ْ 1618 + |aS ٰ 1648 p+ ⁧پ⁩ 1662 v+ ⁧ڤ⁩ 1700 gf ⁧گ⁩ 1711 0a ۰ 1776 1a ۱ 1777 + |2a ۲ 1778 3a ۳ 1779 4a ۴ 1780 5a ۵ 1781 6a ۶ 1782 7a ۷ 1783 + |8a ۸ 1784 9a ۹ 1785 + |Latin extended + |B. Ḃ 7682 b. ḃ 7683 B_ Ḇ 7686 b_ ḇ 7687 D. Ḋ 7690 d. ḋ 7691 + |D_ Ḏ 7694 d_ ḏ 7695 D, Ḑ 7696 d, ḑ 7697 F. Ḟ 7710 f. ḟ 7711 + |G- Ḡ 7712 g- ḡ 7713 H. Ḣ 7714 h. ḣ 7715 H: Ḧ 7718 h: ḧ 7719 + |H, Ḩ 7720 h, ḩ 7721 K' Ḱ 7728 k' ḱ 7729 K_ Ḵ 7732 k_ ḵ 7733 + |L_ Ḻ 7738 l_ ḻ 7739 M' Ḿ 7742 m' ḿ 7743 M. Ṁ 7744 m. ṁ 7745 + |N. Ṅ 7748 n. ṅ 7749 N_ Ṉ 7752 n_ ṉ 7753 P' Ṕ 7764 p' ṕ 7765 + |P. Ṗ 7766 p. ṗ 7767 R. Ṙ 7768 r. ṙ 7769 R_ Ṟ 7774 r_ ṟ 7775 + |S. Ṡ 7776 s. ṡ 7777 T. Ṫ 7786 t. ṫ 7787 T_ Ṯ 7790 t_ ṯ 7791 + |V? Ṽ 7804 v? ṽ 7805 W! Ẁ 7808 W` Ẁ 7808 w! ẁ 7809 w` ẁ 7809 + |W' Ẃ 7810 w' ẃ 7811 W: Ẅ 7812 w: ẅ 7813 W. Ẇ 7814 w. ẇ 7815 + |X. Ẋ 7818 x. ẋ 7819 X: Ẍ 7820 x: ẍ 7821 Y. Ẏ 7822 y. ẏ 7823 + |Z> Ẑ 7824 z> ẑ 7825 Z_ Ẕ 7828 z_ ẕ 7829 h_ ẖ 7830 t: ẗ 7831 + |w0 ẘ 7832 y0 ẙ 7833 A2 Ả 7842 a2 ả 7843 E2 Ẻ 7866 e2 ẻ 7867 + |E? Ẽ 7868 e? ẽ 7869 I2 Ỉ 7880 i2 ỉ 7881 O2 Ỏ 7886 o2 ỏ 7887 + |U2 Ủ 7910 u2 ủ 7911 Y! Ỳ 7922 Y` Ỳ 7922 y! ỳ 7923 y` ỳ 7923 + |Y2 Ỷ 7926 y2 ỷ 7927 Y? Ỹ 7928 y? ỹ 7929 + |Greek extended + |;' ἀ 7936 ,' ἁ 7937 ;! ἂ 7938 ,! ἃ 7939 ?; ἄ 7940 ?, ἅ 7941 + |!: ἆ 7942 ?: ἇ 7943 + |Punctuation + |1N   8194 1M   8195 3M   8196 4M   8197 6M   8198 1T   8201 + |1H   8202 -1 ‐ 8208 -N – 8211 -M — 8212 -3 ― 8213 !2 ‖ 8214 + |=2 ‗ 8215 '6 ‘ 8216 '9 ’ 8217 .9 ‚ 8218 9' ‛ 8219 "6 “ 8220 + |"9 ” 8221 :9 „ 8222 9" ‟ 8223 /- † 8224 /= ‡ 8225 oo • 8226 + |.. ‥ 8229 ,. … 8230 %0 ‰ 8240 1' ′ 8242 2' ″ 8243 3' ‴ 8244 + |4' ⁗ 8279 1" ‵ 8245 2" ‶ 8246 3" ‷ 8247 Ca ‸ 8248 <1 ‹ 8249 + |>1 › 8250 :X ※ 8251 '- ‾ 8254 /f ⁄ 8260 + |Super- and subscripts + |0S ⁰ 8304 4S ⁴ 8308 5S ⁵ 8309 6S ⁶ 8310 7S ⁷ 8311 8S ⁸ 8312 + |9S ⁹ 8313 +S ⁺ 8314 -S ⁻ 8315 =S ⁼ 8316 (S ⁽ 8317 )S ⁾ 8318 + |nS ⁿ 8319 0s ₀ 8320 1s ₁ 8321 2s ₂ 8322 3s ₃ 8323 4s ₄ 8324 + |5s ₅ 8325 6s ₆ 8326 7s ₇ 8327 8s ₈ 8328 9s ₉ 8329 +s ₊ 8330 + |-s ₋ 8331 =s ₌ 8332 (s ₍ 8333 )s ₎ 8334 + |Currency + |Li ₤ 8356 Pt ₧ 8359 W= ₩ 8361 =e € 8364 Eu € 8364 =R ₽ 8381 + |=P ₽ 8381 + |Other + |oC ℃ 8451 co ℅ 8453 oF ℉ 8457 N0 № 8470 PO ℗ 8471 Rx ℞ 8478 + |SM ℠ 8480 TM ™ 8482 Om Ω 8486 AO Å 8491 13 ⅓ 8531 23 ⅔ 8532 + |15 ⅕ 8533 25 ⅖ 8534 35 ⅗ 8535 45 ⅘ 8536 16 ⅙ 8537 56 ⅚ 8538 + |18 ⅛ 8539 38 ⅜ 8540 58 ⅝ 8541 78 ⅞ 8542 + |Roman numbers + |1R Ⅰ 8544 2R Ⅱ 8545 3R Ⅲ 8546 4R Ⅳ 8547 5R Ⅴ 8548 6R Ⅵ 8549 + |7R Ⅶ 8550 8R Ⅷ 8551 9R Ⅸ 8552 aR Ⅹ 8553 bR Ⅺ 8554 cR Ⅻ 8555 + |1r ⅰ 8560 2r ⅱ 8561 3r ⅲ 8562 4r ⅳ 8563 5r ⅴ 8564 6r ⅵ 8565 + |7r ⅶ 8566 8r ⅷ 8567 9r ⅸ 8568 ar ⅹ 8569 br ⅺ 8570 cr ⅻ 8571 + |Arrows + |<- ← 8592 -! ↑ 8593 -> → 8594 -v ↓ 8595 <> ↔ 8596 UD ↕ 8597 + |<= ⇐ 8656 => ⇒ 8658 == ⇔ 8660 + |Mathematical operators + |FA ∀ 8704 dP ∂ 8706 TE ∃ 8707 /0 ∅ 8709 DE ∆ 8710 NB ∇ 8711 + |(- ∈ 8712 -) ∋ 8715 *P ∏ 8719 +Z ∑ 8721 -2 − 8722 -+ ∓ 8723 + |*- ∗ 8727 Ob ∘ 8728 Sb ∙ 8729 RT √ 8730 0( ∝ 8733 00 ∞ 8734 + |-L ∟ 8735 -V ∠ 8736 PP ∥ 8741 AN ∧ 8743 OR ∨ 8744 (U ∩ 8745 + |)U ∪ 8746 In ∫ 8747 DI ∬ 8748 Io ∮ 8750 .: ∴ 8756 :. ∵ 8757 + |:R ∶ 8758 :: ∷ 8759 ?1 ∼ 8764 CG ∾ 8766 ?- ≃ 8771 ?= ≅ 8773 + |?2 ≈ 8776 =? ≌ 8780 HI ≓ 8787 != ≠ 8800 =3 ≡ 8801 =< ≤ 8804 + |>= ≥ 8805 <* ≪ 8810 *> ≫ 8811 !< ≮ 8814 !> ≯ 8815 (C ⊂ 8834 + |)C ⊃ 8835 (_ ⊆ 8838 )_ ⊇ 8839 0. ⊙ 8857 02 ⊚ 8858 -T ⊥ 8869 + |.P ⋅ 8901 :3 ⋮ 8942 .3 ⋯ 8943 + |Technical + |Eh ⌂ 8962 <7 ⌈ 8968 >7 ⌉ 8969 7< ⌊ 8970 7> ⌋ 8971 NI ⌐ 8976 + |(A ⌒ 8978 TR ⌕ 8981 Iu ⌠ 8992 Il ⌡ 8993 〉 9002 + |Other + |Vs ␣ 9251 1h ⑀ 9280 3h ⑁ 9281 2h ⑂ 9282 4h ⑃ 9283 1j ⑆ 9286 + |2j ⑇ 9287 3j ⑈ 9288 4j ⑉ 9289 1. ⒈ 9352 2. ⒉ 9353 3. ⒊ 9354 + |4. ⒋ 9355 5. ⒌ 9356 6. ⒍ 9357 7. ⒎ 9358 8. ⒏ 9359 9. ⒐ 9360 + |Box drawing + |hh ─ 9472 HH ━ 9473 vv │ 9474 VV ┃ 9475 3- ┄ 9476 3_ ┅ 9477 + |3! ┆ 9478 3/ ┇ 9479 4- ┈ 9480 4_ ┉ 9481 4! ┊ 9482 4/ ┋ 9483 + |dr ┌ 9484 dR ┍ 9485 Dr ┎ 9486 DR ┏ 9487 dl ┐ 9488 dL ┑ 9489 + |Dl ┒ 9490 LD ┓ 9491 ur └ 9492 uR ┕ 9493 Ur ┖ 9494 UR ┗ 9495 + |ul ┘ 9496 uL ┙ 9497 Ul ┚ 9498 UL ┛ 9499 vr ├ 9500 vR ┝ 9501 + |Vr ┠ 9504 VR ┣ 9507 vl ┤ 9508 vL ┥ 9509 Vl ┨ 9512 VL ┫ 9515 + |dh ┬ 9516 dH ┯ 9519 Dh ┰ 9520 DH ┳ 9523 uh ┴ 9524 uH ┷ 9527 + |Uh ┸ 9528 UH ┻ 9531 vh ┼ 9532 vH ┿ 9535 Vh ╂ 9538 VH ╋ 9547 + |FD ╱ 9585 BD ╲ 9586 + |Block elements + |TB ▀ 9600 LB ▄ 9604 FB █ 9608 lB ▌ 9612 RB ▐ 9616 .S ░ 9617 + |:S ▒ 9618 ?S ▓ 9619 + |Geometric shapes + |fS ■ 9632 OS □ 9633 RO ▢ 9634 Rr ▣ 9635 RF ▤ 9636 RY ▥ 9637 + |RH ▦ 9638 RZ ▧ 9639 RK ▨ 9640 RX ▩ 9641 sB ▪ 9642 SR ▬ 9644 + |Or ▭ 9645 UT ▲ 9650 uT △ 9651 PR ▶ 9654 Tr ▷ 9655 Dt ▼ 9660 + |dT ▽ 9661 PL ◀ 9664 Tl ◁ 9665 Db ◆ 9670 Dw ◇ 9671 LZ ◊ 9674 + |0m ○ 9675 0o ◎ 9678 0M ● 9679 0L ◐ 9680 0R ◑ 9681 Sn ◘ 9688 + |Ic ◙ 9689 Fd ◢ 9698 Bd ◣ 9699 + |Symbols + |*2 ★ 9733 *1 ☆ 9734 H ☞ 9758 0u ☺ 9786 0U ☻ 9787 + |SU ☼ 9788 Fm ♀ 9792 Ml ♂ 9794 cS ♠ 9824 cH ♡ 9825 cD ♢ 9826 + |cC ♣ 9827 Md ♩ 9833 M8 ♪ 9834 M2 ♫ 9835 Mb ♭ 9837 Mx ♮ 9838 + |MX ♯ 9839 + |Dingbats + |OK ✓ 10003 XX ✗ 10007 -X ✠ 10016 + |CJK symbols and punctuation + |IS   12288 ,_ 、 12289 ._ 。 12290 +" 〃 12291 +_ 〄 12292 *_ 々 12293 + |;_ 〆 12294 0_ 〇 12295 <+ 《 12298 >+ 》 12299 <' 「 12300 >' 」 12301 + |<" 『 12302 >" 』 12303 (" 【 12304 )" 】 12305 =T 〒 12306 =_ 〓 12307 + |(' 〔 12308 )' 〕 12309 (I 〖 12310 )I 〗 12311 -? 〜 12316 + |Hiragana + |A5 ぁ 12353 a5 あ 12354 I5 ぃ 12355 i5 い 12356 U5 ぅ 12357 u5 う 12358 + |E5 ぇ 12359 e5 え 12360 O5 ぉ 12361 o5 お 12362 ka か 12363 ga が 12364 + |ki き 12365 gi ぎ 12366 ku く 12367 gu ぐ 12368 ke け 12369 ge げ 12370 + |ko こ 12371 go ご 12372 sa さ 12373 za ざ 12374 si し 12375 zi じ 12376 + |su す 12377 zu ず 12378 se せ 12379 ze ぜ 12380 so そ 12381 zo ぞ 12382 + |ta た 12383 da だ 12384 ti ち 12385 di ぢ 12386 tU っ 12387 tu つ 12388 + |du づ 12389 te て 12390 de で 12391 to と 12392 do ど 12393 na な 12394 + |ni に 12395 nu ぬ 12396 ne ね 12397 no の 12398 ha は 12399 ba ば 12400 + |pa ぱ 12401 hi ひ 12402 bi び 12403 pi ぴ 12404 hu ふ 12405 bu ぶ 12406 + |pu ぷ 12407 he へ 12408 be べ 12409 pe ぺ 12410 ho ほ 12411 bo ぼ 12412 + |po ぽ 12413 ma ま 12414 mi み 12415 mu む 12416 me め 12417 mo も 12418 + |yA ゃ 12419 ya や 12420 yU ゅ 12421 yu ゆ 12422 yO ょ 12423 yo よ 12424 + |ra ら 12425 ri り 12426 ru る 12427 re れ 12428 ro ろ 12429 wA ゎ 12430 + |wa わ 12431 wi ゐ 12432 we ゑ 12433 wo を 12434 n5 ん 12435 vu ゔ 12436 + |"5 ゛ 12443 05 ゜ 12444 *5 ゝ 12445 +5 ゞ 12446 + |Katakana + |a6 ァ 12449 A6 ア 12450 i6 ィ 12451 I6 イ 12452 u6 ゥ 12453 U6 ウ 12454 + |e6 ェ 12455 E6 エ 12456 o6 ォ 12457 O6 オ 12458 Ka カ 12459 Ga ガ 12460 + |Ki キ 12461 Gi ギ 12462 Ku ク 12463 Gu グ 12464 Ke ケ 12465 Ge ゲ 12466 + |Ko コ 12467 Go ゴ 12468 Sa サ 12469 Za ザ 12470 Si シ 12471 Zi ジ 12472 + |Su ス 12473 Zu ズ 12474 Se セ 12475 Ze ゼ 12476 So ソ 12477 Zo ゾ 12478 + |Ta タ 12479 Da ダ 12480 Ti チ 12481 Di ヂ 12482 TU ッ 12483 Tu ツ 12484 + |Du ヅ 12485 Te テ 12486 De デ 12487 To ト 12488 Do ド 12489 Na ナ 12490 + |Ni ニ 12491 Nu ヌ 12492 Ne ネ 12493 No ノ 12494 Ha ハ 12495 Ba バ 12496 + |Pa パ 12497 Hi ヒ 12498 Bi ビ 12499 Pi ピ 12500 Hu フ 12501 Bu ブ 12502 + |Pu プ 12503 He ヘ 12504 Be ベ 12505 Pe ペ 12506 Ho ホ 12507 Bo ボ 12508 + |Po ポ 12509 Ma マ 12510 Mi ミ 12511 Mu ム 12512 Me メ 12513 Mo モ 12514 + |YA ャ 12515 Ya ヤ 12516 YU ュ 12517 Yu ユ 12518 YO ョ 12519 Yo ヨ 12520 + |Ra ラ 12521 Ri リ 12522 Ru ル 12523 Re レ 12524 Ro ロ 12525 WA ヮ 12526 + |Wa ワ 12527 Wi ヰ 12528 We ヱ 12529 Wo ヲ 12530 N6 ン 12531 Vu ヴ 12532 + |KA ヵ 12533 KE ヶ 12534 Va ヷ 12535 Vi ヸ 12536 Ve ヹ 12537 Vo ヺ 12538 + |.6 ・ 12539 -6 ー 12540 *6 ヽ 12541 +6 ヾ 12542 + |Bopomofo + |b4 ㄅ 12549 p4 ㄆ 12550 m4 ㄇ 12551 f4 ㄈ 12552 d4 ㄉ 12553 t4 ㄊ 12554 + |n4 ㄋ 12555 l4 ㄌ 12556 g4 ㄍ 12557 k4 ㄎ 12558 h4 ㄏ 12559 j4 ㄐ 12560 + |q4 ㄑ 12561 x4 ㄒ 12562 zh ㄓ 12563 ch ㄔ 12564 sh ㄕ 12565 r4 ㄖ 12566 + |z4 ㄗ 12567 c4 ㄘ 12568 s4 ㄙ 12569 a4 ㄚ 12570 o4 ㄛ 12571 e4 ㄜ 12572 + |ai ㄞ 12574 ei ㄟ 12575 au ㄠ 12576 ou ㄡ 12577 an ㄢ 12578 en ㄣ 12579 + |aN ㄤ 12580 eN ㄥ 12581 er ㄦ 12582 i4 ㄧ 12583 u4 ㄨ 12584 iu ㄩ 12585 + |v4 ㄪ 12586 nG ㄫ 12587 gn ㄬ 12588 + |Other + |1c ㈠ 12832 2c ㈡ 12833 3c ㈢ 12834 4c ㈣ 12835 5c ㈤ 12836 6c ㈥ 12837 + |7c ㈦ 12838 8c ㈧ 12839 9c ㈨ 12840 ff ff 64256 fi fi 64257 fl fl 64258 + |ft ſt 64261 st st 64262 + """.trimMargin()) + } } diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroup.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroup.kt index 657859e272..e705db866f 100644 --- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroup.kt +++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroup.kt @@ -11,5 +11,5 @@ interface VimDigraphGroup { fun getCharacterForDigraph(ch1: Char, ch2: Char): Char fun displayAsciiInfo(editor: VimEditor) fun parseCommandLine(editor: VimEditor, args: String): Boolean - fun showDigraphs(editor: VimEditor) + fun showDigraphs(editor: VimEditor, showHeaders: Boolean) } diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt index eccac036aa..3ea964f48e 100644 --- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt +++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt @@ -12,8 +12,10 @@ package com.maddyhome.idea.vim.api import com.maddyhome.idea.vim.diagnostic.vimLogger import com.maddyhome.idea.vim.helper.EngineStringHelper +import com.maddyhome.idea.vim.helper.Msg import java.util.* import javax.swing.KeyStroke +import kotlin.Char import kotlin.math.ceil private val logger = vimLogger() @@ -88,14 +90,22 @@ open class VimDigraphGroupBase() : VimDigraphGroup { override fun parseCommandLine(editor: VimEditor, args: String): Boolean { if (args.isEmpty()) { - showDigraphs(editor) + showDigraphs(editor, false) return true } + else if (args == "!") { + showDigraphs(editor, true) + return true + } + // todo command is not fully supported - return true + // TODO: Command only supports adding new digraphs - :digraphs {char1}{char2} {number} + + injector.messages.showStatusBarMessage(editor, injector.messages.message(Msg.e_invarg, args)) + return false } - override fun showDigraphs(editor: VimEditor) { + override fun showDigraphs(editor: VimEditor, showHeaders: Boolean) { val width = injector.engineEditorHelper.getApproximateScreenWidth(editor).let { if (it < 10) 80 else it } // Vim's columns are 13 characters wide, but for some reason, they suddenly switch to 12. It makes no obvious sense, @@ -111,17 +121,31 @@ open class VimDigraphGroupBase() : VimDigraphGroup { } val digraphCount = defaultDigraphs.size / 3 - val capacity = (digraphCount * columnWidth) + (digraphCount / columnCount) // Text + newlines + val capacity = (digraphCount * columnWidth) + (digraphCount / columnCount) + 300 // Text + newlines + headers val output = buildString(capacity) { var column = 0 var columnLength = 0 + var previousUnicodeBlock: Character.UnicodeBlock? = null - // We cannot guarantee ordering with the dictionaries, so let's use the defaultDigraphs list + // We cannot guarantee ordering with the dictionaries, so let's use the defaultDigraphs list. + // We output in codepoint order, but there are duplicate digraphs for some codepoints and we want control of order for (i in 0 until defaultDigraphs.size step 3) { - if (column != 0) { - repeat(columnWidth - (columnLength % columnWidth)) { - append(' ') + val char = defaultDigraphs[i + 2] + + // Show headers if requested. Vim shows headers for some Unicode blocks, but not all. And its block boundaries + // aren't necessarily correct + val block = getVimCompatibleUnicodeBlock(char) + if (showHeaders && block != previousUnicodeBlock && digraphHeaderNames.containsKey(block)) { + if (column != 0) { + appendLine() } + appendLine(digraphHeaderNames[block]) + previousUnicodeBlock = block + column = 0 + } + + if (column != 0) { + repeat(columnWidth - (columnLength % columnWidth)) { append(' ') } } columnLength = length @@ -130,7 +154,6 @@ open class VimDigraphGroupBase() : VimDigraphGroup { append(' ') // VIM highlights the printable character with HLF_8, which it also uses for special keys in `:map` - val char = defaultDigraphs[i + 2] val printable = EngineStringHelper.toPrintableCharacter(char) val invisibleCharAdjustment = when { // Weird Vim-ism. `NU` (NULL) is set to 10, but displays as `^@` @@ -197,6 +220,16 @@ open class VimDigraphGroupBase() : VimDigraphGroup { || type == Character.FORMAT } + private fun getVimCompatibleUnicodeBlock(char: Char): Character.UnicodeBlock { + // Vim's block boundaries don't agree with Java's. Fudge things so they match + val block = Character.UnicodeBlock.of(char) + return when { + block == Character.UnicodeBlock.LATIN_1_SUPPLEMENT && char.code < 0xa1 -> Character.UnicodeBlock.BASIC_LATIN + block == Character.UnicodeBlock.NUMBER_FORMS && char.code < 0x2160 -> Character.UnicodeBlock.LETTERLIKE_SYMBOLS + else -> block + } + } + // Based on the digraphs listed in `:help digraph-table` and `:help digraph-table-mbyte`, which unfortunately doesn't // list all digraphs. The output of the `:digraphs` command (`redir @">|silent digraphs|redir END|enew|put`) is used // to fill in the missing entries. (Compare against the output in the tests) @@ -1605,6 +1638,41 @@ open class VimDigraphGroupBase() : VimDigraphGroup { */ private val characterToDigraph: MutableMap = TreeMap() + /** + * A map of Unicode block to Vim digraph header name/display text + * + * This map only contains a name for the Unicode blocks that Vim outputs. If no display text exists for a Unicode + * block, then it's not displayed as a separate header + */ + private val digraphHeaderNames = mapOf( + Character.UnicodeBlock.LATIN_1_SUPPLEMENT to "Latin supplement", + Character.UnicodeBlock.GREEK to "Greek and Coptic", + Character.UnicodeBlock.CYRILLIC to "Cyrillic", + Character.UnicodeBlock.HEBREW to "Hebrew", + Character.UnicodeBlock.ARABIC to "Arabic", + Character.UnicodeBlock.LATIN_EXTENDED_ADDITIONAL to "Latin extended", + Character.UnicodeBlock.GREEK_EXTENDED to "Greek extended", + Character.UnicodeBlock.GENERAL_PUNCTUATION to "Punctuation", + Character.UnicodeBlock.SUPERSCRIPTS_AND_SUBSCRIPTS to "Super- and subscripts", + Character.UnicodeBlock.CURRENCY_SYMBOLS to "Currency", + Character.UnicodeBlock.LETTERLIKE_SYMBOLS to "Other", + Character.UnicodeBlock.NUMBER_FORMS to "Roman numbers", + Character.UnicodeBlock.ARROWS to "Arrows", + Character.UnicodeBlock.MATHEMATICAL_OPERATORS to "Mathematical operators", + Character.UnicodeBlock.MISCELLANEOUS_TECHNICAL to "Technical", + Character.UnicodeBlock.CONTROL_PICTURES to "Other", + Character.UnicodeBlock.BOX_DRAWING to "Box drawing", + Character.UnicodeBlock.BLOCK_ELEMENTS to "Block elements", + Character.UnicodeBlock.GEOMETRIC_SHAPES to "Geometric shapes", + Character.UnicodeBlock.MISCELLANEOUS_SYMBOLS to "Symbols", + Character.UnicodeBlock.DINGBATS to "Dingbats", + Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION to "CJK symbols and punctuation", + Character.UnicodeBlock.HIRAGANA to "Hiragana", + Character.UnicodeBlock.KATAKANA to "Katakana", + Character.UnicodeBlock.BOPOMOFO to "Bopomofo", + Character.UnicodeBlock.ENCLOSED_CJK_LETTERS_AND_MONTHS to "Other", + ) + init { loadDigraphs() } From 5aa374799a9e45601c1a258d26213c4846457903 Mon Sep 17 00:00:00 2001 From: Matt Ellis Date: Tue, 3 Sep 2024 23:25:18 +0100 Subject: [PATCH 16/17] Add support for custom digraphs --- .../messages/IdeaVimBundle.properties | 2 + .../InsertCompletedDigraphActionTest.kt | 29 + .../commands/AsciiCommandTest.kt | 8 + .../commands/DigraphsCommandTest.kt | 589 ++++++++++++++++++ .../plugins/ideavim/option/DigraphTest.kt | 36 +- .../jetbrains/plugins/ideavim/VimTestCase.kt | 2 + .../idea/vim/api/VimDigraphGroupBase.kt | 183 ++++-- 7 files changed, 789 insertions(+), 60 deletions(-) diff --git a/src/main/resources/messages/IdeaVimBundle.properties b/src/main/resources/messages/IdeaVimBundle.properties index c847b750c5..3fd60c4646 100644 --- a/src/main/resources/messages/IdeaVimBundle.properties +++ b/src/main/resources/messages/IdeaVimBundle.properties @@ -28,6 +28,7 @@ E20=E20: Mark not set e_nopresub=E33: No previous substitute regular expression e_noprev=E34: No previous command e_noprevre=E35: No previous regular expression +E39=E39: Number expected e_re_damg=E43: Damaged match string e_re_corr=E44: Currupted regexp program E50=E50: Too many \\z( @@ -84,6 +85,7 @@ E549=E549: Illegal percentage: {0} E774=E774: 'operatorfunc' is empty e841.reserved.name.cannot.be.used.for.user.defined.command=E841: Reserved name, cannot be used for user defined command E939=E939: Positive count required +E1214=E1214: Digraph must be just two characters: {0} message.search.hit.bottom=search hit BOTTOM, continuing at TOP message.search.hit.top=search hit TOP, continuing at BOTTOM diff --git a/src/test/java/org/jetbrains/plugins/ideavim/action/change/insert/InsertCompletedDigraphActionTest.kt b/src/test/java/org/jetbrains/plugins/ideavim/action/change/insert/InsertCompletedDigraphActionTest.kt index 253ea0907a..2400ab3c5f 100644 --- a/src/test/java/org/jetbrains/plugins/ideavim/action/change/insert/InsertCompletedDigraphActionTest.kt +++ b/src/test/java/org/jetbrains/plugins/ideavim/action/change/insert/InsertCompletedDigraphActionTest.kt @@ -26,4 +26,33 @@ class InsertCompletedDigraphActionTest : VimTestCase() { fun `test insert same character with different digraphs`() { doTest(listOf("i", "Ct", "c|", ""), "", "¢¢") } + + @Test + fun `test insert custom digraph`() { + doTest(listOf("i", "(0", ""), "", "⓪") { + enterCommand("digraph (0 9450") + } + } + + @Test + fun `test insert custom digraph with reversed characters`() { + doTest(listOf("i", "0(", ""), "", "⓪") { + enterCommand("digraph (0 9450") + } + } + + @Test + fun `test insert custom digraph overriding existing custom digraph`() { + doTest(listOf("i", "(0", ""), "", "✓") { + enterCommand("digraph (0 9450") + enterCommand("digraph (0 10003") + } + } + + @Test + fun `test insert custom digraph overriding existing default digraph`() { + doTest(listOf("i", "OK", ""), "", "⓪") { + enterCommand("digraph OK 9450") + } + } } diff --git a/src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/commands/AsciiCommandTest.kt b/src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/commands/AsciiCommandTest.kt index 2efbf05871..6eb189fafa 100644 --- a/src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/commands/AsciiCommandTest.kt +++ b/src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/commands/AsciiCommandTest.kt @@ -69,4 +69,12 @@ class AsciiCommandTest : VimTestCase() { enterCommand("ascii") assertEquals("<¢> 162, Hex a2, Oct 242, Digr Ct", VimPlugin.getMessage()) } + + @Test + fun `test shows custom digraph`() { + configureByText("⓪") + enterCommand("digraph (0 9450") + enterCommand("ascii") + assertEquals("<⓪> 9450, Hex 24ea, Oct 22352, Digr (0", VimPlugin.getMessage()) + } } diff --git a/src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/commands/DigraphsCommandTest.kt b/src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/commands/DigraphsCommandTest.kt index 629b496b67..ccb758646a 100644 --- a/src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/commands/DigraphsCommandTest.kt +++ b/src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/commands/DigraphsCommandTest.kt @@ -15,6 +15,7 @@ import org.junit.jupiter.api.Assertions.assertTrue import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test import org.junit.jupiter.api.TestInfo +import kotlin.test.assertEquals class DigraphsCommandTest : VimTestCase() { @BeforeEach @@ -29,6 +30,82 @@ class DigraphsCommandTest : VimTestCase() { assertTrue(exCommand is DigraphCommand) } + @Test + fun `test add custom digraph`() { + enterCommand("digraph (0 9450") + assertEquals('⓪', injector.digraphGroup.getCharacterForDigraph('(', '0')) + } + + @Test + fun `test add custom digraph matches reversed characters`() { + enterCommand("digraph (0 9450") + assertEquals('⓪', injector.digraphGroup.getCharacterForDigraph('0', '(')) + } + + @Test + fun `test add multiple custom digraphs`() { + enterCommand("digraph (0 9450 (1 9312") + assertEquals('⓪', injector.digraphGroup.getCharacterForDigraph('(', '0')) + assertEquals('①', injector.digraphGroup.getCharacterForDigraph('(', '1')) + } + + @Test + fun `test add custom digraph with single character reports error`() { + enterCommand("digraph a") + assertPluginError(true) + assertPluginErrorMessageContains("E1214: Digraph must be just two characters: a") + } + + @Test + fun `test add custom digraph with too many characters reports error about missing codepoint`() { + enterCommand("digraph aaaaa") + assertPluginError(true) + assertPluginErrorMessageContains("E39: Number expected") + } + + @Test + fun `test add custom digraph without codepoint reports error`() { + enterCommand("digraph aa") + assertPluginError(true) + assertPluginErrorMessageContains("E39: Number expected") + } + + @Test + fun `test add custom digraph with invalid codepoint reports error`() { + enterCommand("digraph aa nvnvn") + assertPluginError(true) + assertPluginErrorMessageContains("E39: Number expected") + } + + @Test + fun `test add custom digraph with more than two characters add custom digraph with initial two characters`() { + enterCommand("digraph aaaa 9450") + assertEquals('⓪', injector.digraphGroup.getCharacterForDigraph('a', 'a')) + } + + @Test + fun `test add custom digraphs until error`() { + enterCommand("digraph (0 9450 (1 9312 (2") + assertEquals('⓪', injector.digraphGroup.getCharacterForDigraph('(', '0')) + assertEquals('①', injector.digraphGroup.getCharacterForDigraph('(', '1')) + assertPluginError(true) + assertPluginErrorMessageContains("E39: Number expected") + } + + @Test + fun `test custom digraph overwrites existing custom digraph`() { + enterCommand("digraph (0 9450") + assertEquals('⓪', injector.digraphGroup.getCharacterForDigraph('(', '0')) + enterCommand("digraph (0 10003") + assertEquals('✓', injector.digraphGroup.getCharacterForDigraph('(', '0')) + } + + @Test + fun `test custom digraph overwrites existing default digraph`() { + enterCommand("digraph OK 9450") + assertEquals('⓪', injector.digraphGroup.getCharacterForDigraph('O', 'K')) + } + @Test fun `test digraph output`() { // Note that the following text has some control characters in, notably Unicode's RLI and PDI characters to isolate @@ -545,4 +622,516 @@ class DigraphsCommandTest : VimTestCase() { |ft ſt 64261 st st 64262 """.trimMargin()) } + + @Test + fun `test digraph output with custom digraphs output in entered order`() { + enterCommand("digraphs (0 9450 (2 9313 (1 9312") + assertCommandOutput("digraphs", + """ + |NU ^@ 10 SH ^A 1 SX ^B 2 EX ^C 3 ET ^D 4 EQ ^E 5 + |AK ^F 6 BL ^G 7 BS ^H 8 HT ^I 9 LF ^J 10 VT ^K 11 + |FF ^L 12 CR ^M 13 SO ^N 14 SI ^O 15 DL ^P 16 D1 ^Q 17 + |D2 ^R 18 D3 ^S 19 D4 ^T 20 NK ^U 21 SY ^V 22 EB ^W 23 + |CN ^X 24 EM ^Y 25 SB ^Z 26 EC ^[ 27 FS ^\ 28 GS ^] 29 + |RS ^^ 30 US ^_ 31 SP 32 Nb # 35 DO $ 36 At @ 64 + |<( [ 91 // \ 92 )> ] 93 '> ^ 94 '! ` 96 (! { 123 + |!! | 124 !) } 125 '? ~ 126 DT ^? 127 PA <80> 128 HO <81> 129 + |BH <82> 130 NH <83> 131 IN <84> 132 NL <85> 133 SA <86> 134 ES <87> 135 + |HS <88> 136 HJ <89> 137 VS <8a> 138 PD <8b> 139 PU <8c> 140 RI <8d> 141 + |S2 <8e> 142 S3 <8f> 143 DC <90> 144 P1 <91> 145 P2 <92> 146 TS <93> 147 + |CC <94> 148 MW <95> 149 SG <96> 150 EG <97> 151 SS <98> 152 GC <99> 153 + |SC <9a> 154 CI <9b> 155 ST <9c> 156 OC <9d> 157 PM <9e> 158 AC <9f> 159 + |NS   160 !I ¡ 161 ~! ¡ 161 Ct ¢ 162 c| ¢ 162 Pd £ 163 + |$$ £ 163 Cu ¤ 164 ox ¤ 164 Ye ¥ 165 Y- ¥ 165 BB ¦ 166 + ||| ¦ 166 SE § 167 ': ¨ 168 Co © 169 cO © 169 -a ª 170 + |<< « 171 NO ¬ 172 -, ¬ 172 -- 173 Rg ® 174 'm ¯ 175 + |-= ¯ 175 DG ° 176 ~o ° 176 +- ± 177 2S ² 178 22 ² 178 + |3S ³ 179 33 ³ 179 '' ´ 180 My µ 181 PI ¶ 182 pp ¶ 182 + |.M · 183 ~. · 183 ', ¸ 184 1S ¹ 185 11 ¹ 185 -o º 186 + |>> » 187 14 ¼ 188 12 ½ 189 34 ¾ 190 ?I ¿ 191 ~? ¿ 191 + |A! À 192 A` À 192 A' Á 193 A>  194 A^  194 A? à 195 + |A~ à 195 A: Ä 196 A" Ä 196 AA Å 197 A@ Å 197 AE Æ 198 + |C, Ç 199 E! È 200 E` È 200 E' É 201 E> Ê 202 E^ Ê 202 + |E: Ë 203 E" Ë 203 I! Ì 204 I` Ì 204 I' Í 205 I> Î 206 + |I^ Î 206 I: Ï 207 I" Ï 207 D- Ð 208 N? Ñ 209 N~ Ñ 209 + |O! Ò 210 O` Ò 210 O' Ó 211 O> Ô 212 O^ Ô 212 O? Õ 213 + |O~ Õ 213 O: Ö 214 *X × 215 /\ × 215 O/ Ø 216 U! Ù 217 + |U` Ù 217 U' Ú 218 U> Û 219 U^ Û 219 U: Ü 220 Y' Ý 221 + |TH Þ 222 Ip Þ 222 ss ß 223 a! à 224 a` à 224 a' á 225 + |a> â 226 a^ â 226 a? ã 227 a~ ã 227 a: ä 228 a" ä 228 + |aa å 229 a@ å 229 ae æ 230 c, ç 231 e! è 232 e` è 232 + |e' é 233 e> ê 234 e^ ê 234 e: ë 235 e" ë 235 i! ì 236 + |i` ì 236 i' í 237 i> î 238 i^ î 238 i: ï 239 d- ð 240 + |n? ñ 241 n~ ñ 241 o! ò 242 o` ò 242 o' ó 243 o> ô 244 + |o^ ô 244 o? õ 245 o~ õ 245 o: ö 246 -: ÷ 247 o/ ø 248 + |u! ù 249 u` ù 249 u' ú 250 u> û 251 u^ û 251 u: ü 252 + |y' ý 253 th þ 254 y: ÿ 255 y" ÿ 255 A- Ā 256 a- ā 257 + |A( Ă 258 a( ă 259 A; Ą 260 a; ą 261 C' Ć 262 c' ć 263 + |C> Ĉ 264 c> ĉ 265 C. Ċ 266 c. ċ 267 C< Č 268 c< č 269 + |D< Ď 270 d< ď 271 D/ Đ 272 d/ đ 273 E- Ē 274 e- ē 275 + |E( Ĕ 276 e( ĕ 277 E. Ė 278 e. ė 279 E; Ę 280 e; ę 281 + |E< Ě 282 e< ě 283 G> Ĝ 284 g> ĝ 285 G( Ğ 286 g( ğ 287 + |G. Ġ 288 g. ġ 289 G, Ģ 290 g, ģ 291 H> Ĥ 292 h> ĥ 293 + |H/ Ħ 294 h/ ħ 295 I? Ĩ 296 i? ĩ 297 I- Ī 298 i- ī 299 + |I( Ĭ 300 i( ĭ 301 I; Į 302 i; į 303 I. İ 304 i. ı 305 + |IJ IJ 306 ij ij 307 J> Ĵ 308 j> ĵ 309 K, Ķ 310 k, ķ 311 + |kk ĸ 312 L' Ĺ 313 l' ĺ 314 L, Ļ 315 l, ļ 316 L< Ľ 317 + |l< ľ 318 L. Ŀ 319 l. ŀ 320 L/ Ł 321 l/ ł 322 N' Ń 323 + |n' ń 324 N, Ņ 325 n, ņ 326 N< Ň 327 n< ň 328 'n ʼn 329 + |NG Ŋ 330 ng ŋ 331 O- Ō 332 o- ō 333 O( Ŏ 334 o( ŏ 335 + |O" Ő 336 o" ő 337 OE Œ 338 oe œ 339 R' Ŕ 340 r' ŕ 341 + |R, Ŗ 342 r, ŗ 343 R< Ř 344 r< ř 345 S' Ś 346 s' ś 347 + |S> Ŝ 348 s> ŝ 349 S, Ş 350 s, ş 351 S< Š 352 s< š 353 + |T, Ţ 354 t, ţ 355 T< Ť 356 t< ť 357 T/ Ŧ 358 t/ ŧ 359 + |U? Ũ 360 u? ũ 361 U- Ū 362 u- ū 363 U( Ŭ 364 u( ŭ 365 + |U0 Ů 366 u0 ů 367 U" Ű 368 u" ű 369 U; Ų 370 u; ų 371 + |W> Ŵ 372 w> ŵ 373 Y> Ŷ 374 y> ŷ 375 Y: Ÿ 376 Z' Ź 377 + |z' ź 378 Z. Ż 379 z. ż 380 Z< Ž 381 z< ž 382 O9 Ơ 416 + |o9 ơ 417 OI Ƣ 418 oi ƣ 419 yr Ʀ 422 U9 Ư 431 u9 ư 432 + |Z/ Ƶ 437 z/ ƶ 438 ED Ʒ 439 A< Ǎ 461 a< ǎ 462 I< Ǐ 463 + |i< ǐ 464 O< Ǒ 465 o< ǒ 466 U< Ǔ 467 u< ǔ 468 A1 Ǟ 478 + |a1 ǟ 479 A7 Ǡ 480 a7 ǡ 481 A3 Ǣ 482 a3 ǣ 483 G/ Ǥ 484 + |g/ ǥ 485 G< Ǧ 486 g< ǧ 487 K< Ǩ 488 k< ǩ 489 O; Ǫ 490 + |o; ǫ 491 O1 Ǭ 492 o1 ǭ 493 EZ Ǯ 494 ez ǯ 495 j< ǰ 496 + |G' Ǵ 500 g' ǵ 501 ;S ʿ 703 '< ˇ 711 '( ˘ 728 '. ˙ 729 + |'0 ˚ 730 '; ˛ 731 '" ˝ 733 A% Ά 902 E% Έ 904 Y% Ή 905 + |I% Ί 906 O% Ό 908 U% Ύ 910 W% Ώ 911 i3 ΐ 912 A* Α 913 + |B* Β 914 G* Γ 915 D* Δ 916 E* Ε 917 Z* Ζ 918 Y* Η 919 + |H* Θ 920 I* Ι 921 K* Κ 922 L* Λ 923 M* Μ 924 N* Ν 925 + |C* Ξ 926 O* Ο 927 P* Π 928 R* Ρ 929 S* Σ 931 T* Τ 932 + |U* Υ 933 F* Φ 934 X* Χ 935 Q* Ψ 936 W* Ω 937 J* Ϊ 938 + |V* Ϋ 939 a% ά 940 e% έ 941 y% ή 942 i% ί 943 u3 ΰ 944 + |a* α 945 b* β 946 g* γ 947 d* δ 948 e* ε 949 z* ζ 950 + |y* η 951 h* θ 952 i* ι 953 k* κ 954 l* λ 955 m* μ 956 + |n* ν 957 c* ξ 958 o* ο 959 p* π 960 r* ρ 961 *s ς 962 + |s* σ 963 t* τ 964 u* υ 965 f* φ 966 x* χ 967 q* ψ 968 + |w* ω 969 j* ϊ 970 v* ϋ 971 o% ό 972 u% ύ 973 w% ώ 974 + |'G Ϙ 984 ,G ϙ 985 T3 Ϛ 986 t3 ϛ 987 M3 Ϝ 988 m3 ϝ 989 + |K3 Ϟ 990 k3 ϟ 991 P3 Ϡ 992 p3 ϡ 993 '% ϴ 1012 j3 ϵ 1013 + |IO Ё 1025 D% Ђ 1026 G% Ѓ 1027 IE Є 1028 DS Ѕ 1029 II І 1030 + |YI Ї 1031 J% Ј 1032 LJ Љ 1033 NJ Њ 1034 Ts Ћ 1035 KJ Ќ 1036 + |V% Ў 1038 DZ Џ 1039 A= А 1040 B= Б 1041 V= В 1042 G= Г 1043 + |D= Д 1044 E= Е 1045 Z% Ж 1046 Z= З 1047 I= И 1048 J= Й 1049 + |K= К 1050 L= Л 1051 M= М 1052 N= Н 1053 O= О 1054 P= П 1055 + |R= Р 1056 S= С 1057 T= Т 1058 U= У 1059 F= Ф 1060 H= Х 1061 + |C= Ц 1062 C% Ч 1063 S% Ш 1064 Sc Щ 1065 =" Ъ 1066 Y= Ы 1067 + |%" Ь 1068 JE Э 1069 JU Ю 1070 JA Я 1071 a= а 1072 b= б 1073 + |v= в 1074 g= г 1075 d= д 1076 e= е 1077 z% ж 1078 z= з 1079 + |i= и 1080 j= й 1081 k= к 1082 l= л 1083 m= м 1084 n= н 1085 + |o= о 1086 p= п 1087 r= р 1088 s= с 1089 t= т 1090 u= у 1091 + |f= ф 1092 h= х 1093 c= ц 1094 c% ч 1095 s% ш 1096 sc щ 1097 + |=' ъ 1098 y= ы 1099 %' ь 1100 je э 1101 ju ю 1102 ja я 1103 + |io ё 1105 d% ђ 1106 g% ѓ 1107 ie є 1108 ds ѕ 1109 ii і 1110 + |yi ї 1111 j% ј 1112 lj љ 1113 nj њ 1114 ts ћ 1115 kj ќ 1116 + |v% ў 1118 dz џ 1119 Y3 Ѣ 1122 y3 ѣ 1123 O3 Ѫ 1130 o3 ѫ 1131 + |F3 Ѳ 1138 f3 ѳ 1139 V3 Ѵ 1140 v3 ѵ 1141 C3 Ҁ 1152 c3 ҁ 1153 + |G3 Ґ 1168 g3 ґ 1169 A+ ⁧א⁩ 1488 B+ ⁧ב⁩ 1489 G+ ⁧ג⁩ 1490 D+ ⁧ד⁩ 1491 + |H+ ⁧ה⁩ 1492 W+ ⁧ו⁩ 1493 Z+ ⁧ז⁩ 1494 X+ ⁧ח⁩ 1495 Tj ⁧ט⁩ 1496 J+ ⁧י⁩ 1497 + |K% ⁧ך⁩ 1498 K+ ⁧כ⁩ 1499 L+ ⁧ל⁩ 1500 M% ⁧ם⁩ 1501 M+ ⁧מ⁩ 1502 N% ⁧ן⁩ 1503 + |N+ ⁧נ⁩ 1504 S+ ⁧ס⁩ 1505 E+ ⁧ע⁩ 1506 P% ⁧ף⁩ 1507 P+ ⁧פ⁩ 1508 Zj ⁧ץ⁩ 1509 + |ZJ ⁧צ⁩ 1510 Q+ ⁧ק⁩ 1511 R+ ⁧ר⁩ 1512 Sh ⁧ש⁩ 1513 T+ ⁧ת⁩ 1514 ,+ ، 1548 + |;+ ⁧؛⁩ 1563 ?+ ⁧؟⁩ 1567 H' ⁧ء⁩ 1569 aM ⁧آ⁩ 1570 aH ⁧أ⁩ 1571 wH ⁧ؤ⁩ 1572 + |ah ⁧إ⁩ 1573 yH ⁧ئ⁩ 1574 a+ ⁧ا⁩ 1575 b+ ⁧ب⁩ 1576 tm ⁧ة⁩ 1577 t+ ⁧ت⁩ 1578 + |tk ⁧ث⁩ 1579 g+ ⁧ج⁩ 1580 hk ⁧ح⁩ 1581 x+ ⁧خ⁩ 1582 d+ ⁧د⁩ 1583 dk ⁧ذ⁩ 1584 + |r+ ⁧ر⁩ 1585 z+ ⁧ز⁩ 1586 s+ ⁧س⁩ 1587 sn ⁧ش⁩ 1588 c+ ⁧ص⁩ 1589 dd ⁧ض⁩ 1590 + |tj ⁧ط⁩ 1591 zH ⁧ظ⁩ 1592 e+ ⁧ع⁩ 1593 i+ ⁧غ⁩ 1594 ++ ⁧ـ⁩ 1600 f+ ⁧ف⁩ 1601 + |q+ ⁧ق⁩ 1602 k+ ⁧ك⁩ 1603 l+ ⁧ل⁩ 1604 m+ ⁧م⁩ 1605 n+ ⁧ن⁩ 1606 h+ ⁧ه⁩ 1607 + |w+ ⁧و⁩ 1608 j+ ⁧ى⁩ 1609 y+ ⁧ي⁩ 1610 :+ ً 1611 "+ ٌ 1612 =+ ٍ 1613 + |/+ َ 1614 '+ ُ 1615 1+ ِ 1616 3+ ّ 1617 0+ ْ 1618 aS ٰ 1648 + |p+ ⁧پ⁩ 1662 v+ ⁧ڤ⁩ 1700 gf ⁧گ⁩ 1711 0a ۰ 1776 1a ۱ 1777 2a ۲ 1778 + |3a ۳ 1779 4a ۴ 1780 5a ۵ 1781 6a ۶ 1782 7a ۷ 1783 8a ۸ 1784 + |9a ۹ 1785 B. Ḃ 7682 b. ḃ 7683 B_ Ḇ 7686 b_ ḇ 7687 D. Ḋ 7690 + |d. ḋ 7691 D_ Ḏ 7694 d_ ḏ 7695 D, Ḑ 7696 d, ḑ 7697 F. Ḟ 7710 + |f. ḟ 7711 G- Ḡ 7712 g- ḡ 7713 H. Ḣ 7714 h. ḣ 7715 H: Ḧ 7718 + |h: ḧ 7719 H, Ḩ 7720 h, ḩ 7721 K' Ḱ 7728 k' ḱ 7729 K_ Ḵ 7732 + |k_ ḵ 7733 L_ Ḻ 7738 l_ ḻ 7739 M' Ḿ 7742 m' ḿ 7743 M. Ṁ 7744 + |m. ṁ 7745 N. Ṅ 7748 n. ṅ 7749 N_ Ṉ 7752 n_ ṉ 7753 P' Ṕ 7764 + |p' ṕ 7765 P. Ṗ 7766 p. ṗ 7767 R. Ṙ 7768 r. ṙ 7769 R_ Ṟ 7774 + |r_ ṟ 7775 S. Ṡ 7776 s. ṡ 7777 T. Ṫ 7786 t. ṫ 7787 T_ Ṯ 7790 + |t_ ṯ 7791 V? Ṽ 7804 v? ṽ 7805 W! Ẁ 7808 W` Ẁ 7808 w! ẁ 7809 + |w` ẁ 7809 W' Ẃ 7810 w' ẃ 7811 W: Ẅ 7812 w: ẅ 7813 W. Ẇ 7814 + |w. ẇ 7815 X. Ẋ 7818 x. ẋ 7819 X: Ẍ 7820 x: ẍ 7821 Y. Ẏ 7822 + |y. ẏ 7823 Z> Ẑ 7824 z> ẑ 7825 Z_ Ẕ 7828 z_ ẕ 7829 h_ ẖ 7830 + |t: ẗ 7831 w0 ẘ 7832 y0 ẙ 7833 A2 Ả 7842 a2 ả 7843 E2 Ẻ 7866 + |e2 ẻ 7867 E? Ẽ 7868 e? ẽ 7869 I2 Ỉ 7880 i2 ỉ 7881 O2 Ỏ 7886 + |o2 ỏ 7887 U2 Ủ 7910 u2 ủ 7911 Y! Ỳ 7922 Y` Ỳ 7922 y! ỳ 7923 + |y` ỳ 7923 Y2 Ỷ 7926 y2 ỷ 7927 Y? Ỹ 7928 y? ỹ 7929 ;' ἀ 7936 + |,' ἁ 7937 ;! ἂ 7938 ,! ἃ 7939 ?; ἄ 7940 ?, ἅ 7941 !: ἆ 7942 + |?: ἇ 7943 1N   8194 1M   8195 3M   8196 4M   8197 6M   8198 + |1T   8201 1H   8202 -1 ‐ 8208 -N – 8211 -M — 8212 -3 ― 8213 + |!2 ‖ 8214 =2 ‗ 8215 '6 ‘ 8216 '9 ’ 8217 .9 ‚ 8218 9' ‛ 8219 + |"6 “ 8220 "9 ” 8221 :9 „ 8222 9" ‟ 8223 /- † 8224 /= ‡ 8225 + |oo • 8226 .. ‥ 8229 ,. … 8230 %0 ‰ 8240 1' ′ 8242 2' ″ 8243 + |3' ‴ 8244 4' ⁗ 8279 1" ‵ 8245 2" ‶ 8246 3" ‷ 8247 Ca ‸ 8248 + |<1 ‹ 8249 >1 › 8250 :X ※ 8251 '- ‾ 8254 /f ⁄ 8260 0S ⁰ 8304 + |4S ⁴ 8308 5S ⁵ 8309 6S ⁶ 8310 7S ⁷ 8311 8S ⁸ 8312 9S ⁹ 8313 + |+S ⁺ 8314 -S ⁻ 8315 =S ⁼ 8316 (S ⁽ 8317 )S ⁾ 8318 nS ⁿ 8319 + |0s ₀ 8320 1s ₁ 8321 2s ₂ 8322 3s ₃ 8323 4s ₄ 8324 5s ₅ 8325 + |6s ₆ 8326 7s ₇ 8327 8s ₈ 8328 9s ₉ 8329 +s ₊ 8330 -s ₋ 8331 + |=s ₌ 8332 (s ₍ 8333 )s ₎ 8334 Li ₤ 8356 Pt ₧ 8359 W= ₩ 8361 + |=e € 8364 Eu € 8364 =R ₽ 8381 =P ₽ 8381 oC ℃ 8451 co ℅ 8453 + |oF ℉ 8457 N0 № 8470 PO ℗ 8471 Rx ℞ 8478 SM ℠ 8480 TM ™ 8482 + |Om Ω 8486 AO Å 8491 13 ⅓ 8531 23 ⅔ 8532 15 ⅕ 8533 25 ⅖ 8534 + |35 ⅗ 8535 45 ⅘ 8536 16 ⅙ 8537 56 ⅚ 8538 18 ⅛ 8539 38 ⅜ 8540 + |58 ⅝ 8541 78 ⅞ 8542 1R Ⅰ 8544 2R Ⅱ 8545 3R Ⅲ 8546 4R Ⅳ 8547 + |5R Ⅴ 8548 6R Ⅵ 8549 7R Ⅶ 8550 8R Ⅷ 8551 9R Ⅸ 8552 aR Ⅹ 8553 + |bR Ⅺ 8554 cR Ⅻ 8555 1r ⅰ 8560 2r ⅱ 8561 3r ⅲ 8562 4r ⅳ 8563 + |5r ⅴ 8564 6r ⅵ 8565 7r ⅶ 8566 8r ⅷ 8567 9r ⅸ 8568 ar ⅹ 8569 + |br ⅺ 8570 cr ⅻ 8571 <- ← 8592 -! ↑ 8593 -> → 8594 -v ↓ 8595 + |<> ↔ 8596 UD ↕ 8597 <= ⇐ 8656 => ⇒ 8658 == ⇔ 8660 FA ∀ 8704 + |dP ∂ 8706 TE ∃ 8707 /0 ∅ 8709 DE ∆ 8710 NB ∇ 8711 (- ∈ 8712 + |-) ∋ 8715 *P ∏ 8719 +Z ∑ 8721 -2 − 8722 -+ ∓ 8723 *- ∗ 8727 + |Ob ∘ 8728 Sb ∙ 8729 RT √ 8730 0( ∝ 8733 00 ∞ 8734 -L ∟ 8735 + |-V ∠ 8736 PP ∥ 8741 AN ∧ 8743 OR ∨ 8744 (U ∩ 8745 )U ∪ 8746 + |In ∫ 8747 DI ∬ 8748 Io ∮ 8750 .: ∴ 8756 :. ∵ 8757 :R ∶ 8758 + |:: ∷ 8759 ?1 ∼ 8764 CG ∾ 8766 ?- ≃ 8771 ?= ≅ 8773 ?2 ≈ 8776 + |=? ≌ 8780 HI ≓ 8787 != ≠ 8800 =3 ≡ 8801 =< ≤ 8804 >= ≥ 8805 + |<* ≪ 8810 *> ≫ 8811 !< ≮ 8814 !> ≯ 8815 (C ⊂ 8834 )C ⊃ 8835 + |(_ ⊆ 8838 )_ ⊇ 8839 0. ⊙ 8857 02 ⊚ 8858 -T ⊥ 8869 .P ⋅ 8901 + |:3 ⋮ 8942 .3 ⋯ 8943 Eh ⌂ 8962 <7 ⌈ 8968 >7 ⌉ 8969 7< ⌊ 8970 + |7> ⌋ 8971 NI ⌐ 8976 (A ⌒ 8978 TR ⌕ 8981 Iu ⌠ 8992 Il ⌡ 8993 + | 〉 9002 Vs ␣ 9251 1h ⑀ 9280 3h ⑁ 9281 2h ⑂ 9282 + |4h ⑃ 9283 1j ⑆ 9286 2j ⑇ 9287 3j ⑈ 9288 4j ⑉ 9289 1. ⒈ 9352 + |2. ⒉ 9353 3. ⒊ 9354 4. ⒋ 9355 5. ⒌ 9356 6. ⒍ 9357 7. ⒎ 9358 + |8. ⒏ 9359 9. ⒐ 9360 hh ─ 9472 HH ━ 9473 vv │ 9474 VV ┃ 9475 + |3- ┄ 9476 3_ ┅ 9477 3! ┆ 9478 3/ ┇ 9479 4- ┈ 9480 4_ ┉ 9481 + |4! ┊ 9482 4/ ┋ 9483 dr ┌ 9484 dR ┍ 9485 Dr ┎ 9486 DR ┏ 9487 + |dl ┐ 9488 dL ┑ 9489 Dl ┒ 9490 LD ┓ 9491 ur └ 9492 uR ┕ 9493 + |Ur ┖ 9494 UR ┗ 9495 ul ┘ 9496 uL ┙ 9497 Ul ┚ 9498 UL ┛ 9499 + |vr ├ 9500 vR ┝ 9501 Vr ┠ 9504 VR ┣ 9507 vl ┤ 9508 vL ┥ 9509 + |Vl ┨ 9512 VL ┫ 9515 dh ┬ 9516 dH ┯ 9519 Dh ┰ 9520 DH ┳ 9523 + |uh ┴ 9524 uH ┷ 9527 Uh ┸ 9528 UH ┻ 9531 vh ┼ 9532 vH ┿ 9535 + |Vh ╂ 9538 VH ╋ 9547 FD ╱ 9585 BD ╲ 9586 TB ▀ 9600 LB ▄ 9604 + |FB █ 9608 lB ▌ 9612 RB ▐ 9616 .S ░ 9617 :S ▒ 9618 ?S ▓ 9619 + |fS ■ 9632 OS □ 9633 RO ▢ 9634 Rr ▣ 9635 RF ▤ 9636 RY ▥ 9637 + |RH ▦ 9638 RZ ▧ 9639 RK ▨ 9640 RX ▩ 9641 sB ▪ 9642 SR ▬ 9644 + |Or ▭ 9645 UT ▲ 9650 uT △ 9651 PR ▶ 9654 Tr ▷ 9655 Dt ▼ 9660 + |dT ▽ 9661 PL ◀ 9664 Tl ◁ 9665 Db ◆ 9670 Dw ◇ 9671 LZ ◊ 9674 + |0m ○ 9675 0o ◎ 9678 0M ● 9679 0L ◐ 9680 0R ◑ 9681 Sn ◘ 9688 + |Ic ◙ 9689 Fd ◢ 9698 Bd ◣ 9699 *2 ★ 9733 *1 ☆ 9734 H ☞ 9758 0u ☺ 9786 0U ☻ 9787 SU ☼ 9788 Fm ♀ 9792 Ml ♂ 9794 + |cS ♠ 9824 cH ♡ 9825 cD ♢ 9826 cC ♣ 9827 Md ♩ 9833 M8 ♪ 9834 + |M2 ♫ 9835 Mb ♭ 9837 Mx ♮ 9838 MX ♯ 9839 OK ✓ 10003 XX ✗ 10007 + |-X ✠ 10016 IS   12288 ,_ 、 12289 ._ 。 12290 +" 〃 12291 +_ 〄 12292 + |*_ 々 12293 ;_ 〆 12294 0_ 〇 12295 <+ 《 12298 >+ 》 12299 <' 「 12300 + |>' 」 12301 <" 『 12302 >" 』 12303 (" 【 12304 )" 】 12305 =T 〒 12306 + |=_ 〓 12307 (' 〔 12308 )' 〕 12309 (I 〖 12310 )I 〗 12311 -? 〜 12316 + |A5 ぁ 12353 a5 あ 12354 I5 ぃ 12355 i5 い 12356 U5 ぅ 12357 u5 う 12358 + |E5 ぇ 12359 e5 え 12360 O5 ぉ 12361 o5 お 12362 ka か 12363 ga が 12364 + |ki き 12365 gi ぎ 12366 ku く 12367 gu ぐ 12368 ke け 12369 ge げ 12370 + |ko こ 12371 go ご 12372 sa さ 12373 za ざ 12374 si し 12375 zi じ 12376 + |su す 12377 zu ず 12378 se せ 12379 ze ぜ 12380 so そ 12381 zo ぞ 12382 + |ta た 12383 da だ 12384 ti ち 12385 di ぢ 12386 tU っ 12387 tu つ 12388 + |du づ 12389 te て 12390 de で 12391 to と 12392 do ど 12393 na な 12394 + |ni に 12395 nu ぬ 12396 ne ね 12397 no の 12398 ha は 12399 ba ば 12400 + |pa ぱ 12401 hi ひ 12402 bi び 12403 pi ぴ 12404 hu ふ 12405 bu ぶ 12406 + |pu ぷ 12407 he へ 12408 be べ 12409 pe ぺ 12410 ho ほ 12411 bo ぼ 12412 + |po ぽ 12413 ma ま 12414 mi み 12415 mu む 12416 me め 12417 mo も 12418 + |yA ゃ 12419 ya や 12420 yU ゅ 12421 yu ゆ 12422 yO ょ 12423 yo よ 12424 + |ra ら 12425 ri り 12426 ru る 12427 re れ 12428 ro ろ 12429 wA ゎ 12430 + |wa わ 12431 wi ゐ 12432 we ゑ 12433 wo を 12434 n5 ん 12435 vu ゔ 12436 + |"5 ゛ 12443 05 ゜ 12444 *5 ゝ 12445 +5 ゞ 12446 a6 ァ 12449 A6 ア 12450 + |i6 ィ 12451 I6 イ 12452 u6 ゥ 12453 U6 ウ 12454 e6 ェ 12455 E6 エ 12456 + |o6 ォ 12457 O6 オ 12458 Ka カ 12459 Ga ガ 12460 Ki キ 12461 Gi ギ 12462 + |Ku ク 12463 Gu グ 12464 Ke ケ 12465 Ge ゲ 12466 Ko コ 12467 Go ゴ 12468 + |Sa サ 12469 Za ザ 12470 Si シ 12471 Zi ジ 12472 Su ス 12473 Zu ズ 12474 + |Se セ 12475 Ze ゼ 12476 So ソ 12477 Zo ゾ 12478 Ta タ 12479 Da ダ 12480 + |Ti チ 12481 Di ヂ 12482 TU ッ 12483 Tu ツ 12484 Du ヅ 12485 Te テ 12486 + |De デ 12487 To ト 12488 Do ド 12489 Na ナ 12490 Ni ニ 12491 Nu ヌ 12492 + |Ne ネ 12493 No ノ 12494 Ha ハ 12495 Ba バ 12496 Pa パ 12497 Hi ヒ 12498 + |Bi ビ 12499 Pi ピ 12500 Hu フ 12501 Bu ブ 12502 Pu プ 12503 He ヘ 12504 + |Be ベ 12505 Pe ペ 12506 Ho ホ 12507 Bo ボ 12508 Po ポ 12509 Ma マ 12510 + |Mi ミ 12511 Mu ム 12512 Me メ 12513 Mo モ 12514 YA ャ 12515 Ya ヤ 12516 + |YU ュ 12517 Yu ユ 12518 YO ョ 12519 Yo ヨ 12520 Ra ラ 12521 Ri リ 12522 + |Ru ル 12523 Re レ 12524 Ro ロ 12525 WA ヮ 12526 Wa ワ 12527 Wi ヰ 12528 + |We ヱ 12529 Wo ヲ 12530 N6 ン 12531 Vu ヴ 12532 KA ヵ 12533 KE ヶ 12534 + |Va ヷ 12535 Vi ヸ 12536 Ve ヹ 12537 Vo ヺ 12538 .6 ・ 12539 -6 ー 12540 + |*6 ヽ 12541 +6 ヾ 12542 b4 ㄅ 12549 p4 ㄆ 12550 m4 ㄇ 12551 f4 ㄈ 12552 + |d4 ㄉ 12553 t4 ㄊ 12554 n4 ㄋ 12555 l4 ㄌ 12556 g4 ㄍ 12557 k4 ㄎ 12558 + |h4 ㄏ 12559 j4 ㄐ 12560 q4 ㄑ 12561 x4 ㄒ 12562 zh ㄓ 12563 ch ㄔ 12564 + |sh ㄕ 12565 r4 ㄖ 12566 z4 ㄗ 12567 c4 ㄘ 12568 s4 ㄙ 12569 a4 ㄚ 12570 + |o4 ㄛ 12571 e4 ㄜ 12572 ai ㄞ 12574 ei ㄟ 12575 au ㄠ 12576 ou ㄡ 12577 + |an ㄢ 12578 en ㄣ 12579 aN ㄤ 12580 eN ㄥ 12581 er ㄦ 12582 i4 ㄧ 12583 + |u4 ㄨ 12584 iu ㄩ 12585 v4 ㄪ 12586 nG ㄫ 12587 gn ㄬ 12588 1c ㈠ 12832 + |2c ㈡ 12833 3c ㈢ 12834 4c ㈣ 12835 5c ㈤ 12836 6c ㈥ 12837 7c ㈦ 12838 + |8c ㈧ 12839 9c ㈨ 12840 ff ff 64256 fi fi 64257 fl fl 64258 ft ſt 64261 + |st st 64262 (0 ⓪ 9450 (2 ② 9313 (1 ① 9312 + """.trimMargin()) + } + + @Test + fun `test digraph output with headers and custom digraphs`() { + enterCommand("digraphs (0 9450 (2 9313 (1 9312") + assertCommandOutput("digraphs!", + """ + |NU ^@ 10 SH ^A 1 SX ^B 2 EX ^C 3 ET ^D 4 EQ ^E 5 + |AK ^F 6 BL ^G 7 BS ^H 8 HT ^I 9 LF ^J 10 VT ^K 11 + |FF ^L 12 CR ^M 13 SO ^N 14 SI ^O 15 DL ^P 16 D1 ^Q 17 + |D2 ^R 18 D3 ^S 19 D4 ^T 20 NK ^U 21 SY ^V 22 EB ^W 23 + |CN ^X 24 EM ^Y 25 SB ^Z 26 EC ^[ 27 FS ^\ 28 GS ^] 29 + |RS ^^ 30 US ^_ 31 SP 32 Nb # 35 DO $ 36 At @ 64 + |<( [ 91 // \ 92 )> ] 93 '> ^ 94 '! ` 96 (! { 123 + |!! | 124 !) } 125 '? ~ 126 DT ^? 127 PA <80> 128 HO <81> 129 + |BH <82> 130 NH <83> 131 IN <84> 132 NL <85> 133 SA <86> 134 ES <87> 135 + |HS <88> 136 HJ <89> 137 VS <8a> 138 PD <8b> 139 PU <8c> 140 RI <8d> 141 + |S2 <8e> 142 S3 <8f> 143 DC <90> 144 P1 <91> 145 P2 <92> 146 TS <93> 147 + |CC <94> 148 MW <95> 149 SG <96> 150 EG <97> 151 SS <98> 152 GC <99> 153 + |SC <9a> 154 CI <9b> 155 ST <9c> 156 OC <9d> 157 PM <9e> 158 AC <9f> 159 + |NS   160 + |Latin supplement + |!I ¡ 161 ~! ¡ 161 Ct ¢ 162 c| ¢ 162 Pd £ 163 $$ £ 163 + |Cu ¤ 164 ox ¤ 164 Ye ¥ 165 Y- ¥ 165 BB ¦ 166 || ¦ 166 + |SE § 167 ': ¨ 168 Co © 169 cO © 169 -a ª 170 << « 171 + |NO ¬ 172 -, ¬ 172 -- 173 Rg ® 174 'm ¯ 175 -= ¯ 175 + |DG ° 176 ~o ° 176 +- ± 177 2S ² 178 22 ² 178 3S ³ 179 + |33 ³ 179 '' ´ 180 My µ 181 PI ¶ 182 pp ¶ 182 .M · 183 + |~. · 183 ', ¸ 184 1S ¹ 185 11 ¹ 185 -o º 186 >> » 187 + |14 ¼ 188 12 ½ 189 34 ¾ 190 ?I ¿ 191 ~? ¿ 191 A! À 192 + |A` À 192 A' Á 193 A>  194 A^  194 A? à 195 A~ à 195 + |A: Ä 196 A" Ä 196 AA Å 197 A@ Å 197 AE Æ 198 C, Ç 199 + |E! È 200 E` È 200 E' É 201 E> Ê 202 E^ Ê 202 E: Ë 203 + |E" Ë 203 I! Ì 204 I` Ì 204 I' Í 205 I> Î 206 I^ Î 206 + |I: Ï 207 I" Ï 207 D- Ð 208 N? Ñ 209 N~ Ñ 209 O! Ò 210 + |O` Ò 210 O' Ó 211 O> Ô 212 O^ Ô 212 O? Õ 213 O~ Õ 213 + |O: Ö 214 *X × 215 /\ × 215 O/ Ø 216 U! Ù 217 U` Ù 217 + |U' Ú 218 U> Û 219 U^ Û 219 U: Ü 220 Y' Ý 221 TH Þ 222 + |Ip Þ 222 ss ß 223 a! à 224 a` à 224 a' á 225 a> â 226 + |a^ â 226 a? ã 227 a~ ã 227 a: ä 228 a" ä 228 aa å 229 + |a@ å 229 ae æ 230 c, ç 231 e! è 232 e` è 232 e' é 233 + |e> ê 234 e^ ê 234 e: ë 235 e" ë 235 i! ì 236 i` ì 236 + |i' í 237 i> î 238 i^ î 238 i: ï 239 d- ð 240 n? ñ 241 + |n~ ñ 241 o! ò 242 o` ò 242 o' ó 243 o> ô 244 o^ ô 244 + |o? õ 245 o~ õ 245 o: ö 246 -: ÷ 247 o/ ø 248 u! ù 249 + |u` ù 249 u' ú 250 u> û 251 u^ û 251 u: ü 252 y' ý 253 + |th þ 254 y: ÿ 255 y" ÿ 255 A- Ā 256 a- ā 257 A( Ă 258 + |a( ă 259 A; Ą 260 a; ą 261 C' Ć 262 c' ć 263 C> Ĉ 264 + |c> ĉ 265 C. Ċ 266 c. ċ 267 C< Č 268 c< č 269 D< Ď 270 + |d< ď 271 D/ Đ 272 d/ đ 273 E- Ē 274 e- ē 275 E( Ĕ 276 + |e( ĕ 277 E. Ė 278 e. ė 279 E; Ę 280 e; ę 281 E< Ě 282 + |e< ě 283 G> Ĝ 284 g> ĝ 285 G( Ğ 286 g( ğ 287 G. Ġ 288 + |g. ġ 289 G, Ģ 290 g, ģ 291 H> Ĥ 292 h> ĥ 293 H/ Ħ 294 + |h/ ħ 295 I? Ĩ 296 i? ĩ 297 I- Ī 298 i- ī 299 I( Ĭ 300 + |i( ĭ 301 I; Į 302 i; į 303 I. İ 304 i. ı 305 IJ IJ 306 + |ij ij 307 J> Ĵ 308 j> ĵ 309 K, Ķ 310 k, ķ 311 kk ĸ 312 + |L' Ĺ 313 l' ĺ 314 L, Ļ 315 l, ļ 316 L< Ľ 317 l< ľ 318 + |L. Ŀ 319 l. ŀ 320 L/ Ł 321 l/ ł 322 N' Ń 323 n' ń 324 + |N, Ņ 325 n, ņ 326 N< Ň 327 n< ň 328 'n ʼn 329 NG Ŋ 330 + |ng ŋ 331 O- Ō 332 o- ō 333 O( Ŏ 334 o( ŏ 335 O" Ő 336 + |o" ő 337 OE Œ 338 oe œ 339 R' Ŕ 340 r' ŕ 341 R, Ŗ 342 + |r, ŗ 343 R< Ř 344 r< ř 345 S' Ś 346 s' ś 347 S> Ŝ 348 + |s> ŝ 349 S, Ş 350 s, ş 351 S< Š 352 s< š 353 T, Ţ 354 + |t, ţ 355 T< Ť 356 t< ť 357 T/ Ŧ 358 t/ ŧ 359 U? Ũ 360 + |u? ũ 361 U- Ū 362 u- ū 363 U( Ŭ 364 u( ŭ 365 U0 Ů 366 + |u0 ů 367 U" Ű 368 u" ű 369 U; Ų 370 u; ų 371 W> Ŵ 372 + |w> ŵ 373 Y> Ŷ 374 y> ŷ 375 Y: Ÿ 376 Z' Ź 377 z' ź 378 + |Z. Ż 379 z. ż 380 Z< Ž 381 z< ž 382 O9 Ơ 416 o9 ơ 417 + |OI Ƣ 418 oi ƣ 419 yr Ʀ 422 U9 Ư 431 u9 ư 432 Z/ Ƶ 437 + |z/ ƶ 438 ED Ʒ 439 A< Ǎ 461 a< ǎ 462 I< Ǐ 463 i< ǐ 464 + |O< Ǒ 465 o< ǒ 466 U< Ǔ 467 u< ǔ 468 A1 Ǟ 478 a1 ǟ 479 + |A7 Ǡ 480 a7 ǡ 481 A3 Ǣ 482 a3 ǣ 483 G/ Ǥ 484 g/ ǥ 485 + |G< Ǧ 486 g< ǧ 487 K< Ǩ 488 k< ǩ 489 O; Ǫ 490 o; ǫ 491 + |O1 Ǭ 492 o1 ǭ 493 EZ Ǯ 494 ez ǯ 495 j< ǰ 496 G' Ǵ 500 + |g' ǵ 501 ;S ʿ 703 '< ˇ 711 '( ˘ 728 '. ˙ 729 '0 ˚ 730 + |'; ˛ 731 '" ˝ 733 + |Greek and Coptic + |A% Ά 902 E% Έ 904 Y% Ή 905 I% Ί 906 O% Ό 908 U% Ύ 910 + |W% Ώ 911 i3 ΐ 912 A* Α 913 B* Β 914 G* Γ 915 D* Δ 916 + |E* Ε 917 Z* Ζ 918 Y* Η 919 H* Θ 920 I* Ι 921 K* Κ 922 + |L* Λ 923 M* Μ 924 N* Ν 925 C* Ξ 926 O* Ο 927 P* Π 928 + |R* Ρ 929 S* Σ 931 T* Τ 932 U* Υ 933 F* Φ 934 X* Χ 935 + |Q* Ψ 936 W* Ω 937 J* Ϊ 938 V* Ϋ 939 a% ά 940 e% έ 941 + |y% ή 942 i% ί 943 u3 ΰ 944 a* α 945 b* β 946 g* γ 947 + |d* δ 948 e* ε 949 z* ζ 950 y* η 951 h* θ 952 i* ι 953 + |k* κ 954 l* λ 955 m* μ 956 n* ν 957 c* ξ 958 o* ο 959 + |p* π 960 r* ρ 961 *s ς 962 s* σ 963 t* τ 964 u* υ 965 + |f* φ 966 x* χ 967 q* ψ 968 w* ω 969 j* ϊ 970 v* ϋ 971 + |o% ό 972 u% ύ 973 w% ώ 974 'G Ϙ 984 ,G ϙ 985 T3 Ϛ 986 + |t3 ϛ 987 M3 Ϝ 988 m3 ϝ 989 K3 Ϟ 990 k3 ϟ 991 P3 Ϡ 992 + |p3 ϡ 993 '% ϴ 1012 j3 ϵ 1013 + |Cyrillic + |IO Ё 1025 D% Ђ 1026 G% Ѓ 1027 IE Є 1028 DS Ѕ 1029 II І 1030 + |YI Ї 1031 J% Ј 1032 LJ Љ 1033 NJ Њ 1034 Ts Ћ 1035 KJ Ќ 1036 + |V% Ў 1038 DZ Џ 1039 A= А 1040 B= Б 1041 V= В 1042 G= Г 1043 + |D= Д 1044 E= Е 1045 Z% Ж 1046 Z= З 1047 I= И 1048 J= Й 1049 + |K= К 1050 L= Л 1051 M= М 1052 N= Н 1053 O= О 1054 P= П 1055 + |R= Р 1056 S= С 1057 T= Т 1058 U= У 1059 F= Ф 1060 H= Х 1061 + |C= Ц 1062 C% Ч 1063 S% Ш 1064 Sc Щ 1065 =" Ъ 1066 Y= Ы 1067 + |%" Ь 1068 JE Э 1069 JU Ю 1070 JA Я 1071 a= а 1072 b= б 1073 + |v= в 1074 g= г 1075 d= д 1076 e= е 1077 z% ж 1078 z= з 1079 + |i= и 1080 j= й 1081 k= к 1082 l= л 1083 m= м 1084 n= н 1085 + |o= о 1086 p= п 1087 r= р 1088 s= с 1089 t= т 1090 u= у 1091 + |f= ф 1092 h= х 1093 c= ц 1094 c% ч 1095 s% ш 1096 sc щ 1097 + |=' ъ 1098 y= ы 1099 %' ь 1100 je э 1101 ju ю 1102 ja я 1103 + |io ё 1105 d% ђ 1106 g% ѓ 1107 ie є 1108 ds ѕ 1109 ii і 1110 + |yi ї 1111 j% ј 1112 lj љ 1113 nj њ 1114 ts ћ 1115 kj ќ 1116 + |v% ў 1118 dz џ 1119 Y3 Ѣ 1122 y3 ѣ 1123 O3 Ѫ 1130 o3 ѫ 1131 + |F3 Ѳ 1138 f3 ѳ 1139 V3 Ѵ 1140 v3 ѵ 1141 C3 Ҁ 1152 c3 ҁ 1153 + |G3 Ґ 1168 g3 ґ 1169 + |Hebrew + |A+ ⁧א⁩ 1488 B+ ⁧ב⁩ 1489 G+ ⁧ג⁩ 1490 D+ ⁧ד⁩ 1491 H+ ⁧ה⁩ 1492 W+ ⁧ו⁩ 1493 + |Z+ ⁧ז⁩ 1494 X+ ⁧ח⁩ 1495 Tj ⁧ט⁩ 1496 J+ ⁧י⁩ 1497 K% ⁧ך⁩ 1498 K+ ⁧כ⁩ 1499 + |L+ ⁧ל⁩ 1500 M% ⁧ם⁩ 1501 M+ ⁧מ⁩ 1502 N% ⁧ן⁩ 1503 N+ ⁧נ⁩ 1504 S+ ⁧ס⁩ 1505 + |E+ ⁧ע⁩ 1506 P% ⁧ף⁩ 1507 P+ ⁧פ⁩ 1508 Zj ⁧ץ⁩ 1509 ZJ ⁧צ⁩ 1510 Q+ ⁧ק⁩ 1511 + |R+ ⁧ר⁩ 1512 Sh ⁧ש⁩ 1513 T+ ⁧ת⁩ 1514 + |Arabic + |,+ ، 1548 ;+ ⁧؛⁩ 1563 ?+ ⁧؟⁩ 1567 H' ⁧ء⁩ 1569 aM ⁧آ⁩ 1570 aH ⁧أ⁩ 1571 + |wH ⁧ؤ⁩ 1572 ah ⁧إ⁩ 1573 yH ⁧ئ⁩ 1574 a+ ⁧ا⁩ 1575 b+ ⁧ب⁩ 1576 tm ⁧ة⁩ 1577 + |t+ ⁧ت⁩ 1578 tk ⁧ث⁩ 1579 g+ ⁧ج⁩ 1580 hk ⁧ح⁩ 1581 x+ ⁧خ⁩ 1582 d+ ⁧د⁩ 1583 + |dk ⁧ذ⁩ 1584 r+ ⁧ر⁩ 1585 z+ ⁧ز⁩ 1586 s+ ⁧س⁩ 1587 sn ⁧ش⁩ 1588 c+ ⁧ص⁩ 1589 + |dd ⁧ض⁩ 1590 tj ⁧ط⁩ 1591 zH ⁧ظ⁩ 1592 e+ ⁧ع⁩ 1593 i+ ⁧غ⁩ 1594 ++ ⁧ـ⁩ 1600 + |f+ ⁧ف⁩ 1601 q+ ⁧ق⁩ 1602 k+ ⁧ك⁩ 1603 l+ ⁧ل⁩ 1604 m+ ⁧م⁩ 1605 n+ ⁧ن⁩ 1606 + |h+ ⁧ه⁩ 1607 w+ ⁧و⁩ 1608 j+ ⁧ى⁩ 1609 y+ ⁧ي⁩ 1610 :+ ً 1611 "+ ٌ 1612 + |=+ ٍ 1613 /+ َ 1614 '+ ُ 1615 1+ ِ 1616 3+ ّ 1617 0+ ْ 1618 + |aS ٰ 1648 p+ ⁧پ⁩ 1662 v+ ⁧ڤ⁩ 1700 gf ⁧گ⁩ 1711 0a ۰ 1776 1a ۱ 1777 + |2a ۲ 1778 3a ۳ 1779 4a ۴ 1780 5a ۵ 1781 6a ۶ 1782 7a ۷ 1783 + |8a ۸ 1784 9a ۹ 1785 + |Latin extended + |B. Ḃ 7682 b. ḃ 7683 B_ Ḇ 7686 b_ ḇ 7687 D. Ḋ 7690 d. ḋ 7691 + |D_ Ḏ 7694 d_ ḏ 7695 D, Ḑ 7696 d, ḑ 7697 F. Ḟ 7710 f. ḟ 7711 + |G- Ḡ 7712 g- ḡ 7713 H. Ḣ 7714 h. ḣ 7715 H: Ḧ 7718 h: ḧ 7719 + |H, Ḩ 7720 h, ḩ 7721 K' Ḱ 7728 k' ḱ 7729 K_ Ḵ 7732 k_ ḵ 7733 + |L_ Ḻ 7738 l_ ḻ 7739 M' Ḿ 7742 m' ḿ 7743 M. Ṁ 7744 m. ṁ 7745 + |N. Ṅ 7748 n. ṅ 7749 N_ Ṉ 7752 n_ ṉ 7753 P' Ṕ 7764 p' ṕ 7765 + |P. Ṗ 7766 p. ṗ 7767 R. Ṙ 7768 r. ṙ 7769 R_ Ṟ 7774 r_ ṟ 7775 + |S. Ṡ 7776 s. ṡ 7777 T. Ṫ 7786 t. ṫ 7787 T_ Ṯ 7790 t_ ṯ 7791 + |V? Ṽ 7804 v? ṽ 7805 W! Ẁ 7808 W` Ẁ 7808 w! ẁ 7809 w` ẁ 7809 + |W' Ẃ 7810 w' ẃ 7811 W: Ẅ 7812 w: ẅ 7813 W. Ẇ 7814 w. ẇ 7815 + |X. Ẋ 7818 x. ẋ 7819 X: Ẍ 7820 x: ẍ 7821 Y. Ẏ 7822 y. ẏ 7823 + |Z> Ẑ 7824 z> ẑ 7825 Z_ Ẕ 7828 z_ ẕ 7829 h_ ẖ 7830 t: ẗ 7831 + |w0 ẘ 7832 y0 ẙ 7833 A2 Ả 7842 a2 ả 7843 E2 Ẻ 7866 e2 ẻ 7867 + |E? Ẽ 7868 e? ẽ 7869 I2 Ỉ 7880 i2 ỉ 7881 O2 Ỏ 7886 o2 ỏ 7887 + |U2 Ủ 7910 u2 ủ 7911 Y! Ỳ 7922 Y` Ỳ 7922 y! ỳ 7923 y` ỳ 7923 + |Y2 Ỷ 7926 y2 ỷ 7927 Y? Ỹ 7928 y? ỹ 7929 + |Greek extended + |;' ἀ 7936 ,' ἁ 7937 ;! ἂ 7938 ,! ἃ 7939 ?; ἄ 7940 ?, ἅ 7941 + |!: ἆ 7942 ?: ἇ 7943 + |Punctuation + |1N   8194 1M   8195 3M   8196 4M   8197 6M   8198 1T   8201 + |1H   8202 -1 ‐ 8208 -N – 8211 -M — 8212 -3 ― 8213 !2 ‖ 8214 + |=2 ‗ 8215 '6 ‘ 8216 '9 ’ 8217 .9 ‚ 8218 9' ‛ 8219 "6 “ 8220 + |"9 ” 8221 :9 „ 8222 9" ‟ 8223 /- † 8224 /= ‡ 8225 oo • 8226 + |.. ‥ 8229 ,. … 8230 %0 ‰ 8240 1' ′ 8242 2' ″ 8243 3' ‴ 8244 + |4' ⁗ 8279 1" ‵ 8245 2" ‶ 8246 3" ‷ 8247 Ca ‸ 8248 <1 ‹ 8249 + |>1 › 8250 :X ※ 8251 '- ‾ 8254 /f ⁄ 8260 + |Super- and subscripts + |0S ⁰ 8304 4S ⁴ 8308 5S ⁵ 8309 6S ⁶ 8310 7S ⁷ 8311 8S ⁸ 8312 + |9S ⁹ 8313 +S ⁺ 8314 -S ⁻ 8315 =S ⁼ 8316 (S ⁽ 8317 )S ⁾ 8318 + |nS ⁿ 8319 0s ₀ 8320 1s ₁ 8321 2s ₂ 8322 3s ₃ 8323 4s ₄ 8324 + |5s ₅ 8325 6s ₆ 8326 7s ₇ 8327 8s ₈ 8328 9s ₉ 8329 +s ₊ 8330 + |-s ₋ 8331 =s ₌ 8332 (s ₍ 8333 )s ₎ 8334 + |Currency + |Li ₤ 8356 Pt ₧ 8359 W= ₩ 8361 =e € 8364 Eu € 8364 =R ₽ 8381 + |=P ₽ 8381 + |Other + |oC ℃ 8451 co ℅ 8453 oF ℉ 8457 N0 № 8470 PO ℗ 8471 Rx ℞ 8478 + |SM ℠ 8480 TM ™ 8482 Om Ω 8486 AO Å 8491 13 ⅓ 8531 23 ⅔ 8532 + |15 ⅕ 8533 25 ⅖ 8534 35 ⅗ 8535 45 ⅘ 8536 16 ⅙ 8537 56 ⅚ 8538 + |18 ⅛ 8539 38 ⅜ 8540 58 ⅝ 8541 78 ⅞ 8542 + |Roman numbers + |1R Ⅰ 8544 2R Ⅱ 8545 3R Ⅲ 8546 4R Ⅳ 8547 5R Ⅴ 8548 6R Ⅵ 8549 + |7R Ⅶ 8550 8R Ⅷ 8551 9R Ⅸ 8552 aR Ⅹ 8553 bR Ⅺ 8554 cR Ⅻ 8555 + |1r ⅰ 8560 2r ⅱ 8561 3r ⅲ 8562 4r ⅳ 8563 5r ⅴ 8564 6r ⅵ 8565 + |7r ⅶ 8566 8r ⅷ 8567 9r ⅸ 8568 ar ⅹ 8569 br ⅺ 8570 cr ⅻ 8571 + |Arrows + |<- ← 8592 -! ↑ 8593 -> → 8594 -v ↓ 8595 <> ↔ 8596 UD ↕ 8597 + |<= ⇐ 8656 => ⇒ 8658 == ⇔ 8660 + |Mathematical operators + |FA ∀ 8704 dP ∂ 8706 TE ∃ 8707 /0 ∅ 8709 DE ∆ 8710 NB ∇ 8711 + |(- ∈ 8712 -) ∋ 8715 *P ∏ 8719 +Z ∑ 8721 -2 − 8722 -+ ∓ 8723 + |*- ∗ 8727 Ob ∘ 8728 Sb ∙ 8729 RT √ 8730 0( ∝ 8733 00 ∞ 8734 + |-L ∟ 8735 -V ∠ 8736 PP ∥ 8741 AN ∧ 8743 OR ∨ 8744 (U ∩ 8745 + |)U ∪ 8746 In ∫ 8747 DI ∬ 8748 Io ∮ 8750 .: ∴ 8756 :. ∵ 8757 + |:R ∶ 8758 :: ∷ 8759 ?1 ∼ 8764 CG ∾ 8766 ?- ≃ 8771 ?= ≅ 8773 + |?2 ≈ 8776 =? ≌ 8780 HI ≓ 8787 != ≠ 8800 =3 ≡ 8801 =< ≤ 8804 + |>= ≥ 8805 <* ≪ 8810 *> ≫ 8811 !< ≮ 8814 !> ≯ 8815 (C ⊂ 8834 + |)C ⊃ 8835 (_ ⊆ 8838 )_ ⊇ 8839 0. ⊙ 8857 02 ⊚ 8858 -T ⊥ 8869 + |.P ⋅ 8901 :3 ⋮ 8942 .3 ⋯ 8943 + |Technical + |Eh ⌂ 8962 <7 ⌈ 8968 >7 ⌉ 8969 7< ⌊ 8970 7> ⌋ 8971 NI ⌐ 8976 + |(A ⌒ 8978 TR ⌕ 8981 Iu ⌠ 8992 Il ⌡ 8993 〉 9002 + |Other + |Vs ␣ 9251 1h ⑀ 9280 3h ⑁ 9281 2h ⑂ 9282 4h ⑃ 9283 1j ⑆ 9286 + |2j ⑇ 9287 3j ⑈ 9288 4j ⑉ 9289 1. ⒈ 9352 2. ⒉ 9353 3. ⒊ 9354 + |4. ⒋ 9355 5. ⒌ 9356 6. ⒍ 9357 7. ⒎ 9358 8. ⒏ 9359 9. ⒐ 9360 + |Box drawing + |hh ─ 9472 HH ━ 9473 vv │ 9474 VV ┃ 9475 3- ┄ 9476 3_ ┅ 9477 + |3! ┆ 9478 3/ ┇ 9479 4- ┈ 9480 4_ ┉ 9481 4! ┊ 9482 4/ ┋ 9483 + |dr ┌ 9484 dR ┍ 9485 Dr ┎ 9486 DR ┏ 9487 dl ┐ 9488 dL ┑ 9489 + |Dl ┒ 9490 LD ┓ 9491 ur └ 9492 uR ┕ 9493 Ur ┖ 9494 UR ┗ 9495 + |ul ┘ 9496 uL ┙ 9497 Ul ┚ 9498 UL ┛ 9499 vr ├ 9500 vR ┝ 9501 + |Vr ┠ 9504 VR ┣ 9507 vl ┤ 9508 vL ┥ 9509 Vl ┨ 9512 VL ┫ 9515 + |dh ┬ 9516 dH ┯ 9519 Dh ┰ 9520 DH ┳ 9523 uh ┴ 9524 uH ┷ 9527 + |Uh ┸ 9528 UH ┻ 9531 vh ┼ 9532 vH ┿ 9535 Vh ╂ 9538 VH ╋ 9547 + |FD ╱ 9585 BD ╲ 9586 + |Block elements + |TB ▀ 9600 LB ▄ 9604 FB █ 9608 lB ▌ 9612 RB ▐ 9616 .S ░ 9617 + |:S ▒ 9618 ?S ▓ 9619 + |Geometric shapes + |fS ■ 9632 OS □ 9633 RO ▢ 9634 Rr ▣ 9635 RF ▤ 9636 RY ▥ 9637 + |RH ▦ 9638 RZ ▧ 9639 RK ▨ 9640 RX ▩ 9641 sB ▪ 9642 SR ▬ 9644 + |Or ▭ 9645 UT ▲ 9650 uT △ 9651 PR ▶ 9654 Tr ▷ 9655 Dt ▼ 9660 + |dT ▽ 9661 PL ◀ 9664 Tl ◁ 9665 Db ◆ 9670 Dw ◇ 9671 LZ ◊ 9674 + |0m ○ 9675 0o ◎ 9678 0M ● 9679 0L ◐ 9680 0R ◑ 9681 Sn ◘ 9688 + |Ic ◙ 9689 Fd ◢ 9698 Bd ◣ 9699 + |Symbols + |*2 ★ 9733 *1 ☆ 9734 H ☞ 9758 0u ☺ 9786 0U ☻ 9787 + |SU ☼ 9788 Fm ♀ 9792 Ml ♂ 9794 cS ♠ 9824 cH ♡ 9825 cD ♢ 9826 + |cC ♣ 9827 Md ♩ 9833 M8 ♪ 9834 M2 ♫ 9835 Mb ♭ 9837 Mx ♮ 9838 + |MX ♯ 9839 + |Dingbats + |OK ✓ 10003 XX ✗ 10007 -X ✠ 10016 + |CJK symbols and punctuation + |IS   12288 ,_ 、 12289 ._ 。 12290 +" 〃 12291 +_ 〄 12292 *_ 々 12293 + |;_ 〆 12294 0_ 〇 12295 <+ 《 12298 >+ 》 12299 <' 「 12300 >' 」 12301 + |<" 『 12302 >" 』 12303 (" 【 12304 )" 】 12305 =T 〒 12306 =_ 〓 12307 + |(' 〔 12308 )' 〕 12309 (I 〖 12310 )I 〗 12311 -? 〜 12316 + |Hiragana + |A5 ぁ 12353 a5 あ 12354 I5 ぃ 12355 i5 い 12356 U5 ぅ 12357 u5 う 12358 + |E5 ぇ 12359 e5 え 12360 O5 ぉ 12361 o5 お 12362 ka か 12363 ga が 12364 + |ki き 12365 gi ぎ 12366 ku く 12367 gu ぐ 12368 ke け 12369 ge げ 12370 + |ko こ 12371 go ご 12372 sa さ 12373 za ざ 12374 si し 12375 zi じ 12376 + |su す 12377 zu ず 12378 se せ 12379 ze ぜ 12380 so そ 12381 zo ぞ 12382 + |ta た 12383 da だ 12384 ti ち 12385 di ぢ 12386 tU っ 12387 tu つ 12388 + |du づ 12389 te て 12390 de で 12391 to と 12392 do ど 12393 na な 12394 + |ni に 12395 nu ぬ 12396 ne ね 12397 no の 12398 ha は 12399 ba ば 12400 + |pa ぱ 12401 hi ひ 12402 bi び 12403 pi ぴ 12404 hu ふ 12405 bu ぶ 12406 + |pu ぷ 12407 he へ 12408 be べ 12409 pe ぺ 12410 ho ほ 12411 bo ぼ 12412 + |po ぽ 12413 ma ま 12414 mi み 12415 mu む 12416 me め 12417 mo も 12418 + |yA ゃ 12419 ya や 12420 yU ゅ 12421 yu ゆ 12422 yO ょ 12423 yo よ 12424 + |ra ら 12425 ri り 12426 ru る 12427 re れ 12428 ro ろ 12429 wA ゎ 12430 + |wa わ 12431 wi ゐ 12432 we ゑ 12433 wo を 12434 n5 ん 12435 vu ゔ 12436 + |"5 ゛ 12443 05 ゜ 12444 *5 ゝ 12445 +5 ゞ 12446 + |Katakana + |a6 ァ 12449 A6 ア 12450 i6 ィ 12451 I6 イ 12452 u6 ゥ 12453 U6 ウ 12454 + |e6 ェ 12455 E6 エ 12456 o6 ォ 12457 O6 オ 12458 Ka カ 12459 Ga ガ 12460 + |Ki キ 12461 Gi ギ 12462 Ku ク 12463 Gu グ 12464 Ke ケ 12465 Ge ゲ 12466 + |Ko コ 12467 Go ゴ 12468 Sa サ 12469 Za ザ 12470 Si シ 12471 Zi ジ 12472 + |Su ス 12473 Zu ズ 12474 Se セ 12475 Ze ゼ 12476 So ソ 12477 Zo ゾ 12478 + |Ta タ 12479 Da ダ 12480 Ti チ 12481 Di ヂ 12482 TU ッ 12483 Tu ツ 12484 + |Du ヅ 12485 Te テ 12486 De デ 12487 To ト 12488 Do ド 12489 Na ナ 12490 + |Ni ニ 12491 Nu ヌ 12492 Ne ネ 12493 No ノ 12494 Ha ハ 12495 Ba バ 12496 + |Pa パ 12497 Hi ヒ 12498 Bi ビ 12499 Pi ピ 12500 Hu フ 12501 Bu ブ 12502 + |Pu プ 12503 He ヘ 12504 Be ベ 12505 Pe ペ 12506 Ho ホ 12507 Bo ボ 12508 + |Po ポ 12509 Ma マ 12510 Mi ミ 12511 Mu ム 12512 Me メ 12513 Mo モ 12514 + |YA ャ 12515 Ya ヤ 12516 YU ュ 12517 Yu ユ 12518 YO ョ 12519 Yo ヨ 12520 + |Ra ラ 12521 Ri リ 12522 Ru ル 12523 Re レ 12524 Ro ロ 12525 WA ヮ 12526 + |Wa ワ 12527 Wi ヰ 12528 We ヱ 12529 Wo ヲ 12530 N6 ン 12531 Vu ヴ 12532 + |KA ヵ 12533 KE ヶ 12534 Va ヷ 12535 Vi ヸ 12536 Ve ヹ 12537 Vo ヺ 12538 + |.6 ・ 12539 -6 ー 12540 *6 ヽ 12541 +6 ヾ 12542 + |Bopomofo + |b4 ㄅ 12549 p4 ㄆ 12550 m4 ㄇ 12551 f4 ㄈ 12552 d4 ㄉ 12553 t4 ㄊ 12554 + |n4 ㄋ 12555 l4 ㄌ 12556 g4 ㄍ 12557 k4 ㄎ 12558 h4 ㄏ 12559 j4 ㄐ 12560 + |q4 ㄑ 12561 x4 ㄒ 12562 zh ㄓ 12563 ch ㄔ 12564 sh ㄕ 12565 r4 ㄖ 12566 + |z4 ㄗ 12567 c4 ㄘ 12568 s4 ㄙ 12569 a4 ㄚ 12570 o4 ㄛ 12571 e4 ㄜ 12572 + |ai ㄞ 12574 ei ㄟ 12575 au ㄠ 12576 ou ㄡ 12577 an ㄢ 12578 en ㄣ 12579 + |aN ㄤ 12580 eN ㄥ 12581 er ㄦ 12582 i4 ㄧ 12583 u4 ㄨ 12584 iu ㄩ 12585 + |v4 ㄪ 12586 nG ㄫ 12587 gn ㄬ 12588 + |Other + |1c ㈠ 12832 2c ㈡ 12833 3c ㈢ 12834 4c ㈣ 12835 5c ㈤ 12836 6c ㈥ 12837 + |7c ㈦ 12838 8c ㈧ 12839 9c ㈨ 12840 ff ff 64256 fi fi 64257 fl fl 64258 + |ft ſt 64261 st st 64262 + |Custom + |(0 ⓪ 9450 (2 ② 9313 (1 ① 9312 + """.trimMargin()) + } } diff --git a/src/test/java/org/jetbrains/plugins/ideavim/option/DigraphTest.kt b/src/test/java/org/jetbrains/plugins/ideavim/option/DigraphTest.kt index 0e86c5efda..ac63aa0e37 100644 --- a/src/test/java/org/jetbrains/plugins/ideavim/option/DigraphTest.kt +++ b/src/test/java/org/jetbrains/plugins/ideavim/option/DigraphTest.kt @@ -40,12 +40,40 @@ class DigraphTest : VimTestCase() { Sed in orci mauris. Cras id tellus in ex imperdiet egestas. """.trimIndent(), -Mode.INSERT, + Mode.INSERT, ) { enterCommand("set digraph") } } + @TestWithoutNeovim(SkipNeovimReason.UNCLEAR, "backspace works strange") + @Test + fun `test digraph with custom digraph`() { + doTest( + "i (0", + """ + Lorem Ipsum + + I found it$c in a legendary land + consectetur adipiscing elit + Sed in orci mauris. + Cras id tellus in ex imperdiet egestas. + """.trimIndent(), + """ + Lorem Ipsum + + I found it ⓪$c in a legendary land + consectetur adipiscing elit + Sed in orci mauris. + Cras id tellus in ex imperdiet egestas. + """.trimIndent(), + Mode.INSERT, + ) { + enterCommand("digraph (0 9450") + enterCommand("set digraph") + } + } + @TestWithoutNeovim(SkipNeovimReason.UNCLEAR, "backspace works strange") @Test fun `test digraph stops`() { @@ -67,7 +95,7 @@ Mode.INSERT, Sed in orci mauris. Cras id tellus in ex imperdiet egestas. """.trimIndent(), -Mode.INSERT, + Mode.INSERT, ) { enterCommand("set digraph") } @@ -94,7 +122,7 @@ Mode.INSERT, Sed in orci mauris. Cras id tellus in ex imperdiet egestas. """.trimIndent(), -Mode.INSERT, + Mode.INSERT, ) { enterCommand("set digraph") } @@ -121,7 +149,7 @@ Mode.INSERT, Sed in orci mauris. Cras id tellus in ex imperdiet egestas. """.trimIndent(), -Mode.INSERT, + Mode.INSERT, ) { enterCommand("set digraph") } diff --git a/src/testFixtures/kotlin/org/jetbrains/plugins/ideavim/VimTestCase.kt b/src/testFixtures/kotlin/org/jetbrains/plugins/ideavim/VimTestCase.kt index 186c7ff161..c8abb9855a 100644 --- a/src/testFixtures/kotlin/org/jetbrains/plugins/ideavim/VimTestCase.kt +++ b/src/testFixtures/kotlin/org/jetbrains/plugins/ideavim/VimTestCase.kt @@ -51,6 +51,7 @@ import com.maddyhome.idea.vim.action.VimShortcutKeyAction import com.maddyhome.idea.vim.api.EffectiveOptions import com.maddyhome.idea.vim.api.GlobalOptions import com.maddyhome.idea.vim.api.Options +import com.maddyhome.idea.vim.api.VimDigraphGroupBase import com.maddyhome.idea.vim.api.VimOptionGroup import com.maddyhome.idea.vim.api.globalOptions import com.maddyhome.idea.vim.api.injector @@ -223,6 +224,7 @@ abstract class VimTestCase { assertTrue(KeyHandler.getInstance().keyStack.isEmpty()) injector.outputPanel.getCurrentOutputPanel()?.close() injector.modalInput.getCurrentModalInput()?.deactivate(refocusOwningEditor = false, resetCaret = false) + (injector.digraphGroup as VimDigraphGroupBase).clearCustomDigraphs() // Tear down neovim NeovimTesting.tearDown(testInfo) diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt index 3ea964f48e..ada96f65d5 100644 --- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt +++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt @@ -11,8 +11,9 @@ package com.maddyhome.idea.vim.api import com.maddyhome.idea.vim.diagnostic.vimLogger +import com.maddyhome.idea.vim.ex.exExceptionMessage import com.maddyhome.idea.vim.helper.EngineStringHelper -import com.maddyhome.idea.vim.helper.Msg +import org.jetbrains.annotations.TestOnly import java.util.* import javax.swing.KeyStroke import kotlin.Char @@ -23,16 +24,22 @@ private val logger = vimLogger() open class VimDigraphGroupBase() : VimDigraphGroup { override fun getCharacterForDigraph(ch1: Char, ch2: Char): Char { - val chars = charArrayOf(ch1, ch2) - var digraph = String(chars) - var ch: Char? = digraphToCharacter[digraph] - if (ch == null) { - chars[0] = ch2 - chars[1] = ch1 - digraph = String(chars) - ch = digraphToCharacter[digraph] + fun getCharacter(ch1: Char, ch2: Char, digraphs: Map): Char? { + val chars = charArrayOf(ch1, ch2) + var digraph = String(chars) + val ch = digraphs[digraph] + if (ch == null) { + chars[0] = ch2 + chars[1] = ch1 + digraph = String(chars) + return digraphs[digraph] + } + return ch } - return ch ?: ch2 + + return getCharacter(ch1, ch2, customDigraphToCharacter) + ?: getCharacter(ch1, ch2, digraphToCharacter) + ?: ch2 } override fun displayAsciiInfo(editor: VimEditor) { @@ -41,7 +48,7 @@ open class VimDigraphGroupBase() : VimDigraphGroup { if (charsSequence.isEmpty() || offset >= charsSequence.length) return val ch = charsSequence[offset] - val digraph = characterToDigraph[ch] + val digraph = customCharacterToDigraph[ch] ?: characterToDigraph[ch] val digraphText = if (digraph == null) "" else ", Digr $digraph" if (ch.code < 0x100) { @@ -77,7 +84,6 @@ open class VimDigraphGroupBase() : VimDigraphGroup { if (defaultDigraphs[i] != '\u0000' && defaultDigraphs[i + 1] != '\u0000') { val character: Char = defaultDigraphs[i + 2] val digraph = String(defaultDigraphs, i, 2) - // todo use BiMap instead? digraphToCharacter[digraph] = character if (!characterToDigraph.contains(character)) { characterToDigraph[character] = digraph @@ -85,7 +91,6 @@ open class VimDigraphGroupBase() : VimDigraphGroup { } i += 3 } - // TODO - load custom digraphs from .ideavimrc } override fun parseCommandLine(editor: VimEditor, args: String): Boolean { @@ -98,11 +103,26 @@ open class VimDigraphGroupBase() : VimDigraphGroup { return true } - // todo command is not fully supported - // TODO: Command only supports adding new digraphs - :digraphs {char1}{char2} {number} + val tokenizer = StringTokenizer(args) + while (tokenizer.hasMoreTokens()) { + val digraph = tokenizer.nextToken() + if (digraph.length == 1) { + throw exExceptionMessage("E1214", digraph) // E1214: Digraph must be just two characters: {0} + } + + if (!(tokenizer.hasMoreTokens())) { + throw exExceptionMessage("E39") // E39: Number expected + } + + val codepoint = tokenizer.nextToken().toIntOrNull() + if (codepoint == null) { + throw exExceptionMessage("E39") // E39: Number expected + } - injector.messages.showStatusBarMessage(editor, injector.messages.message(Msg.e_invarg, args)) - return false + addCustomDigraph(digraph.substring(0, 2), Char(codepoint)) + } + + return true } override fun showDigraphs(editor: VimEditor, showHeaders: Boolean) { @@ -120,7 +140,7 @@ open class VimDigraphGroupBase() : VimDigraphGroup { logger.debug("height=$height") } - val digraphCount = defaultDigraphs.size / 3 + val digraphCount = (defaultDigraphs.size / 3) + customDigraphToCharacter.size val capacity = (digraphCount * columnWidth) + (digraphCount / columnCount) + 300 // Text + newlines + headers val output = buildString(capacity) { var column = 0 @@ -147,52 +167,32 @@ open class VimDigraphGroupBase() : VimDigraphGroup { if (column != 0) { repeat(columnWidth - (columnLength % columnWidth)) { append(' ') } } - columnLength = length - append(defaultDigraphs[i]) - append(defaultDigraphs[i + 1]) - append(' ') + columnLength = appendDigraph(defaultDigraphs[i], defaultDigraphs[i + 1], char) + column++ - // VIM highlights the printable character with HLF_8, which it also uses for special keys in `:map` - val printable = EngineStringHelper.toPrintableCharacter(char) - val invisibleCharAdjustment = when { - // Weird Vim-ism. `NU` (NULL) is set to 10, but displays as `^@` - char == '\u000a' && i == 0 -> { - append(EngineStringHelper.toPrintableCharacter('\u0000')) - 0 - } - printable.length == 1 && isRightToLeft(char) -> { - append('\u2067') // RIGHT_TO_LEFT_ISOLATE - set RTL and isolate following content from the surrounding text - append(printable) - append('\u2069') // POP_DIRECTIONAL_ISOLATE - close the isolation range and return to LTR - 2 - } - printable.length == 1 && isCombiningCharacter(char) -> { - append(' ') // Give the combining character something to combine with - append(printable) - 1 - } - else -> { - append(printable) - 0 - } + if (column == columnCount) { + appendLine() + column = 0 } + } - // Add an extra space if we've only used one text cell. - // Ideally here, we'd check the EAST_ASIAN_WIDTH Unicode property of the printed character. If it's full width, - // it's taken two "cells". I'm not sure this would work for all characters, e.g. Ⅵ seems to be 1.5 "cells" wide. - // Perhaps we could set the output panel's tab size to 13, and use tab stops to make things line up? - if (printable.length == 1) { - append(' ') + if (showHeaders && customDigraphToCharacter.isNotEmpty()) { + if (column != 0) { + appendLine() } + appendLine("Custom") + column = 0 + } - // Print the code: ' %3d' - append(' ') - append(char.code.toString().padStart(3)) - - columnLength = length - columnLength - invisibleCharAdjustment + customDigraphToCharacter.forEach { (digraph, char) -> + if (column != 0) { + repeat(columnWidth - (columnLength % columnWidth)) { append(' ') } + } + columnLength = appendDigraph(digraph[0], digraph[1], char) column++ + if (column == columnCount) { appendLine() column = 0 @@ -204,6 +204,53 @@ open class VimDigraphGroupBase() : VimDigraphGroup { injector.outputPanel.output(editor, context, output) } + private fun StringBuilder.appendDigraph(ch1: Char, ch2: Char, char: Char): Int { + val start = this.length + + append(ch1) + append(ch2) + append(' ') + + // VIM highlights the printable character with HLF_8, which it also uses for special keys in `:map` + val printable = EngineStringHelper.toPrintableCharacter(char) + val invisibleCharAdjustment = when { + // Vim null handling weirdness... `NU` is NULL, and represented as NL ('\u000a`), but the char should be `^@` + ch1 == 'N' && ch2 == 'U' -> { + append(EngineStringHelper.toPrintableCharacter('\u0000')) + 0 + } + printable.length == 1 && isRightToLeft(char) -> { + append('\u2067') // RIGHT_TO_LEFT_ISOLATE - set RTL and isolate following content from the surrounding text + append(printable) + append('\u2069') // POP_DIRECTIONAL_ISOLATE - close the isolation range and return to LTR + 2 + } + printable.length == 1 && isCombiningCharacter(char) -> { + append(' ') // Give the combining character something to combine with + append(printable) + 1 + } + else -> { + append(printable) + 0 + } + } + + // Add an extra space if we've only used one text cell. + // Ideally here, we'd check the EAST_ASIAN_WIDTH Unicode property of the printed character. If it's full width, + // it's taken two "cells". I'm not sure this would work for all characters, e.g. Ⅵ seems to be 1.5 "cells" wide. + // Perhaps we could set the output panel's tab size to 13, and use tab stops to make things line up? + if (printable.length == 1) { + append(' ') + } + + // Print the code: ' %3d' + append(' ') + append(char.code.toString().padStart(3)) + + return length - start - invisibleCharAdjustment + } + private fun isRightToLeft(c: Char): Boolean { val directionality = Character.getDirectionality(c) return directionality == Character.DIRECTIONALITY_RIGHT_TO_LEFT @@ -230,6 +277,18 @@ open class VimDigraphGroupBase() : VimDigraphGroup { } } + private fun addCustomDigraph(digraph: String, char: Char) { + customDigraphToCharacter[digraph] = char + customCharacterToDigraph[char] = digraph + } + + // Surprisingly, Vim doesn't have a command line for removing custom digraphs + @TestOnly + fun clearCustomDigraphs() { + customDigraphToCharacter.clear() + customCharacterToDigraph.clear() + } + // Based on the digraphs listed in `:help digraph-table` and `:help digraph-table-mbyte`, which unfortunately doesn't // list all digraphs. The output of the `:digraphs` command (`redir @">|silent digraphs|redir END|enew|put`) is used // to fill in the missing entries. (Compare against the output in the tests) @@ -1638,6 +1697,18 @@ open class VimDigraphGroupBase() : VimDigraphGroup { */ private val characterToDigraph: MutableMap = TreeMap() + /** + * A map of custom digraphs to chars + * + * This property uses [LinkedHashMap] so that iteration order matches insertion order + */ + private val customDigraphToCharacter: MutableMap = LinkedHashMap() + + /** + * A map of custom digraph characters to digraph + */ + private val customCharacterToDigraph: MutableMap = HashMap() + /** * A map of Unicode block to Vim digraph header name/display text * From 867853ee21c128b030a8f051ece083a063481f39 Mon Sep 17 00:00:00 2001 From: Matt Ellis Date: Wed, 4 Sep 2024 00:56:46 +0100 Subject: [PATCH 17/17] Use full width of output panel for text --- .../idea/vim/helper/EditorHelper.java | 25 ++++++++++++++----- .../idea/vim/helper/IjEditorHelper.kt | 5 +++- .../idea/vim/api/EngineEditorHelper.kt | 22 +++++++++++++--- .../idea/vim/api/VimDigraphGroupBase.kt | 2 +- .../vimscript/model/commands/SetCommand.kt | 14 +++-------- 5 files changed, 46 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/maddyhome/idea/vim/helper/EditorHelper.java b/src/main/java/com/maddyhome/idea/vim/helper/EditorHelper.java index b927bc902b..cf1a02cbdc 100644 --- a/src/main/java/com/maddyhome/idea/vim/helper/EditorHelper.java +++ b/src/main/java/com/maddyhome/idea/vim/helper/EditorHelper.java @@ -157,6 +157,19 @@ public static int getApproximateScreenWidth(final @NotNull Editor editor) { return (int)(getVisibleArea(editor).width / getPlainSpaceWidthFloat(editor)); } + /** + * Gets the number of characters that can be fit inside the output panel for an editor. + *

+ * This will be greater than the approximate screen width as it also includes any gutter components in the editor. + *

+ * + * @param editor The editor + * @return The approximate number of columns that can fit in the output panel + */ + public static int getApproximateOutputPanelWidth(final @NotNull Editor editor) { + return (int)(editor.getComponent().getWidth() / getPlainSpaceWidthFloat(editor)); + } + /** * Gets the width of the space character in the editor's plain font as a float. *

@@ -273,7 +286,7 @@ else if (bottomInlayHeight > visibleArea.height - caretScreenOffset + editor.get // Scroll the given visual line to the caret location, but do not scroll down passed the end of file, or the current // virtual space at the bottom of the screen - @NotNull final VimEditor editor1 = new IjVimEditor(editor); + final @NotNull VimEditor editor1 = new IjVimEditor(editor); final int lastVisualLine = EngineEditorHelperKt.getVisualLineCount(editor1) - 1; final int yBottomLineOffset = max(getOffsetToScrollVisualLineToBottomOfScreen(editor, lastVisualLine), visibleArea.y); scrollVertically(editor, min(yVisualLine - caretScreenOffset - inlayOffset, yBottomLineOffset)); @@ -325,7 +338,7 @@ public static void scrollVisualLineToMiddleOfScreen(@NotNull Editor editor, int final int lineHeight = editor.getLineHeight(); final int offset = y - ((screenHeight - lineHeight) / lineHeight / 2 * lineHeight); - @NotNull final VimEditor editor1 = new IjVimEditor(editor); + final @NotNull VimEditor editor1 = new IjVimEditor(editor); final int lastVisualLine = EngineEditorHelperKt.getVisualLineCount(editor1) - 1; final int offsetForLastLineAtBottom = getOffsetToScrollVisualLineToBottomOfScreen(editor, lastVisualLine); @@ -379,7 +392,7 @@ private static int getExEntryHeight() { return 0; } - private static int getHorizontalScrollbarHeight(@NotNull final Editor editor) { + private static int getHorizontalScrollbarHeight(final @NotNull Editor editor) { // Horizontal scrollbars on macOS are either transparent AND auto-hide, so we don't need to worry about obscured // text, or always visible, opaque and outside the content area, so we don't need to adjust for them // Transparent scrollbars on Windows and Linux are overlays on the editor content area, and always visible. That @@ -462,7 +475,7 @@ public static void scrollColumnToRightOfScreen(@NotNull Editor editor, int visua */ public static Pair scrollFullPageDown(final @NotNull Editor editor, int pages) { final Rectangle visibleArea = getVisibleArea(editor); - @NotNull final VimEditor editor2 = new IjVimEditor(editor); + final @NotNull VimEditor editor2 = new IjVimEditor(editor); final int lastVisualLine = EngineEditorHelperKt.getVisualLineCount(editor2) - 1; int y = visibleArea.y + visibleArea.height; @@ -480,7 +493,7 @@ public static Pair scrollFullPageDown(final @NotNull Editor ed caretVisualLine = lastVisualLine; } else { - @NotNull final VimEditor editor1 = new IjVimEditor(editor); + final @NotNull VimEditor editor1 = new IjVimEditor(editor); caretVisualLine = EngineEditorHelperKt.getVisualLineCount(editor1) - 1; completed = false; } @@ -515,7 +528,7 @@ public static Pair scrollFullPageDown(final @NotNull Editor ed public static Pair scrollFullPageUp(final @NotNull Editor editor, int pages) { final Rectangle visibleArea = getVisibleArea(editor); final int lineHeight = editor.getLineHeight(); - @NotNull final VimEditor editor1 = new IjVimEditor(editor); + final @NotNull VimEditor editor1 = new IjVimEditor(editor); final int lastVisualLine = EngineEditorHelperKt.getVisualLineCount(editor1) - 1; int y = visibleArea.y; diff --git a/src/main/java/com/maddyhome/idea/vim/helper/IjEditorHelper.kt b/src/main/java/com/maddyhome/idea/vim/helper/IjEditorHelper.kt index 08372c22b0..12d8618a22 100644 --- a/src/main/java/com/maddyhome/idea/vim/helper/IjEditorHelper.kt +++ b/src/main/java/com/maddyhome/idea/vim/helper/IjEditorHelper.kt @@ -13,7 +13,6 @@ import com.intellij.openapi.editor.ReadOnlyFragmentModificationException import com.intellij.openapi.editor.VisualPosition import com.intellij.openapi.editor.actionSystem.EditorActionManager import com.intellij.openapi.editor.ex.util.EditorUtil -import com.maddyhome.idea.vim.api.EngineEditorHelper import com.maddyhome.idea.vim.api.EngineEditorHelperBase import com.maddyhome.idea.vim.api.VimEditor import com.maddyhome.idea.vim.api.VimRangeMarker @@ -42,6 +41,10 @@ internal class IjEditorHelper : EngineEditorHelperBase() { return EditorHelper.getApproximateScreenWidth(editor.ij) } + override fun getApproximateOutputPanelWidth(editor: VimEditor): Int { + return EditorHelper.getApproximateOutputPanelWidth(editor.ij) + } + override fun handleWithReadonlyFragmentModificationHandler(editor: VimEditor, exception: Exception) { return EditorActionManager.getInstance() .getReadonlyFragmentModificationHandler(editor.ij.document) diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/EngineEditorHelper.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/EngineEditorHelper.kt index 3bc926d4e8..2cd7f0ee49 100644 --- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/EngineEditorHelper.kt +++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/EngineEditorHelper.kt @@ -18,7 +18,23 @@ interface EngineEditorHelper { fun amountOfInlaysBeforeVisualPosition(editor: VimEditor, pos: VimVisualPosition): Int fun getVisualLineAtTopOfScreen(editor: VimEditor): Int fun getVisualLineAtBottomOfScreen(editor: VimEditor): Int + + /** + * Return the approximate width, in columns, of the editor surface + * + * This is used for calculating the usable editor width, for editor features such as horizontal scrolling. + */ fun getApproximateScreenWidth(editor: VimEditor): Int + + /** + * Return the approximate width, in columns, of the output panel for a given editor + * + * This value is the approximate number of columns that can be displayed in the output panel for an editor. It will be + * greater than the value returned by [getApproximateScreenWidth], which is the number of editor columns in what Vim + * calls a "screen". That value does not include the space taken up by the editor gutter and other components, and if + * used for the output panel will leave a gap on the right-hand side of the panel. + */ + fun getApproximateOutputPanelWidth(editor: VimEditor): Int fun handleWithReadonlyFragmentModificationHandler(editor: VimEditor, exception: java.lang.Exception) fun pad(editor: VimEditor, line: Int, to: Int): String fun inlayAwareOffsetToVisualPosition(editor: VimEditor, offset: Int): VimVisualPosition @@ -238,9 +254,7 @@ fun VimEditor.getText(range: TextRange): String { val end = range.endOffsets[i] val line = getText(start, end) if (line.isEmpty()) { - for (j in 0 until max) { - res.append(' ') - } + repeat(max) { res.append(' ') } } else { res.append(line) } @@ -307,4 +321,4 @@ interface VimRangeMarker { val isValid: Boolean fun dispose() -} \ No newline at end of file +} diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt index ada96f65d5..5203cda7c3 100644 --- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt +++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt @@ -126,7 +126,7 @@ open class VimDigraphGroupBase() : VimDigraphGroup { } override fun showDigraphs(editor: VimEditor, showHeaders: Boolean) { - val width = injector.engineEditorHelper.getApproximateScreenWidth(editor).let { if (it < 10) 80 else it } + val width = injector.engineEditorHelper.getApproximateOutputPanelWidth(editor).let { if (it < 10) 80 else it } // Vim's columns are 13 characters wide, but for some reason, they suddenly switch to 12. It makes no obvious sense, // and it's a quirk too far to copy. diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/SetCommand.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/SetCommand.kt index ffba2d7245..e488779185 100644 --- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/SetCommand.kt +++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/SetCommand.kt @@ -195,7 +195,7 @@ fun parseOptionLine(editor: VimEditor, context: ExecutionContext, args: String, } // Now show all options that were individually requested - if (toShow.size > 0) { + if (toShow.isNotEmpty()) { showOptions(editor, context, toShow, scope, false, columnFormat) } @@ -240,9 +240,7 @@ private fun showOptions( if (columnFormat || optionAsString.length >= colWidth) extra.add(optionAsString) else cells.add(optionAsString) } - // Note that this is the approximate width of the associated editor, not the ex output panel! - // It excludes gutter width, for example - val width = injector.engineEditorHelper.getApproximateScreenWidth(editor).let { if (it < 20) 80 else it } + val width = injector.engineEditorHelper.getApproximateOutputPanelWidth(editor).let { if (it < 20) 80 else it } val colCount = width / colWidth val height = ceil(cells.size.toDouble() / colCount.toDouble()).toInt() @@ -260,18 +258,14 @@ private fun showOptions( for (c in 0 until colCount) { val index = c * height + h if (index < cells.size) { - val padLength = lengthAtStartOfLine + (c * colWidth) - length - for (i in 1..padLength) { - append(' ') - } - + repeat(lengthAtStartOfLine + (c * colWidth) - length) { append(' ') } append(cells[index]) } } appendLine() } - // Add any lines that are too long to fit into columns. The panel will soft wrap text + // Add any lines that are too long to fit into columns. The panel will soft-wrap text for (option in extra) { appendLine(option) }