Skip to main content

mail_parser/decoders/
html.rs

1/*
2 * SPDX-FileCopyrightText: 2020 Stalwart Labs LLC <hello@stalw.art>
3 *
4 * SPDX-License-Identifier: Apache-2.0 OR MIT
5 */
6
7use std::char::REPLACEMENT_CHARACTER;
8
9pub fn add_html_token(result: &mut String, token: &[u8], add_space: bool) {
10    if add_space {
11        result.push(' ');
12    }
13
14    if let [b'&', entity @ .., b';'] = token {
15        let entity_code = if let [b'#', code @ ..] = entity {
16            let (code, radix) = if let [b'x' | b'X', code @ ..] = code {
17                (code, 16)
18            } else {
19                (code, 10)
20            };
21
22            std::str::from_utf8(code)
23                .ok()
24                .and_then(|code| u32::from_str_radix(code, radix).ok())
25        } else {
26            lookup_entity(entity).copied()
27        };
28
29        if let Some(entity_code) = entity_code {
30            result.push(char::from_u32(entity_code).unwrap_or(REPLACEMENT_CHARACTER));
31            return;
32        }
33    }
34
35    result.push_str(std::str::from_utf8(token).unwrap());
36}
37
38pub fn html_to_text(input: &str) -> String {
39    let mut result = String::with_capacity(input.len());
40    let input = input.as_bytes();
41
42    let mut in_tag = false;
43    let mut in_head = false;
44    let mut in_style = false;
45    let mut in_script = false;
46    let mut in_template = false;
47    let mut in_comment = false;
48
49    let mut is_token_start = true;
50    let mut is_after_space = false;
51    let mut is_tag_close = false;
52    let mut is_new_line = true;
53
54    let mut token_start = 0;
55    let mut token_end = 0;
56
57    let mut tag_token_pos = 0;
58    let mut comment_pos = 0;
59
60    for (pos, ch) in input.iter().enumerate() {
61        if !in_comment {
62            match ch {
63                b'<' => {
64                    if !in_tag
65                        && !in_head
66                        && !in_style
67                        && !in_script
68                        && !in_template
69                        && !is_token_start
70                    {
71                        add_html_token(
72                            &mut result,
73                            &input[token_start..token_end + 1],
74                            is_after_space,
75                        );
76                        is_after_space = false;
77                    }
78
79                    tag_token_pos = 0;
80                    in_tag = true;
81                    is_token_start = true;
82                    is_tag_close = false;
83                    continue;
84                }
85                b'>' if in_tag => {
86                    if tag_token_pos == 1 {
87                        match input.get(token_start..token_end + 1) {
88                            Some(tag)
89                                if tag.eq_ignore_ascii_case(b"br")
90                                    || (tag.eq_ignore_ascii_case(b"p") && is_tag_close) =>
91                            {
92                                result.push('\n');
93                                is_after_space = false;
94                                is_new_line = true;
95                            }
96                            Some(tag) if tag.eq_ignore_ascii_case(b"head") => {
97                                in_head = !is_tag_close;
98                            }
99                            Some(tag) if tag.eq_ignore_ascii_case(b"style") => {
100                                in_style = !is_tag_close;
101                            }
102                            Some(tag) if tag.eq_ignore_ascii_case(b"script") => {
103                                in_script = !is_tag_close;
104                            }
105                            Some(tag) if tag.eq_ignore_ascii_case(b"template") => {
106                                in_template = !is_tag_close;
107                            }
108                            _ => (),
109                        }
110                    }
111
112                    in_tag = false;
113                    is_token_start = true;
114
115                    continue;
116                }
117                b'/' if in_tag => {
118                    if tag_token_pos == 0 {
119                        is_tag_close = true;
120                    }
121                    continue;
122                }
123                b'!' if in_tag && tag_token_pos == 0 => {
124                    if let Some(b"--") = input.get(pos + 1..pos + 3) {
125                        in_comment = true;
126                        continue;
127                    }
128                }
129                b' ' | b'\t' | b'\r' | b'\n' => {
130                    if !in_tag && !in_head && !in_style && !in_script && !in_template {
131                        if !is_token_start {
132                            add_html_token(
133                                &mut result,
134                                &input[token_start..token_end + 1],
135                                is_after_space && !is_new_line,
136                            );
137                            is_new_line = false;
138                        }
139                        is_after_space = true;
140                    }
141
142                    is_token_start = true;
143
144                    continue;
145                }
146                b'&' if !in_tag && !is_token_start && !in_head => {
147                    if in_style || in_script || in_template {
148                        continue;
149                    }
150                    add_html_token(
151                        &mut result,
152                        &input[token_start..token_end + 1],
153                        is_after_space && !is_new_line,
154                    );
155                    is_new_line = false;
156                    is_token_start = true;
157                    is_after_space = false;
158                }
159                b';' if !in_tag && !is_token_start && !in_head => {
160                    if in_style || in_script || in_template {
161                        continue;
162                    }
163                    add_html_token(
164                        &mut result,
165                        &input[token_start..pos + 1],
166                        is_after_space && !is_new_line,
167                    );
168                    is_token_start = true;
169                    is_after_space = false;
170                    is_new_line = false;
171                    continue;
172                }
173                _ => (),
174            }
175            if is_token_start {
176                token_start = pos;
177                is_token_start = false;
178                if in_tag {
179                    tag_token_pos += 1;
180                }
181            }
182            token_end = pos;
183        } else {
184            match ch {
185                b'-' => comment_pos += 1,
186                b'>' if comment_pos == 2 => {
187                    comment_pos = 0;
188                    in_comment = false;
189                    in_tag = false;
190                    is_token_start = true;
191                }
192                _ => comment_pos = 0,
193            }
194        }
195    }
196
197    if !in_tag && !is_token_start && !in_head && !in_style && !in_script && !in_template {
198        add_html_token(
199            &mut result,
200            &input[token_start..token_end + 1],
201            is_after_space && !is_new_line,
202        );
203    }
204
205    result.shrink_to_fit();
206    result
207}
208
209pub fn text_to_html(input: &str) -> String {
210    let input = input.as_bytes();
211    let mut result = Vec::with_capacity(input.len() + 26);
212
213    result.extend_from_slice(b"<html><body>");
214
215    for &ch in input {
216        match ch {
217            b'\n' => result.extend_from_slice(b"<br/>"),
218            b'<' => result.extend_from_slice(b"&lt;"),
219            b'\r' => (),
220            _ => result.push(ch),
221        }
222    }
223    result.extend_from_slice(b"</body></html>");
224
225    String::from_utf8(result).unwrap()
226}
227
228fn lookup_entity(key: &[u8]) -> Option<&u32> {
229    hashify::map! {
230    key,
231    u32,
232    "AElig" => 198,
233    "AMP" => 38,
234    "Aacute" => 193,
235    "Abreve" => 258,
236    "Acirc" => 194,
237    "Acy" => 1040,
238    "Afr" => 120068,
239    "Agrave" => 192,
240    "Alpha" => 913,
241    "Amacr" => 256,
242    "And" => 10835,
243    "Aogon" => 260,
244    "Aopf" => 120120,
245    "ApplyFunction" => 8289,
246    "Aring" => 197,
247    "Ascr" => 119964,
248    "Assign" => 8788,
249    "Atilde" => 195,
250    "Auml" => 196,
251    "Backslash" => 8726,
252    "Barv" => 10983,
253    "Barwed" => 8966,
254    "Bcy" => 1041,
255    "Because" => 8757,
256    "Bernoullis" => 8492,
257    "Beta" => 914,
258    "Bfr" => 120069,
259    "Bopf" => 120121,
260    "Breve" => 728,
261    "Bscr" => 8492,
262    "Bumpeq" => 8782,
263    "CHcy" => 1063,
264    "COPY" => 169,
265    "Cacute" => 262,
266    "Cap" => 8914,
267    "CapitalDifferentialD" => 8517,
268    "Cayleys" => 8493,
269    "Ccaron" => 268,
270    "Ccedil" => 199,
271    "Ccirc" => 264,
272    "Cconint" => 8752,
273    "Cdot" => 266,
274    "Cedilla" => 184,
275    "CenterDot" => 183,
276    "Cfr" => 8493,
277    "Chi" => 935,
278    "CircleDot" => 8857,
279    "CircleMinus" => 8854,
280    "CirclePlus" => 8853,
281    "CircleTimes" => 8855,
282    "ClockwiseContourIntegral" => 8754,
283    "CloseCurlyDoubleQuote" => 8221,
284    "CloseCurlyQuote" => 8217,
285    "Colon" => 8759,
286    "Colone" => 10868,
287    "Congruent" => 8801,
288    "Conint" => 8751,
289    "ContourIntegral" => 8750,
290    "Copf" => 8450,
291    "Coproduct" => 8720,
292    "CounterClockwiseContourIntegral" => 8755,
293    "Cross" => 10799,
294    "Cscr" => 119966,
295    "Cup" => 8915,
296    "CupCap" => 8781,
297    "DD" => 8517,
298    "DDotrahd" => 10513,
299    "DJcy" => 1026,
300    "DScy" => 1029,
301    "DZcy" => 1039,
302    "Dagger" => 8225,
303    "Darr" => 8609,
304    "Dashv" => 10980,
305    "Dcaron" => 270,
306    "Dcy" => 1044,
307    "Del" => 8711,
308    "Delta" => 916,
309    "Dfr" => 120071,
310    "DiacriticalAcute" => 180,
311    "DiacriticalDot" => 729,
312    "DiacriticalDoubleAcute" => 733,
313    "DiacriticalGrave" => 96,
314    "DiacriticalTilde" => 732,
315    "Diamond" => 8900,
316    "DifferentialD" => 8518,
317    "Dopf" => 120123,
318    "Dot" => 168,
319    "DotDot" => 8412,
320    "DotEqual" => 8784,
321    "DoubleContourIntegral" => 8751,
322    "DoubleDot" => 168,
323    "DoubleDownArrow" => 8659,
324    "DoubleLeftArrow" => 8656,
325    "DoubleLeftRightArrow" => 8660,
326    "DoubleLeftTee" => 10980,
327    "DoubleLongLeftArrow" => 10232,
328    "DoubleLongLeftRightArrow" => 10234,
329    "DoubleLongRightArrow" => 10233,
330    "DoubleRightArrow" => 8658,
331    "DoubleRightTee" => 8872,
332    "DoubleUpArrow" => 8657,
333    "DoubleUpDownArrow" => 8661,
334    "DoubleVerticalBar" => 8741,
335    "DownArrow" => 8595,
336    "DownArrowBar" => 10515,
337    "DownArrowUpArrow" => 8693,
338    "DownBreve" => 785,
339    "DownLeftRightVector" => 10576,
340    "DownLeftTeeVector" => 10590,
341    "DownLeftVector" => 8637,
342    "DownLeftVectorBar" => 10582,
343    "DownRightTeeVector" => 10591,
344    "DownRightVector" => 8641,
345    "DownRightVectorBar" => 10583,
346    "DownTee" => 8868,
347    "DownTeeArrow" => 8615,
348    "Downarrow" => 8659,
349    "Dscr" => 119967,
350    "Dstrok" => 272,
351    "ENG" => 330,
352    "ETH" => 208,
353    "Eacute" => 201,
354    "Ecaron" => 282,
355    "Ecirc" => 202,
356    "Ecy" => 1069,
357    "Edot" => 278,
358    "Efr" => 120072,
359    "Egrave" => 200,
360    "Element" => 8712,
361    "Emacr" => 274,
362    "EmptySmallSquare" => 9723,
363    "EmptyVerySmallSquare" => 9643,
364    "Eogon" => 280,
365    "Eopf" => 120124,
366    "Epsilon" => 917,
367    "Equal" => 10869,
368    "EqualTilde" => 8770,
369    "Equilibrium" => 8652,
370    "Escr" => 8496,
371    "Esim" => 10867,
372    "Eta" => 919,
373    "Euml" => 203,
374    "Exists" => 8707,
375    "ExponentialE" => 8519,
376    "Fcy" => 1060,
377    "Ffr" => 120073,
378    "FilledSmallSquare" => 9724,
379    "FilledVerySmallSquare" => 9642,
380    "Fopf" => 120125,
381    "ForAll" => 8704,
382    "Fouriertrf" => 8497,
383    "Fscr" => 8497,
384    "GJcy" => 1027,
385    "GT" => 62,
386    "Gamma" => 915,
387    "Gammad" => 988,
388    "Gbreve" => 286,
389    "Gcedil" => 290,
390    "Gcirc" => 284,
391    "Gcy" => 1043,
392    "Gdot" => 288,
393    "Gfr" => 120074,
394    "Gg" => 8921,
395    "Gopf" => 120126,
396    "GreaterEqual" => 8805,
397    "GreaterEqualLess" => 8923,
398    "GreaterFullEqual" => 8807,
399    "GreaterGreater" => 10914,
400    "GreaterLess" => 8823,
401    "GreaterSlantEqual" => 10878,
402    "GreaterTilde" => 8819,
403    "Gscr" => 119970,
404    "Gt" => 8811,
405    "HARDcy" => 1066,
406    "Hacek" => 711,
407    "Hat" => 94,
408    "Hcirc" => 292,
409    "Hfr" => 8460,
410    "HilbertSpace" => 8459,
411    "Hopf" => 8461,
412    "HorizontalLine" => 9472,
413    "Hscr" => 8459,
414    "Hstrok" => 294,
415    "HumpDownHump" => 8782,
416    "HumpEqual" => 8783,
417    "IEcy" => 1045,
418    "IJlig" => 306,
419    "IOcy" => 1025,
420    "Iacute" => 205,
421    "Icirc" => 206,
422    "Icy" => 1048,
423    "Idot" => 304,
424    "Ifr" => 8465,
425    "Igrave" => 204,
426    "Im" => 8465,
427    "Imacr" => 298,
428    "ImaginaryI" => 8520,
429    "Implies" => 8658,
430    "Int" => 8748,
431    "Integral" => 8747,
432    "Intersection" => 8898,
433    "InvisibleComma" => 8291,
434    "InvisibleTimes" => 8290,
435    "Iogon" => 302,
436    "Iopf" => 120128,
437    "Iota" => 921,
438    "Iscr" => 8464,
439    "Itilde" => 296,
440    "Iukcy" => 1030,
441    "Iuml" => 207,
442    "Jcirc" => 308,
443    "Jcy" => 1049,
444    "Jfr" => 120077,
445    "Jopf" => 120129,
446    "Jscr" => 119973,
447    "Jsercy" => 1032,
448    "Jukcy" => 1028,
449    "KHcy" => 1061,
450    "KJcy" => 1036,
451    "Kappa" => 922,
452    "Kcedil" => 310,
453    "Kcy" => 1050,
454    "Kfr" => 120078,
455    "Kopf" => 120130,
456    "Kscr" => 119974,
457    "LJcy" => 1033,
458    "LT" => 60,
459    "Lacute" => 313,
460    "Lambda" => 923,
461    "Lang" => 10218,
462    "Laplacetrf" => 8466,
463    "Larr" => 8606,
464    "Lcaron" => 317,
465    "Lcedil" => 315,
466    "Lcy" => 1051,
467    "LeftAngleBracket" => 10216,
468    "LeftArrow" => 8592,
469    "LeftArrowBar" => 8676,
470    "LeftArrowRightArrow" => 8646,
471    "LeftCeiling" => 8968,
472    "LeftDoubleBracket" => 10214,
473    "LeftDownTeeVector" => 10593,
474    "LeftDownVector" => 8643,
475    "LeftDownVectorBar" => 10585,
476    "LeftFloor" => 8970,
477    "LeftRightArrow" => 8596,
478    "LeftRightVector" => 10574,
479    "LeftTee" => 8867,
480    "LeftTeeArrow" => 8612,
481    "LeftTeeVector" => 10586,
482    "LeftTriangle" => 8882,
483    "LeftTriangleBar" => 10703,
484    "LeftTriangleEqual" => 8884,
485    "LeftUpDownVector" => 10577,
486    "LeftUpTeeVector" => 10592,
487    "LeftUpVector" => 8639,
488    "LeftUpVectorBar" => 10584,
489    "LeftVector" => 8636,
490    "LeftVectorBar" => 10578,
491    "Leftarrow" => 8656,
492    "Leftrightarrow" => 8660,
493    "LessEqualGreater" => 8922,
494    "LessFullEqual" => 8806,
495    "LessGreater" => 8822,
496    "LessLess" => 10913,
497    "LessSlantEqual" => 10877,
498    "LessTilde" => 8818,
499    "Lfr" => 120079,
500    "Ll" => 8920,
501    "Lleftarrow" => 8666,
502    "Lmidot" => 319,
503    "LongLeftArrow" => 10229,
504    "LongLeftRightArrow" => 10231,
505    "LongRightArrow" => 10230,
506    "Longleftarrow" => 10232,
507    "Longleftrightarrow" => 10234,
508    "Longrightarrow" => 10233,
509    "Lopf" => 120131,
510    "LowerLeftArrow" => 8601,
511    "LowerRightArrow" => 8600,
512    "Lscr" => 8466,
513    "Lsh" => 8624,
514    "Lstrok" => 321,
515    "Lt" => 8810,
516    "Map" => 10501,
517    "Mcy" => 1052,
518    "MediumSpace" => 8287,
519    "Mellintrf" => 8499,
520    "Mfr" => 120080,
521    "MinusPlus" => 8723,
522    "Mopf" => 120132,
523    "Mscr" => 8499,
524    "Mu" => 924,
525    "NJcy" => 1034,
526    "Nacute" => 323,
527    "Ncaron" => 327,
528    "Ncedil" => 325,
529    "Ncy" => 1053,
530    "NegativeMediumSpace" => 8203,
531    "NegativeThickSpace" => 8203,
532    "NegativeThinSpace" => 8203,
533    "NegativeVeryThinSpace" => 8203,
534    "NestedGreaterGreater" => 8811,
535    "NestedLessLess" => 8810,
536    "NewLine" => 10,
537    "Nfr" => 120081,
538    "NoBreak" => 8288,
539    "NonBreakingSpace" => 160,
540    "Nopf" => 8469,
541    "Not" => 10988,
542    "NotCongruent" => 8802,
543    "NotCupCap" => 8813,
544    "NotDoubleVerticalBar" => 8742,
545    "NotElement" => 8713,
546    "NotEqual" => 8800,
547    "NotEqualTilde" => 8770,
548    "NotExists" => 8708,
549    "NotGreater" => 8815,
550    "NotGreaterEqual" => 8817,
551    "NotGreaterFullEqual" => 8807,
552    "NotGreaterGreater" => 8811,
553    "NotGreaterLess" => 8825,
554    "NotGreaterSlantEqual" => 10878,
555    "NotGreaterTilde" => 8821,
556    "NotHumpDownHump" => 8782,
557    "NotHumpEqual" => 8783,
558    "NotLeftTriangle" => 8938,
559    "NotLeftTriangleBar" => 10703,
560    "NotLeftTriangleEqual" => 8940,
561    "NotLess" => 8814,
562    "NotLessEqual" => 8816,
563    "NotLessGreater" => 8824,
564    "NotLessLess" => 8810,
565    "NotLessSlantEqual" => 10877,
566    "NotLessTilde" => 8820,
567    "NotNestedGreaterGreater" => 10914,
568    "NotNestedLessLess" => 10913,
569    "NotPrecedes" => 8832,
570    "NotPrecedesEqual" => 10927,
571    "NotPrecedesSlantEqual" => 8928,
572    "NotReverseElement" => 8716,
573    "NotRightTriangle" => 8939,
574    "NotRightTriangleBar" => 10704,
575    "NotRightTriangleEqual" => 8941,
576    "NotSquareSubset" => 8847,
577    "NotSquareSubsetEqual" => 8930,
578    "NotSquareSuperset" => 8848,
579    "NotSquareSupersetEqual" => 8931,
580    "NotSubset" => 8834,
581    "NotSubsetEqual" => 8840,
582    "NotSucceeds" => 8833,
583    "NotSucceedsEqual" => 10928,
584    "NotSucceedsSlantEqual" => 8929,
585    "NotSucceedsTilde" => 8831,
586    "NotSuperset" => 8835,
587    "NotSupersetEqual" => 8841,
588    "NotTilde" => 8769,
589    "NotTildeEqual" => 8772,
590    "NotTildeFullEqual" => 8775,
591    "NotTildeTilde" => 8777,
592    "NotVerticalBar" => 8740,
593    "Nscr" => 119977,
594    "Ntilde" => 209,
595    "Nu" => 925,
596    "OElig" => 338,
597    "Oacute" => 211,
598    "Ocirc" => 212,
599    "Ocy" => 1054,
600    "Odblac" => 336,
601    "Ofr" => 120082,
602    "Ograve" => 210,
603    "Omacr" => 332,
604    "Omega" => 937,
605    "Omicron" => 927,
606    "Oopf" => 120134,
607    "OpenCurlyDoubleQuote" => 8220,
608    "OpenCurlyQuote" => 8216,
609    "Or" => 10836,
610    "Oscr" => 119978,
611    "Oslash" => 216,
612    "Otilde" => 213,
613    "Otimes" => 10807,
614    "Ouml" => 214,
615    "OverBar" => 8254,
616    "OverBrace" => 9182,
617    "OverBracket" => 9140,
618    "OverParenthesis" => 9180,
619    "PartialD" => 8706,
620    "Pcy" => 1055,
621    "Pfr" => 120083,
622    "Phi" => 934,
623    "Pi" => 928,
624    "PlusMinus" => 177,
625    "Poincareplane" => 8460,
626    "Popf" => 8473,
627    "Pr" => 10939,
628    "Precedes" => 8826,
629    "PrecedesEqual" => 10927,
630    "PrecedesSlantEqual" => 8828,
631    "PrecedesTilde" => 8830,
632    "Prime" => 8243,
633    "Product" => 8719,
634    "Proportion" => 8759,
635    "Proportional" => 8733,
636    "Pscr" => 119979,
637    "Psi" => 936,
638    "QUOT" => 34,
639    "Qfr" => 120084,
640    "Qopf" => 8474,
641    "Qscr" => 119980,
642    "RBarr" => 10512,
643    "REG" => 174,
644    "Racute" => 340,
645    "Rang" => 10219,
646    "Rarr" => 8608,
647    "Rarrtl" => 10518,
648    "Rcaron" => 344,
649    "Rcedil" => 342,
650    "Rcy" => 1056,
651    "Re" => 8476,
652    "ReverseElement" => 8715,
653    "ReverseEquilibrium" => 8651,
654    "ReverseUpEquilibrium" => 10607,
655    "Rfr" => 8476,
656    "Rho" => 929,
657    "RightAngleBracket" => 10217,
658    "RightArrow" => 8594,
659    "RightArrowBar" => 8677,
660    "RightArrowLeftArrow" => 8644,
661    "RightCeiling" => 8969,
662    "RightDoubleBracket" => 10215,
663    "RightDownTeeVector" => 10589,
664    "RightDownVector" => 8642,
665    "RightDownVectorBar" => 10581,
666    "RightFloor" => 8971,
667    "RightTee" => 8866,
668    "RightTeeArrow" => 8614,
669    "RightTeeVector" => 10587,
670    "RightTriangle" => 8883,
671    "RightTriangleBar" => 10704,
672    "RightTriangleEqual" => 8885,
673    "RightUpDownVector" => 10575,
674    "RightUpTeeVector" => 10588,
675    "RightUpVector" => 8638,
676    "RightUpVectorBar" => 10580,
677    "RightVector" => 8640,
678    "RightVectorBar" => 10579,
679    "Rightarrow" => 8658,
680    "Ropf" => 8477,
681    "RoundImplies" => 10608,
682    "Rrightarrow" => 8667,
683    "Rscr" => 8475,
684    "Rsh" => 8625,
685    "RuleDelayed" => 10740,
686    "SHCHcy" => 1065,
687    "SHcy" => 1064,
688    "SOFTcy" => 1068,
689    "Sacute" => 346,
690    "Sc" => 10940,
691    "Scaron" => 352,
692    "Scedil" => 350,
693    "Scirc" => 348,
694    "Scy" => 1057,
695    "Sfr" => 120086,
696    "ShortDownArrow" => 8595,
697    "ShortLeftArrow" => 8592,
698    "ShortRightArrow" => 8594,
699    "ShortUpArrow" => 8593,
700    "Sigma" => 931,
701    "SmallCircle" => 8728,
702    "Sopf" => 120138,
703    "Sqrt" => 8730,
704    "Square" => 9633,
705    "SquareIntersection" => 8851,
706    "SquareSubset" => 8847,
707    "SquareSubsetEqual" => 8849,
708    "SquareSuperset" => 8848,
709    "SquareSupersetEqual" => 8850,
710    "SquareUnion" => 8852,
711    "Sscr" => 119982,
712    "Star" => 8902,
713    "Sub" => 8912,
714    "Subset" => 8912,
715    "SubsetEqual" => 8838,
716    "Succeeds" => 8827,
717    "SucceedsEqual" => 10928,
718    "SucceedsSlantEqual" => 8829,
719    "SucceedsTilde" => 8831,
720    "SuchThat" => 8715,
721    "Sum" => 8721,
722    "Sup" => 8913,
723    "Superset" => 8835,
724    "SupersetEqual" => 8839,
725    "Supset" => 8913,
726    "THORN" => 222,
727    "TRADE" => 8482,
728    "TSHcy" => 1035,
729    "TScy" => 1062,
730    "Tab" => 9,
731    "Tau" => 932,
732    "Tcaron" => 356,
733    "Tcedil" => 354,
734    "Tcy" => 1058,
735    "Tfr" => 120087,
736    "Therefore" => 8756,
737    "Theta" => 920,
738    "ThickSpace" => 8287,
739    "ThinSpace" => 8201,
740    "Tilde" => 8764,
741    "TildeEqual" => 8771,
742    "TildeFullEqual" => 8773,
743    "TildeTilde" => 8776,
744    "Topf" => 120139,
745    "TripleDot" => 8411,
746    "Tscr" => 119983,
747    "Tstrok" => 358,
748    "Uacute" => 218,
749    "Uarr" => 8607,
750    "Uarrocir" => 10569,
751    "Ubrcy" => 1038,
752    "Ubreve" => 364,
753    "Ucirc" => 219,
754    "Ucy" => 1059,
755    "Udblac" => 368,
756    "Ufr" => 120088,
757    "Ugrave" => 217,
758    "Umacr" => 362,
759    "UnderBar" => 95,
760    "UnderBrace" => 9183,
761    "UnderBracket" => 9141,
762    "UnderParenthesis" => 9181,
763    "Union" => 8899,
764    "UnionPlus" => 8846,
765    "Uogon" => 370,
766    "Uopf" => 120140,
767    "UpArrow" => 8593,
768    "UpArrowBar" => 10514,
769    "UpArrowDownArrow" => 8645,
770    "UpDownArrow" => 8597,
771    "UpEquilibrium" => 10606,
772    "UpTee" => 8869,
773    "UpTeeArrow" => 8613,
774    "Uparrow" => 8657,
775    "Updownarrow" => 8661,
776    "UpperLeftArrow" => 8598,
777    "UpperRightArrow" => 8599,
778    "Upsi" => 978,
779    "Upsilon" => 933,
780    "Uring" => 366,
781    "Uscr" => 119984,
782    "Utilde" => 360,
783    "Uuml" => 220,
784    "VDash" => 8875,
785    "Vbar" => 10987,
786    "Vcy" => 1042,
787    "Vdash" => 8873,
788    "Vdashl" => 10982,
789    "Vee" => 8897,
790    "Verbar" => 8214,
791    "Vert" => 8214,
792    "VerticalBar" => 8739,
793    "VerticalLine" => 124,
794    "VerticalSeparator" => 10072,
795    "VerticalTilde" => 8768,
796    "VeryThinSpace" => 8202,
797    "Vfr" => 120089,
798    "Vopf" => 120141,
799    "Vscr" => 119985,
800    "Vvdash" => 8874,
801    "Wcirc" => 372,
802    "Wedge" => 8896,
803    "Wfr" => 120090,
804    "Wopf" => 120142,
805    "Wscr" => 119986,
806    "Xfr" => 120091,
807    "Xi" => 926,
808    "Xopf" => 120143,
809    "Xscr" => 119987,
810    "YAcy" => 1071,
811    "YIcy" => 1031,
812    "YUcy" => 1070,
813    "Yacute" => 221,
814    "Ycirc" => 374,
815    "Ycy" => 1067,
816    "Yfr" => 120092,
817    "Yopf" => 120144,
818    "Yscr" => 119988,
819    "Yuml" => 376,
820    "ZHcy" => 1046,
821    "Zacute" => 377,
822    "Zcaron" => 381,
823    "Zcy" => 1047,
824    "Zdot" => 379,
825    "ZeroWidthSpace" => 8203,
826    "Zeta" => 918,
827    "Zfr" => 8488,
828    "Zopf" => 8484,
829    "Zscr" => 119989,
830    "aacute" => 225,
831    "abreve" => 259,
832    "ac" => 8766,
833    "acE" => 8766,
834    "acd" => 8767,
835    "acirc" => 226,
836    "acute" => 180,
837    "acy" => 1072,
838    "aelig" => 230,
839    "af" => 8289,
840    "afr" => 120094,
841    "agrave" => 224,
842    "alefsym" => 8501,
843    "aleph" => 8501,
844    "alpha" => 945,
845    "amacr" => 257,
846    "amalg" => 10815,
847    "amp" => 38,
848    "and" => 8743,
849    "andand" => 10837,
850    "andd" => 10844,
851    "andslope" => 10840,
852    "andv" => 10842,
853    "ang" => 8736,
854    "ange" => 10660,
855    "angle" => 8736,
856    "angmsd" => 8737,
857    "angmsdaa" => 10664,
858    "angmsdab" => 10665,
859    "angmsdac" => 10666,
860    "angmsdad" => 10667,
861    "angmsdae" => 10668,
862    "angmsdaf" => 10669,
863    "angmsdag" => 10670,
864    "angmsdah" => 10671,
865    "angrt" => 8735,
866    "angrtvb" => 8894,
867    "angrtvbd" => 10653,
868    "angsph" => 8738,
869    "angst" => 197,
870    "angzarr" => 9084,
871    "aogon" => 261,
872    "aopf" => 120146,
873    "ap" => 8776,
874    "apE" => 10864,
875    "apacir" => 10863,
876    "ape" => 8778,
877    "apid" => 8779,
878    "apos" => 39,
879    "approx" => 8776,
880    "approxeq" => 8778,
881    "aring" => 229,
882    "ascr" => 119990,
883    "ast" => 42,
884    "asymp" => 8776,
885    "asympeq" => 8781,
886    "atilde" => 227,
887    "auml" => 228,
888    "awconint" => 8755,
889    "awint" => 10769,
890    "bNot" => 10989,
891    "backcong" => 8780,
892    "backepsilon" => 1014,
893    "backprime" => 8245,
894    "backsim" => 8765,
895    "backsimeq" => 8909,
896    "barvee" => 8893,
897    "barwed" => 8965,
898    "barwedge" => 8965,
899    "bbrk" => 9141,
900    "bbrktbrk" => 9142,
901    "bcong" => 8780,
902    "bcy" => 1073,
903    "bdquo" => 8222,
904    "becaus" => 8757,
905    "because" => 8757,
906    "bemptyv" => 10672,
907    "bepsi" => 1014,
908    "bernou" => 8492,
909    "beta" => 946,
910    "beth" => 8502,
911    "between" => 8812,
912    "bfr" => 120095,
913    "bigcap" => 8898,
914    "bigcirc" => 9711,
915    "bigcup" => 8899,
916    "bigodot" => 10752,
917    "bigoplus" => 10753,
918    "bigotimes" => 10754,
919    "bigsqcup" => 10758,
920    "bigstar" => 9733,
921    "bigtriangledown" => 9661,
922    "bigtriangleup" => 9651,
923    "biguplus" => 10756,
924    "bigvee" => 8897,
925    "bigwedge" => 8896,
926    "bkarow" => 10509,
927    "blacklozenge" => 10731,
928    "blacksquare" => 9642,
929    "blacktriangle" => 9652,
930    "blacktriangledown" => 9662,
931    "blacktriangleleft" => 9666,
932    "blacktriangleright" => 9656,
933    "blank" => 9251,
934    "blk12" => 9618,
935    "blk14" => 9617,
936    "blk34" => 9619,
937    "block" => 9608,
938    "bne" => 61,
939    "bnequiv" => 8801,
940    "bnot" => 8976,
941    "bopf" => 120147,
942    "bot" => 8869,
943    "bottom" => 8869,
944    "bowtie" => 8904,
945    "boxDL" => 9559,
946    "boxDR" => 9556,
947    "boxDl" => 9558,
948    "boxDr" => 9555,
949    "boxH" => 9552,
950    "boxHD" => 9574,
951    "boxHU" => 9577,
952    "boxHd" => 9572,
953    "boxHu" => 9575,
954    "boxUL" => 9565,
955    "boxUR" => 9562,
956    "boxUl" => 9564,
957    "boxUr" => 9561,
958    "boxV" => 9553,
959    "boxVH" => 9580,
960    "boxVL" => 9571,
961    "boxVR" => 9568,
962    "boxVh" => 9579,
963    "boxVl" => 9570,
964    "boxVr" => 9567,
965    "boxbox" => 10697,
966    "boxdL" => 9557,
967    "boxdR" => 9554,
968    "boxdl" => 9488,
969    "boxdr" => 9484,
970    "boxh" => 9472,
971    "boxhD" => 9573,
972    "boxhU" => 9576,
973    "boxhd" => 9516,
974    "boxhu" => 9524,
975    "boxminus" => 8863,
976    "boxplus" => 8862,
977    "boxtimes" => 8864,
978    "boxuL" => 9563,
979    "boxuR" => 9560,
980    "boxul" => 9496,
981    "boxur" => 9492,
982    "boxv" => 9474,
983    "boxvH" => 9578,
984    "boxvL" => 9569,
985    "boxvR" => 9566,
986    "boxvh" => 9532,
987    "boxvl" => 9508,
988    "boxvr" => 9500,
989    "bprime" => 8245,
990    "breve" => 728,
991    "brvbar" => 166,
992    "bscr" => 119991,
993    "bsemi" => 8271,
994    "bsim" => 8765,
995    "bsime" => 8909,
996    "bsol" => 92,
997    "bsolb" => 10693,
998    "bsolhsub" => 10184,
999    "bull" => 8226,
1000    "bullet" => 8226,
1001    "bump" => 8782,
1002    "bumpE" => 10926,
1003    "bumpe" => 8783,
1004    "bumpeq" => 8783,
1005    "cacute" => 263,
1006    "cap" => 8745,
1007    "capand" => 10820,
1008    "capbrcup" => 10825,
1009    "capcap" => 10827,
1010    "capcup" => 10823,
1011    "capdot" => 10816,
1012    "caps" => 8745,
1013    "caret" => 8257,
1014    "caron" => 711,
1015    "ccaps" => 10829,
1016    "ccaron" => 269,
1017    "ccedil" => 231,
1018    "ccirc" => 265,
1019    "ccups" => 10828,
1020    "ccupssm" => 10832,
1021    "cdot" => 267,
1022    "cedil" => 184,
1023    "cemptyv" => 10674,
1024    "cent" => 162,
1025    "centerdot" => 183,
1026    "cfr" => 120096,
1027    "chcy" => 1095,
1028    "check" => 10003,
1029    "checkmark" => 10003,
1030    "chi" => 967,
1031    "cir" => 9675,
1032    "cirE" => 10691,
1033    "circ" => 710,
1034    "circeq" => 8791,
1035    "circlearrowleft" => 8634,
1036    "circlearrowright" => 8635,
1037    "circledR" => 174,
1038    "circledS" => 9416,
1039    "circledast" => 8859,
1040    "circledcirc" => 8858,
1041    "circleddash" => 8861,
1042    "cire" => 8791,
1043    "cirfnint" => 10768,
1044    "cirmid" => 10991,
1045    "cirscir" => 10690,
1046    "clubs" => 9827,
1047    "clubsuit" => 9827,
1048    "colon" => 58,
1049    "colone" => 8788,
1050    "coloneq" => 8788,
1051    "comma" => 44,
1052    "commat" => 64,
1053    "comp" => 8705,
1054    "compfn" => 8728,
1055    "complement" => 8705,
1056    "complexes" => 8450,
1057    "cong" => 8773,
1058    "congdot" => 10861,
1059    "conint" => 8750,
1060    "copf" => 120148,
1061    "coprod" => 8720,
1062    "copy" => 169,
1063    "copysr" => 8471,
1064    "crarr" => 8629,
1065    "cross" => 10007,
1066    "cscr" => 119992,
1067    "csub" => 10959,
1068    "csube" => 10961,
1069    "csup" => 10960,
1070    "csupe" => 10962,
1071    "ctdot" => 8943,
1072    "cudarrl" => 10552,
1073    "cudarrr" => 10549,
1074    "cuepr" => 8926,
1075    "cuesc" => 8927,
1076    "cularr" => 8630,
1077    "cularrp" => 10557,
1078    "cup" => 8746,
1079    "cupbrcap" => 10824,
1080    "cupcap" => 10822,
1081    "cupcup" => 10826,
1082    "cupdot" => 8845,
1083    "cupor" => 10821,
1084    "cups" => 8746,
1085    "curarr" => 8631,
1086    "curarrm" => 10556,
1087    "curlyeqprec" => 8926,
1088    "curlyeqsucc" => 8927,
1089    "curlyvee" => 8910,
1090    "curlywedge" => 8911,
1091    "curren" => 164,
1092    "curvearrowleft" => 8630,
1093    "curvearrowright" => 8631,
1094    "cuvee" => 8910,
1095    "cuwed" => 8911,
1096    "cwconint" => 8754,
1097    "cwint" => 8753,
1098    "cylcty" => 9005,
1099    "dArr" => 8659,
1100    "dHar" => 10597,
1101    "dagger" => 8224,
1102    "daleth" => 8504,
1103    "darr" => 8595,
1104    "dash" => 8208,
1105    "dashv" => 8867,
1106    "dbkarow" => 10511,
1107    "dblac" => 733,
1108    "dcaron" => 271,
1109    "dcy" => 1076,
1110    "dd" => 8518,
1111    "ddagger" => 8225,
1112    "ddarr" => 8650,
1113    "ddotseq" => 10871,
1114    "deg" => 176,
1115    "delta" => 948,
1116    "demptyv" => 10673,
1117    "dfisht" => 10623,
1118    "dfr" => 120097,
1119    "dharl" => 8643,
1120    "dharr" => 8642,
1121    "diam" => 8900,
1122    "diamond" => 8900,
1123    "diamondsuit" => 9830,
1124    "diams" => 9830,
1125    "die" => 168,
1126    "digamma" => 989,
1127    "disin" => 8946,
1128    "div" => 247,
1129    "divide" => 247,
1130    "divideontimes" => 8903,
1131    "divonx" => 8903,
1132    "djcy" => 1106,
1133    "dlcorn" => 8990,
1134    "dlcrop" => 8973,
1135    "dollar" => 36,
1136    "dopf" => 120149,
1137    "dot" => 729,
1138    "doteq" => 8784,
1139    "doteqdot" => 8785,
1140    "dotminus" => 8760,
1141    "dotplus" => 8724,
1142    "dotsquare" => 8865,
1143    "doublebarwedge" => 8966,
1144    "downarrow" => 8595,
1145    "downdownarrows" => 8650,
1146    "downharpoonleft" => 8643,
1147    "downharpoonright" => 8642,
1148    "drbkarow" => 10512,
1149    "drcorn" => 8991,
1150    "drcrop" => 8972,
1151    "dscr" => 119993,
1152    "dscy" => 1109,
1153    "dsol" => 10742,
1154    "dstrok" => 273,
1155    "dtdot" => 8945,
1156    "dtri" => 9663,
1157    "dtrif" => 9662,
1158    "duarr" => 8693,
1159    "duhar" => 10607,
1160    "dwangle" => 10662,
1161    "dzcy" => 1119,
1162    "dzigrarr" => 10239,
1163    "eDDot" => 10871,
1164    "eDot" => 8785,
1165    "eacute" => 233,
1166    "easter" => 10862,
1167    "ecaron" => 283,
1168    "ecir" => 8790,
1169    "ecirc" => 234,
1170    "ecolon" => 8789,
1171    "ecy" => 1101,
1172    "edot" => 279,
1173    "ee" => 8519,
1174    "efDot" => 8786,
1175    "efr" => 120098,
1176    "eg" => 10906,
1177    "egrave" => 232,
1178    "egs" => 10902,
1179    "egsdot" => 10904,
1180    "el" => 10905,
1181    "elinters" => 9191,
1182    "ell" => 8467,
1183    "els" => 10901,
1184    "elsdot" => 10903,
1185    "emacr" => 275,
1186    "empty" => 8709,
1187    "emptyset" => 8709,
1188    "emptyv" => 8709,
1189    "emsp" => 8195,
1190    "emsp13" => 8196,
1191    "emsp14" => 8197,
1192    "eng" => 331,
1193    "ensp" => 8194,
1194    "eogon" => 281,
1195    "eopf" => 120150,
1196    "epar" => 8917,
1197    "eparsl" => 10723,
1198    "eplus" => 10865,
1199    "epsi" => 949,
1200    "epsilon" => 949,
1201    "epsiv" => 1013,
1202    "eqcirc" => 8790,
1203    "eqcolon" => 8789,
1204    "eqsim" => 8770,
1205    "eqslantgtr" => 10902,
1206    "eqslantless" => 10901,
1207    "equals" => 61,
1208    "equest" => 8799,
1209    "equiv" => 8801,
1210    "equivDD" => 10872,
1211    "eqvparsl" => 10725,
1212    "erDot" => 8787,
1213    "erarr" => 10609,
1214    "escr" => 8495,
1215    "esdot" => 8784,
1216    "esim" => 8770,
1217    "eta" => 951,
1218    "eth" => 240,
1219    "euml" => 235,
1220    "euro" => 8364,
1221    "excl" => 33,
1222    "exist" => 8707,
1223    "expectation" => 8496,
1224    "exponentiale" => 8519,
1225    "fallingdotseq" => 8786,
1226    "fcy" => 1092,
1227    "female" => 9792,
1228    "ffilig" => 64259,
1229    "fflig" => 64256,
1230    "ffllig" => 64260,
1231    "ffr" => 120099,
1232    "filig" => 64257,
1233    "fjlig" => 102,
1234    "flat" => 9837,
1235    "fllig" => 64258,
1236    "fltns" => 9649,
1237    "fnof" => 402,
1238    "fopf" => 120151,
1239    "forall" => 8704,
1240    "fork" => 8916,
1241    "forkv" => 10969,
1242    "fpartint" => 10765,
1243    "frac12" => 189,
1244    "frac13" => 8531,
1245    "frac14" => 188,
1246    "frac15" => 8533,
1247    "frac16" => 8537,
1248    "frac18" => 8539,
1249    "frac23" => 8532,
1250    "frac25" => 8534,
1251    "frac34" => 190,
1252    "frac35" => 8535,
1253    "frac38" => 8540,
1254    "frac45" => 8536,
1255    "frac56" => 8538,
1256    "frac58" => 8541,
1257    "frac78" => 8542,
1258    "frasl" => 8260,
1259    "frown" => 8994,
1260    "fscr" => 119995,
1261    "gE" => 8807,
1262    "gEl" => 10892,
1263    "gacute" => 501,
1264    "gamma" => 947,
1265    "gammad" => 989,
1266    "gap" => 10886,
1267    "gbreve" => 287,
1268    "gcirc" => 285,
1269    "gcy" => 1075,
1270    "gdot" => 289,
1271    "ge" => 8805,
1272    "gel" => 8923,
1273    "geq" => 8805,
1274    "geqq" => 8807,
1275    "geqslant" => 10878,
1276    "ges" => 10878,
1277    "gescc" => 10921,
1278    "gesdot" => 10880,
1279    "gesdoto" => 10882,
1280    "gesdotol" => 10884,
1281    "gesl" => 8923,
1282    "gesles" => 10900,
1283    "gfr" => 120100,
1284    "gg" => 8811,
1285    "ggg" => 8921,
1286    "gimel" => 8503,
1287    "gjcy" => 1107,
1288    "gl" => 8823,
1289    "glE" => 10898,
1290    "gla" => 10917,
1291    "glj" => 10916,
1292    "gnE" => 8809,
1293    "gnap" => 10890,
1294    "gnapprox" => 10890,
1295    "gne" => 10888,
1296    "gneq" => 10888,
1297    "gneqq" => 8809,
1298    "gnsim" => 8935,
1299    "gopf" => 120152,
1300    "grave" => 96,
1301    "gscr" => 8458,
1302    "gsim" => 8819,
1303    "gsime" => 10894,
1304    "gsiml" => 10896,
1305    "gt" => 62,
1306    "gtcc" => 10919,
1307    "gtcir" => 10874,
1308    "gtdot" => 8919,
1309    "gtlPar" => 10645,
1310    "gtquest" => 10876,
1311    "gtrapprox" => 10886,
1312    "gtrarr" => 10616,
1313    "gtrdot" => 8919,
1314    "gtreqless" => 8923,
1315    "gtreqqless" => 10892,
1316    "gtrless" => 8823,
1317    "gtrsim" => 8819,
1318    "gvertneqq" => 8809,
1319    "gvnE" => 8809,
1320    "hArr" => 8660,
1321    "hairsp" => 8202,
1322    "half" => 189,
1323    "hamilt" => 8459,
1324    "hardcy" => 1098,
1325    "harr" => 8596,
1326    "harrcir" => 10568,
1327    "harrw" => 8621,
1328    "hbar" => 8463,
1329    "hcirc" => 293,
1330    "hearts" => 9829,
1331    "heartsuit" => 9829,
1332    "hellip" => 8230,
1333    "hercon" => 8889,
1334    "hfr" => 120101,
1335    "hksearow" => 10533,
1336    "hkswarow" => 10534,
1337    "hoarr" => 8703,
1338    "homtht" => 8763,
1339    "hookleftarrow" => 8617,
1340    "hookrightarrow" => 8618,
1341    "hopf" => 120153,
1342    "horbar" => 8213,
1343    "hscr" => 119997,
1344    "hslash" => 8463,
1345    "hstrok" => 295,
1346    "hybull" => 8259,
1347    "hyphen" => 8208,
1348    "iacute" => 237,
1349    "ic" => 8291,
1350    "icirc" => 238,
1351    "icy" => 1080,
1352    "iecy" => 1077,
1353    "iexcl" => 161,
1354    "iff" => 8660,
1355    "ifr" => 120102,
1356    "igrave" => 236,
1357    "ii" => 8520,
1358    "iiiint" => 10764,
1359    "iiint" => 8749,
1360    "iinfin" => 10716,
1361    "iiota" => 8489,
1362    "ijlig" => 307,
1363    "imacr" => 299,
1364    "image" => 8465,
1365    "imagline" => 8464,
1366    "imagpart" => 8465,
1367    "imath" => 305,
1368    "imof" => 8887,
1369    "imped" => 437,
1370    "in" => 8712,
1371    "incare" => 8453,
1372    "infin" => 8734,
1373    "infintie" => 10717,
1374    "inodot" => 305,
1375    "int" => 8747,
1376    "intcal" => 8890,
1377    "integers" => 8484,
1378    "intercal" => 8890,
1379    "intlarhk" => 10775,
1380    "intprod" => 10812,
1381    "iocy" => 1105,
1382    "iogon" => 303,
1383    "iopf" => 120154,
1384    "iota" => 953,
1385    "iprod" => 10812,
1386    "iquest" => 191,
1387    "iscr" => 119998,
1388    "isin" => 8712,
1389    "isinE" => 8953,
1390    "isindot" => 8949,
1391    "isins" => 8948,
1392    "isinsv" => 8947,
1393    "isinv" => 8712,
1394    "it" => 8290,
1395    "itilde" => 297,
1396    "iukcy" => 1110,
1397    "iuml" => 239,
1398    "jcirc" => 309,
1399    "jcy" => 1081,
1400    "jfr" => 120103,
1401    "jmath" => 567,
1402    "jopf" => 120155,
1403    "jscr" => 119999,
1404    "jsercy" => 1112,
1405    "jukcy" => 1108,
1406    "kappa" => 954,
1407    "kappav" => 1008,
1408    "kcedil" => 311,
1409    "kcy" => 1082,
1410    "kfr" => 120104,
1411    "kgreen" => 312,
1412    "khcy" => 1093,
1413    "kjcy" => 1116,
1414    "kopf" => 120156,
1415    "kscr" => 120000,
1416    "lAarr" => 8666,
1417    "lArr" => 8656,
1418    "lAtail" => 10523,
1419    "lBarr" => 10510,
1420    "lE" => 8806,
1421    "lEg" => 10891,
1422    "lHar" => 10594,
1423    "lacute" => 314,
1424    "laemptyv" => 10676,
1425    "lagran" => 8466,
1426    "lambda" => 955,
1427    "lang" => 10216,
1428    "langd" => 10641,
1429    "langle" => 10216,
1430    "lap" => 10885,
1431    "laquo" => 171,
1432    "larr" => 8592,
1433    "larrb" => 8676,
1434    "larrbfs" => 10527,
1435    "larrfs" => 10525,
1436    "larrhk" => 8617,
1437    "larrlp" => 8619,
1438    "larrpl" => 10553,
1439    "larrsim" => 10611,
1440    "larrtl" => 8610,
1441    "lat" => 10923,
1442    "latail" => 10521,
1443    "late" => 10925,
1444    "lates" => 10925,
1445    "lbarr" => 10508,
1446    "lbbrk" => 10098,
1447    "lbrace" => 123,
1448    "lbrack" => 91,
1449    "lbrke" => 10635,
1450    "lbrksld" => 10639,
1451    "lbrkslu" => 10637,
1452    "lcaron" => 318,
1453    "lcedil" => 316,
1454    "lceil" => 8968,
1455    "lcub" => 123,
1456    "lcy" => 1083,
1457    "ldca" => 10550,
1458    "ldquo" => 8220,
1459    "ldquor" => 8222,
1460    "ldrdhar" => 10599,
1461    "ldrushar" => 10571,
1462    "ldsh" => 8626,
1463    "le" => 8804,
1464    "leftarrow" => 8592,
1465    "leftarrowtail" => 8610,
1466    "leftharpoondown" => 8637,
1467    "leftharpoonup" => 8636,
1468    "leftleftarrows" => 8647,
1469    "leftrightarrow" => 8596,
1470    "leftrightarrows" => 8646,
1471    "leftrightharpoons" => 8651,
1472    "leftrightsquigarrow" => 8621,
1473    "leftthreetimes" => 8907,
1474    "leg" => 8922,
1475    "leq" => 8804,
1476    "leqq" => 8806,
1477    "leqslant" => 10877,
1478    "les" => 10877,
1479    "lescc" => 10920,
1480    "lesdot" => 10879,
1481    "lesdoto" => 10881,
1482    "lesdotor" => 10883,
1483    "lesg" => 8922,
1484    "lesges" => 10899,
1485    "lessapprox" => 10885,
1486    "lessdot" => 8918,
1487    "lesseqgtr" => 8922,
1488    "lesseqqgtr" => 10891,
1489    "lessgtr" => 8822,
1490    "lesssim" => 8818,
1491    "lfisht" => 10620,
1492    "lfloor" => 8970,
1493    "lfr" => 120105,
1494    "lg" => 8822,
1495    "lgE" => 10897,
1496    "lhard" => 8637,
1497    "lharu" => 8636,
1498    "lharul" => 10602,
1499    "lhblk" => 9604,
1500    "ljcy" => 1113,
1501    "ll" => 8810,
1502    "llarr" => 8647,
1503    "llcorner" => 8990,
1504    "llhard" => 10603,
1505    "lltri" => 9722,
1506    "lmidot" => 320,
1507    "lmoust" => 9136,
1508    "lmoustache" => 9136,
1509    "lnE" => 8808,
1510    "lnap" => 10889,
1511    "lnapprox" => 10889,
1512    "lne" => 10887,
1513    "lneq" => 10887,
1514    "lneqq" => 8808,
1515    "lnsim" => 8934,
1516    "loang" => 10220,
1517    "loarr" => 8701,
1518    "lobrk" => 10214,
1519    "longleftarrow" => 10229,
1520    "longleftrightarrow" => 10231,
1521    "longmapsto" => 10236,
1522    "longrightarrow" => 10230,
1523    "looparrowleft" => 8619,
1524    "looparrowright" => 8620,
1525    "lopar" => 10629,
1526    "lopf" => 120157,
1527    "loplus" => 10797,
1528    "lotimes" => 10804,
1529    "lowast" => 8727,
1530    "lowbar" => 95,
1531    "loz" => 9674,
1532    "lozenge" => 9674,
1533    "lozf" => 10731,
1534    "lpar" => 40,
1535    "lparlt" => 10643,
1536    "lrarr" => 8646,
1537    "lrcorner" => 8991,
1538    "lrhar" => 8651,
1539    "lrhard" => 10605,
1540    "lrm" => 8206,
1541    "lrtri" => 8895,
1542    "lsaquo" => 8249,
1543    "lscr" => 120001,
1544    "lsh" => 8624,
1545    "lsim" => 8818,
1546    "lsime" => 10893,
1547    "lsimg" => 10895,
1548    "lsqb" => 91,
1549    "lsquo" => 8216,
1550    "lsquor" => 8218,
1551    "lstrok" => 322,
1552    "lt" => 60,
1553    "ltcc" => 10918,
1554    "ltcir" => 10873,
1555    "ltdot" => 8918,
1556    "lthree" => 8907,
1557    "ltimes" => 8905,
1558    "ltlarr" => 10614,
1559    "ltquest" => 10875,
1560    "ltrPar" => 10646,
1561    "ltri" => 9667,
1562    "ltrie" => 8884,
1563    "ltrif" => 9666,
1564    "lurdshar" => 10570,
1565    "luruhar" => 10598,
1566    "lvertneqq" => 8808,
1567    "lvnE" => 8808,
1568    "mDDot" => 8762,
1569    "macr" => 175,
1570    "male" => 9794,
1571    "malt" => 10016,
1572    "maltese" => 10016,
1573    "map" => 8614,
1574    "mapsto" => 8614,
1575    "mapstodown" => 8615,
1576    "mapstoleft" => 8612,
1577    "mapstoup" => 8613,
1578    "marker" => 9646,
1579    "mcomma" => 10793,
1580    "mcy" => 1084,
1581    "mdash" => 8212,
1582    "measuredangle" => 8737,
1583    "mfr" => 120106,
1584    "mho" => 8487,
1585    "micro" => 181,
1586    "mid" => 8739,
1587    "midast" => 42,
1588    "midcir" => 10992,
1589    "middot" => 183,
1590    "minus" => 8722,
1591    "minusb" => 8863,
1592    "minusd" => 8760,
1593    "minusdu" => 10794,
1594    "mlcp" => 10971,
1595    "mldr" => 8230,
1596    "mnplus" => 8723,
1597    "models" => 8871,
1598    "mopf" => 120158,
1599    "mp" => 8723,
1600    "mscr" => 120002,
1601    "mstpos" => 8766,
1602    "mu" => 956,
1603    "multimap" => 8888,
1604    "mumap" => 8888,
1605    "nGg" => 8921,
1606    "nGt" => 8811,
1607    "nGtv" => 8811,
1608    "nLeftarrow" => 8653,
1609    "nLeftrightarrow" => 8654,
1610    "nLl" => 8920,
1611    "nLt" => 8810,
1612    "nLtv" => 8810,
1613    "nRightarrow" => 8655,
1614    "nVDash" => 8879,
1615    "nVdash" => 8878,
1616    "nabla" => 8711,
1617    "nacute" => 324,
1618    "nang" => 8736,
1619    "nap" => 8777,
1620    "napE" => 10864,
1621    "napid" => 8779,
1622    "napos" => 329,
1623    "napprox" => 8777,
1624    "natur" => 9838,
1625    "natural" => 9838,
1626    "naturals" => 8469,
1627    "nbsp" => 160,
1628    "nbump" => 8782,
1629    "nbumpe" => 8783,
1630    "ncap" => 10819,
1631    "ncaron" => 328,
1632    "ncedil" => 326,
1633    "ncong" => 8775,
1634    "ncongdot" => 10861,
1635    "ncup" => 10818,
1636    "ncy" => 1085,
1637    "ndash" => 8211,
1638    "ne" => 8800,
1639    "neArr" => 8663,
1640    "nearhk" => 10532,
1641    "nearr" => 8599,
1642    "nearrow" => 8599,
1643    "nedot" => 8784,
1644    "nequiv" => 8802,
1645    "nesear" => 10536,
1646    "nesim" => 8770,
1647    "nexist" => 8708,
1648    "nexists" => 8708,
1649    "nfr" => 120107,
1650    "ngE" => 8807,
1651    "nge" => 8817,
1652    "ngeq" => 8817,
1653    "ngeqq" => 8807,
1654    "ngeqslant" => 10878,
1655    "nges" => 10878,
1656    "ngsim" => 8821,
1657    "ngt" => 8815,
1658    "ngtr" => 8815,
1659    "nhArr" => 8654,
1660    "nharr" => 8622,
1661    "nhpar" => 10994,
1662    "ni" => 8715,
1663    "nis" => 8956,
1664    "nisd" => 8954,
1665    "niv" => 8715,
1666    "njcy" => 1114,
1667    "nlArr" => 8653,
1668    "nlE" => 8806,
1669    "nlarr" => 8602,
1670    "nldr" => 8229,
1671    "nle" => 8816,
1672    "nleftarrow" => 8602,
1673    "nleftrightarrow" => 8622,
1674    "nleq" => 8816,
1675    "nleqq" => 8806,
1676    "nleqslant" => 10877,
1677    "nles" => 10877,
1678    "nless" => 8814,
1679    "nlsim" => 8820,
1680    "nlt" => 8814,
1681    "nltri" => 8938,
1682    "nltrie" => 8940,
1683    "nmid" => 8740,
1684    "nopf" => 120159,
1685    "not" => 172,
1686    "notin" => 8713,
1687    "notinE" => 8953,
1688    "notindot" => 8949,
1689    "notinva" => 8713,
1690    "notinvb" => 8951,
1691    "notinvc" => 8950,
1692    "notni" => 8716,
1693    "notniva" => 8716,
1694    "notnivb" => 8958,
1695    "notnivc" => 8957,
1696    "npar" => 8742,
1697    "nparallel" => 8742,
1698    "nparsl" => 11005,
1699    "npart" => 8706,
1700    "npolint" => 10772,
1701    "npr" => 8832,
1702    "nprcue" => 8928,
1703    "npre" => 10927,
1704    "nprec" => 8832,
1705    "npreceq" => 10927,
1706    "nrArr" => 8655,
1707    "nrarr" => 8603,
1708    "nrarrc" => 10547,
1709    "nrarrw" => 8605,
1710    "nrightarrow" => 8603,
1711    "nrtri" => 8939,
1712    "nrtrie" => 8941,
1713    "nsc" => 8833,
1714    "nsccue" => 8929,
1715    "nsce" => 10928,
1716    "nscr" => 120003,
1717    "nshortmid" => 8740,
1718    "nshortparallel" => 8742,
1719    "nsim" => 8769,
1720    "nsime" => 8772,
1721    "nsimeq" => 8772,
1722    "nsmid" => 8740,
1723    "nspar" => 8742,
1724    "nsqsube" => 8930,
1725    "nsqsupe" => 8931,
1726    "nsub" => 8836,
1727    "nsubE" => 10949,
1728    "nsube" => 8840,
1729    "nsubset" => 8834,
1730    "nsubseteq" => 8840,
1731    "nsubseteqq" => 10949,
1732    "nsucc" => 8833,
1733    "nsucceq" => 10928,
1734    "nsup" => 8837,
1735    "nsupE" => 10950,
1736    "nsupe" => 8841,
1737    "nsupset" => 8835,
1738    "nsupseteq" => 8841,
1739    "nsupseteqq" => 10950,
1740    "ntgl" => 8825,
1741    "ntilde" => 241,
1742    "ntlg" => 8824,
1743    "ntriangleleft" => 8938,
1744    "ntrianglelefteq" => 8940,
1745    "ntriangleright" => 8939,
1746    "ntrianglerighteq" => 8941,
1747    "nu" => 957,
1748    "num" => 35,
1749    "numero" => 8470,
1750    "numsp" => 8199,
1751    "nvDash" => 8877,
1752    "nvHarr" => 10500,
1753    "nvap" => 8781,
1754    "nvdash" => 8876,
1755    "nvge" => 8805,
1756    "nvgt" => 62,
1757    "nvinfin" => 10718,
1758    "nvlArr" => 10498,
1759    "nvle" => 8804,
1760    "nvlt" => 60,
1761    "nvltrie" => 8884,
1762    "nvrArr" => 10499,
1763    "nvrtrie" => 8885,
1764    "nvsim" => 8764,
1765    "nwArr" => 8662,
1766    "nwarhk" => 10531,
1767    "nwarr" => 8598,
1768    "nwarrow" => 8598,
1769    "nwnear" => 10535,
1770    "oS" => 9416,
1771    "oacute" => 243,
1772    "oast" => 8859,
1773    "ocir" => 8858,
1774    "ocirc" => 244,
1775    "ocy" => 1086,
1776    "odash" => 8861,
1777    "odblac" => 337,
1778    "odiv" => 10808,
1779    "odot" => 8857,
1780    "odsold" => 10684,
1781    "oelig" => 339,
1782    "ofcir" => 10687,
1783    "ofr" => 120108,
1784    "ogon" => 731,
1785    "ograve" => 242,
1786    "ogt" => 10689,
1787    "ohbar" => 10677,
1788    "ohm" => 937,
1789    "oint" => 8750,
1790    "olarr" => 8634,
1791    "olcir" => 10686,
1792    "olcross" => 10683,
1793    "oline" => 8254,
1794    "olt" => 10688,
1795    "omacr" => 333,
1796    "omega" => 969,
1797    "omicron" => 959,
1798    "omid" => 10678,
1799    "ominus" => 8854,
1800    "oopf" => 120160,
1801    "opar" => 10679,
1802    "operp" => 10681,
1803    "oplus" => 8853,
1804    "or" => 8744,
1805    "orarr" => 8635,
1806    "ord" => 10845,
1807    "order" => 8500,
1808    "orderof" => 8500,
1809    "ordf" => 170,
1810    "ordm" => 186,
1811    "origof" => 8886,
1812    "oror" => 10838,
1813    "orslope" => 10839,
1814    "orv" => 10843,
1815    "oscr" => 8500,
1816    "oslash" => 248,
1817    "osol" => 8856,
1818    "otilde" => 245,
1819    "otimes" => 8855,
1820    "otimesas" => 10806,
1821    "ouml" => 246,
1822    "ovbar" => 9021,
1823    "par" => 8741,
1824    "para" => 182,
1825    "parallel" => 8741,
1826    "parsim" => 10995,
1827    "parsl" => 11005,
1828    "part" => 8706,
1829    "pcy" => 1087,
1830    "percnt" => 37,
1831    "period" => 46,
1832    "permil" => 8240,
1833    "perp" => 8869,
1834    "pertenk" => 8241,
1835    "pfr" => 120109,
1836    "phi" => 966,
1837    "phiv" => 981,
1838    "phmmat" => 8499,
1839    "phone" => 9742,
1840    "pi" => 960,
1841    "pitchfork" => 8916,
1842    "piv" => 982,
1843    "planck" => 8463,
1844    "planckh" => 8462,
1845    "plankv" => 8463,
1846    "plus" => 43,
1847    "plusacir" => 10787,
1848    "plusb" => 8862,
1849    "pluscir" => 10786,
1850    "plusdo" => 8724,
1851    "plusdu" => 10789,
1852    "pluse" => 10866,
1853    "plusmn" => 177,
1854    "plussim" => 10790,
1855    "plustwo" => 10791,
1856    "pm" => 177,
1857    "pointint" => 10773,
1858    "popf" => 120161,
1859    "pound" => 163,
1860    "pr" => 8826,
1861    "prE" => 10931,
1862    "prap" => 10935,
1863    "prcue" => 8828,
1864    "pre" => 10927,
1865    "prec" => 8826,
1866    "precapprox" => 10935,
1867    "preccurlyeq" => 8828,
1868    "preceq" => 10927,
1869    "precnapprox" => 10937,
1870    "precneqq" => 10933,
1871    "precnsim" => 8936,
1872    "precsim" => 8830,
1873    "prime" => 8242,
1874    "primes" => 8473,
1875    "prnE" => 10933,
1876    "prnap" => 10937,
1877    "prnsim" => 8936,
1878    "prod" => 8719,
1879    "profalar" => 9006,
1880    "profline" => 8978,
1881    "profsurf" => 8979,
1882    "prop" => 8733,
1883    "propto" => 8733,
1884    "prsim" => 8830,
1885    "prurel" => 8880,
1886    "pscr" => 120005,
1887    "psi" => 968,
1888    "puncsp" => 8200,
1889    "qfr" => 120110,
1890    "qint" => 10764,
1891    "qopf" => 120162,
1892    "qprime" => 8279,
1893    "qscr" => 120006,
1894    "quaternions" => 8461,
1895    "quatint" => 10774,
1896    "quest" => 63,
1897    "questeq" => 8799,
1898    "quot" => 34,
1899    "rAarr" => 8667,
1900    "rArr" => 8658,
1901    "rAtail" => 10524,
1902    "rBarr" => 10511,
1903    "rHar" => 10596,
1904    "race" => 8765,
1905    "racute" => 341,
1906    "radic" => 8730,
1907    "raemptyv" => 10675,
1908    "rang" => 10217,
1909    "rangd" => 10642,
1910    "range" => 10661,
1911    "rangle" => 10217,
1912    "raquo" => 187,
1913    "rarr" => 8594,
1914    "rarrap" => 10613,
1915    "rarrb" => 8677,
1916    "rarrbfs" => 10528,
1917    "rarrc" => 10547,
1918    "rarrfs" => 10526,
1919    "rarrhk" => 8618,
1920    "rarrlp" => 8620,
1921    "rarrpl" => 10565,
1922    "rarrsim" => 10612,
1923    "rarrtl" => 8611,
1924    "rarrw" => 8605,
1925    "ratail" => 10522,
1926    "ratio" => 8758,
1927    "rationals" => 8474,
1928    "rbarr" => 10509,
1929    "rbbrk" => 10099,
1930    "rbrace" => 125,
1931    "rbrack" => 93,
1932    "rbrke" => 10636,
1933    "rbrksld" => 10638,
1934    "rbrkslu" => 10640,
1935    "rcaron" => 345,
1936    "rcedil" => 343,
1937    "rceil" => 8969,
1938    "rcub" => 125,
1939    "rcy" => 1088,
1940    "rdca" => 10551,
1941    "rdldhar" => 10601,
1942    "rdquo" => 8221,
1943    "rdquor" => 8221,
1944    "rdsh" => 8627,
1945    "real" => 8476,
1946    "realine" => 8475,
1947    "realpart" => 8476,
1948    "reals" => 8477,
1949    "rect" => 9645,
1950    "reg" => 174,
1951    "rfisht" => 10621,
1952    "rfloor" => 8971,
1953    "rfr" => 120111,
1954    "rhard" => 8641,
1955    "rharu" => 8640,
1956    "rharul" => 10604,
1957    "rho" => 961,
1958    "rhov" => 1009,
1959    "rightarrow" => 8594,
1960    "rightarrowtail" => 8611,
1961    "rightharpoondown" => 8641,
1962    "rightharpoonup" => 8640,
1963    "rightleftarrows" => 8644,
1964    "rightleftharpoons" => 8652,
1965    "rightrightarrows" => 8649,
1966    "rightsquigarrow" => 8605,
1967    "rightthreetimes" => 8908,
1968    "ring" => 730,
1969    "risingdotseq" => 8787,
1970    "rlarr" => 8644,
1971    "rlhar" => 8652,
1972    "rlm" => 8207,
1973    "rmoust" => 9137,
1974    "rmoustache" => 9137,
1975    "rnmid" => 10990,
1976    "roang" => 10221,
1977    "roarr" => 8702,
1978    "robrk" => 10215,
1979    "ropar" => 10630,
1980    "ropf" => 120163,
1981    "roplus" => 10798,
1982    "rotimes" => 10805,
1983    "rpar" => 41,
1984    "rpargt" => 10644,
1985    "rppolint" => 10770,
1986    "rrarr" => 8649,
1987    "rsaquo" => 8250,
1988    "rscr" => 120007,
1989    "rsh" => 8625,
1990    "rsqb" => 93,
1991    "rsquo" => 8217,
1992    "rsquor" => 8217,
1993    "rthree" => 8908,
1994    "rtimes" => 8906,
1995    "rtri" => 9657,
1996    "rtrie" => 8885,
1997    "rtrif" => 9656,
1998    "rtriltri" => 10702,
1999    "ruluhar" => 10600,
2000    "rx" => 8478,
2001    "sacute" => 347,
2002    "sbquo" => 8218,
2003    "sc" => 8827,
2004    "scE" => 10932,
2005    "scap" => 10936,
2006    "scaron" => 353,
2007    "sccue" => 8829,
2008    "sce" => 10928,
2009    "scedil" => 351,
2010    "scirc" => 349,
2011    "scnE" => 10934,
2012    "scnap" => 10938,
2013    "scnsim" => 8937,
2014    "scpolint" => 10771,
2015    "scsim" => 8831,
2016    "scy" => 1089,
2017    "sdot" => 8901,
2018    "sdotb" => 8865,
2019    "sdote" => 10854,
2020    "seArr" => 8664,
2021    "searhk" => 10533,
2022    "searr" => 8600,
2023    "searrow" => 8600,
2024    "sect" => 167,
2025    "semi" => 59,
2026    "seswar" => 10537,
2027    "setminus" => 8726,
2028    "setmn" => 8726,
2029    "sext" => 10038,
2030    "sfr" => 120112,
2031    "sfrown" => 8994,
2032    "sharp" => 9839,
2033    "shchcy" => 1097,
2034    "shcy" => 1096,
2035    "shortmid" => 8739,
2036    "shortparallel" => 8741,
2037    "shy" => 173,
2038    "sigma" => 963,
2039    "sigmaf" => 962,
2040    "sigmav" => 962,
2041    "sim" => 8764,
2042    "simdot" => 10858,
2043    "sime" => 8771,
2044    "simeq" => 8771,
2045    "simg" => 10910,
2046    "simgE" => 10912,
2047    "siml" => 10909,
2048    "simlE" => 10911,
2049    "simne" => 8774,
2050    "simplus" => 10788,
2051    "simrarr" => 10610,
2052    "slarr" => 8592,
2053    "smallsetminus" => 8726,
2054    "smashp" => 10803,
2055    "smeparsl" => 10724,
2056    "smid" => 8739,
2057    "smile" => 8995,
2058    "smt" => 10922,
2059    "smte" => 10924,
2060    "smtes" => 10924,
2061    "softcy" => 1100,
2062    "sol" => 47,
2063    "solb" => 10692,
2064    "solbar" => 9023,
2065    "sopf" => 120164,
2066    "spades" => 9824,
2067    "spadesuit" => 9824,
2068    "spar" => 8741,
2069    "sqcap" => 8851,
2070    "sqcaps" => 8851,
2071    "sqcup" => 8852,
2072    "sqcups" => 8852,
2073    "sqsub" => 8847,
2074    "sqsube" => 8849,
2075    "sqsubset" => 8847,
2076    "sqsubseteq" => 8849,
2077    "sqsup" => 8848,
2078    "sqsupe" => 8850,
2079    "sqsupset" => 8848,
2080    "sqsupseteq" => 8850,
2081    "squ" => 9633,
2082    "square" => 9633,
2083    "squarf" => 9642,
2084    "squf" => 9642,
2085    "srarr" => 8594,
2086    "sscr" => 120008,
2087    "ssetmn" => 8726,
2088    "ssmile" => 8995,
2089    "sstarf" => 8902,
2090    "star" => 9734,
2091    "starf" => 9733,
2092    "straightepsilon" => 1013,
2093    "straightphi" => 981,
2094    "strns" => 175,
2095    "sub" => 8834,
2096    "subE" => 10949,
2097    "subdot" => 10941,
2098    "sube" => 8838,
2099    "subedot" => 10947,
2100    "submult" => 10945,
2101    "subnE" => 10955,
2102    "subne" => 8842,
2103    "subplus" => 10943,
2104    "subrarr" => 10617,
2105    "subset" => 8834,
2106    "subseteq" => 8838,
2107    "subseteqq" => 10949,
2108    "subsetneq" => 8842,
2109    "subsetneqq" => 10955,
2110    "subsim" => 10951,
2111    "subsub" => 10965,
2112    "subsup" => 10963,
2113    "succ" => 8827,
2114    "succapprox" => 10936,
2115    "succcurlyeq" => 8829,
2116    "succeq" => 10928,
2117    "succnapprox" => 10938,
2118    "succneqq" => 10934,
2119    "succnsim" => 8937,
2120    "succsim" => 8831,
2121    "sum" => 8721,
2122    "sung" => 9834,
2123    "sup" => 8835,
2124    "sup1" => 185,
2125    "sup2" => 178,
2126    "sup3" => 179,
2127    "supE" => 10950,
2128    "supdot" => 10942,
2129    "supdsub" => 10968,
2130    "supe" => 8839,
2131    "supedot" => 10948,
2132    "suphsol" => 10185,
2133    "suphsub" => 10967,
2134    "suplarr" => 10619,
2135    "supmult" => 10946,
2136    "supnE" => 10956,
2137    "supne" => 8843,
2138    "supplus" => 10944,
2139    "supset" => 8835,
2140    "supseteq" => 8839,
2141    "supseteqq" => 10950,
2142    "supsetneq" => 8843,
2143    "supsetneqq" => 10956,
2144    "supsim" => 10952,
2145    "supsub" => 10964,
2146    "supsup" => 10966,
2147    "swArr" => 8665,
2148    "swarhk" => 10534,
2149    "swarr" => 8601,
2150    "swarrow" => 8601,
2151    "swnwar" => 10538,
2152    "szlig" => 223,
2153    "target" => 8982,
2154    "tau" => 964,
2155    "tbrk" => 9140,
2156    "tcaron" => 357,
2157    "tcedil" => 355,
2158    "tcy" => 1090,
2159    "tdot" => 8411,
2160    "telrec" => 8981,
2161    "tfr" => 120113,
2162    "there4" => 8756,
2163    "therefore" => 8756,
2164    "theta" => 952,
2165    "thetasym" => 977,
2166    "thetav" => 977,
2167    "thickapprox" => 8776,
2168    "thicksim" => 8764,
2169    "thinsp" => 8201,
2170    "thkap" => 8776,
2171    "thksim" => 8764,
2172    "thorn" => 254,
2173    "tilde" => 732,
2174    "times" => 215,
2175    "timesb" => 8864,
2176    "timesbar" => 10801,
2177    "timesd" => 10800,
2178    "tint" => 8749,
2179    "toea" => 10536,
2180    "top" => 8868,
2181    "topbot" => 9014,
2182    "topcir" => 10993,
2183    "topf" => 120165,
2184    "topfork" => 10970,
2185    "tosa" => 10537,
2186    "tprime" => 8244,
2187    "trade" => 8482,
2188    "triangle" => 9653,
2189    "triangledown" => 9663,
2190    "triangleleft" => 9667,
2191    "trianglelefteq" => 8884,
2192    "triangleq" => 8796,
2193    "triangleright" => 9657,
2194    "trianglerighteq" => 8885,
2195    "tridot" => 9708,
2196    "trie" => 8796,
2197    "triminus" => 10810,
2198    "triplus" => 10809,
2199    "trisb" => 10701,
2200    "tritime" => 10811,
2201    "trpezium" => 9186,
2202    "tscr" => 120009,
2203    "tscy" => 1094,
2204    "tshcy" => 1115,
2205    "tstrok" => 359,
2206    "twixt" => 8812,
2207    "twoheadleftarrow" => 8606,
2208    "twoheadrightarrow" => 8608,
2209    "uArr" => 8657,
2210    "uHar" => 10595,
2211    "uacute" => 250,
2212    "uarr" => 8593,
2213    "ubrcy" => 1118,
2214    "ubreve" => 365,
2215    "ucirc" => 251,
2216    "ucy" => 1091,
2217    "udarr" => 8645,
2218    "udblac" => 369,
2219    "udhar" => 10606,
2220    "ufisht" => 10622,
2221    "ufr" => 120114,
2222    "ugrave" => 249,
2223    "uharl" => 8639,
2224    "uharr" => 8638,
2225    "uhblk" => 9600,
2226    "ulcorn" => 8988,
2227    "ulcorner" => 8988,
2228    "ulcrop" => 8975,
2229    "ultri" => 9720,
2230    "umacr" => 363,
2231    "uml" => 168,
2232    "uogon" => 371,
2233    "uopf" => 120166,
2234    "uparrow" => 8593,
2235    "updownarrow" => 8597,
2236    "upharpoonleft" => 8639,
2237    "upharpoonright" => 8638,
2238    "uplus" => 8846,
2239    "upsi" => 965,
2240    "upsih" => 978,
2241    "upsilon" => 965,
2242    "upuparrows" => 8648,
2243    "urcorn" => 8989,
2244    "urcorner" => 8989,
2245    "urcrop" => 8974,
2246    "uring" => 367,
2247    "urtri" => 9721,
2248    "uscr" => 120010,
2249    "utdot" => 8944,
2250    "utilde" => 361,
2251    "utri" => 9653,
2252    "utrif" => 9652,
2253    "uuarr" => 8648,
2254    "uuml" => 252,
2255    "uwangle" => 10663,
2256    "vArr" => 8661,
2257    "vBar" => 10984,
2258    "vBarv" => 10985,
2259    "vDash" => 8872,
2260    "vangrt" => 10652,
2261    "varepsilon" => 1013,
2262    "varkappa" => 1008,
2263    "varnothing" => 8709,
2264    "varphi" => 981,
2265    "varpi" => 982,
2266    "varpropto" => 8733,
2267    "varr" => 8597,
2268    "varrho" => 1009,
2269    "varsigma" => 962,
2270    "varsubsetneq" => 8842,
2271    "varsubsetneqq" => 10955,
2272    "varsupsetneq" => 8843,
2273    "varsupsetneqq" => 10956,
2274    "vartheta" => 977,
2275    "vartriangleleft" => 8882,
2276    "vartriangleright" => 8883,
2277    "vcy" => 1074,
2278    "vdash" => 8866,
2279    "vee" => 8744,
2280    "veebar" => 8891,
2281    "veeeq" => 8794,
2282    "vellip" => 8942,
2283    "verbar" => 124,
2284    "vert" => 124,
2285    "vfr" => 120115,
2286    "vltri" => 8882,
2287    "vnsub" => 8834,
2288    "vnsup" => 8835,
2289    "vopf" => 120167,
2290    "vprop" => 8733,
2291    "vrtri" => 8883,
2292    "vscr" => 120011,
2293    "vsubnE" => 10955,
2294    "vsubne" => 8842,
2295    "vsupnE" => 10956,
2296    "vsupne" => 8843,
2297    "vzigzag" => 10650,
2298    "wcirc" => 373,
2299    "wedbar" => 10847,
2300    "wedge" => 8743,
2301    "wedgeq" => 8793,
2302    "weierp" => 8472,
2303    "wfr" => 120116,
2304    "wopf" => 120168,
2305    "wp" => 8472,
2306    "wr" => 8768,
2307    "wreath" => 8768,
2308    "wscr" => 120012,
2309    "xcap" => 8898,
2310    "xcirc" => 9711,
2311    "xcup" => 8899,
2312    "xdtri" => 9661,
2313    "xfr" => 120117,
2314    "xhArr" => 10234,
2315    "xharr" => 10231,
2316    "xi" => 958,
2317    "xlArr" => 10232,
2318    "xlarr" => 10229,
2319    "xmap" => 10236,
2320    "xnis" => 8955,
2321    "xodot" => 10752,
2322    "xopf" => 120169,
2323    "xoplus" => 10753,
2324    "xotime" => 10754,
2325    "xrArr" => 10233,
2326    "xrarr" => 10230,
2327    "xscr" => 120013,
2328    "xsqcup" => 10758,
2329    "xuplus" => 10756,
2330    "xutri" => 9651,
2331    "xvee" => 8897,
2332    "xwedge" => 8896,
2333    "yacute" => 253,
2334    "yacy" => 1103,
2335    "ycirc" => 375,
2336    "ycy" => 1099,
2337    "yen" => 165,
2338    "yfr" => 120118,
2339    "yicy" => 1111,
2340    "yopf" => 120170,
2341    "yscr" => 120014,
2342    "yucy" => 1102,
2343    "yuml" => 255,
2344    "zacute" => 378,
2345    "zcaron" => 382,
2346    "zcy" => 1079,
2347    "zdot" => 380,
2348    "zeetrf" => 8488,
2349    "zeta" => 950,
2350    "zfr" => 120119,
2351    "zhcy" => 1078,
2352    "zigrarr" => 8669,
2353    "zopf" => 120171,
2354    "zscr" => 120015,
2355    "zwj" => 8205,
2356    "zwnj" => 8204,
2357    }
2358}
2359
2360#[cfg(test)]
2361mod tests {
2362
2363    use crate::decoders::html::{add_html_token, html_to_text, text_to_html};
2364
2365    #[test]
2366    fn convert_text_to_html() {
2367        let inputs = [
2368            (
2369                "hello\nworld\n",
2370                "<html><body>hello<br/>world<br/></body></html>",
2371            ),
2372            ("using <>\n", "<html><body>using &lt;><br/></body></html>"),
2373        ];
2374
2375        for input in inputs {
2376            assert_eq!(text_to_html(input.0), input.1);
2377        }
2378    }
2379
2380    #[test]
2381    fn convert_html_to_text() {
2382        let inputs = [
2383            ("<html>hello<br/>world<br/></html>", "hello\nworld\n"),
2384            ("<html>using &lt;><br/></html>", "using <>\n"),
2385            ("test <not br/>tag<br />", "test tag\n"),
2386            ("<>< ><tag\n/>>hello    world< br \n />", ">hello world\n"),
2387            (
2388                concat!(
2389                    "<head><title>ignore head</title><not head>xyz</not head></head>",
2390                    "<h1>&lt;body&gt;</h1>"
2391                ),
2392                "<body>",
2393            ),
2394            (
2395                concat!(
2396                    "<p>what is &heartsuit;?</p><p>&#x000DF;&Abreve;&#914;&gamma; ",
2397                    "don&apos;t hurt me.</p>"
2398                ),
2399                "what is ♥?\nßĂΒγ don't hurt me.\n",
2400            ),
2401            (
2402                concat!(
2403                    "<!--[if mso]><style type=\"text/css\">body, table, td, a, p, ",
2404                    "span, ul, li {font-family: Arial, sans-serif!important;}</style><![endif]-->",
2405                    "this is <!-- <> < < < < ignore  > -> here -->the actual<!--> text"
2406                ),
2407                "this is the actual text",
2408            ),
2409            (
2410                "   < p >  hello < / p > < p > world < / p >   !!! < br > ",
2411                "hello\nworld\n!!!\n",
2412            ),
2413            (
2414                " <p>please unsubscribe <a href=#>here</a>.</p> ",
2415                "please unsubscribe here.\n",
2416            ),
2417        ];
2418
2419        for input in inputs {
2420            assert_eq!(html_to_text(input.0), input.1, "Failed for '{:?}'", input.0);
2421        }
2422    }
2423
2424    #[test]
2425    fn convert_html_entity() {
2426        let inputs = [
2427            ("&lt;", "<"),
2428            ("&#32;", " "),
2429            ("&#x20;", " "),
2430            ("&nbsp;", "\u{a0}"),
2431            ("&CounterClockwiseContourIntegral;", "∳"),
2432            ("&curvearrowright;", "↷"),
2433            ("&rarr;", "→"),
2434            ("&#xFFFFFFF;", "�"),
2435            ("&hmmm", "&hmmm"),
2436        ];
2437
2438        for input in inputs {
2439            let mut result = String::with_capacity(input.0.len());
2440            add_html_token(&mut result, input.0.as_bytes(), false);
2441            assert_eq!(result, input.1, "Failed for '{:?}", input.0);
2442        }
2443    }
2444
2445    #[test]
2446    fn html_to_text_removes_style_content() {
2447        let input = "<style>body{color:red}</style><div>Hello</div>";
2448        let output = html_to_text(input);
2449        assert!(!output.contains("body{color:red}"));
2450        assert!(output.contains("Hello"));
2451    }
2452
2453    #[test]
2454    fn html_to_text_removes_script_content() {
2455        let input = concat!(
2456            "<style>body{color:red}</style>",
2457            "<div>Hello</div>",
2458            "<script>alert('x')</script>",
2459            "<div>World</div>"
2460        );
2461        let output = html_to_text(input);
2462        assert!(!output.contains("body{color:red}"));
2463        assert!(!output.contains("alert('x')"));
2464        assert!(output.contains("Hello"));
2465        assert!(output.contains("World"));
2466    }
2467
2468    #[test]
2469    fn html_to_text_removes_template_content() {
2470        let input = concat!(
2471            "<div>Hello</div>",
2472            "<template><div>Hidden</div><style>.x{}</style></template>",
2473            "<div>World</div>"
2474        );
2475        let output = html_to_text(input);
2476        assert!(!output.contains("Hidden"));
2477        assert!(!output.contains(".x{}"));
2478        assert!(output.contains("Hello"));
2479        assert!(output.contains("World"));
2480    }
2481}