1use crate::types::{MatchError, Result};
2use phf::phf_map;
3
4static ENTITY_MAP: phf::Map<&'static str, &'static str> = phf_map! {
5"Agrave" => r#"À"#,
6"agrave" => r#"à"#,
7"Aacute" => r#"Á"#,
8"aacute" => r#"á"#,
9"Acirc" => r#"Â"#,
10"acirc" => r#"â"#,
11"Amacr" => r#"Ā"#,
12"amacr" => r#"ā"#,
13"Atilde" => r#"Ã"#,
14"atilde" => r#"ã"#,
15"Auml" => r#"Ä"#,
16"auml" => r#"ä"#,
17"Aring" => r#"Å"#,
18"AA" => r#"Å"#,
19"aring" => r#"å"#,
20"AElig" => r#"Æ"#,
21"aelig" => r#"æ"#,
22"Ccedil" => r#"Ç"#,
23"ccedil" => r#"ç"#,
24"Egrave" => r#"È"#,
25"egrave" => r#"è"#,
26"Eacute" => r#"É"#,
27"eacute" => r#"é"#,
28"Ecirc" => r#"Ê"#,
29"ecirc" => r#"ê"#,
30"Euml" => r#"Ë"#,
31"euml" => r#"ë"#,
32"Igrave" => r#"Ì"#,
33"igrave" => r#"ì"#,
34"Iacute" => r#"Í"#,
35"iacute" => r#"í"#,
36"Idot" => r#"İ"#,
37"inodot" => r#"ı"#,
38"Icirc" => r#"Î"#,
39"icirc" => r#"î"#,
40"Iuml" => r#"Ï"#,
41"iuml" => r#"ï"#,
42"Ntilde" => r#"Ñ"#,
43"ntilde" => r#"ñ"#,
44"Ograve" => r#"Ò"#,
45"ograve" => r#"ò"#,
46"Oacute" => r#"Ó"#,
47"oacute" => r#"ó"#,
48"Ocirc" => r#"Ô"#,
49"ocirc" => r#"ô"#,
50"Otilde" => r#"Õ"#,
51"otilde" => r#"õ"#,
52"Ouml" => r#"Ö"#,
53"ouml" => r#"ö"#,
54"Oslash" => r#"Ø"#,
55"oslash" => r#"ø"#,
56"OElig" => r#"Œ"#,
57"oelig" => r#"œ"#,
58"Scaron" => r#"Š"#,
59"scaron" => r#"š"#,
60"szlig" => r#"ß"#,
61"Ugrave" => r#"Ù"#,
62"ugrave" => r#"ù"#,
63"Uacute" => r#"Ú"#,
64"uacute" => r#"ú"#,
65"Ucirc" => r#"Û"#,
66"ucirc" => r#"û"#,
67"Uuml" => r#"Ü"#,
68"uuml" => r#"ü"#,
69"Yacute" => r#"Ý"#,
70"yacute" => r#"ý"#,
71"Yuml" => r#"Ÿ"#,
72"yuml" => r#"ÿ"#,
73"fnof" => r#"ƒ"#,
74"real" => r#"ℜ"#,
75"image" => r#"ℑ"#,
76"weierp" => r#"℘"#,
77"ell" => r#"ℓ"#,
78"imath" => r#"ı"#,
79"jmath" => r#"ȷ"#,
80"Alpha" => r#"Α"#,
81"alpha" => r#"α"#,
82"Beta" => r#"Β"#,
83"beta" => r#"β"#,
84"Gamma" => r#"Γ"#,
85"gamma" => r#"γ"#,
86"Delta" => r#"Δ"#,
87"delta" => r#"δ"#,
88"Epsilon" => r#"Ε"#,
89"epsilon" => r#"ε"#,
90"varepsilon" => r#"ε"#,
91"Zeta" => r#"Ζ"#,
92"zeta" => r#"ζ"#,
93"Eta" => r#"Η"#,
94"eta" => r#"η"#,
95"Theta" => r#"Θ"#,
96"theta" => r#"θ"#,
97"thetasym" => r#"ϑ"#,
98"vartheta" => r#"ϑ"#,
99"Iota" => r#"Ι"#,
100"iota" => r#"ι"#,
101"Kappa" => r#"Κ"#,
102"kappa" => r#"κ"#,
103"Lambda" => r#"Λ"#,
104"lambda" => r#"λ"#,
105"Mu" => r#"Μ"#,
106"mu" => r#"μ"#,
107"nu" => r#"ν"#,
108"Nu" => r#"Ν"#,
109"Xi" => r#"Ξ"#,
110"xi" => r#"ξ"#,
111"Omicron" => r#"Ο"#,
112"omicron" => r#"ο"#,
113"Pi" => r#"Π"#,
114"pi" => r#"π"#,
115"Rho" => r#"Ρ"#,
116"rho" => r#"ρ"#,
117"Sigma" => r#"Σ"#,
118"sigma" => r#"σ"#,
119"sigmaf" => r#"ς"#,
120"varsigma" => r#"ς"#,
121"Tau" => r#"Τ"#,
122"Upsilon" => r#"Υ"#,
123"upsih" => r#"ϒ"#,
124"upsilon" => r#"υ"#,
125"Phi" => r#"Φ"#,
126"phi" => r#"φ"#,
127"varphi" => r#"ϕ"#,
128"Chi" => r#"Χ"#,
129"chi" => r#"χ"#,
130"acutex" => r#"´x"#,
131"Psi" => r#"Ψ"#,
132"psi" => r#"ψ"#,
133"tau" => r#"τ"#,
134"Omega" => r#"Ω"#,
135"omega" => r#"ω"#,
136"piv" => r#"ϖ"#,
137"varpi" => r#"ϖ"#,
138"partial" => r#"∂"#,
139"alefsym" => r#"ℵ"#,
140"aleph" => r#"ℵ"#,
141"gimel" => r#"ℷ"#,
142"beth" => r#"ℶ"#,
143"dalet" => r#"ℸ"#,
144"ETH" => r#"Ð"#,
145"eth" => r#"ð"#,
146"THORN" => r#"Þ"#,
147"thorn" => r#"þ"#,
148"dots" => r#"…"#,
149"cdots" => r#"⋯"#,
150"hellip" => r#"…"#,
151"middot" => r#"·"#,
152"iexcl" => r#"¡"#,
153"iquest" => r#"¿"#,
154"shy" => r#"\u{AD}"#,
155"ndash" => r#"–"#,
156"mdash" => r#"—"#,
157"quot" => r#"""#,
158"acute" => r#"´"#,
159"ldquo" => r#"“"#,
160"rdquo" => r#"”"#,
161"bdquo" => r#"„"#,
162"lsquo" => r#"‘"#,
163"rsquo" => r#"’"#,
164"sbquo" => r#"‚"#,
165"laquo" => r#"«"#,
166"raquo" => r#"»"#,
167"lsaquo" => r#"‹"#,
168"rsaquo" => r#"›"#,
169"circ" => r#"ˆ"#,
170"vert" => r#"|"#,
171"vbar" => r#"|"#,
172"brvbar" => r#"¦"#,
173"S" => r#"§"#,
174"sect" => r#"§"#,
175"amp" => r#"&"#,
176"lt" => r#"<"#,
177"gt" => r#">"#,
178"tilde" => r#"~"#,
179"slash" => r#"/"#,
180"plus" => r#"+"#,
181"under" => r#"_"#,
182"equal" => r#"="#,
183"asciicirc" => r#"^"#,
184"dagger" => r#"†"#,
185"dag" => r#"†"#,
186"Dagger" => r#"‡"#,
187"ddag" => r#"‡"#,
188"ensp" => r#" "#,
189"emsp" => r#" "#,
190"thinsp" => r#" "#,
191"curren" => r#"¤"#,
192"cent" => r#"¢"#,
193"pound" => r#"£"#,
194"yen" => r#"¥"#,
195"euro" => r#"€"#,
196"EUR" => r#"€"#,
197"dollar" => r#"$"#,
198"USD" => r#"$"#,
199"copy" => r#"©"#,
200"reg" => r#"®"#,
201"trade" => r#"™"#,
202"minus" => r#"−"#,
203"pm" => r#"±"#,
204"plusmn" => r#"±"#,
205"times" => r#"×"#,
206"frasl" => r#"⁄"#,
207"colon" => r#":"#,
208"div" => r#"÷"#,
209"frac12" => r#"½"#,
210"frac14" => r#"¼"#,
211"frac34" => r#"¾"#,
212"permil" => r#"‰"#,
213"sup1" => r#"¹"#,
214"sup2" => r#"²"#,
215"sup3" => r#"³"#,
216"radic" => r#"√"#,
217"sum" => r#"∑"#,
218"prod" => r#"∏"#,
219"micro" => r#"µ"#,
220"macr" => r#"¯"#,
221"deg" => r#"°"#,
222"prime" => r#"′"#,
223"Prime" => r#"″"#,
224"infin" => r#"∞"#,
225"infty" => r#"∞"#,
226"prop" => r#"∝"#,
227"propto" => r#"∝"#,
228"not" => r#"¬"#,
229"neg" => r#"¬"#,
230"land" => r#"∧"#,
231"wedge" => r#"∧"#,
232"lor" => r#"∨"#,
233"vee" => r#"∨"#,
234"cap" => r#"∩"#,
235"cup" => r#"∪"#,
236"smile" => r#"⌣"#,
237"frown" => r#"⌢"#,
238"int" => r#"∫"#,
239"therefore" => r#"∴"#,
240"there4" => r#"∴"#,
241"because" => r#"∵"#,
242"sim" => r#"∼"#,
243"cong" => r#"≅"#,
244"simeq" => r#"≅"#,
245"asymp" => r#"≈"#,
246"approx" => r#"≈"#,
247"ne" => r#"≠"#,
248"neq" => r#"≠"#,
249"equiv" => r#"≡"#,
250"triangleq" => r#"≜"#,
251"le" => r#"≤"#,
252"leq" => r#"≤"#,
253"ge" => r#"≥"#,
254"geq" => r#"≥"#,
255"lessgtr" => r#"≶"#,
256"lesseqgtr" => r#"⋚"#,
257"ll" => r#"≪"#,
258"Ll" => r#"⋘"#,
259"lll" => r#"⋘"#,
260"gg" => r#"≫"#,
261"Gg" => r#"⋙"#,
262"ggg" => r#"⋙"#,
263"prec" => r#"≺"#,
264"preceq" => r#"≼"#,
265"preccurlyeq" => r#"≼"#,
266"succ" => r#"≻"#,
267"succeq" => r#"≽"#,
268"succcurlyeq" => r#"≽"#,
269"sub" => r#"⊂"#,
270"subset" => r#"⊂"#,
271"sup" => r#"⊃"#,
272"supset" => r#"⊃"#,
273"nsub" => r#"⊄"#,
274"sube" => r#"⊆"#,
275"nsup" => r#"⊅"#,
276"supe" => r#"⊇"#,
277"setminus" => r#"∖"#,
278"forall" => r#"∀"#,
279"exist" => r#"∃"#,
280"exists" => r#"∃"#,
281"nexist" => r#"∃"#,
282"nexists" => r#"∃"#,
283"empty" => r#"∅"#,
284"emptyset" => r#"∅"#,
285"isin" => r#"∈"#,
286"in" => r#"∈"#,
287"notin" => r#"∉"#,
288"ni" => r#"∋"#,
289"nabla" => r#"∇"#,
290"ang" => r#"∠"#,
291"angle" => r#"∠"#,
292"perp" => r#"⊥"#,
293"parallel" => r#"∥"#,
294"sdot" => r#"⋅"#,
295"cdot" => r#"⋅"#,
296"lceil" => r#"⌈"#,
297"rceil" => r#"⌉"#,
298"lfloor" => r#"⌊"#,
299"rfloor" => r#"⌋"#,
300"lang" => r#"⟨"#,
301"rang" => r#"⟩"#,
302"langle" => r#"⟨"#,
303"rangle" => r#"⟩"#,
304"hbar" => r#"ℏ"#,
305"mho" => r#"℧"#,
306"larr" => r#"←"#,
307"leftarrow" => r#"←"#,
308"gets" => r#"←"#,
309"lArr" => r#"⇐"#,
310"Leftarrow" => r#"⇐"#,
311"uarr" => r#"↑"#,
312"uparrow" => r#"↑"#,
313"uArr" => r#"⇑"#,
314"Uparrow" => r#"⇑"#,
315"rarr" => r#"→"#,
316"to" => r#"→"#,
317"rightarrow" => r#"→"#,
318"rArr" => r#"⇒"#,
319"Rightarrow" => r#"⇒"#,
320"darr" => r#"↓"#,
321"downarrow" => r#"↓"#,
322"dArr" => r#"⇓"#,
323"Downarrow" => r#"⇓"#,
324"harr" => r#"↔"#,
325"leftrightarrow" => r#"↔"#,
326"hArr" => r#"⇔"#,
327"Leftrightarrow" => r#"⇔"#,
328"crarr" => r#"↵"#,
329"hookleftarrow" => r#"↵"#,
330"arccos" => r#"arccos"#,
331"arcsin" => r#"arcsin"#,
332"arctan" => r#"arctan"#,
333"arg" => r#"arg"#,
334"cos" => r#"cos"#,
335"cosh" => r#"cosh"#,
336"cot" => r#"cot"#,
337"coth" => r#"coth"#,
338"csc" => r#"csc"#,
339"det" => r#"det"#,
340"dim" => r#"dim"#,
341"exp" => r#"exp"#,
342"gcd" => r#"gcd"#,
343"hom" => r#"hom"#,
344"inf" => r#"inf"#,
345"ker" => r#"ker"#,
346"lg" => r#"lg"#,
347"lim" => r#"lim"#,
348"liminf" => r#"liminf"#,
349"limsup" => r#"limsup"#,
350"ln" => r#"ln"#,
351"log" => r#"log"#,
352"max" => r#"max"#,
353"min" => r#"min"#,
354"Pr" => r#"Pr"#,
355"sec" => r#"sec"#,
356"sin" => r#"sin"#,
357"sinh" => r#"sinh"#,
358"tan" => r#"tan"#,
359"tanh" => r#"tanh"#,
360"bull" => r#"•"#,
361"bullet" => r#"•"#,
362"star" => r#"*"#,
363"lowast" => r#"∗"#,
364"ast" => r#"∗"#,
365"odot" => r#"o"#,
366"oplus" => r#"⊕"#,
367"otimes" => r#"⊗"#,
368"check" => r#"✓"#,
369"checkmark" => r#"✓"#,
370"para" => r#"¶"#,
371"ordf" => r#"ª"#,
372"ordm" => r#"º"#,
373"cedil" => r#"¸"#,
374"oline" => r#"‾"#,
375"uml" => r#"¨"#,
376"zwnj" => r#""#,
377"zwj" => r#""#,
378"lrm" => r#""#,
379"rlm" => r#""#,
380"smiley" => r#"☺"#,
381"blacksmile" => r#"☻"#,
382"sad" => r#"☹"#,
383"frowny" => r#"☹"#,
384"clubs" => r#"♣"#,
385"clubsuit" => r#"♣"#,
386"spades" => r#"♠"#,
387"spadesuit" => r#"♠"#,
388"hearts" => r#"♥"#,
389"heartsuit" => r#"♥"#,
390"diams" => r#"♦"#,
391"diamondsuit" => r#"♦"#,
392"diamond" => r#"⋄"#,
393"Diamond" => r#"⋄"#,
394"loz" => r#"◊"#,
395};
396
397#[derive(Debug, Clone, Copy)]
398pub struct Entity<'a> {
399 pub name: &'a str,
400 pub mapped_item: &'a str,
401}
402
403pub(crate) fn parse_entity(name: &str) -> Result<Entity> {
404 if let Some(mapped_item) = ENTITY_MAP.get(name) {
405 Ok(Entity { name, mapped_item })
406 } else {
407 Err(MatchError::InvalidLogic)
408 }
409}