hanimers/src/unescape.rs

1519 lines
58 KiB
Rust
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

use regex::{Captures, RegexBuilder};
use std::borrow::Cow;
fn hex_char_decode(c: u8) -> u8 {
match c {
b'a'..=b'f' => c - b'a' + 10,
b'A'..=b'F' => c - b'A' + 10,
b'0'..=b'9' => c - b'0',
_ => panic!("Invalid hex character passed: {}", c),
}
}
fn hex_to_bytes(hex: &[u8]) -> Vec<u8> {
let mut capacity = hex.len() / 2;
if capacity % 2 != 0 {
capacity += 1;
}
let mut result = Vec::with_capacity(capacity);
for chars in hex.chunks(2) {
let (left, right) = if chars.len() == 1 {
(b'0', chars[0])
} else {
(chars[0], chars[1])
};
result.push(hex_char_decode(left) << 4 | hex_char_decode(right));
}
result
}
pub fn unescape<'t>(text: &'t str) -> Cow<'t, str> {
let regex = RegexBuilder::new("&([a-z0-9_\\-]+|#(?:x[0-9a-f]+|[0-9]+));?")
.case_insensitive(true)
.build()
.unwrap();
regex.replace_all(text, |caps: &Captures| {
let data = caps[1].to_ascii_lowercase();
if data.starts_with("#x") {
if let Ok(result) = String::from_utf8(hex_to_bytes(data[2..].as_bytes())) {
result
} else {
caps[0].to_string()
}
} else if data.starts_with("#") {
if let Ok(result) = String::from_utf8(vec![data[1..].parse().unwrap()]) {
result
} else {
caps[0].to_string()
}
} else {
// stolen from https://dev.w3.org/html5/html-author/charref
match data.as_str() {
"Tab" => "\t",
"NewLine" => "\n",
"excl" => "!",
"quot" | "QUOT" => "\"",
"num" => "#",
"dollar" => "$",
"percnt" => "%",
"amp" | "AMP" => "&",
"apos" => "'",
"lpar" => "(",
"rpar" => ")",
"ast" | "midast" => "*",
"plus" => "+",
"comma" => ",",
"period" => ".",
"sol" => "/",
"colon" => ":",
"semi" => ";",
"lt" | "LT" => "<",
"equals" => "=",
"gt" | "GT" => ">",
"quest" => "?",
"commat" => "@",
"lsqb" | "lbrack" => "[",
"bsol" => "\\",
"rsqb" | "rbrack" => "]",
"Hat" => "^",
"lowbar" => "_",
"grave" | "DiacriticalGrave" => "`",
"lcub" | "lbrace" => "{",
"verbar" | "vert" | "VerticalLine" => "|",
"rcub" | "rbrace" => "}",
"nbsp" | "NonBreakingSpace" => " ",
"iexcl" => "¡",
"cent" => "¢",
"pound" => "£",
"curren" => "¤",
"yen" => "¥",
"brvbar" => "¦",
"sect" => "§",
"Dot" | "die" | "DoubleDot" | "uml" => "¨",
"copy" | "COPY" => "©",
"ordf" => "ª",
"laquo" => "«",
"not" => "¬",
"shy" => "­",
"reg" | "circledR" | "REG" => "®",
"macr" | "OverBar" | "strns" => "¯",
"deg" => "°",
"plusmn" | "pm" | "PlusMinus" => "±",
"sup2" => "²",
"sup3" => "³",
"acute" | "DiacriticalAcute" => "´",
"micro" => "µ",
"para" => "",
"middot" | "centerdot" | "CenterDot" => "·",
"cedil" | "Cedilla" => "¸",
"sup1" => "¹",
"ordm" => "º",
"raquo" => "»",
"frac14" => "¼",
"frac12" | "half" => "½",
"frac34" => "¾",
"iquest" => "¿",
"Agrave" => "À",
"Aacute" => "Á",
"Acirc" => "Â",
"Atilde" => "Ã",
"Auml" => "Ä",
"Aring" => "Å",
"AElig" => "Æ",
"Ccedil" => "Ç",
"Egrave" => "È",
"Eacute" => "É",
"Ecirc" => "Ê",
"Euml" => "Ë",
"Igrave" => "Ì",
"Iacute" => "Í",
"Icirc" => "Î",
"Iuml" => "Ï",
"ETH" => "Ð",
"Ntilde" => "Ñ",
"Ograve" => "Ò",
"Oacute" => "Ó",
"Ocirc" => "Ô",
"Otilde" => "Õ",
"Ouml" => "Ö",
"times" => "×",
"Oslash" => "Ø",
"Ugrave" => "Ù",
"Uacute" => "Ú",
"Ucirc" => "Û",
"Uuml" => "Ü",
"Yacute" => "Ý",
"THORN" => "Þ",
"szlig" => "ß",
"agrave" => "à",
"aacute" => "á",
"acirc" => "â",
"atilde" => "ã",
"auml" => "ä",
"aring" => "å",
"aelig" => "æ",
"ccedil" => "ç",
"egrave" => "è",
"eacute" => "é",
"ecirc" => "ê",
"euml" => "ë",
"igrave" => "ì",
"iacute" => "í",
"icirc" => "î",
"iuml" => "ï",
"eth" => "ð",
"ntilde" => "ñ",
"ograve" => "ò",
"oacute" => "ó",
"ocirc" => "ô",
"otilde" => "õ",
"ouml" => "ö",
"divide" | "div" => "÷",
"oslash" => "ø",
"ugrave" => "ù",
"uacute" => "ú",
"ucirc" => "û",
"uuml" => "ü",
"yacute" => "ý",
"thorn" => "þ",
"yuml" => "ÿ",
"Amacr" => "Ā",
"amacr" => "ā",
"Abreve" => "Ă",
"abreve" => "ă",
"Aogon" => "Ą",
"aogon" => "ą",
"Cacute" => "Ć",
"cacute" => "ć",
"Ccirc" => "Ĉ",
"ccirc" => "ĉ",
"Cdot" => "Ċ",
"cdot" => "ċ",
"Ccaron" => "Č",
"ccaron" => "č",
"Dcaron" => "Ď",
"dcaron" => "ď",
"Dstrok" => "Đ",
"dstrok" => "đ",
"Emacr" => "Ē",
"emacr" => "ē",
"Edot" => "Ė",
"edot" => "ė",
"Eogon" => "Ę",
"eogon" => "ę",
"Ecaron" => "Ě",
"ecaron" => "ě",
"Gcirc" => "Ĝ",
"gcirc" => "ĝ",
"Gbreve" => "Ğ",
"gbreve" => "ğ",
"Gdot" => "Ġ",
"gdot" => "ġ",
"Gcedil" => "Ģ",
"Hcirc" => "Ĥ",
"hcirc" => "ĥ",
"Hstrok" => "Ħ",
"hstrok" => "ħ",
"Itilde" => "Ĩ",
"itilde" => "ĩ",
"Imacr" => "Ī",
"imacr" => "ī",
"Iogon" => "Į",
"iogon" => "į",
"Idot" => "İ",
"imath" | "inodot" => "ı",
"IJlig" => "IJ",
"ijlig" => "ij",
"Jcirc" => "Ĵ",
"jcirc" => "ĵ",
"Kcedil" => "Ķ",
"kcedil" => "ķ",
"kgreen" => "ĸ",
"Lacute" => "Ĺ",
"lacute" => "ĺ",
"Lcedil" => "Ļ",
"lcedil" => "ļ",
"Lcaron" => "Ľ",
"lcaron" => "ľ",
"Lmidot" => "Ŀ",
"lmidot" => "ŀ",
"Lstrok" => "Ł",
"lstrok" => "ł",
"Nacute" => "Ń",
"nacute" => "ń",
"Ncedil" => "Ņ",
"ncedil" => "ņ",
"Ncaron" => "Ň",
"ncaron" => "ň",
"napos" => "ʼn",
"ENG" => "Ŋ",
"eng" => "ŋ",
"Omacr" => "Ō",
"omacr" => "ō",
"Odblac" => "Ő",
"odblac" => "ő",
"OElig" => "Œ",
"oelig" => "œ",
"Racute" => "Ŕ",
"racute" => "ŕ",
"Rcedil" => "Ŗ",
"rcedil" => "ŗ",
"Rcaron" => "Ř",
"rcaron" => "ř",
"Sacute" => "Ś",
"sacute" => "ś",
"Scirc" => "Ŝ",
"scirc" => "ŝ",
"Scedil" => "Ş",
"scedil" => "ş",
"Scaron" => "Š",
"scaron" => "š",
"Tcedil" => "Ţ",
"tcedil" => "ţ",
"Tcaron" => "Ť",
"tcaron" => "ť",
"Tstrok" => "Ŧ",
"tstrok" => "ŧ",
"Utilde" => "Ũ",
"utilde" => "ũ",
"Umacr" => "Ū",
"umacr" => "ū",
"Ubreve" => "Ŭ",
"ubreve" => "ŭ",
"Uring" => "Ů",
"uring" => "ů",
"Udblac" => "Ű",
"udblac" => "ű",
"Uogon" => "Ų",
"uogon" => "ų",
"Wcirc" => "Ŵ",
"wcirc" => "ŵ",
"Ycirc" => "Ŷ",
"ycirc" => "ŷ",
"Yuml" => "Ÿ",
"Zacute" => "Ź",
"zacute" => "ź",
"Zdot" => "Ż",
"zdot" => "ż",
"Zcaron" => "Ž",
"zcaron" => "ž",
"fnof" => "ƒ",
"imped" => "Ƶ",
"gacute" => "ǵ",
"jmath" => "ȷ",
"circ" => "ˆ",
"caron" | "Hacek" => "ˇ",
"breve" | "Breve" => "˘",
"dot" | "DiacriticalDot" => "˙",
"ring" => "˚",
"ogon" => "˛",
"tilde" | "DiacriticalTilde" => "˜",
"dblac" | "DiacriticalDoubleAcute" => "˝",
"DownBreve" => "̑",
"UnderBar" => "̲",
"Alpha" => "Α",
"Beta" => "Β",
"Gamma" => "Γ",
"Delta" => "Δ",
"Epsilon" => "Ε",
"Zeta" => "Ζ",
"Eta" => "Η",
"Theta" => "Θ",
"Iota" => "Ι",
"Kappa" => "Κ",
"Lambda" => "Λ",
"Mu" => "Μ",
"Nu" => "Ν",
"Xi" => "Ξ",
"Omicron" => "Ο",
"Pi" => "Π",
"Rho" => "Ρ",
"Sigma" => "Σ",
"Tau" => "Τ",
"Upsilon" => "Υ",
"Phi" => "Φ",
"Chi" => "Χ",
"Psi" => "Ψ",
"Omega" => "Ω",
"alpha" => "α",
"beta" => "β",
"gamma" => "γ",
"delta" => "δ",
"epsiv" | "varepsilon" | "epsilon" => "ε",
"zeta" => "ζ",
"eta" => "η",
"theta" => "θ",
"iota" => "ι",
"kappa" => "κ",
"lambda" => "λ",
"mu" => "μ",
"nu" => "ν",
"xi" => "ξ",
"omicron" => "ο",
"pi" => "π",
"rho" => "ρ",
"sigmav" | "varsigma" | "sigmaf" => "ς",
"sigma" => "σ",
"tau" => "τ",
"upsi" | "upsilon" => "υ",
"phi" | "phiv" | "varphi" => "φ",
"chi" => "χ",
"psi" => "ψ",
"omega" => "ω",
"thetav" | "vartheta" | "thetasym" => "ϑ",
"Upsi" | "upsih" => "ϒ",
"straightphi" => "ϕ",
"piv" | "varpi" => "ϖ",
"Gammad" => "Ϝ",
"gammad" | "digamma" => "ϝ",
"kappav" | "varkappa" => "ϰ",
"rhov" | "varrho" => "ϱ",
"epsi" | "straightepsilon" => "ϵ",
"bepsi" | "backepsilon" => "϶",
"IOcy" => "Ё",
"DJcy" => "Ђ",
"GJcy" => "Ѓ",
"Jukcy" => "Є",
"DScy" => "Ѕ",
"Iukcy" => "І",
"YIcy" => "Ї",
"Jsercy" => "Ј",
"LJcy" => "Љ",
"NJcy" => "Њ",
"TSHcy" => "Ћ",
"KJcy" => "Ќ",
"Ubrcy" => "Ў",
"DZcy" => "Џ",
"Acy" => "А",
"Bcy" => "Б",
"Vcy" => "В",
"Gcy" => "Г",
"Dcy" => "Д",
"IEcy" => "Е",
"ZHcy" => "Ж",
"Zcy" => "З",
"Icy" => "И",
"Jcy" => "Й",
"Kcy" => "К",
"Lcy" => "Л",
"Mcy" => "М",
"Ncy" => "Н",
"Ocy" => "О",
"Pcy" => "П",
"Rcy" => "Р",
"Scy" => "С",
"Tcy" => "Т",
"Ucy" => "У",
"Fcy" => "Ф",
"KHcy" => "Х",
"TScy" => "Ц",
"CHcy" => "Ч",
"SHcy" => "Ш",
"SHCHcy" => "Щ",
"HARDcy" => "Ъ",
"Ycy" => "Ы",
"SOFTcy" => "Ь",
"Ecy" => "Э",
"YUcy" => "Ю",
"YAcy" => "Я",
"acy" => "а",
"bcy" => "б",
"vcy" => "в",
"gcy" => "г",
"dcy" => "д",
"iecy" => "е",
"zhcy" => "ж",
"zcy" => "з",
"icy" => "и",
"jcy" => "й",
"kcy" => "к",
"lcy" => "л",
"mcy" => "м",
"ncy" => "н",
"ocy" => "о",
"pcy" => "п",
"rcy" => "р",
"scy" => "с",
"tcy" => "т",
"ucy" => "у",
"fcy" => "ф",
"khcy" => "х",
"tscy" => "ц",
"chcy" => "ч",
"shcy" => "ш",
"shchcy" => "щ",
"hardcy" => "ъ",
"ycy" => "ы",
"softcy" => "ь",
"ecy" => "э",
"yucy" => "ю",
"yacy" => "я",
"iocy" => "ё",
"djcy" => "ђ",
"gjcy" => "ѓ",
"jukcy" => "є",
"dscy" => "ѕ",
"iukcy" => "і",
"yicy" => "ї",
"jsercy" => "ј",
"ljcy" => "љ",
"njcy" => "њ",
"tshcy" => "ћ",
"kjcy" => "ќ",
"ubrcy" => "ў",
"dzcy" => "џ",
"ensp" => "",
"emsp" => "",
"emsp13" => "",
"emsp14" => "",
"numsp" => "",
"puncsp" => "",
"thinsp" | "ThinSpace" => "",
"hairsp" | "VeryThinSpace" => "",
"ZeroWidthSpace"
| "NegativeVeryThinSpace"
| "NegativeThinSpace"
| "NegativeMediumSpace"
| "NegativeThickSpace" => "",
"zwnj" => "",
"zwj" => "",
"lrm" => "",
"rlm" => "",
"hyphen" | "dash" => "",
"ndash" => "",
"mdash" => "",
"horbar" => "",
"Verbar" | "Vert" => "",
"lsquo" | "OpenCurlyQuote" => "",
"rsquo" | "rsquor" | "CloseCurlyQuote" => "",
"lsquor" | "sbquo" => "",
"ldquo" | "OpenCurlyDoubleQuote" => "",
"rdquo" | "rdquor" | "CloseCurlyDoubleQuote" => "",
"ldquor" | "bdquo" => "",
"dagger" => "",
"Dagger" | "ddagger" => "",
"bull" | "bullet" => "",
"nldr" => "",
"hellip" | "mldr" => "",
"permil" => "",
"pertenk" => "",
"prime" => "",
"Prime" => "",
"tprime" => "",
"bprime" | "backprime" => "",
"lsaquo" => "",
"rsaquo" => "",
"oline" => "",
"caret" => "",
"hybull" => "",
"frasl" => "",
"bsemi" => "",
"qprime" => "",
"MediumSpace" => "",
"NoBreak" => "",
"ApplyFunction" | "af" => "",
"InvisibleTimes" | "it" => "",
"InvisibleComma" | "ic" => "",
"euro" => "",
"tdot" | "TripleDot" => "",
"DotDot" => "",
"Copf" | "complexes" => "",
"incare" => "",
"gscr" => "",
"hamilt" | "HilbertSpace" | "Hscr" => "",
"Hfr" | "Poincareplane" => "",
"quaternions" | "Hopf" => "",
"planckh" => "",
"planck" | "hbar" | "plankv" | "hslash" => "",
"Iscr" | "imagline" => "",
"image" | "Im" | "imagpart" | "Ifr" => "",
"Lscr" | "lagran" | "Laplacetrf" => "",
"ell" => "",
"Nopf" | "naturals" => "",
"numero" => "",
"copysr" => "",
"weierp" | "wp" => "",
"Popf" | "primes" => "",
"rationals" | "Qopf" => "",
"Rscr" | "realine" => "",
"real" | "Re" | "realpart" | "Rfr" => "",
"reals" | "Ropf" => "",
"rx" => "",
"trade" | "TRADE" => "",
"integers" | "Zopf" => "",
"ohm" => "",
"mho" => "",
"Zfr" | "zeetrf" => "",
"iiota" => "",
"angst" => "",
"bernou" | "Bernoullis" | "Bscr" => "",
"Cfr" | "Cayleys" => "",
"escr" => "",
"Escr" | "expectation" => "",
"Fscr" | "Fouriertrf" => "",
"phmmat" | "Mellintrf" | "Mscr" => "",
"order" | "orderof" | "oscr" => "",
"alefsym" | "aleph" => "",
"beth" => "",
"gimel" => "",
"daleth" => "",
"CapitalDifferentialD" | "DD" => "",
"DifferentialD" | "dd" => "",
"ExponentialE" | "exponentiale" | "ee" => "",
"ImaginaryI" | "ii" => "",
"frac13" => "",
"frac23" => "",
"frac15" => "",
"frac25" => "",
"frac35" => "",
"frac45" => "",
"frac16" => "",
"frac56" => "",
"frac18" => "",
"frac38" => "",
"frac58" => "",
"frac78" => "",
"larr" | "leftarrow" | "LeftArrow" | "slarr" | "ShortLeftArrow" => "",
"uarr" | "uparrow" | "UpArrow" | "ShortUpArrow" => "",
"rarr" | "rightarrow" | "RightArrow" | "srarr" | "ShortRightArrow" => "",
"darr" | "downarrow" | "DownArrow" | "ShortDownArrow" => "",
"harr" | "leftrightarrow" | "LeftRightArrow" => "",
"varr" | "updownarrow" | "UpDownArrow" => "",
"nwarr" | "UpperLeftArrow" | "nwarrow" => "",
"nearr" | "UpperRightArrow" | "nearrow" => "",
"searr" | "searrow" | "LowerRightArrow" => "",
"swarr" | "swarrow" | "LowerLeftArrow" => "",
"nlarr" | "nleftarrow" => "",
"nrarr" | "nrightarrow" => "",
"rarrw" | "rightsquigarrow" => "",
"Larr" | "twoheadleftarrow" => "",
"Uarr" => "",
"Rarr" | "twoheadrightarrow" => "",
"Darr" => "",
"larrtl" | "leftarrowtail" => "",
"rarrtl" | "rightarrowtail" => "",
"LeftTeeArrow" | "mapstoleft" => "",
"UpTeeArrow" | "mapstoup" => "",
"map" | "RightTeeArrow" | "mapsto" => "",
"DownTeeArrow" | "mapstodown" => "",
"larrhk" | "hookleftarrow" => "",
"rarrhk" | "hookrightarrow" => "",
"larrlp" | "looparrowleft" => "",
"rarrlp" | "looparrowright" => "",
"harrw" | "leftrightsquigarrow" => "",
"nharr" | "nleftrightarrow" => "",
"lsh" | "Lsh" => "",
"rsh" | "Rsh" => "",
"ldsh" => "",
"rdsh" => "",
"crarr" => "",
"cularr" | "curvearrowleft" => "",
"curarr" | "curvearrowright" => "",
"olarr" | "circlearrowleft" => "",
"orarr" | "circlearrowright" => "",
"lharu" | "LeftVector" | "leftharpoonup" => "",
"lhard" | "leftharpoondown" | "DownLeftVector" => "",
"uharr" | "upharpoonright" | "RightUpVector" => "",
"uharl" | "upharpoonleft" | "LeftUpVector" => "",
"rharu" | "RightVector" | "rightharpoonup" => "",
"rhard" | "rightharpoondown" | "DownRightVector" => "",
"dharr" | "RightDownVector" | "downharpoonright" => "",
"dharl" | "LeftDownVector" | "downharpoonleft" => "",
"rlarr" | "rightleftarrows" | "RightArrowLeftArrow" => "",
"udarr" | "UpArrowDownArrow" => "",
"lrarr" | "leftrightarrows" | "LeftArrowRightArrow" => "",
"llarr" | "leftleftarrows" => "",
"uuarr" | "upuparrows" => "",
"rrarr" | "rightrightarrows" => "",
"ddarr" | "downdownarrows" => "",
"lrhar" | "ReverseEquilibrium" | "leftrightharpoons" => "",
"rlhar" | "rightleftharpoons" | "Equilibrium" => "",
"nlArr" | "nLeftarrow" => "",
"nhArr" | "nLeftrightarrow" => "",
"nrArr" | "nRightarrow" => "",
"lArr" | "Leftarrow" | "DoubleLeftArrow" => "",
"uArr" | "Uparrow" | "DoubleUpArrow" => "",
"rArr" | "Rightarrow" | "Implies" | "DoubleRightArrow" => "",
"dArr" | "Downarrow" | "DoubleDownArrow" => "",
"hArr" | "Leftrightarrow" | "DoubleLeftRightArrow" | "iff" => "",
"vArr" | "Updownarrow" | "DoubleUpDownArrow" => "",
"nwArr" => "",
"neArr" => "",
"seArr" => "",
"swArr" => "",
"lAarr" | "Lleftarrow" => "",
"rAarr" | "Rrightarrow" => "",
"zigrarr" => "",
"larrb" | "LeftArrowBar" => "",
"rarrb" | "RightArrowBar" => "",
"duarr" | "DownArrowUpArrow" => "",
"loarr" => "",
"roarr" => "",
"hoarr" => "",
"forall" | "ForAll" => "",
"comp" | "complement" => "",
"part" | "PartialD" => "",
"exist" | "Exists" => "",
"nexist" | "NotExists" | "nexists" => "",
"empty" | "emptyset" | "emptyv" | "varnothing" => "",
"nabla" | "Del" => "",
"isin" | "isinv" | "Element" | "in" => "",
"notin" | "NotElement" | "notinva" => "",
"niv" | "ReverseElement" | "ni" | "SuchThat" => "",
"notni" | "notniva" | "NotReverseElement" => "",
"prod" | "Product" => "",
"coprod" | "Coproduct" => "",
"sum" | "Sum" => "",
"minus" => "",
"mnplus" | "mp" | "MinusPlus" => "",
"plusdo" | "dotplus" => "",
"setmn" | "setminus" | "Backslash" | "ssetmn" | "smallsetminus" => "",
"lowast" => "",
"compfn" | "SmallCircle" => "",
"radic" | "Sqrt" => "",
"prop" | "propto" | "Proportional" | "vprop" | "varpropto" => "",
"infin" => "",
"angrt" => "",
"ang" | "angle" => "",
"angmsd" | "measuredangle" => "",
"angsph" => "",
"mid" | "VerticalBar" | "smid" | "shortmid" => "",
"nmid" | "NotVerticalBar" | "nsmid" | "nshortmid" => "",
"par" | "parallel" | "DoubleVerticalBar" | "spar" | "shortparallel" => "",
"npar" | "nparallel" | "NotDoubleVerticalBar" | "nspar" | "nshortparallel" => "",
"and" | "wedge" => "",
"or" | "vee" => "",
"cap" => "",
"cup" => "",
"int" | "Integral" => "",
"Int" => "",
"tint" | "iiint" => "",
"conint" | "oint" | "ContourIntegral" => "",
"Conint" | "DoubleContourIntegral" => "",
"Cconint" => "",
"cwint" => "",
"cwconint" | "ClockwiseContourIntegral" => "",
"awconint" | "CounterClockwiseContourIntegral" => "",
"there4" | "therefore" | "Therefore" => "",
"becaus" | "because" | "Because" => "",
"ratio" => "",
"Colon" | "Proportion" => "",
"minusd" | "dotminus" => "",
"mDDot" => "",
"homtht" => "",
"sim" | "Tilde" | "thksim" | "thicksim" => "",
"bsim" | "backsim" => "",
"ac" | "mstpos" => "",
"acd" => "",
"wreath" | "VerticalTilde" | "wr" => "",
"nsim" | "NotTilde" => "",
"esim" | "EqualTilde" | "eqsim" => "",
"sime" | "TildeEqual" | "simeq" => "",
"nsime" | "nsimeq" | "NotTildeEqual" => "",
"cong" | "TildeFullEqual" => "",
"simne" => "",
"ncong" | "NotTildeFullEqual" => "",
"asymp" | "ap" | "TildeTilde" | "approx" | "thkap" | "thickapprox" => "",
"nap" | "NotTildeTilde" | "napprox" => "",
"ape" | "approxeq" => "",
"apid" => "",
"bcong" | "backcong" => "",
"asympeq" | "CupCap" => "",
"bump" | "HumpDownHump" | "Bumpeq" => "",
"bumpe" | "HumpEqual" | "bumpeq" => "",
"esdot" | "DotEqual" | "doteq" => "",
"eDot" | "doteqdot" => "",
"efDot" | "fallingdotseq" => "",
"erDot" | "risingdotseq" => "",
"colone" | "coloneq" | "Assign" => "",
"ecolon" | "eqcolon" => "",
"ecir" | "eqcirc" => "",
"cire" | "circeq" => "",
"wedgeq" => "",
"veeeq" => "",
"trie" | "triangleq" => "",
"equest" | "questeq" => "",
"ne" | "NotEqual" => "",
"equiv" | "Congruent" => "",
"nequiv" | "NotCongruent" => "",
"le" | "leq" => "",
"ge" | "GreaterEqual" | "geq" => "",
"lE" | "LessFullEqual" | "leqq" => "",
"gE" | "GreaterFullEqual" | "geqq" => "",
"lnE" | "lneqq" => "",
"gnE" | "gneqq" => "",
"Lt" | "NestedLessLess" | "ll" => "",
"Gt" | "NestedGreaterGreater" | "gg" => "",
"twixt" | "between" => "",
"NotCupCap" => "",
"nlt" | "NotLess" | "nless" => "",
"ngt" | "NotGreater" | "ngtr" => "",
"nle" | "NotLessEqual" | "nleq" => "",
"nge" | "NotGreaterEqual" | "ngeq" => "",
"lsim" | "LessTilde" | "lesssim" => "",
"gsim" | "gtrsim" | "GreaterTilde" => "",
"nlsim" | "NotLessTilde" => "",
"ngsim" | "NotGreaterTilde" => "",
"lg" | "lessgtr" | "LessGreater" => "",
"gl" | "gtrless" | "GreaterLess" => "",
"ntlg" | "NotLessGreater" => "",
"ntgl" | "NotGreaterLess" => "",
"pr" | "Precedes" | "prec" => "",
"sc" | "Succeeds" | "succ" => "",
"prcue" | "PrecedesSlantEqual" | "preccurlyeq" => "",
"sccue" | "SucceedsSlantEqual" | "succcurlyeq" => "",
"prsim" | "precsim" | "PrecedesTilde" => "",
"scsim" | "succsim" | "SucceedsTilde" => "",
"npr" | "nprec" | "NotPrecedes" => "",
"nsc" | "nsucc" | "NotSucceeds" => "",
"sub" | "subset" => "",
"sup" | "supset" | "Superset" => "",
"nsub" => "",
"nsup" => "",
"sube" | "SubsetEqual" | "subseteq" => "",
"supe" | "supseteq" | "SupersetEqual" => "",
"nsube" | "nsubseteq" | "NotSubsetEqual" => "",
"nsupe" | "nsupseteq" | "NotSupersetEqual" => "",
"subne" | "subsetneq" => "",
"supne" | "supsetneq" => "",
"cupdot" => "",
"uplus" | "UnionPlus" => "",
"sqsub" | "SquareSubset" | "sqsubset" => "",
"sqsup" | "SquareSuperset" | "sqsupset" => "",
"sqsube" | "SquareSubsetEqual" | "sqsubseteq" => "",
"sqsupe" | "SquareSupersetEqual" | "sqsupseteq" => "",
"sqcap" | "SquareIntersection" => "",
"sqcup" | "SquareUnion" => "",
"oplus" | "CirclePlus" => "",
"ominus" | "CircleMinus" => "",
"otimes" | "CircleTimes" => "",
"osol" => "",
"odot" | "CircleDot" => "",
"ocir" | "circledcirc" => "",
"oast" | "circledast" => "",
"odash" | "circleddash" => "",
"plusb" | "boxplus" => "",
"minusb" | "boxminus" => "",
"timesb" | "boxtimes" => "",
"sdotb" | "dotsquare" => "",
"vdash" | "RightTee" => "",
"dashv" | "LeftTee" => "",
"top" | "DownTee" => "",
"bottom" | "bot" | "perp" | "UpTee" => "",
"models" => "",
"vDash" | "DoubleRightTee" => "",
"Vdash" => "",
"Vvdash" => "",
"VDash" => "",
"nvdash" => "",
"nvDash" => "",
"nVdash" => "",
"nVDash" => "",
"prurel" => "",
"vltri" | "vartriangleleft" | "LeftTriangle" => "",
"vrtri" | "vartriangleright" | "RightTriangle" => "",
"ltrie" | "trianglelefteq" | "LeftTriangleEqual" => "",
"rtrie" | "trianglerighteq" | "RightTriangleEqual" => "",
"origof" => "",
"imof" => "",
"mumap" | "multimap" => "",
"hercon" => "",
"intcal" | "intercal" => "",
"veebar" => "",
"barvee" => "",
"angrtvb" => "",
"lrtri" => "",
"xwedge" | "Wedge" | "bigwedge" => "",
"xvee" | "Vee" | "bigvee" => "",
"xcap" | "Intersection" | "bigcap" => "",
"xcup" | "Union" | "bigcup" => "",
"diam" | "diamond" | "Diamond" => "",
"sdot" => "",
"sstarf" | "Star" => "",
"divonx" | "divideontimes" => "",
"bowtie" => "",
"ltimes" => "",
"rtimes" => "",
"lthree" | "leftthreetimes" => "",
"rthree" | "rightthreetimes" => "",
"bsime" | "backsimeq" => "",
"cuvee" | "curlyvee" => "",
"cuwed" | "curlywedge" => "",
"Sub" | "Subset" => "",
"Sup" | "Supset" => "",
"Cap" => "",
"Cup" => "",
"fork" | "pitchfork" => "",
"epar" => "",
"ltdot" | "lessdot" => "",
"gtdot" | "gtrdot" => "",
"Ll" => "",
"Gg" | "ggg" => "",
"leg" | "LessEqualGreater" | "lesseqgtr" => "",
"gel" | "gtreqless" | "GreaterEqualLess" => "",
"cuepr" | "curlyeqprec" => "",
"cuesc" | "curlyeqsucc" => "",
"nprcue" | "NotPrecedesSlantEqual" => "",
"nsccue" | "NotSucceedsSlantEqual" => "",
"nsqsube" | "NotSquareSubsetEqual" => "",
"nsqsupe" | "NotSquareSupersetEqual" => "",
"lnsim" => "",
"gnsim" => "",
"prnsim" | "precnsim" => "",
"scnsim" | "succnsim" => "",
"nltri" | "ntriangleleft" | "NotLeftTriangle" => "",
"nrtri" | "ntriangleright" | "NotRightTriangle" => "",
"nltrie" | "ntrianglelefteq" | "NotLeftTriangleEqual" => "",
"nrtrie" | "ntrianglerighteq" | "NotRightTriangleEqual" => "",
"vellip" => "",
"ctdot" => "",
"utdot" => "",
"dtdot" => "",
"disin" => "",
"isinsv" => "",
"isins" => "",
"isindot" => "",
"notinvc" => "",
"notinvb" => "",
"isinE" => "",
"nisd" => "",
"xnis" => "",
"nis" => "",
"notnivc" => "",
"notnivb" => "",
"barwed" | "barwedge" => "",
"Barwed" | "doublebarwedge" => "",
"lceil" | "LeftCeiling" => "",
"rceil" | "RightCeiling" => "",
"lfloor" | "LeftFloor" => "",
"rfloor" | "RightFloor" => "",
"drcrop" => "",
"dlcrop" => "",
"urcrop" => "",
"ulcrop" => "",
"bnot" => "",
"profline" => "",
"profsurf" => "",
"telrec" => "",
"target" => "",
"ulcorn" | "ulcorner" => "",
"urcorn" | "urcorner" => "",
"dlcorn" | "llcorner" => "",
"drcorn" | "lrcorner" => "",
"frown" | "sfrown" => "",
"smile" | "ssmile" => "",
"cylcty" => "",
"profalar" => "",
"topbot" => "",
"ovbar" => "",
"solbar" => "",
"angzarr" => "",
"lmoust" | "lmoustache" => "",
"rmoust" | "rmoustache" => "",
"tbrk" | "OverBracket" => "",
"bbrk" | "UnderBracket" => "",
"bbrktbrk" => "",
"OverParenthesis" => "",
"UnderParenthesis" => "",
"OverBrace" => "",
"UnderBrace" => "",
"trpezium" => "",
"elinters" => "",
"blank" => "",
"oS" | "circledS" => "",
"boxh" | "HorizontalLine" => "",
"boxv" => "",
"boxdr" => "",
"boxdl" => "",
"boxur" => "",
"boxul" => "",
"boxvr" => "",
"boxvl" => "",
"boxhd" => "",
"boxhu" => "",
"boxvh" => "",
"boxH" => "",
"boxV" => "",
"boxdR" => "",
"boxDr" => "",
"boxDR" => "",
"boxdL" => "",
"boxDl" => "",
"boxDL" => "",
"boxuR" => "",
"boxUr" => "",
"boxUR" => "",
"boxuL" => "",
"boxUl" => "",
"boxUL" => "",
"boxvR" => "",
"boxVr" => "",
"boxVR" => "",
"boxvL" => "",
"boxVl" => "",
"boxVL" => "",
"boxHd" => "",
"boxhD" => "",
"boxHD" => "",
"boxHu" => "",
"boxhU" => "",
"boxHU" => "",
"boxvH" => "",
"boxVh" => "",
"boxVH" => "",
"uhblk" => "",
"lhblk" => "",
"block" => "",
"blk14" => "",
"blk12" => "",
"blk34" => "",
"squ" | "square" | "Square" => "",
"squf" | "squarf" | "blacksquare" | "FilledVerySmallSquare" => "",
"EmptyVerySmallSquare" => "",
"rect" => "",
"marker" => "",
"fltns" => "",
"xutri" | "bigtriangleup" => "",
"utrif" | "blacktriangle" => "",
"utri" | "triangle" => "",
"rtrif" | "blacktriangleright" => "",
"rtri" | "triangleright" => "",
"xdtri" | "bigtriangledown" => "",
"dtrif" | "blacktriangledown" => "",
"dtri" | "triangledown" => "",
"ltrif" | "blacktriangleleft" => "",
"ltri" | "triangleleft" => "",
"loz" | "lozenge" => "",
"cir" => "",
"tridot" => "",
"xcirc" | "bigcirc" => "",
"ultri" => "",
"urtri" => "",
"lltri" => "",
"EmptySmallSquare" => "",
"FilledSmallSquare" => "",
"starf" | "bigstar" => "",
"star" => "",
"phone" => "",
"female" => "",
"male" => "",
"spades" | "spadesuit" => "",
"clubs" | "clubsuit" => "",
"hearts" | "heartsuit" => "",
"diams" | "diamondsuit" => "",
"sung" => "",
"flat" => "",
"natur" | "natural" => "",
"sharp" => "",
"check" | "checkmark" => "",
"cross" => "",
"malt" | "maltese" => "",
"sext" => "",
"VerticalSeparator" => "",
"lbbrk" => "",
"rbbrk" => "",
"lobrk" | "LeftDoubleBracket" => "",
"robrk" | "RightDoubleBracket" => "",
"lang" | "LeftAngleBracket" | "langle" => "",
"rang" | "RightAngleBracket" | "rangle" => "",
"Lang" => "",
"Rang" => "",
"loang" => "",
"roang" => "",
"xlarr" | "longleftarrow" | "LongLeftArrow" => "",
"xrarr" | "longrightarrow" | "LongRightArrow" => "",
"xharr" | "longleftrightarrow" | "LongLeftRightArrow" => "",
"xlArr" | "Longleftarrow" | "DoubleLongLeftArrow" => "",
"xrArr" | "Longrightarrow" | "DoubleLongRightArrow" => "",
"xhArr" | "Longleftrightarrow" | "DoubleLongLeftRightArrow" => "",
"xmap" | "longmapsto" => "",
"dzigrarr" => "",
"nvlArr" => "",
"nvrArr" => "",
"nvHarr" => "",
"Map" => "",
"lbarr" => "",
"rbarr" | "bkarow" => "",
"lBarr" => "",
"rBarr" | "dbkarow" => "",
"RBarr" | "drbkarow" => "",
"DDotrahd" => "",
"UpArrowBar" => "",
"DownArrowBar" => "",
"Rarrtl" => "",
"latail" => "",
"ratail" => "",
"lAtail" => "",
"rAtail" => "",
"larrfs" => "",
"rarrfs" => "",
"larrbfs" => "",
"rarrbfs" => "",
"nwarhk" => "",
"nearhk" => "",
"searhk" | "hksearow" => "",
"swarhk" | "hkswarow" => "",
"nwnear" => "",
"nesear" | "toea" => "",
"seswar" | "tosa" => "",
"swnwar" => "",
"rarrc" => "",
"cudarrr" => "",
"ldca" => "",
"rdca" => "",
"cudarrl" => "",
"larrpl" => "",
"curarrm" => "",
"cularrp" => "",
"rarrpl" => "",
"harrcir" => "",
"Uarrocir" => "",
"lurdshar" => "",
"ldrushar" => "",
"LeftRightVector" => "",
"RightUpDownVector" => "",
"DownLeftRightVector" => "",
"LeftUpDownVector" => "",
"LeftVectorBar" => "",
"RightVectorBar" => "",
"RightUpVectorBar" => "",
"RightDownVectorBar" => "",
"DownLeftVectorBar" => "",
"DownRightVectorBar" => "",
"LeftUpVectorBar" => "",
"LeftDownVectorBar" => "",
"LeftTeeVector" => "",
"RightTeeVector" => "",
"RightUpTeeVector" => "",
"RightDownTeeVector" => "",
"DownLeftTeeVector" => "",
"DownRightTeeVector" => "",
"LeftUpTeeVector" => "",
"LeftDownTeeVector" => "",
"lHar" => "",
"uHar" => "",
"rHar" => "",
"dHar" => "",
"luruhar" => "",
"ldrdhar" => "",
"ruluhar" => "",
"rdldhar" => "",
"lharul" => "",
"llhard" => "",
"rharul" => "",
"lrhard" => "",
"udhar" | "UpEquilibrium" => "",
"duhar" | "ReverseUpEquilibrium" => "",
"RoundImplies" => "",
"erarr" => "",
"simrarr" => "",
"larrsim" => "",
"rarrsim" => "",
"rarrap" => "",
"ltlarr" => "",
"gtrarr" => "",
"subrarr" => "",
"suplarr" => "",
"lfisht" => "",
"rfisht" => "",
"ufisht" => "",
"dfisht" => "⥿",
"lopar" => "",
"ropar" => "",
"lbrke" => "",
"rbrke" => "",
"lbrkslu" => "",
"rbrksld" => "",
"lbrksld" => "",
"rbrkslu" => "",
"langd" => "",
"rangd" => "",
"lparlt" => "",
"rpargt" => "",
"gtlPar" => "",
"ltrPar" => "",
"vzigzag" => "",
"vangrt" => "",
"angrtvbd" => "",
"ange" => "",
"range" => "",
"dwangle" => "",
"uwangle" => "",
"angmsdaa" => "",
"angmsdab" => "",
"angmsdac" => "",
"angmsdad" => "",
"angmsdae" => "",
"angmsdaf" => "",
"angmsdag" => "",
"angmsdah" => "",
"bemptyv" => "",
"demptyv" => "",
"cemptyv" => "",
"raemptyv" => "",
"laemptyv" => "",
"ohbar" => "",
"omid" => "",
"opar" => "",
"operp" => "",
"olcross" => "",
"odsold" => "",
"olcir" => "",
"ofcir" => "⦿",
"olt" => "",
"ogt" => "",
"cirscir" => "",
"cirE" => "",
"solb" => "",
"bsolb" => "",
"boxbox" => "",
"trisb" => "",
"rtriltri" => "",
"LeftTriangleBar" => "",
"RightTriangleBar" => "",
"race" => "",
"iinfin" => "",
"infintie" => "",
"nvinfin" => "",
"eparsl" => "",
"smeparsl" => "",
"eqvparsl" => "",
"lozf" | "blacklozenge" => "",
"RuleDelayed" => "",
"dsol" => "",
"xodot" | "bigodot" => "",
"xoplus" | "bigoplus" => "",
"xotime" | "bigotimes" => "",
"xuplus" | "biguplus" => "",
"xsqcup" | "bigsqcup" => "",
"qint" | "iiiint" => "",
"fpartint" => "",
"cirfnint" => "",
"awint" => "",
"rppolint" => "",
"scpolint" => "",
"npolint" => "",
"pointint" => "",
"quatint" => "",
"intlarhk" => "",
"pluscir" => "",
"plusacir" => "",
"simplus" => "",
"plusdu" => "",
"plussim" => "",
"plustwo" => "",
"mcomma" => "",
"minusdu" => "",
"loplus" => "",
"roplus" => "",
"Cross" => "",
"timesd" => "",
"timesbar" => "",
"smashp" => "",
"lotimes" => "",
"rotimes" => "",
"otimesas" => "",
"Otimes" => "",
"odiv" => "",
"triplus" => "",
"triminus" => "",
"tritime" => "",
"iprod" | "intprod" => "",
"amalg" => "⨿",
"capdot" => "",
"ncup" => "",
"ncap" => "",
"capand" => "",
"cupor" => "",
"cupcap" => "",
"capcup" => "",
"cupbrcap" => "",
"capbrcup" => "",
"cupcup" => "",
"capcap" => "",
"ccups" => "",
"ccaps" => "",
"ccupssm" => "",
"And" => "",
"Or" => "",
"andand" => "",
"oror" => "",
"orslope" => "",
"andslope" => "",
"andv" => "",
"orv" => "",
"andd" => "",
"ord" => "",
"wedbar" => "",
"sdote" => "",
"simdot" => "",
"congdot" => "",
"easter" => "",
"apacir" => "",
"apE" => "",
"eplus" => "",
"pluse" => "",
"Esim" => "",
"Colone" => "",
"Equal" => "",
"eDDot" | "ddotseq" => "",
"equivDD" => "",
"ltcir" => "",
"gtcir" => "",
"ltquest" => "",
"gtquest" => "",
"les" | "LessSlantEqual" | "leqslant" => "",
"ges" | "GreaterSlantEqual" | "geqslant" => "",
"lesdot" => "⩿",
"gesdot" => "",
"lesdoto" => "",
"gesdoto" => "",
"lesdotor" => "",
"gesdotol" => "",
"lap" | "lessapprox" => "",
"gap" | "gtrapprox" => "",
"lne" | "lneq" => "",
"gne" | "gneq" => "",
"lnap" | "lnapprox" => "",
"gnap" | "gnapprox" => "",
"lEg" | "lesseqqgtr" => "",
"gEl" | "gtreqqless" => "",
"lsime" => "",
"gsime" => "",
"lsimg" => "",
"gsiml" => "",
"lgE" => "",
"glE" => "",
"lesges" => "",
"gesles" => "",
"els" | "eqslantless" => "",
"egs" | "eqslantgtr" => "",
"elsdot" => "",
"egsdot" => "",
"el" => "",
"eg" => "",
"siml" => "",
"simg" => "",
"simlE" => "",
"simgE" => "",
"LessLess" => "",
"GreaterGreater" => "",
"glj" => "",
"gla" => "",
"ltcc" => "",
"gtcc" => "",
"lescc" => "",
"gescc" => "",
"smt" => "",
"lat" => "",
"smte" => "",
"late" => "",
"bumpE" => "",
"pre" | "preceq" | "PrecedesEqual" => "",
"sce" | "succeq" | "SucceedsEqual" => "",
"prE" => "",
"scE" => "",
"prnE" | "precneqq" => "",
"scnE" | "succneqq" => "",
"prap" | "precapprox" => "",
"scap" | "succapprox" => "",
"prnap" | "precnapprox" => "",
"scnap" | "succnapprox" => "",
"Pr" => "",
"Sc" => "",
"subdot" => "",
"supdot" => "",
"subplus" => "⪿",
"supplus" => "",
"submult" => "",
"supmult" => "",
"subedot" => "",
"supedot" => "",
"subE" | "subseteqq" => "",
"supE" | "supseteqq" => "",
"subsim" => "",
"supsim" => "",
"subnE" | "subsetneqq" => "",
"supnE" | "supsetneqq" => "",
"csub" => "",
"csup" => "",
"csube" => "",
"csupe" => "",
"subsup" => "",
"supsub" => "",
"subsub" => "",
"supsup" => "",
"suphsub" => "",
"supdsub" => "",
"forkv" => "",
"topfork" => "",
"mlcp" => "",
"Dashv" | "DoubleLeftTee" => "",
"Vdashl" => "",
"Barv" => "",
"vBar" => "",
"vBarv" => "",
"Vbar" => "",
"Not" => "",
"bNot" => "",
"rnmid" => "",
"cirmid" => "",
"midcir" => "",
"topcir" => "",
"nhpar" => "",
"parsim" => "",
"parsl" => "",
"fflig" => "",
"filig" => "",
"fllig" => "",
"ffilig" => "",
"ffllig" => "",
"Ascr" => "𝒜",
"Cscr" => "𝒞",
"Dscr" => "𝒟",
"Gscr" => "𝒢",
"Jscr" => "𝒥",
"Kscr" => "𝒦",
"Nscr" => "𝒩",
"Oscr" => "𝒪",
"Pscr" => "𝒫",
"Qscr" => "𝒬",
"Sscr" => "𝒮",
"Tscr" => "𝒯",
"Uscr" => "𝒰",
"Vscr" => "𝒱",
"Wscr" => "𝒲",
"Xscr" => "𝒳",
"Yscr" => "𝒴",
"Zscr" => "𝒵",
"ascr" => "𝒶",
"bscr" => "𝒷",
"cscr" => "𝒸",
"dscr" => "𝒹",
"fscr" => "𝒻",
"hscr" => "𝒽",
"iscr" => "𝒾",
"jscr" => "𝒿",
"kscr" => "𝓀",
"lscr" => "𝓁",
"mscr" => "𝓂",
"nscr" => "𝓃",
"pscr" => "𝓅",
"qscr" => "𝓆",
"rscr" => "𝓇",
"sscr" => "𝓈",
"tscr" => "𝓉",
"uscr" => "𝓊",
"vscr" => "𝓋",
"wscr" => "𝓌",
"xscr" => "𝓍",
"yscr" => "𝓎",
"zscr" => "𝓏",
"Afr" => "𝔄",
"Bfr" => "𝔅",
"Dfr" => "𝔇",
"Efr" => "𝔈",
"Ffr" => "𝔉",
"Gfr" => "𝔊",
"Jfr" => "𝔍",
"Kfr" => "𝔎",
"Lfr" => "𝔏",
"Mfr" => "𝔐",
"Nfr" => "𝔑",
"Ofr" => "𝔒",
"Pfr" => "𝔓",
"Qfr" => "𝔔",
"Sfr" => "𝔖",
"Tfr" => "𝔗",
"Ufr" => "𝔘",
"Vfr" => "𝔙",
"Wfr" => "𝔚",
"Xfr" => "𝔛",
"Yfr" => "𝔜",
"afr" => "𝔞",
"bfr" => "𝔟",
"cfr" => "𝔠",
"dfr" => "𝔡",
"efr" => "𝔢",
"ffr" => "𝔣",
"gfr" => "𝔤",
"hfr" => "𝔥",
"ifr" => "𝔦",
"jfr" => "𝔧",
"kfr" => "𝔨",
"lfr" => "𝔩",
"mfr" => "𝔪",
"nfr" => "𝔫",
"ofr" => "𝔬",
"pfr" => "𝔭",
"qfr" => "𝔮",
"rfr" => "𝔯",
"sfr" => "𝔰",
"tfr" => "𝔱",
"ufr" => "𝔲",
"vfr" => "𝔳",
"wfr" => "𝔴",
"xfr" => "𝔵",
"yfr" => "𝔶",
"zfr" => "𝔷",
"Aopf" => "𝔸",
"Bopf" => "𝔹",
"Dopf" => "𝔻",
"Eopf" => "𝔼",
"Fopf" => "𝔽",
"Gopf" => "𝔾",
"Iopf" => "𝕀",
"Jopf" => "𝕁",
"Kopf" => "𝕂",
"Lopf" => "𝕃",
"Mopf" => "𝕄",
"Oopf" => "𝕆",
"Sopf" => "𝕊",
"Topf" => "𝕋",
"Uopf" => "𝕌",
"Vopf" => "𝕍",
"Wopf" => "𝕎",
"Xopf" => "𝕏",
"Yopf" => "𝕐",
"aopf" => "𝕒",
"bopf" => "𝕓",
"copf" => "𝕔",
"dopf" => "𝕕",
"eopf" => "𝕖",
"fopf" => "𝕗",
"gopf" => "𝕘",
"hopf" => "𝕙",
"iopf" => "𝕚",
"jopf" => "𝕛",
"kopf" => "𝕜",
"lopf" => "𝕝",
"mopf" => "𝕞",
"nopf" => "𝕟",
"oopf" => "𝕠",
"popf" => "𝕡",
"qopf" => "𝕢",
"ropf" => "𝕣",
"sopf" => "𝕤",
"topf" => "𝕥",
"uopf" => "𝕦",
"vopf" => "𝕧",
"wopf" => "𝕨",
"xopf" => "𝕩",
"yopf" => "𝕪",
"zopf" => "𝕫",
_ => &caps[0],
}
.to_string()
}
})
}
#[test]
fn test_unescape() {
assert_eq!(&*unescape("test"), "test");
assert_eq!(&*unescape("&lt;test&gt;"), "<test>");
assert_eq!(&*unescape("&#x30;"), "0");
assert_eq!(&*unescape("&#48;"), "0");
assert_eq!(&*unescape("&foo;"), "&foo;");
}