From 273341685a01a540071f2b968efebb7f2f3eb656 Mon Sep 17 00:00:00 2001 From: Turiiya <34311583+ttytm@users.noreply.github.com> Date: Tue, 5 Sep 2023 07:29:24 +0200 Subject: [PATCH] encoding.html: implement `unescape()` (#19267) --- vlib/encoding/html/escape.v | 85 +- vlib/encoding/html/escape_test.v | 48 + vlib/encoding/html/named_references.v | 2130 +++++++++++++++++++++++++ 3 files changed, 2258 insertions(+), 5 deletions(-) create mode 100644 vlib/encoding/html/named_references.v diff --git a/vlib/encoding/html/escape.v b/vlib/encoding/html/escape.v index 4c4ed9f7c6bcbd..1bdf11a8c3b42d 100644 --- a/vlib/encoding/html/escape.v +++ b/vlib/encoding/html/escape.v @@ -1,13 +1,24 @@ module html +import encoding.hex +import strconv + [params] pub struct EscapeConfig { quote bool = true } +[params] +pub struct UnescapeConfig { + EscapeConfig + all bool +} + const ( - html_replacement_table = ['&', '&', '<', '<', '>', '>'] - html_quote_replacement_table = ['"', '"', "'", '''] // `'"'` is shorter than `'"'` + escape_seq = ['&', '&', '<', '<', '>', '>'] + escape_quote_seq = ['"', '"', "'", '''] + unescape_seq = ['&', '&', '<', '<', '>', '>'] + unescape_quote_seq = ['"', '"', ''', "'"] ) // escape converts special characters in the input, specifically "<", ">", and "&" @@ -16,10 +27,74 @@ const ( // **Note:** escape() supports funky accents by doing nothing about them. V's UTF-8 // support through `string` is robust enough to deal with these cases. pub fn escape(input string, config EscapeConfig) string { - tag_free_input := input.replace_each(html.html_replacement_table) return if config.quote { - tag_free_input.replace_each(html.html_quote_replacement_table) + input.replace_each(html.escape_seq).replace_each(html.escape_quote_seq) } else { - tag_free_input + input.replace_each(html.escape_seq) + } +} + +// unescape converts entities like "<" to "<". By default it is the converse of `escape`. +// If `all` is set to true, it handles named, numeric, and hex values - for example, +// `'''`, `'''`, and `'''` then unescape to "'". +pub fn unescape(input string, config UnescapeConfig) string { + return if config.all { + unescape_all(input) + } else if config.quote { + input.replace_each(html.unescape_seq).replace_each(html.unescape_quote_seq) + } else { + input.replace_each(html.unescape_seq) + } +} + +fn unescape_all(input string) string { + mut result := []rune{} + runes := input.runes() + mut i := 0 + outer: for i < runes.len { + if runes[i] == `&` { + mut j := i + 1 + for j < runes.len && runes[j] != `;` { + j++ + } + if j < runes.len && runes[i + 1] == `#` { + // Numeric escape sequences (e.g., ' or ') + code := runes[i + 2..j].string() + if code[0] == `x` { + // Hexadecimal escape sequence + for c in code[1..] { + if !c.is_hex_digit() { + // Leave invalid sequences unchanged + result << runes[i..j + 1] + i = j + 1 + continue outer + } + } + result << hex.decode(code[1..]) or { []u8{} }.bytestr().runes() + } else { + // Decimal escape sequence + if v := strconv.atoi(code) { + result << v + } else { + // Leave invalid sequences unchanged + result << runes[i..j + 1] + } + } + } else { + // Named entity (e.g., <) + entity := runes[i + 1..j].string() + if v := named_references[entity] { + result << v + } else { + // Leave unknown entities unchanged + result << runes[i..j + 1] + } + } + i = j + 1 + } else { + result << runes[i] + i++ + } } + return result.string() } diff --git a/vlib/encoding/html/escape_test.v b/vlib/encoding/html/escape_test.v index da0cb50af9ff76..f94b52b2319264 100644 --- a/vlib/encoding/html/escape_test.v +++ b/vlib/encoding/html/escape_test.v @@ -20,3 +20,51 @@ fn test_escape_html() { assert html.escape('café') == 'café' assert html.escape('

façade

') == '<p>façade</p>' } + +fn test_unescape_html() { + // Test different formats + assert html.unescape(''''') == "'''" + // Converse escape tests + assert html.unescape('<>&') == '<>&' + assert html.unescape('No change') == 'No change' + assert html.unescape('<b>Bold text</b>') == 'Bold text' + assert html.unescape('<img />') == '' + assert html.unescape('' onmouseover='alert(1)'') == "' onmouseover='alert(1)'" + assert html.unescape('<a href='http://www.example.com'>link</a>') == "link" + assert html.unescape('<script>alert('hello');</script>') == "" + // Cases obtained from: + // https://github.com/apache/commons-lang/blob/master/src/test/java/org/apache/commons/lang3/StringEscapeUtilsTest.java + assert html.unescape('plain text') == 'plain text' + assert html.unescape('') == '' + assert html.unescape('bread & butter') == 'bread & butter' + assert html.unescape('"bread" & butter') == '"bread" & butter' + assert html.unescape('greater than >') == 'greater than >' + assert html.unescape('< less than') == '< less than' + // Leave accents as-is + assert html.unescape('café') == 'café' + assert html.unescape('<p>façade</p>') == '

façade

' +} + +fn test_unescape_all_html() { + // Test different formats + assert html.unescape(''''', all: true) == "'''" + // Converse escape tests + assert html.unescape('<>&', all: true) == '<>&' + assert html.unescape('No change', all: true) == 'No change' + assert html.unescape('<b>Bold text</b>', all: true) == 'Bold text' + assert html.unescape('<img />', all: true) == '' + assert html.unescape('' onmouseover='alert(1)'', all: true) == "' onmouseover='alert(1)'" + assert html.unescape('<a href='http://www.example.com'>link</a>', all: true) == "link" + assert html.unescape('<script>alert('hello');</script>', all: true) == "" + // Cases obtained from: + // https://github.com/apache/commons-lang/blob/master/src/test/java/org/apache/commons/lang3/StringEscapeUtilsTest.java + assert html.unescape('plain text', all: true) == 'plain text' + assert html.unescape('', all: true) == '' + assert html.unescape('bread & butter', all: true) == 'bread & butter' + assert html.unescape('"bread" & butter', all: true) == '"bread" & butter' + assert html.unescape('greater than >', all: true) == 'greater than >' + assert html.unescape('< less than', all: true) == '< less than' + // Leave accents as-is + assert html.unescape('café', all: true) == 'café' + assert html.unescape('<p>façade</p>', all: true) == '

façade

' +} diff --git a/vlib/encoding/html/named_references.v b/vlib/encoding/html/named_references.v new file mode 100644 index 00000000000000..f5e735e8f6791c --- /dev/null +++ b/vlib/encoding/html/named_references.v @@ -0,0 +1,2130 @@ +module html + +// Generated based on https://www.w3.org/TR/2011/WD-html5-20110525/named-character-references.html +const named_references = { + 'AElig': `Æ` + 'AMP': `&` + 'Aacute': `Á` + 'Abreve': `Ă` + 'Acirc': `Â` + 'Acy': `А` + 'Afr': `𝔄` + 'Agrave': `À` + 'Alpha': `Α` + 'Amacr': `Ā` + 'And': `⩓` + 'Aogon': `Ą` + 'Aopf': `𝔸` + 'ApplyFunction': `⁡` + 'Aring': `Å` + 'Ascr': `𝒜` + 'Assign': `≔` + 'Atilde': `Ã` + 'Auml': `Ä` + 'Backslash': `∖` + 'Barv': `⫧` + 'Barwed': `⌆` + 'Bcy': `Б` + 'Because': `∵` + 'Bernoullis': `ℬ` + 'Beta': `Β` + 'Bfr': `𝔅` + 'Bopf': `𝔹` + 'Breve': `˘` + 'Bscr': `ℬ` + 'Bumpeq': `≎` + 'CHcy': `Ч` + 'COPY': `©` + 'Cacute': `Ć` + 'Cap': `⋒` + 'CapitalDifferentialD': `ⅅ` + 'Cayleys': `ℭ` + 'Ccaron': `Č` + 'Ccedil': `Ç` + 'Ccirc': `Ĉ` + 'Cconint': `∰` + 'Cdot': `Ċ` + 'Cedilla': `¸` + 'CenterDot': `·` + 'Cfr': `ℭ` + 'Chi': `Χ` + 'CircleDot': `⊙` + 'CircleMinus': `⊖` + 'CirclePlus': `⊕` + 'CircleTimes': `⊗` + 'ClockwiseContourIntegral': `∲` + 'CloseCurlyDoubleQuote': `”` + 'CloseCurlyQuote': `’` + 'Colon': `∷` + 'Colone': `⩴` + 'Congruent': `≡` + 'Conint': `∯` + 'ContourIntegral': `∮` + 'Copf': `ℂ` + 'Coproduct': `∐` + 'CounterClockwiseContourIntegral': `∳` + 'Cross': `⨯` + 'Cscr': `𝒞` + 'Cup': `⋓` + 'CupCap': `≍` + 'DD': `ⅅ` + 'DDotrahd': `⤑` + 'DJcy': `Ђ` + 'DScy': `Ѕ` + 'DZcy': `Џ` + 'Dagger': `‡` + 'Darr': `↡` + 'Dashv': `⫤` + 'Dcaron': `Ď` + 'Dcy': `Д` + 'Del': `∇` + 'Delta': `Δ` + 'Dfr': `𝔇` + 'DiacriticalAcute': `´` + 'DiacriticalDot': `˙` + 'DiacriticalDoubleAcute': `˝` + 'DiacriticalGrave': `\`` + 'DiacriticalTilde': `˜` + 'Diamond': `⋄` + 'DifferentialD': `ⅆ` + 'Dopf': `𝔻` + 'Dot': `¨` + 'DotDot': `⃜` + 'DotEqual': `≐` + 'DoubleContourIntegral': `∯` + 'DoubleDot': `¨` + 'DoubleDownArrow': `⇓` + 'DoubleLeftArrow': `⇐` + 'DoubleLeftRightArrow': `⇔` + 'DoubleLeftTee': `⫤` + 'DoubleLongLeftArrow': `⟸` + 'DoubleLongLeftRightArrow': `⟺` + 'DoubleLongRightArrow': `⟹` + 'DoubleRightArrow': `⇒` + 'DoubleRightTee': `⊨` + 'DoubleUpArrow': `⇑` + 'DoubleUpDownArrow': `⇕` + 'DoubleVerticalBar': `∥` + 'DownArrow': `↓` + 'DownArrowBar': `⤓` + 'DownArrowUpArrow': `⇵` + 'DownBreve': `̑` + 'DownLeftRightVector': `⥐` + 'DownLeftTeeVector': `⥞` + 'DownLeftVector': `↽` + 'DownLeftVectorBar': `⥖` + 'DownRightTeeVector': `⥟` + 'DownRightVector': `⇁` + 'DownRightVectorBar': `⥗` + 'DownTee': `⊤` + 'DownTeeArrow': `↧` + 'Downarrow': `⇓` + 'Dscr': `𝒟` + 'Dstrok': `Đ` + 'ENG': `Ŋ` + 'ETH': `Ð` + 'Eacute': `É` + 'Ecaron': `Ě` + 'Ecirc': `Ê` + 'Ecy': `Э` + 'Edot': `Ė` + 'Efr': `𝔈` + 'Egrave': `È` + 'Element': `∈` + 'Emacr': `Ē` + 'EmptySmallSquare': `◻` + 'EmptyVerySmallSquare': `▫` + 'Eogon': `Ę` + 'Eopf': `𝔼` + 'Epsilon': `Ε` + 'Equal': `⩵` + 'EqualTilde': `≂` + 'Equilibrium': `⇌` + 'Escr': `ℰ` + 'Esim': `⩳` + 'Eta': `Η` + 'Euml': `Ë` + 'Exists': `∃` + 'ExponentialE': `ⅇ` + 'Fcy': `Ф` + 'Ffr': `𝔉` + 'FilledSmallSquare': `◼` + 'FilledVerySmallSquare': `▪` + 'Fopf': `𝔽` + 'ForAll': `∀` + 'Fouriertrf': `ℱ` + 'Fscr': `ℱ` + 'GJcy': `Ѓ` + 'GT': `>` + 'Gamma': `Γ` + 'Gammad': `Ϝ` + 'Gbreve': `Ğ` + 'Gcedil': `Ģ` + 'Gcirc': `Ĝ` + 'Gcy': `Г` + 'Gdot': `Ġ` + 'Gfr': `𝔊` + 'Gg': `⋙` + 'Gopf': `𝔾` + 'GreaterEqual': `≥` + 'GreaterEqualLess': `⋛` + 'GreaterFullEqual': `≧` + 'GreaterGreater': `⪢` + 'GreaterLess': `≷` + 'GreaterSlantEqual': `⩾` + 'GreaterTilde': `≳` + 'Gscr': `𝒢` + 'Gt': `≫` + 'HARDcy': `Ъ` + 'Hacek': `ˇ` + 'Hat': `^` + 'Hcirc': `Ĥ` + 'Hfr': `ℌ` + 'HilbertSpace': `ℋ` + 'Hopf': `ℍ` + 'HorizontalLine': `─` + 'Hscr': `ℋ` + 'Hstrok': `Ħ` + 'HumpDownHump': `≎` + 'HumpEqual': `≏` + 'IEcy': `Е` + 'IJlig': `IJ` + 'IOcy': `Ё` + 'Iacute': `Í` + 'Icirc': `Î` + 'Icy': `И` + 'Idot': `İ` + 'Ifr': `ℑ` + 'Igrave': `Ì` + 'Im': `ℑ` + 'Imacr': `Ī` + 'ImaginaryI': `ⅈ` + 'Implies': `⇒` + 'Int': `∬` + 'Integral': `∫` + 'Intersection': `⋂` + 'InvisibleComma': `⁣` + 'InvisibleTimes': `⁢` + 'Iogon': `Į` + 'Iopf': `𝕀` + 'Iota': `Ι` + 'Iscr': `ℐ` + 'Itilde': `Ĩ` + 'Iukcy': `І` + 'Iuml': `Ï` + 'Jcirc': `Ĵ` + 'Jcy': `Й` + 'Jfr': `𝔍` + 'Jopf': `𝕁` + 'Jscr': `𝒥` + 'Jsercy': `Ј` + 'Jukcy': `Є` + 'KHcy': `Х` + 'KJcy': `Ќ` + 'Kappa': `Κ` + 'Kcedil': `Ķ` + 'Kcy': `К` + 'Kfr': `𝔎` + 'Kopf': `𝕂` + 'Kscr': `𝒦` + 'LJcy': `Љ` + 'LT': `<` + 'Lacute': `Ĺ` + 'Lambda': `Λ` + 'Lang': `⟪` + 'Laplacetrf': `ℒ` + 'Larr': `↞` + 'Lcaron': `Ľ` + 'Lcedil': `Ļ` + 'Lcy': `Л` + 'LeftAngleBracket': `⟨` + 'LeftArrow': `←` + 'LeftArrowBar': `⇤` + 'LeftArrowRightArrow': `⇆` + 'LeftCeiling': `⌈` + 'LeftDoubleBracket': `⟦` + 'LeftDownTeeVector': `⥡` + 'LeftDownVector': `⇃` + 'LeftDownVectorBar': `⥙` + 'LeftFloor': `⌊` + 'LeftRightArrow': `↔` + 'LeftRightVector': `⥎` + 'LeftTee': `⊣` + 'LeftTeeArrow': `↤` + 'LeftTeeVector': `⥚` + 'LeftTriangle': `⊲` + 'LeftTriangleBar': `⧏` + 'LeftTriangleEqual': `⊴` + 'LeftUpDownVector': `⥑` + 'LeftUpTeeVector': `⥠` + 'LeftUpVector': `↿` + 'LeftUpVectorBar': `⥘` + 'LeftVector': `↼` + 'LeftVectorBar': `⥒` + 'Leftarrow': `⇐` + 'Leftrightarrow': `⇔` + 'LessEqualGreater': `⋚` + 'LessFullEqual': `≦` + 'LessGreater': `≶` + 'LessLess': `⪡` + 'LessSlantEqual': `⩽` + 'LessTilde': `≲` + 'Lfr': `𝔏` + 'Ll': `⋘` + 'Lleftarrow': `⇚` + 'Lmidot': `Ŀ` + 'LongLeftArrow': `⟵` + 'LongLeftRightArrow': `⟷` + 'LongRightArrow': `⟶` + 'Longleftarrow': `⟸` + 'Longleftrightarrow': `⟺` + 'Longrightarrow': `⟹` + 'Lopf': `𝕃` + 'LowerLeftArrow': `↙` + 'LowerRightArrow': `↘` + 'Lscr': `ℒ` + 'Lsh': `↰` + 'Lstrok': `Ł` + 'Lt': `≪` + 'Map': `⤅` + 'Mcy': `М` + 'MediumSpace': ` ` + 'Mellintrf': `ℳ` + 'Mfr': `𝔐` + 'MinusPlus': `∓` + 'Mopf': `𝕄` + 'Mscr': `ℳ` + 'Mu': `Μ` + 'NJcy': `Њ` + 'Nacute': `Ń` + 'Ncaron': `Ň` + 'Ncedil': `Ņ` + 'Ncy': `Н` + 'NegativeMediumSpace': `​` + 'NegativeThickSpace': `​` + 'NegativeThinSpace': `​` + 'NegativeVeryThinSpace': `​` + 'NestedGreaterGreater': `≫` + 'NestedLessLess': `≪` + 'NewLine': `\n` + 'Nfr': `𝔑` + 'NoBreak': `⁠` + 'NonBreakingSpace': ` ` + 'Nopf': `ℕ` + 'Not': `⫬` + 'NotCongruent': `≢` + 'NotCupCap': `≭` + 'NotDoubleVerticalBar': `∦` + 'NotElement': `∉` + 'NotEqual': `≠` + // 'NotEqualTilde': `≂̸` // not compatible as rune + 'NotExists': `∄` + 'NotGreater': `≯` + 'NotGreaterEqual': `≱` + // 'NotGreaterFullEqual': `≧̸` // not compatible as rune + // 'NotGreaterGreater': `≫̸` // not compatible as rune + 'NotGreaterLess': `≹` + // 'NotGreaterSlantEqual': `⩾̸` // not compatible as rune + 'NotGreaterTilde': `≵` + // 'NotHumpDownHump': `≎̸` // not compatible as rune + // 'NotHumpEqual': `≏̸` // not compatible as rune + // 'NotLeftTriangle': `⋪` + // 'NotLeftTriangleBar': `⧏̸` + 'NotLeftTriangleEqual': `⋬` + 'NotLess': `≮` + 'NotLessEqual': `≰` + 'NotLessGreater': `≸` + // 'NotLessLess': `≪̸` // not compatible as rune + // 'NotLessSlantEqual': `⩽̸` // not compatible as rune + 'NotLessTilde': `≴` + // 'NotNestedGreaterGreater': `⪢̸` // not compatible as rune + // 'NotNestedLessLess': `⪡̸` // not compatible as rune + 'NotPrecedes': `⊀` + // 'NotPrecedesEqual': `⪯̸` // not compatible as rune + 'NotPrecedesSlantEqual': `⋠` + 'NotReverseElement': `∌` + 'NotRightTriangle': `⋫` + // 'NotRightTriangleBar': `⧐̸` // not compatible as rune + 'NotRightTriangleEqual': `⋭` + // 'NotSquareSubset': `⊏̸` // not compatible as rune + 'NotSquareSubsetEqual': `⋢` + // 'NotSquareSuperset': `⊐̸` // not compatible as rune + 'NotSquareSupersetEqual': `⋣` + // 'NotSubset': `⊂⃒` // not compatible as rune + 'NotSubsetEqual': `⊈` + 'NotSucceeds': `⊁` + // 'NotSucceedsEqual': `⪰̸` // not compatible as rune + 'NotSucceedsSlantEqual': `⋡` + // 'NotSucceedsTilde': `≿̸` // not compatible as rune + // 'NotSuperset': `⊃⃒` // not compatible as rune + 'NotSupersetEqual': `⊉` + 'NotTilde': `≁` + 'NotTildeEqual': `≄` + 'NotTildeFullEqual': `≇` + 'NotTildeTilde': `≉` + 'NotVerticalBar': `∤` + 'Nscr': `𝒩` + 'Ntilde': `Ñ` + 'Nu': `Ν` + 'OElig': `Œ` + 'Oacute': `Ó` + 'Ocirc': `Ô` + 'Ocy': `О` + 'Odblac': `Ő` + 'Ofr': `𝔒` + 'Ograve': `Ò` + 'Omacr': `Ō` + 'Omega': `Ω` + 'Omicron': `Ο` + 'Oopf': `𝕆` + 'OpenCurlyDoubleQuote': `“` + 'OpenCurlyQuote': `‘` + 'Or': `⩔` + 'Oscr': `𝒪` + 'Oslash': `Ø` + 'Otilde': `Õ` + 'Otimes': `⨷` + 'Ouml': `Ö` + 'OverBar': `‾` + 'OverBrace': `⏞` + 'OverBracket': `⎴` + 'OverParenthesis': `⏜` + 'PartialD': `∂` + 'Pcy': `П` + 'Pfr': `𝔓` + 'Phi': `Φ` + 'Pi': `Π` + 'PlusMinus': `±` + 'Poincareplane': `ℌ` + 'Popf': `ℙ` + 'Pr': `⪻` + 'Precedes': `≺` + 'PrecedesEqual': `⪯` + 'PrecedesSlantEqual': `≼` + 'PrecedesTilde': `≾` + 'Prime': `″` + 'Product': `∏` + 'Proportion': `∷` + 'Proportional': `∝` + 'Pscr': `𝒫` + 'Psi': `Ψ` + 'QUOT': `"` + 'Qfr': `𝔔` + 'Qopf': `ℚ` + 'Qscr': `𝒬` + 'RBarr': `⤐` + 'REG': `®` + 'Racute': `Ŕ` + 'Rang': `⟫` + 'Rarr': `↠` + 'Rarrtl': `⤖` + 'Rcaron': `Ř` + 'Rcedil': `Ŗ` + 'Rcy': `Р` + 'Re': `ℜ` + 'ReverseElement': `∋` + 'ReverseEquilibrium': `⇋` + 'ReverseUpEquilibrium': `⥯` + 'Rfr': `ℜ` + 'Rho': `Ρ` + 'RightAngleBracket': `⟩` + 'RightArrow': `→` + 'RightArrowBar': `⇥` + 'RightArrowLeftArrow': `⇄` + 'RightCeiling': `⌉` + 'RightDoubleBracket': `⟧` + 'RightDownTeeVector': `⥝` + 'RightDownVector': `⇂` + 'RightDownVectorBar': `⥕` + 'RightFloor': `⌋` + 'RightTee': `⊢` + 'RightTeeArrow': `↦` + 'RightTeeVector': `⥛` + 'RightTriangle': `⊳` + 'RightTriangleBar': `⧐` + 'RightTriangleEqual': `⊵` + 'RightUpDownVector': `⥏` + 'RightUpTeeVector': `⥜` + 'RightUpVector': `↾` + 'RightUpVectorBar': `⥔` + 'RightVector': `⇀` + 'RightVectorBar': `⥓` + 'Rightarrow': `⇒` + 'Ropf': `ℝ` + 'RoundImplies': `⥰` + 'Rrightarrow': `⇛` + 'Rscr': `ℛ` + 'Rsh': `↱` + 'RuleDelayed': `⧴` + 'SHCHcy': `Щ` + 'SHcy': `Ш` + 'SOFTcy': `Ь` + 'Sacute': `Ś` + 'Sc': `⪼` + 'Scaron': `Š` + 'Scedil': `Ş` + 'Scirc': `Ŝ` + 'Scy': `С` + 'Sfr': `𝔖` + 'ShortDownArrow': `↓` + 'ShortLeftArrow': `←` + 'ShortRightArrow': `→` + 'ShortUpArrow': `↑` + 'Sigma': `Σ` + 'SmallCircle': `∘` + 'Sopf': `𝕊` + 'Sqrt': `√` + 'Square': `□` + 'SquareIntersection': `⊓` + 'SquareSubset': `⊏` + 'SquareSubsetEqual': `⊑` + 'SquareSuperset': `⊐` + 'SquareSupersetEqual': `⊒` + 'SquareUnion': `⊔` + 'Sscr': `𝒮` + 'Star': `⋆` + 'Sub': `⋐` + 'Subset': `⋐` + 'SubsetEqual': `⊆` + 'Succeeds': `≻` + 'SucceedsEqual': `⪰` + 'SucceedsSlantEqual': `≽` + 'SucceedsTilde': `≿` + 'SuchThat': `∋` + 'Sum': `∑` + 'Sup': `⋑` + 'Superset': `⊃` + 'SupersetEqual': `⊇` + 'Supset': `⋑` + 'THORN': `Þ` + 'TRADE': `™` + 'TSHcy': `Ћ` + 'TScy': `Ц` + 'Tab': `\t` + 'Tau': `Τ` + 'Tcaron': `Ť` + 'Tcedil': `Ţ` + 'Tcy': `Т` + 'Tfr': `𝔗` + 'Therefore': `∴` + 'Theta': `Θ` + // 'ThickSpace': `  ` // not compatible as rune + 'ThinSpace': ` ` + 'Tilde': `∼` + 'TildeEqual': `≃` + 'TildeFullEqual': `≅` + 'TildeTilde': `≈` + 'Topf': `𝕋` + 'TripleDot': `⃛` + 'Tscr': `𝒯` + 'Tstrok': `Ŧ` + 'Uacute': `Ú` + 'Uarr': `↟` + 'Uarrocir': `⥉` + 'Ubrcy': `Ў` + 'Ubreve': `Ŭ` + 'Ucirc': `Û` + 'Ucy': `У` + 'Udblac': `Ű` + 'Ufr': `𝔘` + 'Ugrave': `Ù` + 'Umacr': `Ū` + 'UnderBar': `_` + 'UnderBrace': `⏟` + 'UnderBracket': `⎵` + 'UnderParenthesis': `⏝` + 'Union': `⋃` + 'UnionPlus': `⊎` + 'Uogon': `Ų` + 'Uopf': `𝕌` + 'UpArrow': `↑` + 'UpArrowBar': `⤒` + 'UpArrowDownArrow': `⇅` + 'UpDownArrow': `↕` + 'UpEquilibrium': `⥮` + 'UpTee': `⊥` + 'UpTeeArrow': `↥` + 'Uparrow': `⇑` + 'Updownarrow': `⇕` + 'UpperLeftArrow': `↖` + 'UpperRightArrow': `↗` + 'Upsi': `ϒ` + 'Upsilon': `Υ` + 'Uring': `Ů` + 'Uscr': `𝒰` + 'Utilde': `Ũ` + 'Uuml': `Ü` + 'VDash': `⊫` + 'Vbar': `⫫` + 'Vcy': `В` + 'Vdash': `⊩` + 'Vdashl': `⫦` + 'Vee': `⋁` + 'Verbar': `‖` + 'Vert': `‖` + 'VerticalBar': `∣` + 'VerticalLine': `|` + 'VerticalSeparator': `❘` + 'VerticalTilde': `≀` + 'VeryThinSpace': ` ` + 'Vfr': `𝔙` + 'Vopf': `𝕍` + 'Vscr': `𝒱` + 'Vvdash': `⊪` + 'Wcirc': `Ŵ` + 'Wedge': `⋀` + 'Wfr': `𝔚` + 'Wopf': `𝕎` + 'Wscr': `𝒲` + 'Xfr': `𝔛` + 'Xi': `Ξ` + 'Xopf': `𝕏` + 'Xscr': `𝒳` + 'YAcy': `Я` + 'YIcy': `Ї` + 'YUcy': `Ю` + 'Yacute': `Ý` + 'Ycirc': `Ŷ` + 'Ycy': `Ы` + 'Yfr': `𝔜` + 'Yopf': `𝕐` + 'Yscr': `𝒴` + 'Yuml': `Ÿ` + 'ZHcy': `Ж` + 'Zacute': `Ź` + 'Zcaron': `Ž` + 'Zcy': `З` + 'Zdot': `Ż` + 'ZeroWidthSpace': `​` + 'Zeta': `Ζ` + 'Zfr': `ℨ` + 'Zopf': `ℤ` + 'Zscr': `𝒵` + 'aacute': `á` + 'abreve': `ă` + 'ac': `∾` + // 'acE': `∾̳` // not compatible as rune + 'acd': `∿` + 'acirc': `â` + 'acute': `´` + 'acy': `а` + 'aelig': `æ` + 'af': `⁡` + 'afr': `𝔞` + 'agrave': `à` + 'alefsym': `ℵ` + 'aleph': `ℵ` + 'alpha': `α` + 'amacr': `ā` + 'amalg': `⨿` + 'amp': `&` + 'and': `∧` + 'andand': `⩕` + 'andd': `⩜` + 'andslope': `⩘` + 'andv': `⩚` + 'ang': `∠` + 'ange': `⦤` + 'angle': `∠` + 'angmsd': `∡` + 'angmsdaa': `⦨` + 'angmsdab': `⦩` + 'angmsdac': `⦪` + 'angmsdad': `⦫` + 'angmsdae': `⦬` + 'angmsdaf': `⦭` + 'angmsdag': `⦮` + 'angmsdah': `⦯` + 'angrt': `∟` + 'angrtvb': `⊾` + 'angrtvbd': `⦝` + 'angsph': `∢` + 'angst': `Å` + 'angzarr': `⍼` + 'aogon': `ą` + 'aopf': `𝕒` + 'ap': `≈` + 'apE': `⩰` + 'apacir': `⩯` + 'ape': `≊` + 'apid': `≋` + 'apos': `'` + 'approx': `≈` + 'approxeq': `≊` + 'aring': `å` + 'ascr': `𝒶` + 'ast': `*` + 'asymp': `≈` + 'asympeq': `≍` + 'atilde': `ã` + 'auml': `ä` + 'awconint': `∳` + 'awint': `⨑` + 'bNot': `⫭` + 'backcong': `≌` + 'backepsilon': `϶` + 'backprime': `‵` + 'backsim': `∽` + 'backsimeq': `⋍` + 'barvee': `⊽` + 'barwed': `⌅` + 'barwedge': `⌅` + 'bbrk': `⎵` + 'bbrktbrk': `⎶` + 'bcong': `≌` + 'bcy': `б` + 'bdquo': `„` + 'becaus': `∵` + 'because': `∵` + 'bemptyv': `⦰` + 'bepsi': `϶` + 'bernou': `ℬ` + 'beta': `β` + 'beth': `ℶ` + 'between': `≬` + 'bfr': `𝔟` + 'bigcap': `⋂` + 'bigcirc': `◯` + 'bigcup': `⋃` + 'bigodot': `⨀` + 'bigoplus': `⨁` + 'bigotimes': `⨂` + 'bigsqcup': `⨆` + 'bigstar': `★` + 'bigtriangledown': `▽` + 'bigtriangleup': `△` + 'biguplus': `⨄` + 'bigvee': `⋁` + 'bigwedge': `⋀` + 'bkarow': `⤍` + 'blacklozenge': `⧫` + 'blacksquare': `▪` + 'blacktriangle': `▴` + 'blacktriangledown': `▾` + 'blacktriangleleft': `◂` + 'blacktriangleright': `▸` + 'blank': `␣` + 'blk12': `▒` + 'blk14': `░` + 'blk34': `▓` + 'block': `█` + // 'bne': `=⃥` // not compatible as rune + // 'bnequiv': `≡⃥` // not compatible as rune + 'bnot': `⌐` + 'bopf': `𝕓` + 'bot': `⊥` + 'bottom': `⊥` + 'bowtie': `⋈` + 'boxDL': `╗` + 'boxDR': `╔` + 'boxDl': `╖` + 'boxDr': `╓` + 'boxH': `═` + 'boxHD': `╦` + 'boxHU': `╩` + 'boxHd': `╤` + 'boxHu': `╧` + 'boxUL': `╝` + 'boxUR': `╚` + 'boxUl': `╜` + 'boxUr': `╙` + 'boxV': `║` + 'boxVH': `╬` + 'boxVL': `╣` + 'boxVR': `╠` + 'boxVh': `╫` + 'boxVl': `╢` + 'boxVr': `╟` + 'boxbox': `⧉` + 'boxdL': `╕` + 'boxdR': `╒` + 'boxdl': `┐` + 'boxdr': `┌` + 'boxh': `─` + 'boxhD': `╥` + 'boxhU': `╨` + 'boxhd': `┬` + 'boxhu': `┴` + 'boxminus': `⊟` + 'boxplus': `⊞` + 'boxtimes': `⊠` + 'boxuL': `╛` + 'boxuR': `╘` + 'boxul': `┘` + 'boxur': `└` + 'boxv': `│` + 'boxvH': `╪` + 'boxvL': `╡` + 'boxvR': `╞` + 'boxvh': `┼` + 'boxvl': `┤` + 'boxvr': `├` + 'bprime': `‵` + 'breve': `˘` + 'brvbar': `¦` + 'bscr': `𝒷` + 'bsemi': `⁏` + 'bsim': `∽` + 'bsime': `⋍` + 'bsol': `\\` + 'bsolb': `⧅` + 'bsolhsub': `⟈` + 'bull': `•` + 'bullet': `•` + 'bump': `≎` + 'bumpE': `⪮` + 'bumpe': `≏` + 'bumpeq': `≏` + 'cacute': `ć` + 'cap': `∩` + 'capand': `⩄` + 'capbrcup': `⩉` + 'capcap': `⩋` + 'capcup': `⩇` + 'capdot': `⩀` + // 'caps': `∩︀` // not compatible as rune + 'caret': `⁁` + 'caron': `ˇ` + 'ccaps': `⩍` + 'ccaron': `č` + 'ccedil': `ç` + 'ccirc': `ĉ` + 'ccups': `⩌` + 'ccupssm': `⩐` + 'cdot': `ċ` + 'cedil': `¸` + 'cemptyv': `⦲` + 'cent': `¢` + 'centerdot': `·` + 'cfr': `𝔠` + 'chcy': `ч` + 'check': `✓` + 'checkmark': `✓` + 'chi': `χ` + 'cir': `○` + 'cirE': `⧃` + 'circ': `ˆ` + 'circeq': `≗` + 'circlearrowleft': `↺` + 'circlearrowright': `↻` + 'circledR': `®` + 'circledS': `Ⓢ` + 'circledast': `⊛` + 'circledcirc': `⊚` + 'circleddash': `⊝` + 'cire': `≗` + 'cirfnint': `⨐` + 'cirmid': `⫯` + 'cirscir': `⧂` + 'clubs': `♣` + 'clubsuit': `♣` + 'colon': `:` + 'colone': `≔` + 'coloneq': `≔` + 'comma': `,` + 'commat': `@` + 'comp': `∁` + 'compfn': `∘` + 'complement': `∁` + 'complexes': `ℂ` + 'cong': `≅` + 'congdot': `⩭` + 'conint': `∮` + 'copf': `𝕔` + 'coprod': `∐` + 'copy': `©` + 'copysr': `℗` + 'crarr': `↵` + 'cross': `✗` + 'cscr': `𝒸` + 'csub': `⫏` + 'csube': `⫑` + 'csup': `⫐` + 'csupe': `⫒` + 'ctdot': `⋯` + 'cudarrl': `⤸` + 'cudarrr': `⤵` + 'cuepr': `⋞` + 'cuesc': `⋟` + 'cularr': `↶` + 'cularrp': `⤽` + 'cup': `∪` + 'cupbrcap': `⩈` + 'cupcap': `⩆` + 'cupcup': `⩊` + 'cupdot': `⊍` + 'cupor': `⩅` + // 'cups': `∪︀` // not compatible as rune + 'curarr': `↷` + 'curarrm': `⤼` + 'curlyeqprec': `⋞` + 'curlyeqsucc': `⋟` + 'curlyvee': `⋎` + 'curlywedge': `⋏` + 'curren': `¤` + 'curvearrowleft': `↶` + 'curvearrowright': `↷` + 'cuvee': `⋎` + 'cuwed': `⋏` + 'cwconint': `∲` + 'cwint': `∱` + 'cylcty': `⌭` + 'dArr': `⇓` + 'dHar': `⥥` + 'dagger': `†` + 'daleth': `ℸ` + 'darr': `↓` + 'dash': `‐` + 'dashv': `⊣` + 'dbkarow': `⤏` + 'dblac': `˝` + 'dcaron': `ď` + 'dcy': `д` + 'dd': `ⅆ` + 'ddagger': `‡` + 'ddarr': `⇊` + 'ddotseq': `⩷` + 'deg': `°` + 'delta': `δ` + 'demptyv': `⦱` + 'dfisht': `⥿` + 'dfr': `𝔡` + 'dharl': `⇃` + 'dharr': `⇂` + 'diam': `⋄` + 'diamond': `⋄` + 'diamondsuit': `♦` + 'diams': `♦` + 'die': `¨` + 'digamma': `ϝ` + 'disin': `⋲` + 'div': `÷` + 'divide': `÷` + 'divideontimes': `⋇` + 'divonx': `⋇` + 'djcy': `ђ` + 'dlcorn': `⌞` + 'dlcrop': `⌍` + 'dollar': `$` + 'dopf': `𝕕` + 'dot': `˙` + 'doteq': `≐` + 'doteqdot': `≑` + 'dotminus': `∸` + 'dotplus': `∔` + 'dotsquare': `⊡` + 'doublebarwedge': `⌆` + 'downarrow': `↓` + 'downdownarrows': `⇊` + 'downharpoonleft': `⇃` + 'downharpoonright': `⇂` + 'drbkarow': `⤐` + 'drcorn': `⌟` + 'drcrop': `⌌` + 'dscr': `𝒹` + 'dscy': `ѕ` + 'dsol': `⧶` + 'dstrok': `đ` + 'dtdot': `⋱` + 'dtri': `▿` + 'dtrif': `▾` + 'duarr': `⇵` + 'duhar': `⥯` + 'dwangle': `⦦` + 'dzcy': `џ` + 'dzigrarr': `⟿` + 'eDDot': `⩷` + 'eDot': `≑` + 'eacute': `é` + 'easter': `⩮` + 'ecaron': `ě` + 'ecir': `≖` + 'ecirc': `ê` + 'ecolon': `≕` + 'ecy': `э` + 'edot': `ė` + 'ee': `ⅇ` + 'efDot': `≒` + 'efr': `𝔢` + 'eg': `⪚` + 'egrave': `è` + 'egs': `⪖` + 'egsdot': `⪘` + 'el': `⪙` + 'elinters': `⏧` + 'ell': `ℓ` + 'els': `⪕` + 'elsdot': `⪗` + 'emacr': `ē` + 'empty': `∅` + 'emptyset': `∅` + 'emptyv': `∅` + 'emsp13': ` ` + 'emsp14': ` ` + 'emsp': ` ` + 'eng': `ŋ` + 'ensp': ` ` + 'eogon': `ę` + 'eopf': `𝕖` + 'epar': `⋕` + 'eparsl': `⧣` + 'eplus': `⩱` + 'epsi': `ε` + 'epsilon': `ε` + 'epsiv': `ϵ` + 'eqcirc': `≖` + 'eqcolon': `≕` + 'eqsim': `≂` + 'eqslantgtr': `⪖` + 'eqslantless': `⪕` + 'equals': `=` + 'equest': `≟` + 'equiv': `≡` + 'equivDD': `⩸` + 'eqvparsl': `⧥` + 'erDot': `≓` + 'erarr': `⥱` + 'escr': `ℯ` + 'esdot': `≐` + 'esim': `≂` + 'eta': `η` + 'eth': `ð` + 'euml': `ë` + 'euro': `€` + 'excl': `!` + 'exist': `∃` + 'expectation': `ℰ` + 'exponentiale': `ⅇ` + 'fallingdotseq': `≒` + 'fcy': `ф` + 'female': `♀` + 'ffilig': `ffi` + 'fflig': `ff` + 'ffllig': `ffl` + 'ffr': `𝔣` + 'filig': `fi` + // 'fjlig': `fj` // not compatible as rune + 'flat': `♭` + 'fllig': `fl` + 'fltns': `▱` + 'fnof': `ƒ` + 'fopf': `𝕗` + 'forall': `∀` + 'fork': `⋔` + 'forkv': `⫙` + 'fpartint': `⨍` + 'frac12': `½` + 'frac13': `⅓` + 'frac14': `¼` + 'frac15': `⅕` + 'frac16': `⅙` + 'frac18': `⅛` + 'frac23': `⅔` + 'frac25': `⅖` + 'frac34': `¾` + 'frac35': `⅗` + 'frac38': `⅜` + 'frac45': `⅘` + 'frac56': `⅚` + 'frac58': `⅝` + 'frac78': `⅞` + 'frasl': `⁄` + 'frown': `⌢` + 'fscr': `𝒻` + 'gE': `≧` + 'gEl': `⪌` + 'gacute': `ǵ` + 'gamma': `γ` + 'gammad': `ϝ` + 'gap': `⪆` + 'gbreve': `ğ` + 'gcirc': `ĝ` + 'gcy': `г` + 'gdot': `ġ` + 'ge': `≥` + 'gel': `⋛` + 'geq': `≥` + 'geqq': `≧` + 'geqslant': `⩾` + 'ges': `⩾` + 'gescc': `⪩` + 'gesdot': `⪀` + 'gesdoto': `⪂` + 'gesdotol': `⪄` + // 'gesl': `⋛︀` // not compatible as rune + 'gesles': `⪔` + 'gfr': `𝔤` + 'gg': `≫` + 'ggg': `⋙` + 'gimel': `ℷ` + 'gjcy': `ѓ` + 'gl': `≷` + 'glE': `⪒` + 'gla': `⪥` + 'glj': `⪤` + 'gnE': `≩` + 'gnap': `⪊` + 'gnapprox': `⪊` + 'gne': `⪈` + 'gneq': `⪈` + 'gneqq': `≩` + 'gnsim': `⋧` + 'gopf': `𝕘` + 'grave': `\`` + 'gscr': `ℊ` + 'gsim': `≳` + 'gsime': `⪎` + 'gsiml': `⪐` + 'gt': `>` + 'gtcc': `⪧` + 'gtcir': `⩺` + 'gtdot': `⋗` + 'gtlPar': `⦕` + 'gtquest': `⩼` + 'gtrapprox': `⪆` + 'gtrarr': `⥸` + 'gtrdot': `⋗` + 'gtreqless': `⋛` + 'gtreqqless': `⪌` + 'gtrless': `≷` + 'gtrsim': `≳` + // 'gvertneqq': `≩︀` // not compatible as rune + // 'gvnE': `≩︀` // not compatible as rune + 'hArr': `⇔` + 'hairsp': ` ` + 'half': `½` + 'hamilt': `ℋ` + 'hardcy': `ъ` + 'harr': `↔` + 'harrcir': `⥈` + 'harrw': `↭` + 'hbar': `ℏ` + 'hcirc': `ĥ` + 'hearts': `♥` + 'heartsuit': `♥` + 'hellip': `…` + 'hercon': `⊹` + 'hfr': `𝔥` + 'hksearow': `⤥` + 'hkswarow': `⤦` + 'hoarr': `⇿` + 'homtht': `∻` + 'hookleftarrow': `↩` + 'hookrightarrow': `↪` + 'hopf': `𝕙` + 'horbar': `―` + 'hscr': `𝒽` + 'hslash': `ℏ` + 'hstrok': `ħ` + 'hybull': `⁃` + 'hyphen': `‐` + 'iacute': `í` + 'ic': `⁣` + 'icirc': `î` + 'icy': `и` + 'iecy': `е` + 'iexcl': `¡` + 'iff': `⇔` + 'ifr': `𝔦` + 'igrave': `ì` + 'ii': `ⅈ` + 'iiiint': `⨌` + 'iiint': `∭` + 'iinfin': `⧜` + 'iiota': `℩` + 'ijlig': `ij` + 'imacr': `ī` + 'image': `ℑ` + 'imagline': `ℐ` + 'imagpart': `ℑ` + 'imath': `ı` + 'imof': `⊷` + 'imped': `Ƶ` + 'in': `∈` + 'incare': `℅` + 'infin': `∞` + 'infintie': `⧝` + 'inodot': `ı` + 'int': `∫` + 'intcal': `⊺` + 'integers': `ℤ` + 'intercal': `⊺` + 'intlarhk': `⨗` + 'intprod': `⨼` + 'iocy': `ё` + 'iogon': `į` + 'iopf': `𝕚` + 'iota': `ι` + 'iprod': `⨼` + 'iquest': `¿` + 'iscr': `𝒾` + 'isin': `∈` + 'isinE': `⋹` + 'isindot': `⋵` + 'isins': `⋴` + 'isinsv': `⋳` + 'isinv': `∈` + 'it': `⁢` + 'itilde': `ĩ` + 'iukcy': `і` + 'iuml': `ï` + 'jcirc': `ĵ` + 'jcy': `й` + 'jfr': `𝔧` + 'jmath': `ȷ` + 'jopf': `𝕛` + 'jscr': `𝒿` + 'jsercy': `ј` + 'jukcy': `є` + 'kappa': `κ` + 'kappav': `ϰ` + 'kcedil': `ķ` + 'kcy': `к` + 'kfr': `𝔨` + 'kgreen': `ĸ` + 'khcy': `х` + 'kjcy': `ќ` + 'kopf': `𝕜` + 'kscr': `𝓀` + 'lAarr': `⇚` + 'lArr': `⇐` + 'lAtail': `⤛` + 'lBarr': `⤎` + 'lE': `≦` + 'lEg': `⪋` + 'lHar': `⥢` + 'lacute': `ĺ` + 'laemptyv': `⦴` + 'lagran': `ℒ` + 'lambda': `λ` + 'lang': `⟨` + 'langd': `⦑` + 'langle': `⟨` + 'lap': `⪅` + 'laquo': `«` + 'larr': `←` + 'larrb': `⇤` + 'larrbfs': `⤟` + 'larrfs': `⤝` + 'larrhk': `↩` + 'larrlp': `↫` + 'larrpl': `⤹` + 'larrsim': `⥳` + 'larrtl': `↢` + 'lat': `⪫` + 'latail': `⤙` + 'late': `⪭` + // 'lates': `⪭︀` // not compatible as rune + 'lbarr': `⤌` + 'lbbrk': `❲` + 'lbrace': `{` + 'lbrack': `[` + 'lbrke': `⦋` + 'lbrksld': `⦏` + 'lbrkslu': `⦍` + 'lcaron': `ľ` + 'lcedil': `ļ` + 'lceil': `⌈` + 'lcub': `{` + 'lcy': `л` + 'ldca': `⤶` + 'ldquo': `“` + 'ldquor': `„` + 'ldrdhar': `⥧` + 'ldrushar': `⥋` + 'ldsh': `↲` + 'le': `≤` + 'leftarrow': `←` + 'leftarrowtail': `↢` + 'leftharpoondown': `↽` + 'leftharpoonup': `↼` + 'leftleftarrows': `⇇` + 'leftrightarrow': `↔` + 'leftrightarrows': `⇆` + 'leftrightharpoons': `⇋` + 'leftrightsquigarrow': `↭` + 'leftthreetimes': `⋋` + 'leg': `⋚` + 'leq': `≤` + 'leqq': `≦` + 'leqslant': `⩽` + 'les': `⩽` + 'lescc': `⪨` + 'lesdot': `⩿` + 'lesdoto': `⪁` + 'lesdotor': `⪃` + // 'lesg': `⋚︀` // not compatible as rune + 'lesges': `⪓` + 'lessapprox': `⪅` + 'lessdot': `⋖` + 'lesseqgtr': `⋚` + 'lesseqqgtr': `⪋` + 'lessgtr': `≶` + 'lesssim': `≲` + 'lfisht': `⥼` + 'lfloor': `⌊` + 'lfr': `𝔩` + 'lg': `≶` + 'lgE': `⪑` + 'lhard': `↽` + 'lharu': `↼` + 'lharul': `⥪` + 'lhblk': `▄` + 'ljcy': `љ` + 'll': `≪` + 'llarr': `⇇` + 'llcorner': `⌞` + 'llhard': `⥫` + 'lltri': `◺` + 'lmidot': `ŀ` + 'lmoust': `⎰` + 'lmoustache': `⎰` + 'lnE': `≨` + 'lnap': `⪉` + 'lnapprox': `⪉` + 'lne': `⪇` + 'lneq': `⪇` + 'lneqq': `≨` + 'lnsim': `⋦` + 'loang': `⟬` + 'loarr': `⇽` + 'lobrk': `⟦` + 'longleftarrow': `⟵` + 'longleftrightarrow': `⟷` + 'longmapsto': `⟼` + 'longrightarrow': `⟶` + 'looparrowleft': `↫` + 'looparrowright': `↬` + 'lopar': `⦅` + 'lopf': `𝕝` + 'loplus': `⨭` + 'lotimes': `⨴` + 'lowast': `∗` + 'lowbar': `_` + 'loz': `◊` + 'lozenge': `◊` + 'lozf': `⧫` + 'lpar': `(` + 'lparlt': `⦓` + 'lrarr': `⇆` + 'lrcorner': `⌟` + 'lrhar': `⇋` + 'lrhard': `⥭` + 'lrm': `‎` + 'lrtri': `⊿` + 'lsaquo': `‹` + 'lscr': `𝓁` + 'lsh': `↰` + 'lsim': `≲` + 'lsime': `⪍` + 'lsimg': `⪏` + 'lsqb': `[` + 'lsquo': `‘` + 'lsquor': `‚` + 'lstrok': `ł` + 'lt': `<` + 'ltcc': `⪦` + 'ltcir': `⩹` + 'ltdot': `⋖` + 'lthree': `⋋` + 'ltimes': `⋉` + 'ltlarr': `⥶` + 'ltquest': `⩻` + 'ltrPar': `⦖` + 'ltri': `◃` + 'ltrie': `⊴` + 'ltrif': `◂` + 'lurdshar': `⥊` + 'luruhar': `⥦` + // 'lvertneqq': `≨︀` // not compatible as rune + // 'lvnE': `≨︀` // not compatible as rune + 'mDDot': `∺` + 'macr': `¯` + 'male': `♂` + 'malt': `✠` + 'maltese': `✠` + 'map': `↦` + 'mapsto': `↦` + 'mapstodown': `↧` + 'mapstoleft': `↤` + 'mapstoup': `↥` + 'marker': `▮` + 'mcomma': `⨩` + 'mcy': `м` + 'mdash': `—` + 'measuredangle': `∡` + 'mfr': `𝔪` + 'mho': `℧` + 'micro': `µ` + 'mid': `∣` + 'midast': `*` + 'midcir': `⫰` + 'middot': `·` + 'minus': `−` + 'minusb': `⊟` + 'minusd': `∸` + 'minusdu': `⨪` + 'mlcp': `⫛` + 'mldr': `…` + 'mnplus': `∓` + 'models': `⊧` + 'mopf': `𝕞` + 'mp': `∓` + 'mscr': `𝓂` + 'mstpos': `∾` + 'mu': `μ` + 'multimap': `⊸` + 'mumap': `⊸` + // 'nGg': `⋙̸` // not compatible as rune + // 'nGt': `≫⃒` // not compatible as rune + // 'nGtv': `≫̸` // not compatible as rune + 'nLeftarrow': `⇍` + 'nLeftrightarrow': `⇎` + // 'nLl': `⋘̸` // not compatible as rune + // 'nLt': `≪⃒` // not compatible as rune + // 'nLtv': `≪̸` // not compatible as rune + 'nRightarrow': `⇏` + 'nVDash': `⊯` + 'nVdash': `⊮` + 'nabla': `∇` + 'nacute': `ń` + // 'nang': `∠⃒` // not compatible as rune + 'nap': `≉` + // 'napE': `⩰̸` // not compatible as rune + // 'napid': `≋̸` // not compatible as rune + 'napos': `ʼn` + 'napprox': `≉` + 'natur': `♮` + 'natural': `♮` + 'naturals': `ℕ` + 'nbsp': ` ` + // 'nbump': `≎̸` // not compatible as rune + // 'nbumpe': `≏̸` // not compatible as rune + 'ncap': `⩃` + 'ncaron': `ň` + 'ncedil': `ņ` + 'ncong': `≇` + // 'ncongdot': `⩭̸` // not compatible as rune + 'ncup': `⩂` + 'ncy': `н` + 'ndash': `–` + 'ne': `≠` + 'neArr': `⇗` + 'nearhk': `⤤` + 'nearr': `↗` + 'nearrow': `↗` + // 'nedot': `≐̸` // not compatible as rune + 'nequiv': `≢` + 'nesear': `⤨` + // 'nesim': `≂̸` // not compatible as rune + 'nexist': `∄` + 'nexists': `∄` + 'nfr': `𝔫` + // 'ngE': `≧̸` // not compatible as rune + 'nge': `≱` + 'ngeq': `≱` + // 'ngeqq': `≧̸` // not compatible as rune + // 'ngeqslant': `⩾̸` // not compatible as rune + // 'nges': `⩾̸` // not compatible as rune + 'ngsim': `≵` + 'ngt': `≯` + 'ngtr': `≯` + 'nhArr': `⇎` + 'nharr': `↮` + 'nhpar': `⫲` + 'ni': `∋` + 'nis': `⋼` + 'nisd': `⋺` + 'niv': `∋` + 'njcy': `њ` + 'nlArr': `⇍` + // 'nlE': `≦̸` // not compatible as rune + 'nlarr': `↚` + 'nldr': `‥` + 'nle': `≰` + 'nleftarrow': `↚` + 'nleftrightarrow': `↮` + 'nleq': `≰` + // 'nleqq': `≦̸` // not compatible as rune + // 'nleqslant': `⩽̸` // not compatible as rune + // 'nles': `⩽̸` // not compatible as rune + 'nless': `≮` + 'nlsim': `≴` + 'nlt': `≮` + 'nltri': `⋪` + 'nltrie': `⋬` + 'nmid': `∤` + 'nopf': `𝕟` + 'not': `¬` + 'notin': `∉` + // 'notinE': `⋹̸` // not compatible as rune + // 'notindot': `⋵̸` // not compatible as rune + 'notinva': `∉` + 'notinvb': `⋷` + 'notinvc': `⋶` + 'notni': `∌` + 'notniva': `∌` + 'notnivb': `⋾` + 'notnivc': `⋽` + 'npar': `∦` + 'nparallel': `∦` + // 'nparsl': `⫽⃥` // not compatible as rune + // 'npart': `∂̸` // not compatible as rune + 'npolint': `⨔` + 'npr': `⊀` + 'nprcue': `⋠` + // 'npre': `⪯̸` // not compatible as rune + 'nprec': `⊀` + // 'npreceq': `⪯̸` // not compatible as rune + 'nrArr': `⇏` + 'nrarr': `↛` + // 'nrarrc': `⤳̸` // not compatible as rune + // 'nrarrw': `↝̸` // not compatible as rune + 'nrightarrow': `↛` + 'nrtri': `⋫` + 'nrtrie': `⋭` + 'nsc': `⊁` + 'nsccue': `⋡` + // 'nsce': `⪰̸` // not compatible as rune + 'nscr': `𝓃` + 'nshortmid': `∤` + 'nshortparallel': `∦` + 'nsim': `≁` + 'nsime': `≄` + 'nsimeq': `≄` + 'nsmid': `∤` + 'nspar': `∦` + 'nsqsube': `⋢` + 'nsqsupe': `⋣` + 'nsub': `⊄` + // 'nsubE': `⫅̸` // not compatible as rune + 'nsube': `⊈` + // 'nsubset': `⊂⃒` // not compatible as rune + 'nsubseteq': `⊈` + // 'nsubseteqq': `⫅̸` // not compatible as rune + 'nsucc': `⊁` + // 'nsucceq': `⪰̸` // not compatible as rune + 'nsup': `⊅` + // 'nsupE': `⫆̸` // not compatible as rune + 'nsupe': `⊉` + // 'nsupset': `⊃⃒` // not compatible as rune + 'nsupseteq': `⊉` + // 'nsupseteqq': `⫆̸` // not compatible as rune + 'ntgl': `≹` + 'ntilde': `ñ` + 'ntlg': `≸` + 'ntriangleleft': `⋪` + 'ntrianglelefteq': `⋬` + 'ntriangleright': `⋫` + 'ntrianglerighteq': `⋭` + 'nu': `ν` + 'num': `#` + 'numero': `№` + 'numsp': ` ` + 'nvDash': `⊭` + 'nvHarr': `⤄` + // 'nvap': `≍⃒` // not compatible as rune + 'nvdash': `⊬` + // 'nvge': `≥⃒` // not compatible as rune + // 'nvgt': `>⃒` // not compatible as rune + 'nvinfin': `⧞` + 'nvlArr': `⤂` + // 'nvle': `≤⃒` // not compatible as rune + // 'nvlt': `<⃒` // not compatible as rune + // 'nvltrie': `⊴⃒` // not compatible as rune + 'nvrArr': `⤃` + // 'nvrtrie': `⊵⃒` // not compatible as rune + // 'nvsim': `∼⃒` // not compatible as rune + 'nwArr': `⇖` + 'nwarhk': `⤣` + 'nwarr': `↖` + 'nwarrow': `↖` + 'nwnear': `⤧` + 'oS': `Ⓢ` + 'oacute': `ó` + 'oast': `⊛` + 'ocir': `⊚` + 'ocirc': `ô` + 'ocy': `о` + 'odash': `⊝` + 'odblac': `ő` + 'odiv': `⨸` + 'odot': `⊙` + 'odsold': `⦼` + 'oelig': `œ` + 'ofcir': `⦿` + 'ofr': `𝔬` + 'ogon': `˛` + 'ograve': `ò` + 'ogt': `⧁` + 'ohbar': `⦵` + 'ohm': `Ω` + 'oint': `∮` + 'olarr': `↺` + 'olcir': `⦾` + 'olcross': `⦻` + 'oline': `‾` + 'olt': `⧀` + 'omacr': `ō` + 'omega': `ω` + 'omicron': `ο` + 'omid': `⦶` + 'ominus': `⊖` + 'oopf': `𝕠` + 'opar': `⦷` + 'operp': `⦹` + 'oplus': `⊕` + 'or': `∨` + 'orarr': `↻` + 'ord': `⩝` + 'order': `ℴ` + 'orderof': `ℴ` + 'ordf': `ª` + 'ordm': `º` + 'origof': `⊶` + 'oror': `⩖` + 'orslope': `⩗` + 'orv': `⩛` + 'oscr': `ℴ` + 'oslash': `ø` + 'osol': `⊘` + 'otilde': `õ` + 'otimes': `⊗` + 'otimesas': `⨶` + 'ouml': `ö` + 'ovbar': `⌽` + 'par': `∥` + 'para': `¶` + 'parallel': `∥` + 'parsim': `⫳` + 'parsl': `⫽` + 'part': `∂` + 'pcy': `п` + 'percnt': `%` + 'period': `.` + 'permil': `‰` + 'perp': `⊥` + 'pertenk': `‱` + 'pfr': `𝔭` + 'phi': `φ` + 'phiv': `ϕ` + 'phmmat': `ℳ` + 'phone': `☎` + 'pi': `π` + 'pitchfork': `⋔` + 'piv': `ϖ` + 'planck': `ℏ` + 'planckh': `ℎ` + 'plankv': `ℏ` + 'plus': `+` + 'plusacir': `⨣` + 'plusb': `⊞` + 'pluscir': `⨢` + 'plusdo': `∔` + 'plusdu': `⨥` + 'pluse': `⩲` + 'plusmn': `±` + 'plussim': `⨦` + 'plustwo': `⨧` + 'pm': `±` + 'pointint': `⨕` + 'popf': `𝕡` + 'pound': `£` + 'pr': `≺` + 'prE': `⪳` + 'prap': `⪷` + 'prcue': `≼` + 'pre': `⪯` + 'prec': `≺` + 'precapprox': `⪷` + 'preccurlyeq': `≼` + 'preceq': `⪯` + 'precnapprox': `⪹` + 'precneqq': `⪵` + 'precnsim': `⋨` + 'precsim': `≾` + 'prime': `′` + 'primes': `ℙ` + 'prnE': `⪵` + 'prnap': `⪹` + 'prnsim': `⋨` + 'prod': `∏` + 'profalar': `⌮` + 'profline': `⌒` + 'profsurf': `⌓` + 'prop': `∝` + 'propto': `∝` + 'prsim': `≾` + 'prurel': `⊰` + 'pscr': `𝓅` + 'psi': `ψ` + 'puncsp': ` ` + 'qfr': `𝔮` + 'qint': `⨌` + 'qopf': `𝕢` + 'qprime': `⁗` + 'qscr': `𝓆` + 'quaternions': `ℍ` + 'quatint': `⨖` + 'quest': `?` + 'questeq': `≟` + 'quot': `"` + 'rAarr': `⇛` + 'rArr': `⇒` + 'rAtail': `⤜` + 'rBarr': `⤏` + 'rHar': `⥤` + // 'race': `∽̱` // not compatible as rune + 'racute': `ŕ` + 'radic': `√` + 'raemptyv': `⦳` + 'rang': `⟩` + 'rangd': `⦒` + 'range': `⦥` + 'rangle': `⟩` + 'raquo': `»` + 'rarr': `→` + 'rarrap': `⥵` + 'rarrb': `⇥` + 'rarrbfs': `⤠` + 'rarrc': `⤳` + 'rarrfs': `⤞` + 'rarrhk': `↪` + 'rarrlp': `↬` + 'rarrpl': `⥅` + 'rarrsim': `⥴` + 'rarrtl': `↣` + 'rarrw': `↝` + 'ratail': `⤚` + 'ratio': `∶` + 'rationals': `ℚ` + 'rbarr': `⤍` + 'rbbrk': `❳` + 'rbrace': `}` + 'rbrack': `]` + 'rbrke': `⦌` + 'rbrksld': `⦎` + 'rbrkslu': `⦐` + 'rcaron': `ř` + 'rcedil': `ŗ` + 'rceil': `⌉` + 'rcub': `}` + 'rcy': `р` + 'rdca': `⤷` + 'rdldhar': `⥩` + 'rdquo': `”` + 'rdquor': `”` + 'rdsh': `↳` + 'real': `ℜ` + 'realine': `ℛ` + 'realpart': `ℜ` + 'reals': `ℝ` + 'rect': `▭` + 'reg': `®` + 'rfisht': `⥽` + 'rfloor': `⌋` + 'rfr': `𝔯` + 'rhard': `⇁` + 'rharu': `⇀` + 'rharul': `⥬` + 'rho': `ρ` + 'rhov': `ϱ` + 'rightarrow': `→` + 'rightarrowtail': `↣` + 'rightharpoondown': `⇁` + 'rightharpoonup': `⇀` + 'rightleftarrows': `⇄` + 'rightleftharpoons': `⇌` + 'rightrightarrows': `⇉` + 'rightsquigarrow': `↝` + 'rightthreetimes': `⋌` + 'ring': `˚` + 'risingdotseq': `≓` + 'rlarr': `⇄` + 'rlhar': `⇌` + 'rlm': `‏` + 'rmoust': `⎱` + 'rmoustache': `⎱` + 'rnmid': `⫮` + 'roang': `⟭` + 'roarr': `⇾` + 'robrk': `⟧` + 'ropar': `⦆` + 'ropf': `𝕣` + 'roplus': `⨮` + 'rotimes': `⨵` + 'rpar': `)` + 'rpargt': `⦔` + 'rppolint': `⨒` + 'rrarr': `⇉` + 'rsaquo': `›` + 'rscr': `𝓇` + 'rsh': `↱` + 'rsqb': `]` + 'rsquo': `’` + 'rsquor': `’` + 'rthree': `⋌` + 'rtimes': `⋊` + 'rtri': `▹` + 'rtrie': `⊵` + 'rtrif': `▸` + 'rtriltri': `⧎` + 'ruluhar': `⥨` + 'rx': `℞` + 'sacute': `ś` + 'sbquo': `‚` + 'sc': `≻` + 'scE': `⪴` + 'scap': `⪸` + 'scaron': `š` + 'sccue': `≽` + 'sce': `⪰` + 'scedil': `ş` + 'scirc': `ŝ` + 'scnE': `⪶` + 'scnap': `⪺` + 'scnsim': `⋩` + 'scpolint': `⨓` + 'scsim': `≿` + 'scy': `с` + 'sdot': `⋅` + 'sdotb': `⊡` + 'sdote': `⩦` + 'seArr': `⇘` + 'searhk': `⤥` + 'searr': `↘` + 'searrow': `↘` + 'sect': `§` + 'semi': `;` + 'seswar': `⤩` + 'setminus': `∖` + 'setmn': `∖` + 'sext': `✶` + 'sfr': `𝔰` + 'sfrown': `⌢` + 'sharp': `♯` + 'shchcy': `щ` + 'shcy': `ш` + 'shortmid': `∣` + 'shortparallel': `∥` + 'shy': `­` + 'sigma': `σ` + 'sigmaf': `ς` + 'sigmav': `ς` + 'sim': `∼` + 'simdot': `⩪` + 'sime': `≃` + 'simeq': `≃` + 'simg': `⪞` + 'simgE': `⪠` + 'siml': `⪝` + 'simlE': `⪟` + 'simne': `≆` + 'simplus': `⨤` + 'simrarr': `⥲` + 'slarr': `←` + 'smallsetminus': `∖` + 'smashp': `⨳` + 'smeparsl': `⧤` + 'smid': `∣` + 'smile': `⌣` + 'smt': `⪪` + 'smte': `⪬` + // 'smtes': `⪬︀` // not compatible as rune + 'softcy': `ь` + 'sol': `/` + 'solb': `⧄` + 'solbar': `⌿` + 'sopf': `𝕤` + 'spades': `♠` + 'spadesuit': `♠` + 'spar': `∥` + 'sqcap': `⊓` + // 'sqcaps': `⊓︀` // not compatible as rune + // 'sqcup': `⊔` // not compatible as rune + // 'sqcups': `⊔︀` // not compatible as rune + 'sqsub': `⊏` + 'sqsube': `⊑` + 'sqsubset': `⊏` + 'sqsubseteq': `⊑` + 'sqsup': `⊐` + 'sqsupe': `⊒` + 'sqsupset': `⊐` + 'sqsupseteq': `⊒` + 'squ': `□` + 'square': `□` + 'squarf': `▪` + 'squf': `▪` + 'srarr': `→` + 'sscr': `𝓈` + 'ssetmn': `∖` + 'ssmile': `⌣` + 'sstarf': `⋆` + 'star': `☆` + 'starf': `★` + 'straightepsilon': `ϵ` + 'straightphi': `ϕ` + 'strns': `¯` + 'sub': `⊂` + 'subE': `⫅` + 'subdot': `⪽` + 'sube': `⊆` + 'subedot': `⫃` + 'submult': `⫁` + 'subnE': `⫋` + 'subne': `⊊` + 'subplus': `⪿` + 'subrarr': `⥹` + 'subset': `⊂` + 'subseteq': `⊆` + 'subseteqq': `⫅` + 'subsetneq': `⊊` + 'subsetneqq': `⫋` + 'subsim': `⫇` + 'subsub': `⫕` + 'subsup': `⫓` + 'succ': `≻` + 'succapprox': `⪸` + 'succcurlyeq': `≽` + 'succeq': `⪰` + 'succnapprox': `⪺` + 'succneqq': `⪶` + 'succnsim': `⋩` + 'succsim': `≿` + 'sum': `∑` + 'sung': `♪` + 'sup1': `¹` + 'sup2': `²` + 'sup3': `³` + 'sup': `⊃` + 'supE': `⫆` + 'supdot': `⪾` + 'supdsub': `⫘` + 'supe': `⊇` + 'supedot': `⫄` + 'suphsol': `⟉` + 'suphsub': `⫗` + 'suplarr': `⥻` + 'supmult': `⫂` + 'supnE': `⫌` + 'supne': `⊋` + 'supplus': `⫀` + 'supset': `⊃` + 'supseteq': `⊇` + 'supseteqq': `⫆` + 'supsetneq': `⊋` + 'supsetneqq': `⫌` + 'supsim': `⫈` + 'supsub': `⫔` + 'supsup': `⫖` + 'swArr': `⇙` + 'swarhk': `⤦` + 'swarr': `↙` + 'swarrow': `↙` + 'swnwar': `⤪` + 'szlig': `ß` + 'target': `⌖` + 'tau': `τ` + 'tbrk': `⎴` + 'tcaron': `ť` + 'tcedil': `ţ` + 'tcy': `т` + 'tdot': `⃛` + 'telrec': `⌕` + 'tfr': `𝔱` + 'there4': `∴` + 'therefore': `∴` + 'theta': `θ` + 'thetasym': `ϑ` + 'thetav': `ϑ` + 'thickapprox': `≈` + 'thicksim': `∼` + 'thinsp': ` ` + 'thkap': `≈` + 'thksim': `∼` + 'thorn': `þ` + 'tilde': `˜` + 'times': `×` + 'timesb': `⊠` + 'timesbar': `⨱` + 'timesd': `⨰` + 'tint': `∭` + 'toea': `⤨` + 'top': `⊤` + 'topbot': `⌶` + 'topcir': `⫱` + 'topf': `𝕥` + 'topfork': `⫚` + 'tosa': `⤩` + 'tprime': `‴` + 'trade': `™` + 'triangle': `▵` + 'triangledown': `▿` + 'triangleleft': `◃` + 'trianglelefteq': `⊴` + 'triangleq': `≜` + 'triangleright': `▹` + 'trianglerighteq': `⊵` + 'tridot': `◬` + 'trie': `≜` + 'triminus': `⨺` + 'triplus': `⨹` + 'trisb': `⧍` + 'tritime': `⨻` + 'trpezium': `⏢` + 'tscr': `𝓉` + 'tscy': `ц` + 'tshcy': `ћ` + 'tstrok': `ŧ` + 'twixt': `≬` + 'twoheadleftarrow': `↞` + 'twoheadrightarrow': `↠` + 'uArr': `⇑` + 'uHar': `⥣` + 'uacute': `ú` + 'uarr': `↑` + 'ubrcy': `ў` + 'ubreve': `ŭ` + 'ucirc': `û` + 'ucy': `у` + 'udarr': `⇅` + 'udblac': `ű` + 'udhar': `⥮` + 'ufisht': `⥾` + 'ufr': `𝔲` + 'ugrave': `ù` + 'uharl': `↿` + 'uharr': `↾` + 'uhblk': `▀` + 'ulcorn': `⌜` + 'ulcorner': `⌜` + 'ulcrop': `⌏` + 'ultri': `◸` + 'umacr': `ū` + 'uml': `¨` + 'uogon': `ų` + 'uopf': `𝕦` + 'uparrow': `↑` + 'updownarrow': `↕` + 'upharpoonleft': `↿` + 'upharpoonright': `↾` + 'uplus': `⊎` + 'upsi': `υ` + 'upsih': `ϒ` + 'upsilon': `υ` + 'upuparrows': `⇈` + 'urcorn': `⌝` + 'urcorner': `⌝` + 'urcrop': `⌎` + 'uring': `ů` + 'urtri': `◹` + 'uscr': `𝓊` + 'utdot': `⋰` + 'utilde': `ũ` + 'utri': `▵` + 'utrif': `▴` + 'uuarr': `⇈` + 'uuml': `ü` + 'uwangle': `⦧` + 'vArr': `⇕` + 'vBar': `⫨` + 'vBarv': `⫩` + 'vDash': `⊨` + 'vangrt': `⦜` + 'varepsilon': `ϵ` + 'varkappa': `ϰ` + 'varnothing': `∅` + 'varphi': `ϕ` + 'varpi': `ϖ` + 'varpropto': `∝` + 'varr': `↕` + 'varrho': `ϱ` + 'varsigma': `ς` + // 'varsubsetneq': `⊊︀` // not compatible as rune + // 'varsubsetneqq': `⫋︀` // not compatible as rune + // 'varsupsetneq': `⊋︀` // not compatible as rune + // 'varsupsetneqq': `⫌︀` // not compatible as rune + 'vartheta': `ϑ` + 'vartriangleleft': `⊲` + 'vartriangleright': `⊳` + 'vcy': `в` + 'vdash': `⊢` + 'vee': `∨` + 'veebar': `⊻` + 'veeeq': `≚` + 'vellip': `⋮` + 'verbar': `|` + 'vert': `|` + 'vfr': `𝔳` + 'vltri': `⊲` + // 'vnsub': `⊂⃒` // not compatible as rune + // 'vnsup': `⊃⃒` // not compatible as rune + 'vopf': `𝕧` + 'vprop': `∝` + 'vrtri': `⊳` + 'vscr': `𝓋` + // 'vsubnE': `⫋︀` // not compatible as rune + // 'vsubne': `⊊︀` // not compatible as rune + // 'vsupnE': `⫌︀` // not compatible as rune + // 'vsupne': `⊋︀` // not compatible as rune + 'vzigzag': `⦚` + 'wcirc': `ŵ` + 'wedbar': `⩟` + 'wedge': `∧` + 'wedgeq': `≙` + 'weierp': `℘` + 'wfr': `𝔴` + 'wopf': `𝕨` + 'wp': `℘` + 'wr': `≀` + 'wreath': `≀` + 'wscr': `𝓌` + 'xcap': `⋂` + 'xcirc': `◯` + 'xcup': `⋃` + 'xdtri': `▽` + 'xfr': `𝔵` + 'xhArr': `⟺` + 'xharr': `⟷` + 'xi': `ξ` + 'xlArr': `⟸` + 'xlarr': `⟵` + 'xmap': `⟼` + 'xnis': `⋻` + 'xodot': `⨀` + 'xopf': `𝕩` + 'xoplus': `⨁` + 'xotime': `⨂` + 'xrArr': `⟹` + 'xrarr': `⟶` + 'xscr': `𝓍` + 'xsqcup': `⨆` + 'xuplus': `⨄` + 'xutri': `△` + 'xvee': `⋁` + 'xwedge': `⋀` + 'yacute': `ý` + 'yacy': `я` + 'ycirc': `ŷ` + 'ycy': `ы` + 'yen': `¥` + 'yfr': `𝔶` + 'yicy': `ї` + 'yopf': `𝕪` + 'yscr': `𝓎` + 'yucy': `ю` + 'yuml': `ÿ` + 'zacute': `ź` + 'zcaron': `ž` + 'zcy': `з` + 'zdot': `ż` + 'zeetrf': `ℨ` + 'zeta': `ζ` + 'zfr': `𝔷` + 'zhcy': `ж` + 'zigrarr': `⇝` + 'zopf': `𝕫` + 'zscr': `𝓏` + 'zwj': `‍` + 'zwnj': `‌` +}