diff --git a/.tool-versions b/.tool-versions index 01f3cd5..fc13219 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1,3 +1,3 @@ -gleam 0.30.2 -erlang 25.2.2 +gleam 0.33.0 +erlang 26.1.2 nodejs 18.14.0 diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 0dcefc9..282a958 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,3 +1,10 @@ +6.0.0 +----- + +* Update for Gleam 0.32+. +* Split encoders and the decoder into separate files so that they can be separately imported. + This helps keep the file size down. + 5.0.0 ----- diff --git a/README.md b/README.md index e40be53..0d04fdd 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,10 @@ glentities.decode("</html>") // "" glentities.decode("</html>") // "" ``` +### Code size + +If you import `glentities`, it will pull in all the encoders and the entire named decoder. Since there are so many different entity names, this will result in a hefty JS payload. If you need to minimise the payload size, prefer importing `glentities/decoder` or one of the `glentities/*_encoder` modules directly. + ## Development ```sh diff --git a/gleam.toml b/gleam.toml index 0d7fe65..ea41c7f 100644 --- a/gleam.toml +++ b/gleam.toml @@ -1,5 +1,5 @@ name = "glentities" -version = "5.0.0" +version = "6.0.0" description = "HTML entity encoder/decoder for Gleam" # Fill out these fields if you intend to generate HTML documentation or publish @@ -10,9 +10,10 @@ repository = { type = "gitlab", user = "Nicd", repo = "glentities" } links = [] internal_modules = ["glentities/internal/*"] +gleam = ">= 0.32.0" [dependencies] -gleam_stdlib = "~> 0.29" +gleam_stdlib = "~> 0.32" [dev-dependencies] -gleeunit = "~> 0.10" +gleeunit = "~> 1.0" diff --git a/manifest.toml b/manifest.toml index 262a3e6..45a9a35 100644 --- a/manifest.toml +++ b/manifest.toml @@ -2,10 +2,10 @@ # You typically do not need to edit this file packages = [ - { name = "gleam_stdlib", version = "0.30.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "03710B3DA047A3683117591707FCA19D32B980229DD8CE8B0603EB5B5144F6C3" }, - { name = "gleeunit", version = "0.10.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "ECEA2DE4BE6528D36AFE74F42A21CDF99966EC36D7F25DEB34D47DD0F7977BAF" }, + { name = "gleam_stdlib", version = "0.34.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "1FB8454D2991E9B4C0C804544D8A9AD0F6184725E20D63C3155F0AEB4230B016" }, + { name = "gleeunit", version = "1.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "4E75DCF846D653848094169304743DFFB386E3AECCCF611F99ADB735FF4D4DD9" }, ] [requirements] -gleam_stdlib = { version = "~> 0.29" } -gleeunit = { version = "~> 0.10" } +gleam_stdlib = { version = "~> 0.32" } +gleeunit = { version = "~> 1.0" } diff --git a/src/glentities.gleam b/src/glentities.gleam index 76a6649..c1bdf98 100644 --- a/src/glentities.gleam +++ b/src/glentities.gleam @@ -1,8 +1,7 @@ -import gleam/string -import gleam/string_builder.{StringBuilder} -import gleam/int -import gleam/list -import glentities/internal/string_utils +import glentities/decoder +import glentities/hex_encoder +import glentities/html_encoder +import glentities/named_encoder pub type EncodeMode { /// Encode all characters that have a specified named entity using that name, except tab and newline. @@ -21,4073 +20,14 @@ pub type EncodeMode { /// Decode any HTML entities in the given string. pub fn decode(text: String) { - decode_text_normal(string.to_graphemes(text), string_builder.new()) - |> string_builder.to_string() -} - -fn decode_text_normal(text: List(String), acc: StringBuilder) { - case text { - [] -> acc - ["&", ..rest] -> decode_text_entity(rest, acc, string_builder.new()) - [other, ..rest] -> - decode_text_normal(rest, string_builder.append(acc, other)) - } -} - -fn decode_text_entity( - text: List(String), - acc: StringBuilder, - current_entity: StringBuilder, -) { - case text { - [] -> - acc - |> string_builder.append("&") - |> string_builder.append_builder(current_entity) - [";", ..rest] -> { - let entity = string_builder.to_string(current_entity) - let acc = string_builder.append(acc, decode_entity(entity)) - decode_text_normal(rest, acc) - } - [other, ..rest] -> - case other { - // I regret nothing - "a" - | "b" - | "c" - | "d" - | "e" - | "f" - | "g" - | "h" - | "i" - | "j" - | "k" - | "l" - | "m" - | "n" - | "o" - | "p" - | "q" - | "r" - | "s" - | "t" - | "u" - | "v" - | "w" - | "x" - | "y" - | "z" - | "A" - | "B" - | "C" - | "D" - | "E" - | "F" - | "G" - | "H" - | "I" - | "J" - | "K" - | "L" - | "M" - | "N" - | "O" - | "P" - | "Q" - | "R" - | "S" - | "T" - | "U" - | "V" - | "W" - | "X" - | "Y" - | "Z" - | "0" - | "1" - | "2" - | "3" - | "4" - | "5" - | "6" - | "7" - | "8" - | "9" - | "#" -> - decode_text_entity( - rest, - acc, - string_builder.append(current_entity, other), - ) - _invalid -> { - let acc = - acc - |> string_builder.append("&") - |> string_builder.append_builder(current_entity) - decode_text_normal([other, ..rest], acc) - } - } - } -} - -fn decode_entity(entity: String) { - case entity { - "#x" <> rest -> decode_hex(rest) - "#" <> rest -> decode_dec(rest) - other -> decode_named(other) - } -} - -/// Decode given entity (without surrounding `&#x` and `;`) as hex entity. Returns original if cannot be decoded. -pub fn decode_hex(entity: String) { - case int.base_parse(entity, 16) { - Ok(codepoint) -> - case string.utf_codepoint(codepoint) { - Ok(utf_codepoint) -> string.from_utf_codepoints([utf_codepoint]) - Error(_) -> entity - } - Error(_) -> entity - } -} - -/// Decode given entity (without surrounding `&#` and `;`) as decimal entity. Returns original if cannot be decoded. -pub fn decode_dec(entity: String) { - case int.parse(entity) { - Ok(codepoint) -> - case string.utf_codepoint(codepoint) { - Ok(utf_codepoint) -> string.from_utf_codepoints([utf_codepoint]) - Error(_) -> entity - } - Error(_) -> entity - } -} - -/// Decode given entity (without surrounding `&` and `;`) as a named entity. Returns original if it doesn't match any entity name. -pub fn decode_named(entity: String) { - case entity { - "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" -> "≂̸" - "NotExists" -> "∄" - "NotGreater" -> "≯" - "NotGreaterEqual" -> "≱" - "NotGreaterFullEqual" -> "≧̸" - "NotGreaterGreater" -> "≫̸" - "NotGreaterLess" -> "≹" - "NotGreaterSlantEqual" -> "⩾̸" - "NotGreaterTilde" -> "≵" - "NotHumpDownHump" -> "≎̸" - "NotHumpEqual" -> "≏̸" - "NotLeftTriangle" -> "⋪" - "NotLeftTriangleBar" -> "⧏̸" - "NotLeftTriangleEqual" -> "⋬" - "NotLess" -> "≮" - "NotLessEqual" -> "≰" - "NotLessGreater" -> "≸" - "NotLessLess" -> "≪̸" - "NotLessSlantEqual" -> "⩽̸" - "NotLessTilde" -> "≴" - "NotNestedGreaterGreater" -> "⪢̸" - "NotNestedLessLess" -> "⪡̸" - "NotPrecedes" -> "⊀" - "NotPrecedesEqual" -> "⪯̸" - "NotPrecedesSlantEqual" -> "⋠" - "NotReverseElement" -> "∌" - "NotRightTriangle" -> "⋫" - "NotRightTriangleBar" -> "⧐̸" - "NotRightTriangleEqual" -> "⋭" - "NotSquareSubset" -> "⊏̸" - "NotSquareSubsetEqual" -> "⋢" - "NotSquareSuperset" -> "⊐̸" - "NotSquareSupersetEqual" -> "⋣" - "NotSubset" -> "⊂⃒" - "NotSubsetEqual" -> "⊈" - "NotSucceeds" -> "⊁" - "NotSucceedsEqual" -> "⪰̸" - "NotSucceedsSlantEqual" -> "⋡" - "NotSucceedsTilde" -> "≿̸" - "NotSuperset" -> "⊃⃒" - "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" -> "  " - "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" -> "∾̳" - "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" -> "=⃥" - "bnequiv" -> "≡⃥" - "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" -> "∩︀" - "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" -> "∪︀" - "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" - "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" -> "⋛︀" - "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" -> "≩︀" - "gvnE" -> "≩︀" - "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" -> "⪭︀" - "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" -> "⋚︀" - "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" -> "≨︀" - "lvnE" -> "≨︀" - "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" -> "⋙̸" - "nGt" -> "≫⃒" - "nGtv" -> "≫̸" - "nLeftarrow" -> "⇍" - "nLeftrightarrow" -> "⇎" - "nLl" -> "⋘̸" - "nLt" -> "≪⃒" - "nLtv" -> "≪̸" - "nRightarrow" -> "⇏" - "nVDash" -> "⊯" - "nVdash" -> "⊮" - "nabla" -> "∇" - "nacute" -> "ń" - "nang" -> "∠⃒" - "nap" -> "≉" - "napE" -> "⩰̸" - "napid" -> "≋̸" - "napos" -> "ʼn" - "napprox" -> "≉" - "natur" -> "♮" - "natural" -> "♮" - "naturals" -> "ℕ" - "nbsp" -> " " - "nbump" -> "≎̸" - "nbumpe" -> "≏̸" - "ncap" -> "⩃" - "ncaron" -> "ň" - "ncedil" -> "ņ" - "ncong" -> "≇" - "ncongdot" -> "⩭̸" - "ncup" -> "⩂" - "ncy" -> "н" - "ndash" -> "–" - "ne" -> "≠" - "neArr" -> "⇗" - "nearhk" -> "⤤" - "nearr" -> "↗" - "nearrow" -> "↗" - "nedot" -> "≐̸" - "nequiv" -> "≢" - "nesear" -> "⤨" - "nesim" -> "≂̸" - "nexist" -> "∄" - "nexists" -> "∄" - "nfr" -> "𝔫" - "ngE" -> "≧̸" - "nge" -> "≱" - "ngeq" -> "≱" - "ngeqq" -> "≧̸" - "ngeqslant" -> "⩾̸" - "nges" -> "⩾̸" - "ngsim" -> "≵" - "ngt" -> "≯" - "ngtr" -> "≯" - "nhArr" -> "⇎" - "nharr" -> "↮" - "nhpar" -> "⫲" - "ni" -> "∋" - "nis" -> "⋼" - "nisd" -> "⋺" - "niv" -> "∋" - "njcy" -> "њ" - "nlArr" -> "⇍" - "nlE" -> "≦̸" - "nlarr" -> "↚" - "nldr" -> "‥" - "nle" -> "≰" - "nleftarrow" -> "↚" - "nleftrightarrow" -> "↮" - "nleq" -> "≰" - "nleqq" -> "≦̸" - "nleqslant" -> "⩽̸" - "nles" -> "⩽̸" - "nless" -> "≮" - "nlsim" -> "≴" - "nlt" -> "≮" - "nltri" -> "⋪" - "nltrie" -> "⋬" - "nmid" -> "∤" - "nopf" -> "𝕟" - "not" -> "¬" - "notin" -> "∉" - "notinE" -> "⋹̸" - "notindot" -> "⋵̸" - "notinva" -> "∉" - "notinvb" -> "⋷" - "notinvc" -> "⋶" - "notni" -> "∌" - "notniva" -> "∌" - "notnivb" -> "⋾" - "notnivc" -> "⋽" - "npar" -> "∦" - "nparallel" -> "∦" - "nparsl" -> "⫽⃥" - "npart" -> "∂̸" - "npolint" -> "⨔" - "npr" -> "⊀" - "nprcue" -> "⋠" - "npre" -> "⪯̸" - "nprec" -> "⊀" - "npreceq" -> "⪯̸" - "nrArr" -> "⇏" - "nrarr" -> "↛" - "nrarrc" -> "⤳̸" - "nrarrw" -> "↝̸" - "nrightarrow" -> "↛" - "nrtri" -> "⋫" - "nrtrie" -> "⋭" - "nsc" -> "⊁" - "nsccue" -> "⋡" - "nsce" -> "⪰̸" - "nscr" -> "𝓃" - "nshortmid" -> "∤" - "nshortparallel" -> "∦" - "nsim" -> "≁" - "nsime" -> "≄" - "nsimeq" -> "≄" - "nsmid" -> "∤" - "nspar" -> "∦" - "nsqsube" -> "⋢" - "nsqsupe" -> "⋣" - "nsub" -> "⊄" - "nsubE" -> "⫅̸" - "nsube" -> "⊈" - "nsubset" -> "⊂⃒" - "nsubseteq" -> "⊈" - "nsubseteqq" -> "⫅̸" - "nsucc" -> "⊁" - "nsucceq" -> "⪰̸" - "nsup" -> "⊅" - "nsupE" -> "⫆̸" - "nsupe" -> "⊉" - "nsupset" -> "⊃⃒" - "nsupseteq" -> "⊉" - "nsupseteqq" -> "⫆̸" - "ntgl" -> "≹" - "ntilde" -> "ñ" - "ntlg" -> "≸" - "ntriangleleft" -> "⋪" - "ntrianglelefteq" -> "⋬" - "ntriangleright" -> "⋫" - "ntrianglerighteq" -> "⋭" - "nu" -> "ν" - "num" -> "#" - "numero" -> "№" - "numsp" -> " " - "nvDash" -> "⊭" - "nvHarr" -> "⤄" - "nvap" -> "≍⃒" - "nvdash" -> "⊬" - "nvge" -> "≥⃒" - "nvgt" -> ">⃒" - "nvinfin" -> "⧞" - "nvlArr" -> "⤂" - "nvle" -> "≤⃒" - "nvlt" -> "<⃒" - "nvltrie" -> "⊴⃒" - "nvrArr" -> "⤃" - "nvrtrie" -> "⊵⃒" - "nvsim" -> "∼⃒" - "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" -> "∽̱" - "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" -> "⪬︀" - "softcy" -> "ь" - "sol" -> "/" - "solb" -> "⧄" - "solbar" -> "⌿" - "sopf" -> "𝕤" - "spades" -> "♠" - "spadesuit" -> "♠" - "spar" -> "∥" - "sqcap" -> "⊓" - "sqcaps" -> "⊓︀" - "sqcup" -> "⊔" - "sqcups" -> "⊔︀" - "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" -> "⊊︀" - "varsubsetneqq" -> "⫋︀" - "varsupsetneq" -> "⊋︀" - "varsupsetneqq" -> "⫌︀" - "vartheta" -> "ϑ" - "vartriangleleft" -> "⊲" - "vartriangleright" -> "⊳" - "vcy" -> "в" - "vdash" -> "⊢" - "vee" -> "∨" - "veebar" -> "⊻" - "veeeq" -> "≚" - "vellip" -> "⋮" - "verbar" -> "|" - "vert" -> "|" - "vfr" -> "𝔳" - "vltri" -> "⊲" - "vnsub" -> "⊂⃒" - "vnsup" -> "⊃⃒" - "vopf" -> "𝕧" - "vprop" -> "∝" - "vrtri" -> "⊳" - "vscr" -> "𝓋" - "vsubnE" -> "⫋︀" - "vsubne" -> "⊊︀" - "vsupnE" -> "⫌︀" - "vsupne" -> "⊋︀" - "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" -> "‌" - other -> "&" <> other <> ";" - } + decoder.decode(text) } /// Encode characters in text as HTML entities with given encoding mode. pub fn encode(text: String, mode: EncodeMode) { - let input = string_utils.normalise(text) case mode { - Named -> encode_named(input, string_builder.new()) - Hex -> encode_hex(input) - HTMLBody -> encode_html_body(input, string_builder.new()) - } -} - -/// Encode text using HTML hex entities, except a-z, A-Z, 0-9, newline, tab, carriage return, and space. -pub fn encode_hex(text: String) { - text - |> string.to_utf_codepoints - |> list.map(fn(codepoint) { - case string.utf_codepoint_to_int(codepoint) { - c if c == 9 || c == 10 || c == 13 || c == 32 || c >= 48 && c <= 57 || c >= 65 && c <= 90 || c >= 97 && c <= 122 -> - string.from_utf_codepoints([codepoint]) - encodable -> "&#x" <> int.to_base16(encodable) <> ";" - } - }) - |> string.join("") -} - -/// Encode text to be safe in the HTML body, inside element or attribute content. -/// -/// `&`, `<`, `>`, `'`, and `"` are encoded. -/// -/// Note! Not suitable for outputting inside `