From a16d4f7416a4004b209df14940b8cbb0c76faeeb Mon Sep 17 00:00:00 2001 From: erjemin Date: Fri, 8 Aug 2025 18:16:35 +0300 Subject: [PATCH] =?UTF-8?q?mod:=20++++=D0=BF=D1=80=D0=B8=D0=BE=D1=80=D0=B8?= =?UTF-8?q?=D1=82=D0=B5=D1=82=D1=8B=20=D0=B8=20=D1=82=D0=B5=D1=81=D1=82?= =?UTF-8?q?=D1=8B=20html-=D0=BC=D0=BD=D0=B5=D0=BC=D0=BE=D0=BD=D0=B8=D0=BA?= =?UTF-8?q?=20=D0=B4=D0=BB=D1=8F=20decode=5Fto=5Funicode()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- etpgrf/config.py | 414 ++++++++++++++++++++++++++++++++++++++++---- tests/test_codec.py | 239 +++++++++++++------------ 2 files changed, 507 insertions(+), 146 deletions(-) diff --git a/etpgrf/config.py b/etpgrf/config.py index 8f9147f..80d888c 100644 --- a/etpgrf/config.py +++ b/etpgrf/config.py @@ -58,11 +58,11 @@ SAFE_MODE_CHARS_TO_MNEMONIC = frozenset([ '\u200D', # Нулевая ширина (с объединением) (Zero Width Joiner) -- ‌ '\u200E', # Изменить направление текста на слева-направо (Left-to-Right Mark /LRE) -- ‎ '\u200F', # Изменить направление текста направо-налево (Right-to-Left Mark /RLM) -- ‏ + '\u2010', # ‐ -- дефис (Hyphen) '\u205F', # Средний пробел (Medium Mathematical Space) --   '\u2060', # ⁠ - '\u2062', # ⁢ - '\u2063', # ⁣ - + '\u2062', # ⁢ -- для семантической разметки математических выражений + '\u2063', # ⁣ -- для семантической разметки математических выражений ]) # 3. СПИСОК ДЛЯ ЧИСЛОВОГО КОДИРОВАНИЯ: Символы без стандартного имени. @@ -84,35 +84,385 @@ ALWAYS_ENCODE_TO_NUMERIC_CHARS = frozenset([ # # Также можно использовать для создания исключений из "черного списка" NEVER_ENCODE_CHARS. CUSTOM_ENCODE_MAP = { - '\u2010': '‐', # Для \u2010 всегда предпочитаем ‐, а не ‐ - # Исключения для букв, которые есть в алфавитах, но должны кодироваться (для обеспечения консистентности): - # 'Æ': 'Æ', - # 'Œ': 'Œ', - # 'æ': 'æ', - # 'œ': 'œ', - '\u3253': 'ℵ', # ℵ / &alefsym / ℵ - '&': '&', # & / & / & - '\u2220': '∠', # ∠ / ∠ / ∠ - '\u2061': '⁡', # / ⁡ / ⁡ - '\u2248': '≈', # ≈ / ≈ / ≈ / ≈ / ≈ / ≈ / ≈ - '\u00c5': 'Å', # Å / Å / Å / - '\u224a': '≊', # ≊ / ≊ / &≊ - '\u2305': '⌅', # ⌅ / ⌅ / ⌅ - '\u2235': '∵', # ∵ / ∵ / ∵ / ∵ - '\u224c': '≌', # ≌ / ≌ / ≌ - '\u03f6': '϶', # ϶ / ϶ / ϶ - '\u212c': 'ℬ', # ℬ / ℬ / ℬ / ℬ - '\u22a5': '⊥', # ⊥ / ⊥ / ⊥ / ⊥ / ⊥ - '\u2035': '‵', # ‵ / ‵ / ‵ - '\u02d8': '˘', # ˘ / ˘ / ˘ - '\u223d': '∽', # ∽ / ∽ / ∽ - '\u22cd': '⋍', # ⋍ / ⋍ / ⋍ - '\u2022': '•', # • / • / • - '\u224e': '≎', # ≎ / ≎ / ≎ / &HumpDownHumpl; - '\u224f': '≏', # ≏ / ≏ / ≏ / ≏ - '\u00b8': '¸', # ¸ / ¸ / ¸ - '\u00b7': '·', # · / · / · / · - '\u212d': 'ℭ', # ℭ / ℭ / ℭ + # '\u2010': '‐', # Для \u2010 всегда предпочитаем ‐, а не ‐ + # # Исключения для букв, которые есть в алфавитах, но должны кодироваться (для обеспечения консистентности): + # # 'Æ': 'Æ', + # # 'Œ': 'Œ', + # # 'æ': 'æ', + # # 'œ': 'œ', + # '\u002a': '*', # * / * / * + # '\u005b': '[', # [ / [ / [ + # '\u005d': ']', # ] / ] / ] + # '\u005f': '_', # _ / _ / _ + # '\u007b': '{', # { / { / { + # '\u007d': '}', # } / } / } + # '\u007c': '|', # | / | / | / | + # '\u0026': '&', # & / & / & + '\u0026': '&', # & / & / & + '\u003e': '>', # > / > / > + '\u00ae': '®', # ® / ® / ® / ® + '\u00b7': '·', # · / · / · / · + '\u0060': '`', # ` / grave / DiacriticalGrave + '\u00a8': '¨', # ¨ / ¨ / ¨ / ¨ + '\u00b1': '±', # ± / pm / PlusMinus + '\u00bd': '½', # ½ / ½ / ½ + '\u223e': '∾', # ∾ / ∾ / ∾ + '\u2207': '∇', # ∇ / ∇ / ∇ + '\u2061': '⁡', # / ⁡ / ⁡ + '\u2221': '∡', # ∡ / ∡ / ∡ + '\u2248': '≈', # ≈ / ≈ / ≈ / ≈ / ≈ / ≈ + '\u224a': '≊', # ≊ / ≊ / ≊ + '\u2254': '≔', # ≔ / ≔ / ≔ / ≔ + '\u224d': '≍', # ≍ / ≍ / ≍ + '\u2233': '∳', # ∳ / awconint / CounterClockwiseContourIntegral + '\u224c': '≌', # ≌ / bcong / backcong + '\u03f6': '϶', # ϶ / bepsi / backepsilon + '\u2035': '‵', # ‵ / bprime / backprime + '\u223d': '∽', # ∽ / bsim / backsim + '\u22cd': '⋍', # ⋍ / bsime / backsimeq + '\u2216': '∖', # ∖ / ∖ / ∖ / ∖ / ∖ / ∖ + '\u2306': '⌆', # ⌆ / Barwed / doublebarwedge + '\u2305': '⌅', # ⌅ / barwed / barwedge + '\u23b5': '⎵', # ⎵ / bbrk / UnderBracket + '\u2235': '∵', # ∵ / becaus / because / Because + '\u212c': 'ℬ', # ℬ / Bscr / bernou / Bernoullis + '\u226c': '≬', # ≬ / ≬ / ≬ + '\u22c2': '⋂', # ⋂ / ⋂ / ⋂ / ⋂ + '\u25ef': '◯', # ◯ / ◯ / ◯ + '\u22c3': '⋃', # ⋃ / ⋃ / ⋃ / ⋃ + '\u2a00': '⨀', # ⨀ / ⨀ / ⨀ + '\u2a01': '⨁', # ⨁ / ⨁ / ⨁ + '\u2a02': '⨂', # ⨂ / ⨂ / ⨂ + '\u2a06': '⨆', # ⨆ / ⨆ / ⨆ + '\u2605': '★', # ★ / ★ / ★ + '\u25bd': '▽', # ▽ / ▽ / ▽ + '\u25b3': '△', # △ / △ / △ + '\u2a04': '⨄', # ⨄ / ⨄ / ⨄ + '\u22c1': '⋁', # ⋁ / ⋁ / ⋁ / ⋁ + '\u22c0': '⋀', # ⋀ / Wedge / ⋀ / $bigwedge; + '\u290d': '⤍', # ⤍ / rbarr / bkarow + '\u29eb': '⧫', # ⧫ / ⧫ / ⧫ + '\u25aa': '▪', # ▪ / ▪ / ▪ / ▪ / ▪ + '\u25b4': '▴', # ▴ / ▴ / ▴ + '\u25be': '▾', # ▾ / ▾ / ▾ + '\u25c2': '◂', # ◂ / ◂ / ◂ + '\u25b8': '▸', # ▸ / ▸ / ▸ + '\u22a5': '⊥', # ⊥ / ⊥ / ⊥ / ⊥ / ⊥ + '\u2500': '─', # ─ / ─ / ─ + '\u229f': '⊟', # ⊟ / ⊟ / ⊟ + '\u229e': '⊞', # ⊞ / ⊞ / ⊞ + '\u22a0': '⊠', # ⊠ / ⊠ / ⊠ + '\u02d8': '˘', # ˘ / breve / Breve + '\u224e': '≎', # ≎ / ≎ / ≎ / ≎ + '\u224f': '≏', # ≏ / ≏ / ≏ / ≏ + '\u2145': 'ⅅ', # ⅅ / ⅅ / ⅅ + '\u02c7': 'ˇ', # ˇ / ˇ / ˇ + '\u212d': 'ℭ', # ℭ / Cfr / Cayleys + '\u2713': '✓', # ✓ / check / checkmark + '\u2257': '≗', # ≗ / cire / circeq + '\u21ba': '↺', # ↺ / olarr / circlearrowleft + '\u21bb': '↻', # ↻ / orarr / circlearrowright + '\u229b': '⊛', # ⊛ / ⊛ / ⊛ + '\u229a': '⊚', # ⊚ / ⊚ / ⊚ + '\u229d': '⊝', # ⊝ / ⊝ / ⊝ + '\u2299': '⊙', # ⊙ / odot / CircleDot + '\u2200': '∀', # ∀ / ∀ / ∀ + '\u24c8': 'Ⓢ', # Ⓢ / Ⓢ / Ⓢ + '\u2296': '⊖', # ⊖ / ⊖ / ⊖ + '\u2232': '∲', # ∲ / cwconint / ClockwiseContourIntegral + '\u201d': '”', # ” / ” / rdquor / CloseCurlyDoubleQuote + '\u2019': '’', # ’ / ’ / rsquor / CloseCurlyQuote + '\u2237': '∷', # ∷ / Colon / Proportion + '\u2201': '∁', # ∁ / comp / complement + '\u2218': '∘', # ∘ / compfn / SmallCircle + '\u2102': 'ℂ', # ℂ / Copf / complexes + '\u222f': '∯', # ∯ / Conint / DoubleContourIntegral + '\u222e': '∮', # ∮ / oint / conint / ContourIntegral + '\u2210': '∐', # ∐ / coprod / Coproduct + '\u22de': '⋞', # ⋞ / cuepr / curlyeqprec + '\u22df': '⋟', # ⋟ / cuesc / curlyeqsucc + '\u21b6': '↶', # ↶ / cularr / curvearrowleft + '\u21b7': '↷', # ↷ / curarr / curvearrowright + '\u22ce': '⋎', # ⋎ / cuvee / curlyvee + '\u22cf': '⋏', # ⋏ / cuwed / curlywedge + '\u2010': '‐', # ‐ / ‐ / ‐ + '\u2ae4': '⫤', # ⫤ / Dashv / DoubleLeftTee + '\u22a3': '⊣', # ⊣ / dashv / LeftTee + '\u290f': '⤏', # ⤏ / ⤏ / ⤏ + '\u02dd': '˝', # ˝ / dblac / DiacriticalDoubleAcute + '\u2146': 'ⅆ', # ⅆ / dd / DifferentialD + '\u21ca': '⇊', # ⇊ / ddarr / downdownarrows + '\u2a77': '⩷', # ⩷ / eDDot / ddotseq + '\u21c3': '⇃', # ⇃ / ⇃ / ⇃ / ⇃ + '\u21c2': '⇂', # ⇂ / dharr / RightDownVector / downharpoonright + '\u02d9': '˙', # ˙ / dot / DiacriticalDot + '\u222b': '∫', # ∫ / ∫ / ∫ + '\u22c4': '⋄', # ⋄ / diam / diamond / Diamond + '\u03b5': 'ε', # ε / ε / ε + '\u03dd': 'ϝ', # ϝ / gammad / digamma + '\u22c7': '⋇', # ⋇ / divonx / divideontimes + '\u231e': '⌞', # ⌞ / dlcorn / llcorner + '\u2250': '≐', # ≐ / esdot / doteq / DotEqual + '\u2251': '≑', # ≑ / eDot / doteqdot + '\u2238': '∸', # ∸ / minusd / dotminus + '\u2214': '∔', # ∔ / plusdo / dotplus + '\u22a1': '⊡', # ⊡ / sdotb / dotsquare + '\u21d3': '⇓', # ⇓ / ⇓ / ⇓ / ⇓ + '\u21d0': '⇐', # ⇐ / ⇐ / ⇐ / ⇐ + '\u21d4': '⇔', # ⇔ / ⇔ / ⇔ / ⇔ / ⇔ + '\u27f8': '⟸', # ⟸ / xlArr / Longleftarrow / DoubleLongLeftArrow + '\u27fa': '⟺', # ⟺ / xhArr / Longleftrightarrow / DoubleLongLeftRightArrow + '\u27f9': '⟹', # ⟹ / xrArr / Longrightarrow / DoubleLongRightArrow + '\u21d2': '⇒', # ⇒ / ⇒ / ⇒ / ⇒ / ⇒ + '\u22a8': '⊨', # ⊨ / vDash / DoubleRightTee + '\u21d1': '⇑', # ⇑ / ⇑ / ⇑ / ⇑ + '\u21d5': '⇕', # ⇕ / vArr / Updownarrow / DoubleUpDownArrow + '\u2225': '∥', # ∥ / par / spar / parallel / shortparallel / DoubleVerticalBar + '\u2191': '↑', # ↑ / ↑ / ↑ / ↑ + '\u2193': '↓', # ↓ / ↓ / ↓ / ↓ / ↓ + '\u21f5': '⇵', # ⇵ / ⇵ / ⇵ + '\u21bd': '↽', # ↽ / ↽ /↽ / ↽ + '\u21c1': '⇁', # ⇁ / ⇁ / ⇁ / ⇁ + '\u22a4': '⊤', # ⊤ / ⊤ / ⊤ + '\u21a7': '↧', # ↧ / ↧ / ↧ + '\u2910': '⤐', # ⤐ / ⤐ / ⤐ + '\u231f': '⌟', # ⌟ / ⌟ / ⌟ + '\u25bf': '▿', # ▿ / ▿ / ▿ + '\u296f': '⥯', # ⥯ / duhar / ReverseUpEquilibrium + '\u2256': '≖', # ≖ / ≖ / ≖ + '\u2255': '≕', # ≕ / ecolon / eqcolon + '\u2147': 'ⅇ', # ⅇ / ⅇ / ⅇ / ⅇ + '\u2252': '≒', # ≒ / ≒ / ≒ + '\u2a96': '⪖', # ⪖ / ⪖ / ⪖ + '\u2208': '∈', # ∈ / ∈ / ∈ / ∈ / ∈ + '\u2a95': '⪕', # ⪕ / ⪕ / ⪕ + '\u2205': '∅', # ∅ / ∅ / ∅ / ∅ / ∅ + '\u03f5': 'ϵ', # ϵ / epsiv / varepsilon / straightepsilon + '\u2242': '≂', # ≂ / ≂ / ≂ / ≂ + '\u225f': '≟', # ≟ / equest / questeq + '\u21cc': '⇌', # ⇌ / ⇌ / ⇌ / ⇌ + '\u2253': '≓', # ≓ / erDot / risingdotseq + '\u2130': 'ℰ', # ℰ / ℰ / ℰ + '\u22d4': '⋔', # ⋔ / fork / pitchfork + '\u2131': 'ℱ', # ℱ / ℱ / ℱ + '\u2322': '⌢', # ⌢ / frown / sfrown + '\u2a86': '⪆', # ⪆ / ⪆ / ⪆ + '\u2267': '≧', # ≧ / ≧ / ≧ / ≧ + '\u2a8c': '⪌', # ⪌ / ⪌ / ⪌ + '\u22db': '⋛', # ⋛ / ⋛ / ⋛ / ⋛ + '\u2265': '≥', # ≥ / ≥ / ≥ / ≥ + '\u2a7e': '⩾', # ⩾ / ⩾ / ⩾ / ⩾ + '\u22d9': '⋙', # ⋙ / ⋙ / ⋙ + '\u226b': '≫', # ≫ / &gg ;/ ≫ / ≫ + '\u2277': '≷', # ≷ / ≷ / ≷ / ≷ + '\u2a8a': '⪊', # ⪊ / ⪊ / ⪊ + '\u2269': '≩', # ≩ / ≩ / ≩ + '\u2a88': '⪈', # ⪈ / ⪈ / ⪈ + '\u2273': '≳', # ≳ / ≳ / ≳ / ≳ + '\u22d7': '⋗', # ⋗ / ⋗ / ⋗ + '\u200a': ' ', # /   /   + '\u210b': 'ℋ', # ℋ / ℋ / ℋ / ℋ + '\u21ad': '↭', # ↭ / harrw / leftrightsquigarrow + '\u210f': 'ℏ', # ℏ / ℏ / ℏ / ℏ / ℏ + '\u210c': 'ℌ', # ℌ / Hfr / Poincareplane + '\u2925': '⤥', # ⤥ / ⤥ / ⤥ + '\u2926': '⤦', # ⤦ / ⤦ / ⤦ + '\u21a9': '↩', # ↩ / ↩ / ↩ + '\u21aa': '↪', # ↪ / ↪ / ↪ + '\u210d': 'ℍ', # ℍ / Hopf / quaternions + '\u2063': '⁣', # ⁣ / ⁣ / ⁣ + '\u2111': 'ℑ', # ℑ / ℑ / ℑ / ℑ / ℑ + '\u2148': 'ⅈ', # ⅈ / ⅈ / ⅈ + '\u2a0c': '⨌', # ⨌ / ⨌ / ⨌ + '\u222d': '∭', # ∭ / ∭ / ∭ + '\u2110': 'ℐ', # ℐ / ℐ / ℐ + '\u0131': 'ı', # ı / ı / ı + '\u22ba': '⊺', # ⊺ / ⊺ / ⊺ + '\u2124': 'ℤ', # ℤ / ℤ / ℤ + '\u2a3c': '⨼', # ⨼ / ⨼ / ⨼ + '\u2062': '⁢', # ⁢ / ⁢ / ⁢ + '\u03f0': 'ϰ', # ϰ / kappav / varkappa + '\u21da': '⇚', # ⇚ / lAarr / Lleftarrow + '\u2112': 'ℒ', # ℒ / ℒ / ℒ / ℒ + '\u27e8': '⟨', # ⟨ / ⟨ / ⟨ / ⟨ + '\u2a85': '⪅', # ⪅ / lap / lessapprox + '\u219e': '↞', # ↞ / Larr / twoheadleftarrow + '\u21e4': '⇤', # ⇤ / ⇤ / ⇤ + '\u21ab': '↫', # ↫ / larrlp / looparrowleft + '\u21a2': '↢', # ↢ / ↢ / ↢ + '\u2266': '≦', # ≦ / lE / leqq / LessFullEqual + '\u2190': '←', # ← / ← / ← / ← / ← / ← + '\u21c6': '⇆', # ⇆ / ⇆ / ⇆ / ⇆ + '\u27e6': '⟦', # ⟦ / ⟦ / ⟦ + '\u21bc': '↼', # ↼ / ↼ / ↼ / ↼ + '\u21c7': '⇇', # ⇇ / ⇇ / ⇇ + '\u2194': '↔', # ↔ / ↔ / ↔ / ↔ + '\u21cb': '⇋', # ⇋ / lrhar / leftrightharpoons / ReverseEquilibrium + '\u21a4': '↤', # ↤ / mapstoleft / LeftTeeArrow + '\u22cb': '⋋', # ⋋ / lthree / leftthreetimes + '\u22b2': '⊲', # ⊲ / vltri / LeftTriangle / vartriangleleft + '\u22b4': '⊴', # ⊴ / ltrie / trianglelefteq / LeftTriangleEqual + '\u21bf': '↿', # ↿ / uharl / LeftUpVector / upharpoonleft + '\u2308': '⌈', # ⌈ / ⌈ / ⌈ + '\u230a': '⌊', # ⌊ / ⌊ / ⌊ + '\u2a8b': '⪋', # ⪋ / lEg / lesseqqgtr + '\u22da': '⋚', # ⋚ / leg / lesseqgtr / LessEqualGreater + '\u2a7d': '⩽', # ⩽ / les / leqslant / LessSlantEqual + '\u22d6': '⋖', # ⋖ / ltdot / lessdot + '\u2276': '≶', # ≶ / lg / lessgtr / LessGreater + '\u2272': '≲', # ≲ / lsim / lesssim / LessTilde + '\u226a': '≪', # ≪ / ll / Lt / NestedLessLess + '\u23b0': '⎰', # ⎰ / lmoust / lmoustache + '\u2a89': '⪉', # ⪉ / lnap / lnapprox + '\u2268': '≨', # ≨ / lnE / lneqq + '\u2a87': '⪇', # ⪇ / lne / lneq + '\u27f5': '⟵', # ⟵ / xlarr / longleftarrow / LongLeftArrow + '\u27f7': '⟷', # ⟷ / xharr / longleftrightarrow / LongLeftRightArrow + '\u27fc': '⟼', # ⟼ / xmap / longmapsto + '\u27f6': '⟶', # ⟶ / xrarr / LongRightArrow / longrightarrow + '\u21ac': '↬', # ↬ / rarrlp / looparrowright + '\u201e': '„', # „ / „ / „ + '\u2199': '↙', # ↙ / swarr / swarrow / LowerLeftArrow + '\u2198': '↘', # ↘ / searr / searrow / LowerRightArrow + '\u21b0': '↰', # ↰ / Lsh / lsh + '\u25c3': '◃', # ◃ / ltri / triangleleft + '\u2720': '✠', # ✠ / malt / maltese + '\u21a6': '↦', # ↦ / map / mapsto / RightTeeArrow + '\u21a5': '↥', # ↥ / mapstoup / UpTeeArrow + '\u2133': 'ℳ', # ℳ / Mscr / phmmat / Mellintrf + '\u2223': '∣', # ∣ / mid / smid / shortmid / VerticalBar + '\u2213': '∓', # ∓ / mp / mnplus / MinusPlus + '\u22b8': '⊸', # ⊸ / mumap / multimap + '\u2249': '≉', # ≉ / nap / napprox / NotTildeTilde + '\u266e': '♮', # ♮ / natur / natural + '\u2115': 'ℕ', # ℕ / Nopf / naturals + '\u2247': '≇', # ≇ / ncong / NotTildeFullEqual + '\u2197': '↗', # ↗ / nearr / nearrow / UpperRightArrow + '\u200b': '​', # / ZeroWidthSpace / NegativeThinSpace / NegativeThickSpace / NegativeMediumSpace / NegativeVeryThinSpace + '\u2262': '≢', # ≢ / nequiv / NotCongruent + '\u2928': '⤨', # ⤨ / toea / nesear + '\u2203': '∃', # ∃ / ∃ / ∃ + '\u2204': '∄', # ∄ / nexist / nexists / NotExists + '\u2271': '≱', # ≱ / nge / ngeq / NotGreaterEqual + '\u2275': '≵', # ≵ / ngsim / NotGreaterTilde + '\u226f': '≯', # ≯ / ngt / ngtr / NotGreater + '\u21ce': '⇎', # ⇎ / nhArr / nLeftrightarrow + '\u21ae': '↮', # ↮ / nharr / nleftrightarrow + '\u220b': '∋', # ∋ / ∋ / ∋ / ∋ / ∋ + '\u21cd': '⇍', # ⇍ / nlArr / nLeftarrow + '\u219a': '↚', # ↚ / nlarr / nleftarrow + '\u2270': '≰', # ≰ / nle / nleq / NotLessEqual + '\u226e': '≮', # ≮ / nlt / nless / NotLess + '\u2274': '≴', # ≴ / nlsim / NotLessTilde + '\u22ea': '⋪', # ⋪ / nltri / ntriangleleft / NotLeftTriangle + '\u22ec': '⋬', # ⋬ / nltrie / ntrianglelefteq / NotLeftTriangleEqual + '\u2224': '∤', # ∤ / nmid / nsmid / nshortmid / NotVerticalBar + '\u2226': '∦', # ∦ / npar / nspar / nparallel / nshortparallel / NotDoubleVerticalBar + '\u2209': '∉', # ∉ / ∉ / ∉ / ∉ + '\u2279': '≹', # ≹ / ntgl / NotGreaterLess + '\u2278': '≸', # ≸ / ntlg / NotLessGreater + '\u220c': '∌', # ∌ / notni / notniva / NotReverseElement + '\u2280': '⊀', # ⊀ / npr / nprec / NotPrecedes + '\u22e0': '⋠', # ⋠ / nprcue / NotPrecedesSlantEqual + '\u22eb': '⋫', # ⋫ / nrtri / ntriangleright / NotRightTriangle + '\u22ed': '⋭', # ⋭ / nrtrie / ntrianglerighteq / NotRightTriangleEqual + '\u22e2': '⋢', # ⋢ / nsqsube / NotSquareSubsetEqual + '\u22e3': '⋣', # ⋣ / nsqsupe / NotSquareSupersetEqual + '\u2288': '⊈', # ⊈ / nsube / nsubseteq / NotSubsetEqual + '\u2281': '⊁', # ⊁ / nsc / nsucc / NotSucceeds + '\u22e1': '⋡', # ⋡ / nsccue / NotSucceedsSlantEqual + '\u2289': '⊉', # ⊉ / nsupe / nsupseteq / NotSupersetEqual + '\u2241': '≁', # ≁ / nsim / NotTilde + '\u2244': '≄', # ≄ / nsime / nsimeq / NotTildeEqual + '\u21cf': '⇏', # ⇏ / nrArr / nRightarrow + '\u219b': '↛', # ↛ / nrarr / nrightarrow + '\u2196': '↖', # ↖ / nwarr / nwarrow / UpperLeftArrow + '\u2134': 'ℴ', # ℴ / oscr / order / orderof + '\u23b4': '⎴', # ⎴ / tbrk / OverBracket + '\u03d5': 'ϕ', # ϕ / phiv / varphi / straightphi + '\u2665': '♥', # ♥ / ♥ / ♥ / + '\u2119': 'ℙ', # ℙ / Popf / primes + '\u227a': '≺', # ≺ / pr / prec / Precedes + '\u2ab7': '⪷', # ⪷ / prap / precapprox + '\u227c': '≼', # ≼ / prcue / preccurlyeq / PrecedesSlantEqual + '\u2aaf': '⪯', # ⪯ / pre / preceq / PrecedesEqual + '\u227e': '≾', # ≾ / prsim / precsim / PrecedesTilde + '\u2ab9': '⪹', # ⪹ / prnap / precnapprox + '\u2ab5': '⪵', # ⪵ / prnE / precneqq + '\u22e8': '⋨', # ⋨ / prnsim / precnsim + '\u221d': '∝', # ∝ / ∝ / ∝ / ∝ / ∝ / ∝ + '\u211a': 'ℚ', # ℚ / Qopf / rationals + '\u21db': '⇛', # ⇛ / rAarr / Rrightarrow + '\u27e9': '⟩', # ⟩ / ⟩ / ⟩ / ⟩ + '\u21a0': '↠', # ↠ / Rarr / twoheadrightarrow + '\u21e5': '⇥', # ⇥ / rarrb / RightArrowBar + '\u21a3': '↣', # ↣ / rarrtl / rightarrowtail + '\u219d': '↝', # ↝ / rarrw / rightsquigarrow + + '\u211c': 'ℜ', # ℜ / ℜ / ℜ / ℜ / ℜ + '\u211b': 'ℛ', # ℛ / Rscr / realine + '\u211d': 'ℝ', # ℝ / Ropf / reals + '\u21c0': '⇀', # ⇀ / rharu / RightVector / rightharpoonup + '\u03f1': 'ϱ', # ϱ / rhov / varrho + '\u2192': '→', # → / → / → / → / → / → + '\u21c4': '⇄', # ⇄ / rlarr / rightleftarrows / RightArrowLeftArrow + '\u27e7': '⟧', # ⟧ / robrk / RightDoubleBracket + '\u21c9': '⇉', # ⇉ / rrarr / rightrightarrows + '\u22a2': '⊢', # ⊢ / vdash / RightTee + '\u22cc': '⋌', # ⋌ / rthree / rightthreetimes + '\u22b3': '⊳', # ⊳ / vrtri / RightTriangle / vartriangleright + '\u22b5': '⊵', # ⊵ / rtrie / trianglerighteq / RightTriangleEqual + '\u21be': '↾', # ↾ / uharr / RightUpVector / upharpoonright + '\u23b1': '⎱', # ⎱ / rmoust / rmoustache + '\u21b1': '↱', # ↱ / rsh / Rsh + '\u25b9': '▹', # ▹ / rtri / triangleright + '\u227b': '≻', # ≻ / sc / succ / Succeeds + '\u2ab8': '⪸', # ⪸ / scap / succapprox + '\u227d': '≽', # ≽ / sccue / succcurlyeq / SucceedsSlantEqual + '\u2ab0': '⪰', # ⪰ / sce / succeq / SucceedsEqual + '\u2aba': '⪺', # ⪺ / scnap / succnapprox + '\u2ab6': '⪶', # ⪶ / scnE / succneqq + '\u22e9': '⋩', # ⋩ / scnsim / succnsim + '\u227f': '≿', # ≿ / scsim / succsim / SucceedsTilde + '\u2929': '⤩', # ⤩ / tosa / seswar + '\u03c2': 'ς', # ς / ς / ς / ς + '\u2243': '≃', # ≃ / sime / simeq / TildeEqual + '\u2323': '⌣', # ⌣ / smile / ssmile + '\u2293': '⊓', # ⊓ / sqcap / SquareIntersection + '\u2294': '⊔', # ⊔ / sqcup / SquareUnion + '\u228f': '⊏', # ⊏ / sqsub / sqsubset / SquareSubset + '\u2291': '⊑', # ⊑ / sqsube / sqsubseteq / SquareSubsetEqual + '\u2290': '⊐', # ⊐ / sqsup / sqsupset / SquareSuperset + '\u2292': '⊒', # ⊒ / sqsupe / sqsupseteq / SquareSupersetEqual + '\u25a1': '□', # □ / squ / Square / square + '\u22c6': '⋆', # ⋆ / Star / sstarf + '\u22d0': '⋐', # ⋐ / Sub / Subset + '\u2ac5': '⫅', # ⫅ / subE / subseteqq + '\u2acb': '⫋', # ⫋ / subnE / subsetneqq + '\u228a': '⊊', # ⊊ / subne / subsetneq + '\u2286': '⊆', # ⊆ / ⊆ / ⊆ / ⊆ + '\u22d1': '⋑', # ⋑ / Sup / Supset + '\u2ac6': '⫆', # ⫆ / supE / supseteqq + '\u2283': '⊃', # ⊃ / ⊃ / ⊃ / ⊃ + '\u2287': '⊇', # ⊇ / ⊇ / ⊇ / ⊇ + '\u2acc': '⫌', # ⫌ / supnE / supsetneqq + '\u228b': '⊋', # ⊋ / supne / supsetneq + '\u20db': '⃛', # ⃛ / tdot / TripleDot + '\u2234': '∴', # ∴ / ∴ / ∴ / ∴ + '\u03d1': 'ϑ', # ϑ / ϑ / ϑ / ϑ + '\u25b5': '▵', # ▵ / utri / triangle + '\u225c': '≜', # ≜ / trie / triangleq + '\u21c5': '⇅', # ⇅ / udarr / UpArrowDownArrow + '\u296e': '⥮', # ⥮ / udhar / UpEquilibrium + '\u231c': '⌜', # ⌜ / ulcorn / ulcorner + '\u228e': '⊎', # ⊎ / uplus / UnionPlus + '\u2195': '↕', # ↕ / varr / updownarrow / UpDownArrow + '\u21c8': '⇈', # ⇈ / uuarr / upuparrows + '\u231d': '⌝', # ⌝ / urcorn / urcorner + '\u2016': '‖', # ‖ / Vert / Verbar + + '\u2240': '≀', # ≀ / wr / wreath / VerticalTilde + '\u2128': 'ℨ', # ℨ / Zfr / zeetrf } # === Динамическая генерация карт преобразования === diff --git a/tests/test_codec.py b/tests/test_codec.py index 8b5ed1d..33e0754 100644 --- a/tests/test_codec.py +++ b/tests/test_codec.py @@ -42,9 +42,9 @@ STRINGS_FOR_DECODE = [ ("ο ⊕ ∨ ª º ø õ ⊗ ö", "ο ⊕ ∨ ª º ø õ ⊗ ö"), ("¶ ∂ ‰ ⊥ φ π ϖ ± £ ′ ∏", "¶ ∂ ‰ ⊥ φ π ϖ ± £ ′ ∏"), ("∝ ψ " ⇒ √ ⟩ » → ⌉ ”", "∝ ψ \" ⇒ √ ⟩ » → ⌉ ”"), - ("ℜ ® ⌋ ρ ‏ › ’ ‚ š", "ℜ ® ⌋ ρ \u200f › ’ ‚ š"), - ("⋅ § ­ σ ς ∼ ♠ ⊂ ⊆ ∑", "⋅ § \u00AD σ ς ∼ ♠ ⊂ ⊆ ∑"), - ("⊃ ¹ ² ³ ⊇ ß τ ∴ θ ϑ", "⊃ ¹ ² ³ ⊇ ß τ ∴ θ ϑ"), + ("ℜ ® ⌋ ρ ‏ › ’ ‚ š", "ℜ ® ⌋ ρ \u200f › ’ ‚ š"), + ("⋅ § ­ σ ς ∼ ♠ ⊂ ⊆ ∑", "⋅ § \u00AD σ ς ∼ ♠ ⊂ ⊆ ∑"), + ("⊃ ¹ ² ³ ⊇ ß τ ∴ θ ϑ", "⊃ ¹ ² ³ ⊇ ß τ ∴ θ ϑ"), ("  þ ˜ × ™ ⇑ ú ↑ û", "\u2009 þ ˜ × ™ ⇑ ú ↑ û"), ("ù ¨ ϒ υ ü ℘ ξ ý ¥ ÿ", "ù ¨ ϒ υ ü ℘ ξ ý ¥ ÿ"), ("ζ ‍ ‌ + = %", "ζ \u200D \u200C + = %"), @@ -79,7 +79,7 @@ STRINGS_FOR_DECODE = [ ("Χ χ ○ ˆ ≗ ↺ ↻", "Χ χ ○ ˆ ≗ ↺ ↻"), ("⊛ ⊚ ⊝ ⊙ ® Ⓢ", "⊛ ⊚ ⊝ ⊙ ® Ⓢ"), ("⊖ ⊕ ⊗ ⧃ ≗ ⨐ ⫯", "⊖ ⊕ ⊗ ⧃ ≗ ⨐ ⫯"), - ("⧂ ∲ ” ’", "⧂ ∲ ” ’"), + ("⧂ ∲ ” ’", "⧂ ∲ ” ’"), ("♣ ♣ ∷ : ⩴ ≔ ≔ , @", "♣ ♣ ∷ : ⩴ ≔ ≔ , @"), ("∁ ∘ ∁ ℂ ≅ ⩭ ≡", "∁ ∘ ∁ ℂ ≅ ⩭ ≡"), ("∯ ∮ ∮ ℂ 𝕔 ∐ ∐", "∯ ∮ ∮ ℂ 𝕔 ∐ ∐"), @@ -234,7 +234,7 @@ STRINGS_FOR_DECODE = [ ("⨷ ⊗ ⨶ Ö ö Ö ö ⌽ ‾", "⨷ ⊗ ⨶ Ö ö Ö ö ⌽ ‾"), ("⏞ ⎴ ⏜ ∥ ¶ ¶ ∥", "⏞ ⎴ ⏜ ∥ ¶ ¶ ∥"), ("⫳ ⫽ ∂ ∂ П п % . ‰", "⫳ ⫽ ∂ ∂ П п % . ‰"), - ("⊥ ‱ 𝔓 𝔭 Φ φ ϕ ℳ ☎ Π π", "⊥ ‱ 𝔓 𝔭 Φ φ ϕ ℳ ☎ Π π"), + ("⊥ ‱ 𝔓 𝔭 Φ φ ϕ ℳ ☎ Π π", "⊥ ‱ 𝔓 𝔭 Φ φ ϕ ℳ ☎ Π π"), ("⋔ ϖ ℏ ℎ ℏ + ⨣ ⊞", "⋔ ϖ ℏ ℎ ℏ + ⨣ ⊞"), ("⨢ ∔ ⨥ ⩲ ± ± ± ⨦", "⨢ ∔ ⨥ ⩲ ± ± ± ⨦"), ("⨧ ± ℌ ⨕ ℙ 𝕡 £ £ ⪻", "⨧ ± ℌ ⨕ ℙ 𝕡 £ £ ⪻"), @@ -272,7 +272,7 @@ STRINGS_FOR_DECODE = [ ("⤥ ⇘ ↘ ↘ § § ; ⤩ ∖", "⤥ ⇘ ↘ ↘ § § ; ⤩ ∖"), ("∖ ✶ 𝔖 𝔰 ⌢ ♯ Щ щ Ш ш", "∖ ✶ 𝔖 𝔰 ⌢ ♯ Щ щ Ш ш"), ("↓ ← ∣ ∥ →", "↓ ← ∣ ∥ →"), - ("↑ ­ Σ σ ς ς ∼ ⩪", "↑ \u00AD Σ σ ς ς ∼ ⩪"), + ("↑ ­ Σ σ ς ς ∼ ⩪", "↑ \u00AD Σ σ ς ς ∼ ⩪"), ("≃ ≃ ⪞ ⪠ ⪝ ⪟ ≆ ⨤ ⥲", "≃ ≃ ⪞ ⪠ ⪝ ⪟ ≆ ⨤ ⥲"), ("← ∘ ∖ ⨳ ⧤ ∣ ⌣ ⪪", "← ∘ ∖ ⨳ ⧤ ∣ ⌣ ⪪"), ("⪬ ⪬︀ Ь ь / ⧄ ⌿ 𝕊 𝕤 ♠", "⪬ ⪬︀ Ь ь / ⧄ ⌿ 𝕊 𝕤 ♠"), @@ -315,7 +315,7 @@ STRINGS_FOR_DECODE = [ ("𝒰 𝓊 ⋰ Ũ ũ ▵ ▴ ⇈ Ü ü", "𝒰 𝓊 ⋰ Ũ ũ ▵ ▴ ⇈ Ü ü"), ("Ü ü ⦧ ⦜ ϵ ϰ ∅ ϕ", "Ü ü ⦧ ⦜ ϵ ϰ ∅ ϕ"), ("ϖ ∝ ⇕ ↕ ϱ ς ⊊︀", "ϖ ∝ ⇕ ↕ ϱ ς ⊊︀"), - ("⫋︀ ⊋︀ ⫌︀ ϑ ⊲", "⫋︀ ⊋︀ ⫌︀ ϑ ⊲"), + ("⫋︀ ⊋︀ ⫌︀ ϑ ⊲", "⫋︀ ⊋︀ ⫌︀ ϑ ⊲"), ("⊳ ⫫ ⫨ ⫩ В в ⊫ ⊩ ⊨", "⊳ ⫫ ⫨ ⫩ В в ⊫ ⊩ ⊨"), ("⊢ ⫦ ⋁ ∨ ⊻ ≚ ⋮ ‖ |", "⊢ ⫦ ⋁ ∨ ⊻ ≚ ⋮ ‖ |"), ("‖ | ∣ | ❘ ≀", "‖ | ∣ | ❘ ≀"), @@ -351,7 +351,7 @@ STRINGS_FOR_ENCODE = [ ("< > & \"", "< > & ""), # Самый простой набор HTML-мнемоников ("\u00AD", "­"), # Мягкий перенос ("\u00A0\u2002\u2003\u2009\u200D\u200C", "    ‍‌"), # Набор пробелов и невидимых символов - ("– — ‐ ―", "– — ‐ ―"), # Набор тире и дефисов + ("– — ‐ ―", "– — ‐ ―"), # Набор тире и дефисов ("$ ¢ £ ¤ ¥ € ₽", "$ ¢ £ ¤ ¥ € ₽"), # Валютные символы ("֏ ₽ ₴ ₸ ₹ ₼ ₾", "֏ ₽ ₴ ₸ ₹ ₼ ₾"), # Валютные символы # Набор из html.entities.name2codepoint @@ -362,25 +362,25 @@ STRINGS_FOR_ENCODE = [ ("Ω Ο Ø Õ Φ Π ″ Ψ Ρ Š", "Ω Ο Ø Õ Φ Π ″ Ψ Ρ Š"), ("Σ Þ Τ Θ Ú Û Ù Υ Ü", "Σ Þ Τ Θ Ú Û Ù Υ Ü"), ("Ξ Ý Ÿ Ζ á â ´ æ à", "Ξ Ý Ÿ Ζ á â ´ æ à"), - ("ℵ α & ∧ ∠ ' å ≈ ã ä", "ℵ α & ∧ ∠ ' å ≈ ã ä"), + ("ℵ α & ∧ ∠ ' å ≈ ã ä", "ℵ α & ∧ ∠ ' å ≈ ã ä"), ("„ β ¦ • ∩ ç ¸ ¢ χ ˆ", "„ β ¦ • ∩ ç ¸ ¢ χ ˆ"), ("♣ ≅ © ↵ ∪ ¤ ⇓ † ↓ °", "♣ ≅ © ↵ ∪ ¤ ⇓ † ↓ °"), ("δ ♦ ÷ é ê è ∅ \u2003 \u2002", "δ ♦ ÷ é ê è ∅    "), - ("ε ≡ η ð ë € ∃ ƒ ∀ ½", "ε ≡ η ð ë € ∃ ƒ ∀ ½"), - ("¼ ¾ ⁄ γ ≥ > ⇔ ↔ ♥ …", "¼ ¾ ⁄ γ ≥ > ⇔ ↔ ♥ …"), - ("í î ¡ ì ℑ ∞ ∫ ι ¿ ∈", "í î ¡ ì ℑ ∞ ∫ ι ¿ ∈"), + ("ε ≡ η ð ë € ∃ ƒ ∀ ½", "ε ≡ η ð ë € ∃ ƒ ∀ ½"), + ("¼ ¾ ⁄ γ ≥ > ⇔ ↔ ♥ …", "¼ ¾ ⁄ γ ≥ > ⇔ ↔ ♥ …"), + ("í î ¡ ì ℑ ∞ ∫ ι ¿ ∈", "í î ¡ ì ℑ ∞ ∫ ι ¿ ∈"), ("ï κ ⇐ λ ⟨ « ← ⌈ “ ≤", "ï κ ⇐ λ ⟨ « ← ⌈ “ ≤"), ("⌊ ∗ ◊ \u200e ‹ ‘ < ¯ — µ", "⌊ ∗ ◊ ‎ ‹ ‘ < ¯ — µ"), - ("· − μ ∇ \u00A0 – ≠ ∋ ¬ ∉", "· − μ ∇   – ≠ ∋ ¬ ∉"), + ("· − μ ∇ \u00A0 – ≠ ∋ ¬ ∉", "· − μ ∇   – ≠ ∋ ¬ ∉"), ("⊄ ñ ν ó ô œ ò ‾ ω", "⊄ ñ ν ó ô œ ò ‾ ω"), ("ο ⊕ ∨ ª º ø õ ⊗ ö", "ο ⊕ ∨ ª º ø õ ⊗ ö"), - ("¶ ∂ ‰ ⊥ φ π ϖ ± £ ′ ∏", "¶ ∂ ‰ ⊥ φ π ϖ ± £ ′ ∏"), + ("¶ ∂ ‰ ⊥ φ π ϖ ± £ ′ ∏", "¶ ∂ ‰ ⊥ φ π ϖ ± £ ′ ∏"), ("∝ ψ \" ⇒ √ ⟩ » → ⌉ ”", "∝ ψ " ⇒ √ ⟩ » → ⌉ ”"), - ("ℜ ® ⌋ ρ \u200f › ’ ‚ š", "ℜ ® ⌋ ρ ‏ › ’ ‚ š"), + ("ℜ ® ⌋ ρ \u200f › ’ ‚ š", "ℜ ® ⌋ ρ ‏ › ’ ‚ š"), ("⋅ § \u00AD σ ς ∼ ♠ ⊂ ⊆ ∑", "⋅ § ­ σ ς ∼ ♠ ⊂ ⊆ ∑"), - ("⊃ ¹ ² ³ ⊇ ß τ ∴ θ ϑ", "⊃ ¹ ² ³ ⊇ ß τ ∴ θ ϑ"), + ("⊃ ¹ ² ³ ⊇ ß τ ∴ θ ϑ", "⊃ ¹ ² ³ ⊇ ß τ ∴ θ ϑ"), ("\u2009 þ ˜ × ™ ⇑ ú ↑ û", "  þ ˜ × ™ ⇑ ú ↑ û"), - ("ù ¨ ϒ υ ü ℘ ξ ý ¥ ÿ", "ù ¨ ϒ υ ü ℘ ξ ý ¥ ÿ"), + ("ù ¨ ϒ υ ü ℘ ξ ý ¥ ÿ", "ù ¨ ϒ υ ü ℘ ξ ý ¥ ÿ"), ("ζ \u200D \u200C + = %", "ζ ‍ ‌ + = %"), # Набор из html.entities.html5 ("Á á Á á Ă ă ∾ ∿ Â", "Á á Á á Ă ă ∾ ∿ Â"), @@ -390,114 +390,114 @@ STRINGS_FOR_ENCODE = [ ("⩕ ⩜ ⩘ ⩚ ∠ ⦤ ∠ ∡ ⦨", "⩕ ⩜ ⩘ ⩚ ∠ ⦤ ∠ ∡ ⦨"), ("⦩ ⦪ ⦫ ⦬ ⦭ ⦮ ⦯", "⦩ ⦪ ⦫ ⦬ ⦭ ⦮ ⦯"), ("∟ ⊾ ⦝ ∢ Å ⍼ Ą ą 𝔸", "∟ ⊾ ⦝ ∢ Å ⍼ Ą ą 𝔸"), - ("𝕒 ≈ ⩯ ⩰ ≊ ≋ ' \u2061 ≈", "𝕒 ≈ ⩯ ⩰ ≊ ≋ ' ⁡ ≈"), + ("𝕒 ≈ ⩯ ⩰ ≊ ≋ ' \u2061 ≈", "𝕒 ≈ ⩯ ⩰ ≊ ≋ ' ⁡ ≈"), ("≊ Å å Å å 𝒜 𝒶 ≔ *", "≊ Å å Å å 𝒜 𝒶 ≔ *"), - ("≈ ≍ à ã à ã Ä ä Ä", "≈ ≍ à ã à ã Ä ä Ä"), + ("≈ ≍ à ã à ã Ä ä Ä", "≈ ≍ à ã à ã Ä ä Ä"), ("ä ∳ ⨑ ≌ ϶ ‵ ∽", "ä ∳ ⨑ ≌ ϶ ‵ ∽"), - ("⋍ ∖ ⫧ ⊽ ⌆ ⌅ ⌅ ⎵", "⋍ ∖ ⫧ ⊽ ⌆ ⌅ ⌅ ⎵"), + ("⋍ ∖ ⫧ ⊽ ⌆ ⌅ ⌅ ⎵", "⋍ ∖ ⫧ ⊽ ⌆ ⌅ ⌅ ⎵"), ("⎶ ≌ Б б „ ∵ ⦰", "⎶ ≌ Б б „ ∵ ⦰"), - ("϶ ℬ ℬ Β β ℶ ≬ 𝔅 𝔟", "϶ ℬ ℬ Β β ℶ ≬ 𝔅 𝔟"), - ("⋂ ◯ ⋃ ⨀ ⨁ ⨂ ⨆", "⋂ ◯ ⋃ ⨀ ⨁ ⨂ ⨆"), - ("★ ▽ △ ⨄ ⋁ ⋀", "★ ▽ △ ⨄ ⋁ ⋀"), - ("⤍ ⧫ ▪ ▴ ▾", "⤍ ⧫ ▪ ▴ ▾"), - ("◂ ▸ ␣ ▒ ░ ▓", "◂ ▸ ␣ ▒ ░ ▓"), - ("█ ⫭ ⌐ 𝔹 𝕓 ⊥ ⊥ ⋈ ⧉ ╗", "█ ⫭ ⌐ 𝔹 𝕓 ⊥ ⊥ ⋈ ⧉ ╗"), + ("϶ ℬ ℬ Β β ℶ ≬ 𝔅 𝔟", "϶ ℬ ℬ Β β ℶ ≬ 𝔅 𝔟"), + ("⋂ ◯ ⋃ ⨀ ⨁ ⨂ ⨆", "⋂ ◯ ⋃ ⨀ ⨁ ⨂ ⨆"), + ("★ ▽ △ ⨄ ⋁ ⋀", "★ ▽ △ ⨄ ⋁ ⋀"), + ("⤍ ⧫ ▪ ▴ ▾", "⤍ ⧫ ▪ ▴ ▾"), + ("◂ ▸ ␣ ▒ ░ ▓", "◂ ▸ ␣ ▒ ░ ▓"), + ("█ ⫭ ⌐ 𝔹 𝕓 ⊥ ⊥ ⋈ ⧉ ╗", "█ ⫭ ⌐ 𝔹 𝕓 ⊥ ⊥ ⋈ ⧉ ╗"), ("╖ ╕ ┐ ╔ ╓ ╒ ┌ ═ ─ ╦", "╖ ╕ ┐ ╔ ╓ ╒ ┌ ═ ─ ╦"), - ("╤ ╥ ┬ ╩ ╧ ╨ ┴ ⊟ ⊞", "╤ ╥ ┬ ╩ ╧ ╨ ┴ ⊟ ⊞"), - ("⊠ ╝ ╜ ╛ ┘ ╚ ╙ ╘ └", "⊠ ╝ ╜ ╛ ┘ ╚ ╙ ╘ └"), + ("╤ ╥ ┬ ╩ ╧ ╨ ┴ ⊟ ⊞", "╤ ╥ ┬ ╩ ╧ ╨ ┴ ⊟ ⊞"), + ("⊠ ╝ ╜ ╛ ┘ ╚ ╙ ╘ └", "⊠ ╝ ╜ ╛ ┘ ╚ ╙ ╘ └"), ("║ │ ╬ ╫ ╪ ┼ ╣ ╢ ╡ ┤", "║ │ ╬ ╫ ╪ ┼ ╣ ╢ ╡ ┤"), ("╠ ╟ ╞ ├ ‵ ˘ ˘ ¦ ¦", "╠ ╟ ╞ ├ ‵ ˘ ˘ ¦ ¦"), ("ℬ 𝒷 ⁏ ∽ ⋍ \\ ⧅ ⟈ • •", "ℬ 𝒷 ⁏ ∽ ⋍ \\ ⧅ ⟈ • •"), ("≎ ⪮ ≏ ≎ ≏ Ć ć ⋒ ∩", "≎ ⪮ ≏ ≎ ≏ Ć ć ⋒ ∩"), - ("⩄ ⩉ ⩋ ⩇ ⩀ ⅅ ⁁", "⩄ ⩉ ⩋ ⩇ ⩀ ⅅ ⁁"), + ("⩄ ⩉ ⩋ ⩇ ⩀ ⅅ ⁁", "⩄ ⩉ ⩋ ⩇ ⩀ ⅅ ⁁"), ("ˇ ℭ ⩍ Č č Ç ç Ç", "ˇ ℭ ⩍ Č č Ç ç Ç"), ("ç Ĉ ĉ ∰ ⩌ ⩐ Ċ ċ ¸", "ç Ĉ ĉ ∰ ⩌ ⩐ Ċ ċ ¸"), ("¸ ¸ ⦲ ¢ ¢ · · ℭ 𝔠", "¸ ¸ ⦲ ¢ ¢ · · ℭ 𝔠"), - # ("Ч ч ✓ ✓ Χ χ ○ ˆ ≗", "Ч ч ✓ ✓ Χ χ ○ ˆ ≗"), - # ("↺ ↻ ⊛ ⊚ ⊝", "↺ ↻ ⊛ ⊚ ⊝"), - # ("⊙ ® Ⓢ ⊖ ⊕ ⊗", "⊙ ® Ⓢ ⊖ ⊕ ⊗"), - # ("⧃ ≗ ⨐ ⫯ ⧂ ∲", "⧃ ≗ ⨐ ⫯ ⧂ ∲"), - # ("” ’ ♣ ♣ ∷ :", "” ’ ♣ ♣ ∷ :"), - # ("⩴ ≔ ≔ , @ ∁ ∘ ∁", "⩴ ≔ ≔ , @ ∁ ∘ ∁"), - # ("ℂ ≅ ⩭ ≡ ∯ ∮ ∮", "ℂ ≅ ⩭ ≡ ∯ ∮ ∮"), - # ("ℂ 𝕔 ∐ ∐ © © © © ℗", "ℂ 𝕔 ∐ ∐ © © © © ℗"), - # ("∳ ↵ ⨯ ✗ 𝒞 𝒸 ⫏", "∳ ↵ ⨯ ✗ 𝒞 𝒸 ⫏"), - # ("⫑ ⫐ ⫒ ⋯ ⤸ ⤵ ⋞ ⋟ ↶", "⫑ ⫐ ⫒ ⋯ ⤸ ⤵ ⋞ ⋟ ↶"), - # ("⤽ ⋓ ∪ ⩈ ≍ ⩆ ⩊ ⊍ ⩅", "⤽ ⋓ ∪ ⩈ ≍ ⩆ ⩊ ⊍ ⩅"), - # ("↷ ⤼ ⋞ ⋟ ⋎ ⋏", "↷ ⤼ ⋞ ⋟ ⋎ ⋏"), - # ("¤ ¤ ↶ ↷ ⋎ ⋏", "¤ ¤ ↶ ↷ ⋎ ⋏"), - # ("∲ ∱ ⌭ ‡ † ℸ ↡ ⇓ ↓", "∲ ∱ ⌭ ‡ † ℸ ↡ ⇓ ↓"), - # ("‐ ⫤ ⊣ ⤏ ˝ Ď ď Д д ⅅ", "‐ ⫤ ⊣ ⤏ ˝ Ď ď Д д ⅅ"), - # ("ⅆ ‡ ⇊ ⤑ ⩷ ° ° ∇ Δ δ", "ⅆ ‡ ⇊ ⤑ ⩷ ° ° ∇ Δ δ"), - # ("⦱ ⥿ 𝔇 𝔡 ⥥ ⇃ ⇂ ´", "⦱ ⥿ 𝔇 𝔡 ⥥ ⇃ ⇂ ´"), - # ("˙ ˝ `", "˙ ˝ `"), - # ("˜ ⋄ ⋄ ⋄ ♦ ♦ ¨", "˜ ⋄ ⋄ ⋄ ♦ ♦ ¨"), - # ("ⅆ ϝ ⋲ ÷ ÷ ÷ ⋇", "ⅆ ϝ ⋲ ÷ ÷ ÷ ⋇"), - # ("⋇ Ђ ђ ⌞ ⌍ $ 𝔻 𝕕 ¨ ˙", "⋇ Ђ ђ ⌞ ⌍ $ 𝔻 𝕕 ¨ ˙"), - # ("⃜ ≐ ≑ ≐ ∸ ∔ ⊡", "⃜ ≐ ≑ ≐ ∸ ∔ ⊡"), - # ("⌆ ∯ ¨ ⇓", "⌆ ∯ ¨ ⇓"), - # ("⇐ ⇔ ⫤ ⟸", "⇐ ⇔ ⫤ ⟸"), - # ("⟺ ⟹ ⇒", "⟺ ⟹ ⇒"), - # ("⊨ ⇑ ⇕ ∥", "⊨ ⇑ ⇕ ∥"), - # ("↓ ⇓ ↓ ⤓ ⇵", "↓ ⇓ ↓ ⤓ ⇵"), - # ("̑ ⇊ ⇃ ⇂", "̑ ⇊ ⇃ ⇂"), - # ("⥐ ⥞ ↽ ⥖", "⥐ ⥞ ↽ ⥖"), - # ("⥟ ⇁ ⥗ ⊤", "⥟ ⇁ ⥗ ⊤"), - # ("↧ ⤐ ⌟ ⌌ 𝒟 𝒹 Ѕ ѕ ⧶", "↧ ⤐ ⌟ ⌌ 𝒟 𝒹 Ѕ ѕ ⧶"), - # ("Đ đ ⋱ ▿ ▾ ⇵ ⥯ ⦦ Џ", "Đ đ ⋱ ▿ ▾ ⇵ ⥯ ⦦ Џ"), - # ("џ ⟿ É é É é ⩮ Ě", "џ ⟿ É é É é ⩮ Ě"), - # ("ě ≖ Ê ê Ê ê ≕ Э э ⩷", "ě ≖ Ê ê Ê ê ≕ Э э ⩷"), - # ("Ė ≑ ė ⅇ ≒ 𝔈 𝔢 ⪚ È è È", "Ė ≑ ė ⅇ ≒ 𝔈 𝔢 ⪚ È è È"), - # ("è ⪖ ⪘ ⪙ ∈ ⏧ ℓ ⪕ ⪗ Ē", "è ⪖ ⪘ ⪙ ∈ ⏧ ℓ ⪕ ⪗ Ē"), - # ("ē ∅ ∅ ◻ ∅ ▫", "ē ∅ ∅ ◻ ∅ ▫"), - # ("      Ŋ ŋ   Ę ę 𝔼 𝕖", "      Ŋ ŋ   Ę ę 𝔼 𝕖"), - # ("⋕ ⧣ ⩱ ε Ε ε ϵ ≖ ≕", "⋕ ⧣ ⩱ ε Ε ε ϵ ≖ ≕"), - # ("≂ ⪖ ⪕ ⩵ = ≂ ≟", "≂ ⪖ ⪕ ⩵ = ≂ ≟"), - # ("⇌ ≡ ⩸ ⧥ ⥱ ≓ ℰ ℯ", "⇌ ≡ ⩸ ⧥ ⥱ ≓ ℰ ℯ"), - # ("≐ ⩳ ≂ Η η Ð ð Ð ð Ë ë Ë", "≐ ⩳ ≂ Η η Ð ð Ð ð Ë ë Ë"), - # ("ë € ! ∃ ∃ ℰ ⅇ", "ë € ! ∃ ∃ ℰ ⅇ"), - # ("ⅇ ≒ Ф ф ♀ ffi ff ffl", "ⅇ ≒ Ф ф ♀ ffi ff ffl"), - # ("𝔉 𝔣 fi ◼ ▪ ♭ fl", "𝔉 𝔣 fi ◼ ▪ ♭ fl"), - # ("▱ ƒ 𝔽 𝕗 ∀ ∀ ⋔ ⫙ ℱ", "▱ ƒ 𝔽 𝕗 ∀ ∀ ⋔ ⫙ ℱ"), - # ("⨍ ½ ½ ⅓ ¼ ¼ ⅕ ⅙", "⨍ ½ ½ ⅓ ¼ ¼ ⅕ ⅙"), - # ("⅛ ⅔ ⅖ ¾ ¾ ⅗ ⅜ ⅘", "⅛ ⅔ ⅖ ¾ ¾ ⅗ ⅜ ⅘"), - # ("⅚ ⅝ ⅞ ⁄ ⌢ ℱ 𝒻 ǵ Γ", "⅚ ⅝ ⅞ ⁄ ⌢ ℱ 𝒻 ǵ Γ"), - # ("γ Ϝ ϝ ⪆ Ğ ğ Ģ Ĝ ĝ", "γ Ϝ ϝ ⪆ Ğ ğ Ģ Ĝ ĝ"), - # ("Г г Ġ ġ ≧ ≥ ⪌ ⋛ ≥ ≧ ⩾ ⩾", "Г г Ġ ġ ≧ ≥ ⪌ ⋛ ≥ ≧ ⩾ ⩾"), - # ("⪩ ⪀ ⪂ ⪄ ⪔ 𝔊 𝔤 ⋙ ≫ ⋙", "⪩ ⪀ ⪂ ⪄ ⪔ 𝔊 𝔤 ⋙ ≫ ⋙"), - # ("ℷ Ѓ ѓ ≷ ⪥ ⪒ ⪤ ⪊ ⪊ ≩ ⪈", "ℷ Ѓ ѓ ≷ ⪥ ⪒ ⪤ ⪊ ⪊ ≩ ⪈"), - # ("⪈ ≩ ⋧ 𝔾 𝕘 ` ≥ ⋛", "⪈ ≩ ⋧ 𝔾 𝕘 ` ≥ ⋛"), - # ("≧ ⪢ ≷ ⩾", "≧ ⪢ ≷ ⩾"), - # ("≳ 𝒢 ℊ ≳ ⪎ ⪐ > > > ≫ >", "≳ 𝒢 ℊ ≳ ⪎ ⪐ > > > ≫ >"), - # ("⪧ ⩺ ⋗ ⦕ ⩼ ⪆ ⥸ ⋗", "⪧ ⩺ ⋗ ⦕ ⩼ ⪆ ⥸ ⋗"), - # ("⋛ ⪌ ≷ ≳ ˇ   ½ ℋ", "⋛ ⪌ ≷ ≳ ˇ   ½ ℋ"), - # ("Ъ ъ ⇔ ↔ ⥈ ↭ ^ ℏ Ĥ ĥ", "Ъ ъ ⇔ ↔ ⥈ ↭ ^ ℏ Ĥ ĥ"), - # ("♥ ♥ … ⊹ ℌ 𝔥 ℋ ⤥", "♥ ♥ … ⊹ ℌ 𝔥 ℋ ⤥"), - # ("⤦ ⇿ ∻ ↩ ↪ ℍ 𝕙", "⤦ ⇿ ∻ ↩ ↪ ℍ 𝕙"), - # ("― ─ ℋ 𝒽 ℏ Ħ ħ", "― ─ ℋ 𝒽 ℏ Ħ ħ"), - # ("≎ ≏ ⁃ ‐ Í í Í", "≎ ≏ ⁃ ‐ Í í Í"), - # ("í ⁣ Î î Î î И и İ Е е", "í ⁣ Î î Î î И и İ Е е"), - # ("¡ ¡ ⇔ ℑ 𝔦 Ì ì Ì ì ⅈ", "¡ ¡ ⇔ ℑ 𝔦 Ì ì Ì ì ⅈ"), - # ("⨌ ∭ ⧜ ℩ IJ ij ℑ Ī ī ℑ", "⨌ ∭ ⧜ ℩ IJ ij ℑ Ī ī ℑ"), - # ("ⅈ ℐ ℑ ı ⊷ Ƶ ⇒ ∈", "ⅈ ℐ ℑ ı ⊷ Ƶ ⇒ ∈"), - # ("℅ ∞ ⧝ ı ∬ ∫ ⊺ ℤ", "℅ ∞ ⧝ ı ∬ ∫ ⊺ ℤ"), - # ("∫ ⊺ ⋂ ⨗ ⨼ ⁣", "∫ ⊺ ⋂ ⨗ ⨼ ⁣"), - # ("⁢ Ё ё Į į 𝕀 𝕚 Ι ι", "⁢ Ё ё Į į 𝕀 𝕚 Ι ι"), - # ("⨼ ¿ ¿ ℐ 𝒾 ∈ ⋵ ⋹ ⋴", "⨼ ¿ ¿ ℐ 𝒾 ∈ ⋵ ⋹ ⋴"), - # ("⋳ ∈ ⁢ Ĩ ĩ І і Ï ï Ï", "⋳ ∈ ⁢ Ĩ ĩ І і Ï ï Ï"), - # ("ï Ĵ ĵ Й й 𝔍 𝔧 ȷ 𝕁 𝕛 𝒥", "ï Ĵ ĵ Й й 𝔍 𝔧 ȷ 𝕁 𝕛 𝒥"), - # ("𝒿 Ј ј Є є Κ κ ϰ Ķ", "𝒿 Ј ј Є є Κ κ ϰ Ķ"), - # ("ķ К к 𝔎 𝔨 ĸ Х х Ќ ќ 𝕂", "ķ К к 𝔎 𝔨 ĸ Х х Ќ ќ 𝕂"), - # ("𝕜 𝒦 𝓀 ⇚ Ĺ ĺ ⦴ ℒ Λ", "𝕜 𝒦 𝓀 ⇚ Ĺ ĺ ⦴ ℒ Λ"), - # ("λ ⟪ ⟨ ⦑ ⟨ ⪅ ℒ « «", "λ ⟪ ⟨ ⦑ ⟨ ⪅ ℒ « «"), - # ("↞ ⇐ ← ⇤ ⤟ ⤝ ↩ ↫ ⤹", "↞ ⇐ ← ⇤ ⤟ ⤝ ↩ ↫ ⤹"), - # ("⥳ ↢ ⪫ ⤛ ⤙ ⪭ ⤎ ⤌ ❲", "⥳ ↢ ⪫ ⤛ ⤙ ⪭ ⤎ ⤌ ❲"), - # ("{ [ ⦋ ⦏ ⦍ Ľ ľ Ļ", "{ [ ⦋ ⦏ ⦍ Ľ ľ Ļ"), - # ("ļ ⌈ { Л л ⤶ “ „ ⥧", "ļ ⌈ { Л л ⤶ “ „ ⥧"), - # ("⥋ ↲ ≦ ≤ ⟨ ← ⇐", "⥋ ↲ ≦ ≤ ⟨ ← ⇐"), - # ("← ⇤ ⇆ ↢ ⌈", "← ⇤ ⇆ ↢ ⌈"), - # ("⟦ ⥡ ⇃ ⥙", "⟦ ⥡ ⇃ ⥙"), - # ("⌊ ↽ ↼ ⇇", "⌊ ↽ ↼ ⇇"), + ("Ч ч ✓ ✓ Χ χ ○ ˆ ≗", "Ч ч ✓ ✓ Χ χ ○ ˆ ≗"), + ("↺ ↻ ⊛ ⊚ ⊝", "↺ ↻ ⊛ ⊚ ⊝"), + ("⊙ ® Ⓢ ⊖ ⊕ ⊗", "⊙ ® Ⓢ ⊖ ⊕ ⊗"), + ("⧃ ≗ ⨐ ⫯ ⧂ ∲", "⧃ ≗ ⨐ ⫯ ⧂ ∲"), + ("” ’ ♣ ♣ ∷ :", "” ’ ♣ ♣ ∷ :"), + ("⩴ ≔ ≔ , @ ∁ ∘ ∁", "⩴ ≔ ≔ , @ ∁ ∘ ∁"), + ("ℂ ≅ ⩭ ≡ ∯ ∮ ∮", "ℂ ≅ ⩭ ≡ ∯ ∮ ∮"), + ("ℂ 𝕔 ∐ ∐ © © © © ℗", "ℂ 𝕔 ∐ ∐ © © © © ℗"), + ("∳ ↵ ⨯ ✗ 𝒞 𝒸 ⫏", "∳ ↵ ⨯ ✗ 𝒞 𝒸 ⫏"), + ("⫑ ⫐ ⫒ ⋯ ⤸ ⤵ ⋞ ⋟ ↶", "⫑ ⫐ ⫒ ⋯ ⤸ ⤵ ⋞ ⋟ ↶"), + ("⤽ ⋓ ∪ ⩈ ≍ ⩆ ⩊ ⊍ ⩅", "⤽ ⋓ ∪ ⩈ ≍ ⩆ ⩊ ⊍ ⩅"), + ("↷ ⤼ ⋞ ⋟ ⋎ ⋏", "↷ ⤼ ⋞ ⋟ ⋎ ⋏"), + ("¤ ¤ ↶ ↷ ⋎ ⋏", "¤ ¤ ↶ ↷ ⋎ ⋏"), + ("∲ ∱ ⌭ ‡ † ℸ ↡ ⇓ ↓", "∲ ∱ ⌭ ‡ † ℸ ↡ ⇓ ↓"), + ("‐ ⫤ ⊣ ⤏ ˝ Ď ď Д д ⅅ", "‐ ⫤ ⊣ ⤏ ˝ Ď ď Д д ⅅ"), + ("ⅆ ‡ ⇊ ⤑ ⩷ ° ° ∇ Δ δ", "ⅆ ‡ ⇊ ⤑ ⩷ ° ° ∇ Δ δ"), + ("⦱ ⥿ 𝔇 𝔡 ⥥ ⇃ ⇂ ´", "⦱ ⥿ 𝔇 𝔡 ⥥ ⇃ ⇂ ´"), + ("˙ ˝ `", "˙ ˝ `"), + ("˜ ⋄ ⋄ ⋄ ♦ ♦ ¨", "˜ ⋄ ⋄ ⋄ ♦ ♦ ¨"), + ("ⅆ ϝ ⋲ ÷ ÷ ÷ ⋇", "ⅆ ϝ ⋲ ÷ ÷ ÷ ⋇"), + ("⋇ Ђ ђ ⌞ ⌍ $ 𝔻 𝕕 ¨ ˙", "⋇ Ђ ђ ⌞ ⌍ $ 𝔻 𝕕 ¨ ˙"), + ("⃜ ≐ ≑ ≐ ∸ ∔ ⊡", "⃜ ≐ ≑ ≐ ∸ ∔ ⊡"), + ("⌆ ∯ ¨ ⇓", "⌆ ∯ ¨ ⇓"), + ("⇐ ⇔ ⫤ ⟸", "⇐ ⇔ ⫤ ⟸"), + ("⟺ ⟹ ⇒", "⟺ ⟹ ⇒"), + ("⊨ ⇑ ⇕ ∥", "⊨ ⇑ ⇕ ∥"), + ("↓ ⇓ ↓ ⤓ ⇵", "↓ ⇓ ↓ ⤓ ⇵"), + ("̑ ⇊ ⇃ ⇂", "̑ ⇊ ⇃ ⇂"), + ("⥐ ⥞ ↽ ⥖", "⥐ ⥞ ↽ ⥖"), + ("⥟ ⇁ ⥗ ⊤", "⥟ ⇁ ⥗ ⊤"), + ("↧ ⤐ ⌟ ⌌ 𝒟 𝒹 Ѕ ѕ ⧶", "↧ ⤐ ⌟ ⌌ 𝒟 𝒹 Ѕ ѕ ⧶"), + ("Đ đ ⋱ ▿ ▾ ⇵ ⥯ ⦦ Џ", "Đ đ ⋱ ▿ ▾ ⇵ ⥯ ⦦ Џ"), + ("џ ⟿ É é É é ⩮ Ě", "џ ⟿ É é É é ⩮ Ě"), + ("ě ≖ Ê ê Ê ê ≕ Э э ⩷", "ě ≖ Ê ê Ê ê ≕ Э э ⩷"), + ("Ė ≑ ė ⅇ ≒ 𝔈 𝔢 ⪚ È è È", "Ė ≑ ė ⅇ ≒ 𝔈 𝔢 ⪚ È è È"), + ("è ⪖ ⪘ ⪙ ∈ ⏧ ℓ ⪕ ⪗ Ē", "è ⪖ ⪘ ⪙ ∈ ⏧ ℓ ⪕ ⪗ Ē"), + ("ē ∅ ∅ ◻ ∅ ▫", "ē ∅ ∅ ◻ ∅ ▫"), + ("\u2004 \u2005 \u2003 Ŋ ŋ Ę ę 𝔼 𝕖", "      Ŋ ŋ Ę ę 𝔼 𝕖"), + ("⋕ ⧣ ⩱ ε Ε ε ϵ ≖ ≕", "⋕ ⧣ ⩱ ε Ε ε ϵ ≖ ≕"), + ("≂ ⪖ ⪕ ⩵ = ≂ ≟", "≂ ⪖ ⪕ ⩵ = ≂ ≟"), + ("⇌ ≡ ⩸ ⧥ ⥱ ≓ ℰ ℯ", "⇌ ≡ ⩸ ⧥ ⥱ ≓ ℰ ℯ"), + ("≐ ⩳ ≂ Η η Ð ð Ð ð Ë ë Ë", "≐ ⩳ ≂ Η η Ð ð Ð ð Ë ë Ë"), + ("ë € ! ∃ ∃ ℰ ⅇ", "ë € ! ∃ ∃ ℰ ⅇ"), + ("ⅇ ≒ Ф ф ♀ ffi ff ffl", "ⅇ ≒ Ф ф ♀ ffi ff ffl"), + ("𝔉 𝔣 fi ◼ ▪ ♭ fl", "𝔉 𝔣 fi ◼ ▪ ♭ fl"), + ("▱ ƒ 𝔽 𝕗 ∀ ∀ ⋔ ⫙ ℱ", "▱ ƒ 𝔽 𝕗 ∀ ∀ ⋔ ⫙ ℱ"), + ("⨍ ½ ½ ⅓ ¼ ¼ ⅕ ⅙", "⨍ ½ ½ ⅓ ¼ ¼ ⅕ ⅙"), + ("⅛ ⅔ ⅖ ¾ ¾ ⅗ ⅜ ⅘", "⅛ ⅔ ⅖ ¾ ¾ ⅗ ⅜ ⅘"), + ("⅚ ⅝ ⅞ ⁄ ⌢ ℱ 𝒻 ǵ Γ", "⅚ ⅝ ⅞ ⁄ ⌢ ℱ 𝒻 ǵ Γ"), + ("γ Ϝ ϝ ⪆ Ğ ğ Ģ Ĝ ĝ", "γ Ϝ ϝ ⪆ Ğ ğ Ģ Ĝ ĝ"), + ("Г г Ġ ġ ≧ ≥ ⪌ ⋛ ≥ ≧ ⩾", "Г г Ġ ġ ≧ ≥ ⪌ ⋛ ≥ ≧ ⩾"), + ("⪩ ⪀ ⪂ ⪄ ⪔ 𝔊 𝔤 ⋙ ≫ ⋙", "⪩ ⪀ ⪂ ⪄ ⪔ 𝔊 𝔤 ⋙ ≫ ⋙"), + ("ℷ Ѓ ѓ ≷ ⪥ ⪒ ⪤ ⪊ ⪊ ≩ ⪈", "ℷ Ѓ ѓ ≷ ⪥ ⪒ ⪤ ⪊ ⪊ ≩ ⪈"), + ("⪈ ≩ ⋧ 𝔾 𝕘 ` ≥ ⋛", "⪈ ≩ ⋧ 𝔾 𝕘 ` ≥ ⋛"), + ("≧ ⪢ ≷ ⩾", "≧ ⪢ ≷ ⩾"), + ("≳ 𝒢 ℊ ≳ ⪎ ⪐ > > ≫ >", "≳ 𝒢 ℊ ≳ ⪎ ⪐ > > ≫ >"), + ("⪧ ⩺ ⋗ ⦕ ⩼ ⪆ ⥸ ⋗", "⪧ ⩺ ⋗ ⦕ ⩼ ⪆ ⥸ ⋗"), + ("⋛ ⪌ ≷ ≳ ˇ \u200a ½ ℋ", "⋛ ⪌ ≷ ≳ ˇ   ½ ℋ"), + ("Ъ ъ ⇔ ↔ ⥈ ↭ ^ ℏ Ĥ ĥ", "Ъ ъ ⇔ ↔ ⥈ ↭ ^ ℏ Ĥ ĥ"), + ("♥ … ⊹ ℌ 𝔥 ℋ ⤥", "♥ … ⊹ ℌ 𝔥 ℋ ⤥"), + ("⤦ ⇿ ∻ ↩ ↪ ℍ 𝕙", "⤦ ⇿ ∻ ↩ ↪ ℍ 𝕙"), + ("― ─ ℋ 𝒽 ℏ Ħ ħ", "― ─ ℋ 𝒽 ℏ Ħ ħ"), + ("≎ ≏ ⁃ ‐ Í í Í", "≎ ≏ ⁃ ‐ Í í Í"), + ("í ⁣ Î î Î î И и İ Е е", "í ⁣ Î î Î î И и İ Е е"), + ("¡ ¡ ⇔ ℑ 𝔦 Ì ì Ì ì ⅈ", "¡ ¡ ⇔ ℑ 𝔦 Ì ì Ì ì ⅈ"), + ("⨌ ∭ ⧜ ℩ IJ ij ℑ Ī ī ℑ", "⨌ ∭ ⧜ ℩ IJ ij ℑ Ī ī ℑ"), + ("ⅈ ℐ ℑ ı ⊷ Ƶ ⇒ ∈", "ⅈ ℐ ℑ ı ⊷ Ƶ ⇒ ∈"), + ("℅ ∞ ⧝ ı ∬ ∫ ⊺ ℤ", "℅ ∞ ⧝ ı ∬ ∫ ⊺ ℤ"), + ("∫ ⊺ ⋂ ⨗ ⨼ ⁣", "∫ ⊺ ⋂ ⨗ ⨼ ⁣"), + ("⁢ Ё ё Į į 𝕀 𝕚 Ι ι", "⁢ Ё ё Į į 𝕀 𝕚 Ι ι"), + ("⨼ ¿ ¿ ℐ 𝒾 ∈ ⋵ ⋹ ⋴", "⨼ ¿ ¿ ℐ 𝒾 ∈ ⋵ ⋹ ⋴"), + ("⋳ ∈ ⁢ Ĩ ĩ І і Ï ï Ï", "⋳ ∈ ⁢ Ĩ ĩ І і Ï ï Ï"), + ("ï Ĵ ĵ Й й 𝔍 𝔧 ȷ 𝕁 𝕛 𝒥", "ï Ĵ ĵ Й й 𝔍 𝔧 ȷ 𝕁 𝕛 𝒥"), + ("𝒿 Ј ј Є є Κ κ ϰ Ķ", "𝒿 Ј ј Є є Κ κ ϰ Ķ"), + ("ķ К к 𝔎 𝔨 ĸ Х х Ќ ќ 𝕂", "ķ К к 𝔎 𝔨 ĸ Х х Ќ ќ 𝕂"), + ("𝕜 𝒦 𝓀 ⇚ Ĺ ĺ ⦴ ℒ Λ", "𝕜 𝒦 𝓀 ⇚ Ĺ ĺ ⦴ ℒ Λ"), + ("λ ⟪ ⟨ ⦑ ⟨ ⪅ ℒ « «", "λ ⟪ ⟨ ⦑ ⟨ ⪅ ℒ « «"), + ("↞ ⇐ ← ⇤ ⤟ ⤝ ↩ ↫ ⤹", "↞ ⇐ ← ⇤ ⤟ ⤝ ↩ ↫ ⤹"), + ("⥳ ↢ ⪫ ⤛ ⤙ ⪭ ⤎ ⤌ ❲", "⥳ ↢ ⪫ ⤛ ⤙ ⪭ ⤎ ⤌ ❲"), + ("{ [ ⦋ ⦏ ⦍ Ľ ľ Ļ", "{ [ ⦋ ⦏ ⦍ Ľ ľ Ļ"), + ("ļ ⌈ { Л л ⤶ “ „ ⥧", "ļ ⌈ { Л л ⤶ “ „ ⥧"), + ("⥋ ↲ ≦ ≤ ⟨ ← ⇐", "⥋ ↲ ≦ ≤ ⟨ ← ⇐"), + ("← ⇤ ⇆ ↢ ⌈", "← ⇤ ⇆ ↢ ⌈"), + ("⟦ ⥡ ⇃ ⥙", "⟦ ⥡ ⇃ ⥙"), + ("⌊ ↽ ↼ ⇇", "⌊ ↽ ↼ ⇇"), # ("↔ ⇔ ↔ ⇆", "↔ ⇔ ↔ ⇆"), # ("⇋ ↭ ⥎ ⊣", "⇋ ↭ ⥎ ⊣"), # ("↤ ⥚ ⋋ ⊲", "↤ ⥚ ⋋ ⊲"), @@ -665,4 +665,15 @@ def test_utf_to_html_mnemo(input_string, expected_output): # Act (действие) - тестируем actual_output = codec.encode_from_unicode(input_string, mode="mnemonic") # Assert (проверка) + assert actual_output == expected_output + + +@pytest.mark.parametrize("expected_output, input_string", STRINGS_FOR_ENCODE) +def test_html_mnemo_to_utf_back(expected_output, input_string): + """ + Проверяет ОБРАТНОЕ ПОВЕДЕНИЕ: из HTML-мнемоники после encode_from_unicode() в Unicode-строки. + """ + # Act (действие) - тестируем + actual_output = codec.decode_to_unicode(input_string) + # Assert (проверка) assert actual_output == expected_output \ No newline at end of file