/rust/registry/src/index.crates.io-6f17d22bba15001f/quick-xml-0.29.0/src/escapei.rs
Line | Count | Source (jump to first uncovered line) |
1 | | //! Manage xml character escapes |
2 | | |
3 | | use memchr::memchr2_iter; |
4 | | use std::borrow::Cow; |
5 | | use std::ops::Range; |
6 | | |
7 | | #[cfg(test)] |
8 | | use pretty_assertions::assert_eq; |
9 | | |
10 | | /// Error for XML escape / unescape. |
11 | | #[derive(Clone, Debug)] |
12 | | pub enum EscapeError { |
13 | | /// Entity with Null character |
14 | | EntityWithNull(Range<usize>), |
15 | | /// Unrecognized escape symbol |
16 | | UnrecognizedSymbol(Range<usize>, String), |
17 | | /// Cannot find `;` after `&` |
18 | | UnterminatedEntity(Range<usize>), |
19 | | /// Cannot convert Hexa to utf8 |
20 | | TooLongHexadecimal, |
21 | | /// Character is not a valid hexadecimal value |
22 | | InvalidHexadecimal(char), |
23 | | /// Cannot convert decimal to hexa |
24 | | TooLongDecimal, |
25 | | /// Character is not a valid decimal value |
26 | | InvalidDecimal(char), |
27 | | /// Not a valid unicode codepoint |
28 | | InvalidCodepoint(u32), |
29 | | } |
30 | | |
31 | | impl std::fmt::Display for EscapeError { |
32 | 0 | fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { |
33 | 0 | match self { |
34 | 0 | EscapeError::EntityWithNull(e) => write!( |
35 | 0 | f, |
36 | 0 | "Error while escaping character at range {:?}: Null character entity not allowed", |
37 | 0 | e |
38 | 0 | ), |
39 | 0 | EscapeError::UnrecognizedSymbol(rge, res) => write!( |
40 | 0 | f, |
41 | 0 | "Error while escaping character at range {:?}: Unrecognized escape symbol: {:?}", |
42 | 0 | rge, res |
43 | 0 | ), |
44 | 0 | EscapeError::UnterminatedEntity(e) => write!( |
45 | 0 | f, |
46 | 0 | "Error while escaping character at range {:?}: Cannot find ';' after '&'", |
47 | 0 | e |
48 | 0 | ), |
49 | 0 | EscapeError::TooLongHexadecimal => write!(f, "Cannot convert hexadecimal to utf8"), |
50 | 0 | EscapeError::InvalidHexadecimal(e) => { |
51 | 0 | write!(f, "'{}' is not a valid hexadecimal character", e) |
52 | | } |
53 | 0 | EscapeError::TooLongDecimal => write!(f, "Cannot convert decimal to utf8"), |
54 | 0 | EscapeError::InvalidDecimal(e) => write!(f, "'{}' is not a valid decimal character", e), |
55 | 0 | EscapeError::InvalidCodepoint(n) => write!(f, "'{}' is not a valid codepoint", n), |
56 | | } |
57 | 0 | } |
58 | | } |
59 | | |
60 | | impl std::error::Error for EscapeError {} |
61 | | |
62 | | /// Escapes an `&str` and replaces all xml special characters (`<`, `>`, `&`, `'`, `"`) |
63 | | /// with their corresponding xml escaped value. |
64 | | /// |
65 | | /// This function performs following replacements: |
66 | | /// |
67 | | /// | Character | Replacement |
68 | | /// |-----------|------------ |
69 | | /// | `<` | `<` |
70 | | /// | `>` | `>` |
71 | | /// | `&` | `&` |
72 | | /// | `'` | `'` |
73 | | /// | `"` | `"` |
74 | 0 | pub fn escape(raw: &str) -> Cow<str> { |
75 | 0 | _escape(raw, |ch| matches!(ch, b'<' | b'>' | b'&' | b'\'' | b'\"')) |
76 | 0 | } |
77 | | |
78 | | /// Escapes an `&str` and replaces xml special characters (`<`, `>`, `&`) |
79 | | /// with their corresponding xml escaped value. |
80 | | /// |
81 | | /// Should only be used for escaping text content. In XML text content, it is allowed |
82 | | /// (though not recommended) to leave the quote special characters `"` and `'` unescaped. |
83 | | /// |
84 | | /// This function performs following replacements: |
85 | | /// |
86 | | /// | Character | Replacement |
87 | | /// |-----------|------------ |
88 | | /// | `<` | `<` |
89 | | /// | `>` | `>` |
90 | | /// | `&` | `&` |
91 | 0 | pub fn partial_escape(raw: &str) -> Cow<str> { |
92 | 0 | _escape(raw, |ch| matches!(ch, b'<' | b'>' | b'&')) |
93 | 0 | } |
94 | | |
95 | | /// Escapes an `&str` and replaces a subset of xml special characters (`<`, `>`, |
96 | | /// `&`, `'`, `"`) with their corresponding xml escaped value. |
97 | 0 | pub(crate) fn _escape<F: Fn(u8) -> bool>(raw: &str, escape_chars: F) -> Cow<str> { |
98 | 0 | let bytes = raw.as_bytes(); |
99 | 0 | let mut escaped = None; |
100 | 0 | let mut iter = bytes.iter(); |
101 | 0 | let mut pos = 0; |
102 | 0 | while let Some(i) = iter.position(|&b| escape_chars(b)) { Unexecuted instantiation: quick_xml::escapei::_escape::<quick_xml::escapei::partial_escape::{closure#0}>::{closure#0} Unexecuted instantiation: quick_xml::escapei::_escape::<quick_xml::escapei::escape::{closure#0}>::{closure#0} |
103 | 0 | if escaped.is_none() { |
104 | 0 | escaped = Some(Vec::with_capacity(raw.len())); |
105 | 0 | } |
106 | 0 | let escaped = escaped.as_mut().expect("initialized"); |
107 | 0 | let new_pos = pos + i; |
108 | 0 | escaped.extend_from_slice(&bytes[pos..new_pos]); |
109 | 0 | match bytes[new_pos] { |
110 | 0 | b'<' => escaped.extend_from_slice(b"<"), |
111 | 0 | b'>' => escaped.extend_from_slice(b">"), |
112 | 0 | b'\'' => escaped.extend_from_slice(b"'"), |
113 | 0 | b'&' => escaped.extend_from_slice(b"&"), |
114 | 0 | b'"' => escaped.extend_from_slice(b"""), |
115 | | |
116 | | // This set of escapes handles characters that should be escaped |
117 | | // in elements of xs:lists, because those characters works as |
118 | | // delimiters of list elements |
119 | 0 | b'\t' => escaped.extend_from_slice(b"	"), |
120 | 0 | b'\n' => escaped.extend_from_slice(b" "), |
121 | 0 | b'\r' => escaped.extend_from_slice(b" "), |
122 | 0 | b' ' => escaped.extend_from_slice(b" "), |
123 | 0 | _ => unreachable!( |
124 | 0 | "Only '<', '>','\', '&', '\"', '\\t', '\\r', '\\n', and ' ' are escaped" |
125 | 0 | ), |
126 | | } |
127 | 0 | pos = new_pos + 1; |
128 | | } |
129 | | |
130 | 0 | if let Some(mut escaped) = escaped { |
131 | 0 | if let Some(raw) = bytes.get(pos..) { |
132 | 0 | escaped.extend_from_slice(raw); |
133 | 0 | } |
134 | | // SAFETY: we operate on UTF-8 input and search for an one byte chars only, |
135 | | // so all slices that was put to the `escaped` is a valid UTF-8 encoded strings |
136 | | // TODO: Can be replaced with `unsafe { String::from_utf8_unchecked() }` |
137 | | // if unsafe code will be allowed |
138 | 0 | Cow::Owned(String::from_utf8(escaped).unwrap()) |
139 | | } else { |
140 | 0 | Cow::Borrowed(raw) |
141 | | } |
142 | 0 | } Unexecuted instantiation: quick_xml::escapei::_escape::<quick_xml::escapei::partial_escape::{closure#0}> Unexecuted instantiation: quick_xml::escapei::_escape::<quick_xml::escapei::escape::{closure#0}> |
143 | | |
144 | | /// Unescape an `&str` and replaces all xml escaped characters (`&...;`) into |
145 | | /// their corresponding value. |
146 | | /// |
147 | | /// If feature `escape-html` is enabled, then recognizes all [HTML5 escapes]. |
148 | | /// |
149 | | /// [HTML5 escapes]: https://dev.w3.org/html5/html-author/charref |
150 | 30.8M | pub fn unescape(raw: &str) -> Result<Cow<str>, EscapeError> { |
151 | 30.8M | unescape_with(raw, |_| None) |
152 | 30.8M | } |
153 | | |
154 | | /// Unescape an `&str` and replaces all xml escaped characters (`&...;`) into |
155 | | /// their corresponding value, using a resolver function for custom entities. |
156 | | /// |
157 | | /// If feature `escape-html` is enabled, then recognizes all [HTML5 escapes]. |
158 | | /// |
159 | | /// [HTML5 escapes]: https://dev.w3.org/html5/html-author/charref |
160 | 33.7M | pub fn unescape_with<'input, 'entity, F>( |
161 | 33.7M | raw: &'input str, |
162 | 33.7M | mut resolve_entity: F, |
163 | 33.7M | ) -> Result<Cow<'input, str>, EscapeError> |
164 | 33.7M | where |
165 | 33.7M | // the lifetime of the output comes from a capture or is `'static` |
166 | 33.7M | F: FnMut(&str) -> Option<&'entity str>, |
167 | 33.7M | { |
168 | 33.7M | let bytes = raw.as_bytes(); |
169 | 33.7M | let mut unescaped = None; |
170 | 33.7M | let mut last_end = 0; |
171 | 33.7M | let mut iter = memchr2_iter(b'&', b';', bytes); |
172 | 63.0M | while let Some(start) = iter.by_ref().find(|p| bytes[*p] == b'&') { quick_xml::escapei::unescape_with::<quick_xml::escapei::unescape::{closure#0}>::{closure#0} Line | Count | Source | 172 | 23.1M | while let Some(start) = iter.by_ref().find(|p| bytes[*p] == b'&') { |
quick_xml::escapei::unescape_with::<<quick_xml::events::attributes::Attribute>::unescape_value::{closure#0}>::{closure#0} Line | Count | Source | 172 | 6.60M | while let Some(start) = iter.by_ref().find(|p| bytes[*p] == b'&') { |
Unexecuted instantiation: quick_xml::escapei::unescape_with::<<quick_xml::events::BytesText>::unescape::{closure#0}>::{closure#0} |
173 | 29.3M | match iter.next() { |
174 | 29.3M | Some(end) if bytes[end] == b';' => { |
175 | 29.3M | // append valid data |
176 | 29.3M | if unescaped.is_none() { |
177 | 10.6M | unescaped = Some(String::with_capacity(raw.len())); |
178 | 18.7M | } |
179 | 29.3M | let unescaped = unescaped.as_mut().expect("initialized"); |
180 | 29.3M | unescaped.push_str(&raw[last_end..start]); |
181 | 29.3M | |
182 | 29.3M | // search for character correctness |
183 | 29.3M | let pat = &raw[start + 1..end]; |
184 | 29.3M | if let Some(entity) = pat.strip_prefix('#') { |
185 | 0 | let codepoint = parse_number(entity, start..end)?; |
186 | 0 | unescaped.push_str(codepoint.encode_utf8(&mut [0u8; 4])); |
187 | 29.3M | } else if let Some(value) = named_entity(pat) { |
188 | 29.3M | unescaped.push_str(value); |
189 | 29.3M | } else if let Some(value) = resolve_entity(pat) { |
190 | 0 | unescaped.push_str(value); |
191 | 0 | } else { |
192 | 0 | return Err(EscapeError::UnrecognizedSymbol( |
193 | 0 | start + 1..end, |
194 | 0 | pat.to_string(), |
195 | 0 | )); |
196 | | } |
197 | | |
198 | 29.3M | last_end = end + 1; |
199 | | } |
200 | 0 | _ => return Err(EscapeError::UnterminatedEntity(start..raw.len())), |
201 | | } |
202 | | } |
203 | | |
204 | 33.7M | if let Some(mut unescaped) = unescaped { |
205 | 10.6M | if let Some(raw) = raw.get(last_end..) { |
206 | 10.6M | unescaped.push_str(raw); |
207 | 10.6M | } |
208 | 10.6M | Ok(Cow::Owned(unescaped)) |
209 | | } else { |
210 | 23.0M | Ok(Cow::Borrowed(raw)) |
211 | | } |
212 | 33.7M | } quick_xml::escapei::unescape_with::<quick_xml::escapei::unescape::{closure#0}> Line | Count | Source | 160 | 30.8M | pub fn unescape_with<'input, 'entity, F>( | 161 | 30.8M | raw: &'input str, | 162 | 30.8M | mut resolve_entity: F, | 163 | 30.8M | ) -> Result<Cow<'input, str>, EscapeError> | 164 | 30.8M | where | 165 | 30.8M | // the lifetime of the output comes from a capture or is `'static` | 166 | 30.8M | F: FnMut(&str) -> Option<&'entity str>, | 167 | 30.8M | { | 168 | 30.8M | let bytes = raw.as_bytes(); | 169 | 30.8M | let mut unescaped = None; | 170 | 30.8M | let mut last_end = 0; | 171 | 30.8M | let mut iter = memchr2_iter(b'&', b';', bytes); | 172 | 53.8M | while let Some(start) = iter.by_ref().find(|p| bytes[*p] == b'&') { | 173 | 22.9M | match iter.next() { | 174 | 22.9M | Some(end) if bytes[end] == b';' => { | 175 | 22.9M | // append valid data | 176 | 22.9M | if unescaped.is_none() { | 177 | 10.5M | unescaped = Some(String::with_capacity(raw.len())); | 178 | 12.4M | } | 179 | 22.9M | let unescaped = unescaped.as_mut().expect("initialized"); | 180 | 22.9M | unescaped.push_str(&raw[last_end..start]); | 181 | 22.9M | | 182 | 22.9M | // search for character correctness | 183 | 22.9M | let pat = &raw[start + 1..end]; | 184 | 22.9M | if let Some(entity) = pat.strip_prefix('#') { | 185 | 0 | let codepoint = parse_number(entity, start..end)?; | 186 | 0 | unescaped.push_str(codepoint.encode_utf8(&mut [0u8; 4])); | 187 | 22.9M | } else if let Some(value) = named_entity(pat) { | 188 | 22.9M | unescaped.push_str(value); | 189 | 22.9M | } else if let Some(value) = resolve_entity(pat) { | 190 | 0 | unescaped.push_str(value); | 191 | 0 | } else { | 192 | 0 | return Err(EscapeError::UnrecognizedSymbol( | 193 | 0 | start + 1..end, | 194 | 0 | pat.to_string(), | 195 | 0 | )); | 196 | | } | 197 | | | 198 | 22.9M | last_end = end + 1; | 199 | | } | 200 | 0 | _ => return Err(EscapeError::UnterminatedEntity(start..raw.len())), | 201 | | } | 202 | | } | 203 | | | 204 | 30.8M | if let Some(mut unescaped) = unescaped { | 205 | 10.5M | if let Some(raw) = raw.get(last_end..) { | 206 | 10.5M | unescaped.push_str(raw); | 207 | 10.5M | } | 208 | 10.5M | Ok(Cow::Owned(unescaped)) | 209 | | } else { | 210 | 20.3M | Ok(Cow::Borrowed(raw)) | 211 | | } | 212 | 30.8M | } |
quick_xml::escapei::unescape_with::<<quick_xml::events::attributes::Attribute>::unescape_value::{closure#0}> Line | Count | Source | 160 | 2.85M | pub fn unescape_with<'input, 'entity, F>( | 161 | 2.85M | raw: &'input str, | 162 | 2.85M | mut resolve_entity: F, | 163 | 2.85M | ) -> Result<Cow<'input, str>, EscapeError> | 164 | 2.85M | where | 165 | 2.85M | // the lifetime of the output comes from a capture or is `'static` | 166 | 2.85M | F: FnMut(&str) -> Option<&'entity str>, | 167 | 2.85M | { | 168 | 2.85M | let bytes = raw.as_bytes(); | 169 | 2.85M | let mut unescaped = None; | 170 | 2.85M | let mut last_end = 0; | 171 | 2.85M | let mut iter = memchr2_iter(b'&', b';', bytes); | 172 | 9.26M | while let Some(start) = iter.by_ref().find(|p| bytes[*p] == b'&') { | 173 | 6.41M | match iter.next() { | 174 | 6.41M | Some(end) if bytes[end] == b';' => { | 175 | 6.41M | // append valid data | 176 | 6.41M | if unescaped.is_none() { | 177 | 88.9k | unescaped = Some(String::with_capacity(raw.len())); | 178 | 6.32M | } | 179 | 6.41M | let unescaped = unescaped.as_mut().expect("initialized"); | 180 | 6.41M | unescaped.push_str(&raw[last_end..start]); | 181 | 6.41M | | 182 | 6.41M | // search for character correctness | 183 | 6.41M | let pat = &raw[start + 1..end]; | 184 | 6.41M | if let Some(entity) = pat.strip_prefix('#') { | 185 | 0 | let codepoint = parse_number(entity, start..end)?; | 186 | 0 | unescaped.push_str(codepoint.encode_utf8(&mut [0u8; 4])); | 187 | 6.41M | } else if let Some(value) = named_entity(pat) { | 188 | 6.41M | unescaped.push_str(value); | 189 | 6.41M | } else if let Some(value) = resolve_entity(pat) { | 190 | 0 | unescaped.push_str(value); | 191 | 0 | } else { | 192 | 0 | return Err(EscapeError::UnrecognizedSymbol( | 193 | 0 | start + 1..end, | 194 | 0 | pat.to_string(), | 195 | 0 | )); | 196 | | } | 197 | | | 198 | 6.41M | last_end = end + 1; | 199 | | } | 200 | 0 | _ => return Err(EscapeError::UnterminatedEntity(start..raw.len())), | 201 | | } | 202 | | } | 203 | | | 204 | 2.85M | if let Some(mut unescaped) = unescaped { | 205 | 88.9k | if let Some(raw) = raw.get(last_end..) { | 206 | 88.9k | unescaped.push_str(raw); | 207 | 88.9k | } | 208 | 88.9k | Ok(Cow::Owned(unescaped)) | 209 | | } else { | 210 | 2.76M | Ok(Cow::Borrowed(raw)) | 211 | | } | 212 | 2.85M | } |
Unexecuted instantiation: quick_xml::escapei::unescape_with::<<quick_xml::events::BytesText>::unescape::{closure#0}> |
213 | | |
214 | | #[cfg(not(feature = "escape-html"))] |
215 | 29.3M | fn named_entity(name: &str) -> Option<&str> { |
216 | | // match over strings are not allowed in const functions |
217 | 29.3M | let s = match name.as_bytes() { |
218 | 29.3M | b"lt" => "<", |
219 | 9.91M | b"gt" => ">", |
220 | 5.26M | b"amp" => "&", |
221 | 4.05M | b"apos" => "'", |
222 | 4.05M | b"quot" => "\"", |
223 | 0 | _ => return None, |
224 | | }; |
225 | 29.3M | Some(s) |
226 | 29.3M | } |
227 | | #[cfg(feature = "escape-html")] |
228 | | fn named_entity(name: &str) -> Option<&str> { |
229 | | // imported from https://dev.w3.org/html5/html-author/charref |
230 | | // match over strings are not allowed in const functions |
231 | | //TODO: automate up-to-dating using https://html.spec.whatwg.org/entities.json |
232 | | let s = match name.as_bytes() { |
233 | | b"Tab" => "\u{09}", |
234 | | b"NewLine" => "\u{0A}", |
235 | | b"excl" => "\u{21}", |
236 | | b"quot" | b"QUOT" => "\u{22}", |
237 | | b"num" => "\u{23}", |
238 | | b"dollar" => "\u{24}", |
239 | | b"percnt" => "\u{25}", |
240 | | b"amp" | b"AMP" => "\u{26}", |
241 | | b"apos" => "\u{27}", |
242 | | b"lpar" => "\u{28}", |
243 | | b"rpar" => "\u{29}", |
244 | | b"ast" | b"midast" => "\u{2A}", |
245 | | b"plus" => "\u{2B}", |
246 | | b"comma" => "\u{2C}", |
247 | | b"period" => "\u{2E}", |
248 | | b"sol" => "\u{2F}", |
249 | | b"colon" => "\u{3A}", |
250 | | b"semi" => "\u{3B}", |
251 | | b"lt" | b"LT" => "\u{3C}", |
252 | | b"equals" => "\u{3D}", |
253 | | b"gt" | b"GT" => "\u{3E}", |
254 | | b"quest" => "\u{3F}", |
255 | | b"commat" => "\u{40}", |
256 | | b"lsqb" | b"lbrack" => "\u{5B}", |
257 | | b"bsol" => "\u{5C}", |
258 | | b"rsqb" | b"rbrack" => "\u{5D}", |
259 | | b"Hat" => "\u{5E}", |
260 | | b"lowbar" => "\u{5F}", |
261 | | b"grave" | b"DiacriticalGrave" => "\u{60}", |
262 | | b"lcub" | b"lbrace" => "\u{7B}", |
263 | | b"verbar" | b"vert" | b"VerticalLine" => "\u{7C}", |
264 | | b"rcub" | b"rbrace" => "\u{7D}", |
265 | | b"nbsp" | b"NonBreakingSpace" => "\u{A0}", |
266 | | b"iexcl" => "\u{A1}", |
267 | | b"cent" => "\u{A2}", |
268 | | b"pound" => "\u{A3}", |
269 | | b"curren" => "\u{A4}", |
270 | | b"yen" => "\u{A5}", |
271 | | b"brvbar" => "\u{A6}", |
272 | | b"sect" => "\u{A7}", |
273 | | b"Dot" | b"die" | b"DoubleDot" | b"uml" => "\u{A8}", |
274 | | b"copy" | b"COPY" => "\u{A9}", |
275 | | b"ordf" => "\u{AA}", |
276 | | b"laquo" => "\u{AB}", |
277 | | b"not" => "\u{AC}", |
278 | | b"shy" => "\u{AD}", |
279 | | b"reg" | b"circledR" | b"REG" => "\u{AE}", |
280 | | b"macr" | b"OverBar" | b"strns" => "\u{AF}", |
281 | | b"deg" => "\u{B0}", |
282 | | b"plusmn" | b"pm" | b"PlusMinus" => "\u{B1}", |
283 | | b"sup2" => "\u{B2}", |
284 | | b"sup3" => "\u{B3}", |
285 | | b"acute" | b"DiacriticalAcute" => "\u{B4}", |
286 | | b"micro" => "\u{B5}", |
287 | | b"para" => "\u{B6}", |
288 | | b"middot" | b"centerdot" | b"CenterDot" => "\u{B7}", |
289 | | b"cedil" | b"Cedilla" => "\u{B8}", |
290 | | b"sup1" => "\u{B9}", |
291 | | b"ordm" => "\u{BA}", |
292 | | b"raquo" => "\u{BB}", |
293 | | b"frac14" => "\u{BC}", |
294 | | b"frac12" | b"half" => "\u{BD}", |
295 | | b"frac34" => "\u{BE}", |
296 | | b"iquest" => "\u{BF}", |
297 | | b"Agrave" => "\u{C0}", |
298 | | b"Aacute" => "\u{C1}", |
299 | | b"Acirc" => "\u{C2}", |
300 | | b"Atilde" => "\u{C3}", |
301 | | b"Auml" => "\u{C4}", |
302 | | b"Aring" => "\u{C5}", |
303 | | b"AElig" => "\u{C6}", |
304 | | b"Ccedil" => "\u{C7}", |
305 | | b"Egrave" => "\u{C8}", |
306 | | b"Eacute" => "\u{C9}", |
307 | | b"Ecirc" => "\u{CA}", |
308 | | b"Euml" => "\u{CB}", |
309 | | b"Igrave" => "\u{CC}", |
310 | | b"Iacute" => "\u{CD}", |
311 | | b"Icirc" => "\u{CE}", |
312 | | b"Iuml" => "\u{CF}", |
313 | | b"ETH" => "\u{D0}", |
314 | | b"Ntilde" => "\u{D1}", |
315 | | b"Ograve" => "\u{D2}", |
316 | | b"Oacute" => "\u{D3}", |
317 | | b"Ocirc" => "\u{D4}", |
318 | | b"Otilde" => "\u{D5}", |
319 | | b"Ouml" => "\u{D6}", |
320 | | b"times" => "\u{D7}", |
321 | | b"Oslash" => "\u{D8}", |
322 | | b"Ugrave" => "\u{D9}", |
323 | | b"Uacute" => "\u{DA}", |
324 | | b"Ucirc" => "\u{DB}", |
325 | | b"Uuml" => "\u{DC}", |
326 | | b"Yacute" => "\u{DD}", |
327 | | b"THORN" => "\u{DE}", |
328 | | b"szlig" => "\u{DF}", |
329 | | b"agrave" => "\u{E0}", |
330 | | b"aacute" => "\u{E1}", |
331 | | b"acirc" => "\u{E2}", |
332 | | b"atilde" => "\u{E3}", |
333 | | b"auml" => "\u{E4}", |
334 | | b"aring" => "\u{E5}", |
335 | | b"aelig" => "\u{E6}", |
336 | | b"ccedil" => "\u{E7}", |
337 | | b"egrave" => "\u{E8}", |
338 | | b"eacute" => "\u{E9}", |
339 | | b"ecirc" => "\u{EA}", |
340 | | b"euml" => "\u{EB}", |
341 | | b"igrave" => "\u{EC}", |
342 | | b"iacute" => "\u{ED}", |
343 | | b"icirc" => "\u{EE}", |
344 | | b"iuml" => "\u{EF}", |
345 | | b"eth" => "\u{F0}", |
346 | | b"ntilde" => "\u{F1}", |
347 | | b"ograve" => "\u{F2}", |
348 | | b"oacute" => "\u{F3}", |
349 | | b"ocirc" => "\u{F4}", |
350 | | b"otilde" => "\u{F5}", |
351 | | b"ouml" => "\u{F6}", |
352 | | b"divide" | b"div" => "\u{F7}", |
353 | | b"oslash" => "\u{F8}", |
354 | | b"ugrave" => "\u{F9}", |
355 | | b"uacute" => "\u{FA}", |
356 | | b"ucirc" => "\u{FB}", |
357 | | b"uuml" => "\u{FC}", |
358 | | b"yacute" => "\u{FD}", |
359 | | b"thorn" => "\u{FE}", |
360 | | b"yuml" => "\u{FF}", |
361 | | b"Amacr" => "\u{10}", |
362 | | b"amacr" => "\u{10}", |
363 | | b"Abreve" => "\u{10}", |
364 | | b"abreve" => "\u{10}", |
365 | | b"Aogon" => "\u{10}", |
366 | | b"aogon" => "\u{10}", |
367 | | b"Cacute" => "\u{10}", |
368 | | b"cacute" => "\u{10}", |
369 | | b"Ccirc" => "\u{10}", |
370 | | b"ccirc" => "\u{10}", |
371 | | b"Cdot" => "\u{10}", |
372 | | b"cdot" => "\u{10}", |
373 | | b"Ccaron" => "\u{10}", |
374 | | b"ccaron" => "\u{10}", |
375 | | b"Dcaron" => "\u{10}", |
376 | | b"dcaron" => "\u{10}", |
377 | | b"Dstrok" => "\u{11}", |
378 | | b"dstrok" => "\u{11}", |
379 | | b"Emacr" => "\u{11}", |
380 | | b"emacr" => "\u{11}", |
381 | | b"Edot" => "\u{11}", |
382 | | b"edot" => "\u{11}", |
383 | | b"Eogon" => "\u{11}", |
384 | | b"eogon" => "\u{11}", |
385 | | b"Ecaron" => "\u{11}", |
386 | | b"ecaron" => "\u{11}", |
387 | | b"Gcirc" => "\u{11}", |
388 | | b"gcirc" => "\u{11}", |
389 | | b"Gbreve" => "\u{11}", |
390 | | b"gbreve" => "\u{11}", |
391 | | b"Gdot" => "\u{12}", |
392 | | b"gdot" => "\u{12}", |
393 | | b"Gcedil" => "\u{12}", |
394 | | b"Hcirc" => "\u{12}", |
395 | | b"hcirc" => "\u{12}", |
396 | | b"Hstrok" => "\u{12}", |
397 | | b"hstrok" => "\u{12}", |
398 | | b"Itilde" => "\u{12}", |
399 | | b"itilde" => "\u{12}", |
400 | | b"Imacr" => "\u{12}", |
401 | | b"imacr" => "\u{12}", |
402 | | b"Iogon" => "\u{12}", |
403 | | b"iogon" => "\u{12}", |
404 | | b"Idot" => "\u{13}", |
405 | | b"imath" | b"inodot" => "\u{13}", |
406 | | b"IJlig" => "\u{13}", |
407 | | b"ijlig" => "\u{13}", |
408 | | b"Jcirc" => "\u{13}", |
409 | | b"jcirc" => "\u{13}", |
410 | | b"Kcedil" => "\u{13}", |
411 | | b"kcedil" => "\u{13}", |
412 | | b"kgreen" => "\u{13}", |
413 | | b"Lacute" => "\u{13}", |
414 | | b"lacute" => "\u{13}", |
415 | | b"Lcedil" => "\u{13}", |
416 | | b"lcedil" => "\u{13}", |
417 | | b"Lcaron" => "\u{13}", |
418 | | b"lcaron" => "\u{13}", |
419 | | b"Lmidot" => "\u{13}", |
420 | | b"lmidot" => "\u{14}", |
421 | | b"Lstrok" => "\u{14}", |
422 | | b"lstrok" => "\u{14}", |
423 | | b"Nacute" => "\u{14}", |
424 | | b"nacute" => "\u{14}", |
425 | | b"Ncedil" => "\u{14}", |
426 | | b"ncedil" => "\u{14}", |
427 | | b"Ncaron" => "\u{14}", |
428 | | b"ncaron" => "\u{14}", |
429 | | b"napos" => "\u{14}", |
430 | | b"ENG" => "\u{14}", |
431 | | b"eng" => "\u{14}", |
432 | | b"Omacr" => "\u{14}", |
433 | | b"omacr" => "\u{14}", |
434 | | b"Odblac" => "\u{15}", |
435 | | b"odblac" => "\u{15}", |
436 | | b"OElig" => "\u{15}", |
437 | | b"oelig" => "\u{15}", |
438 | | b"Racute" => "\u{15}", |
439 | | b"racute" => "\u{15}", |
440 | | b"Rcedil" => "\u{15}", |
441 | | b"rcedil" => "\u{15}", |
442 | | b"Rcaron" => "\u{15}", |
443 | | b"rcaron" => "\u{15}", |
444 | | b"Sacute" => "\u{15}", |
445 | | b"sacute" => "\u{15}", |
446 | | b"Scirc" => "\u{15}", |
447 | | b"scirc" => "\u{15}", |
448 | | b"Scedil" => "\u{15}", |
449 | | b"scedil" => "\u{15}", |
450 | | b"Scaron" => "\u{16}", |
451 | | b"scaron" => "\u{16}", |
452 | | b"Tcedil" => "\u{16}", |
453 | | b"tcedil" => "\u{16}", |
454 | | b"Tcaron" => "\u{16}", |
455 | | b"tcaron" => "\u{16}", |
456 | | b"Tstrok" => "\u{16}", |
457 | | b"tstrok" => "\u{16}", |
458 | | b"Utilde" => "\u{16}", |
459 | | b"utilde" => "\u{16}", |
460 | | b"Umacr" => "\u{16}", |
461 | | b"umacr" => "\u{16}", |
462 | | b"Ubreve" => "\u{16}", |
463 | | b"ubreve" => "\u{16}", |
464 | | b"Uring" => "\u{16}", |
465 | | b"uring" => "\u{16}", |
466 | | b"Udblac" => "\u{17}", |
467 | | b"udblac" => "\u{17}", |
468 | | b"Uogon" => "\u{17}", |
469 | | b"uogon" => "\u{17}", |
470 | | b"Wcirc" => "\u{17}", |
471 | | b"wcirc" => "\u{17}", |
472 | | b"Ycirc" => "\u{17}", |
473 | | b"ycirc" => "\u{17}", |
474 | | b"Yuml" => "\u{17}", |
475 | | b"Zacute" => "\u{17}", |
476 | | b"zacute" => "\u{17}", |
477 | | b"Zdot" => "\u{17}", |
478 | | b"zdot" => "\u{17}", |
479 | | b"Zcaron" => "\u{17}", |
480 | | b"zcaron" => "\u{17}", |
481 | | b"fnof" => "\u{19}", |
482 | | b"imped" => "\u{1B}", |
483 | | b"gacute" => "\u{1F}", |
484 | | b"jmath" => "\u{23}", |
485 | | b"circ" => "\u{2C}", |
486 | | b"caron" | b"Hacek" => "\u{2C}", |
487 | | b"breve" | b"Breve" => "\u{2D}", |
488 | | b"dot" | b"DiacriticalDot" => "\u{2D}", |
489 | | b"ring" => "\u{2D}", |
490 | | b"ogon" => "\u{2D}", |
491 | | b"tilde" | b"DiacriticalTilde" => "\u{2D}", |
492 | | b"dblac" | b"DiacriticalDoubleAcute" => "\u{2D}", |
493 | | b"DownBreve" => "\u{31}", |
494 | | b"UnderBar" => "\u{33}", |
495 | | b"Alpha" => "\u{39}", |
496 | | b"Beta" => "\u{39}", |
497 | | b"Gamma" => "\u{39}", |
498 | | b"Delta" => "\u{39}", |
499 | | b"Epsilon" => "\u{39}", |
500 | | b"Zeta" => "\u{39}", |
501 | | b"Eta" => "\u{39}", |
502 | | b"Theta" => "\u{39}", |
503 | | b"Iota" => "\u{39}", |
504 | | b"Kappa" => "\u{39}", |
505 | | b"Lambda" => "\u{39}", |
506 | | b"Mu" => "\u{39}", |
507 | | b"Nu" => "\u{39}", |
508 | | b"Xi" => "\u{39}", |
509 | | b"Omicron" => "\u{39}", |
510 | | b"Pi" => "\u{3A}", |
511 | | b"Rho" => "\u{3A}", |
512 | | b"Sigma" => "\u{3A}", |
513 | | b"Tau" => "\u{3A}", |
514 | | b"Upsilon" => "\u{3A}", |
515 | | b"Phi" => "\u{3A}", |
516 | | b"Chi" => "\u{3A}", |
517 | | b"Psi" => "\u{3A}", |
518 | | b"Omega" => "\u{3A}", |
519 | | b"alpha" => "\u{3B}", |
520 | | b"beta" => "\u{3B}", |
521 | | b"gamma" => "\u{3B}", |
522 | | b"delta" => "\u{3B}", |
523 | | b"epsiv" | b"varepsilon" | b"epsilon" => "\u{3B}", |
524 | | b"zeta" => "\u{3B}", |
525 | | b"eta" => "\u{3B}", |
526 | | b"theta" => "\u{3B}", |
527 | | b"iota" => "\u{3B}", |
528 | | b"kappa" => "\u{3B}", |
529 | | b"lambda" => "\u{3B}", |
530 | | b"mu" => "\u{3B}", |
531 | | b"nu" => "\u{3B}", |
532 | | b"xi" => "\u{3B}", |
533 | | b"omicron" => "\u{3B}", |
534 | | b"pi" => "\u{3C}", |
535 | | b"rho" => "\u{3C}", |
536 | | b"sigmav" | b"varsigma" | b"sigmaf" => "\u{3C}", |
537 | | b"sigma" => "\u{3C}", |
538 | | b"tau" => "\u{3C}", |
539 | | b"upsi" | b"upsilon" => "\u{3C}", |
540 | | b"phi" | b"phiv" | b"varphi" => "\u{3C}", |
541 | | b"chi" => "\u{3C}", |
542 | | b"psi" => "\u{3C}", |
543 | | b"omega" => "\u{3C}", |
544 | | b"thetav" | b"vartheta" | b"thetasym" => "\u{3D}", |
545 | | b"Upsi" | b"upsih" => "\u{3D}", |
546 | | b"straightphi" => "\u{3D}", |
547 | | b"piv" | b"varpi" => "\u{3D}", |
548 | | b"Gammad" => "\u{3D}", |
549 | | b"gammad" | b"digamma" => "\u{3D}", |
550 | | b"kappav" | b"varkappa" => "\u{3F}", |
551 | | b"rhov" | b"varrho" => "\u{3F}", |
552 | | b"epsi" | b"straightepsilon" => "\u{3F}", |
553 | | b"bepsi" | b"backepsilon" => "\u{3F}", |
554 | | b"IOcy" => "\u{40}", |
555 | | b"DJcy" => "\u{40}", |
556 | | b"GJcy" => "\u{40}", |
557 | | b"Jukcy" => "\u{40}", |
558 | | b"DScy" => "\u{40}", |
559 | | b"Iukcy" => "\u{40}", |
560 | | b"YIcy" => "\u{40}", |
561 | | b"Jsercy" => "\u{40}", |
562 | | b"LJcy" => "\u{40}", |
563 | | b"NJcy" => "\u{40}", |
564 | | b"TSHcy" => "\u{40}", |
565 | | b"KJcy" => "\u{40}", |
566 | | b"Ubrcy" => "\u{40}", |
567 | | b"DZcy" => "\u{40}", |
568 | | b"Acy" => "\u{41}", |
569 | | b"Bcy" => "\u{41}", |
570 | | b"Vcy" => "\u{41}", |
571 | | b"Gcy" => "\u{41}", |
572 | | b"Dcy" => "\u{41}", |
573 | | b"IEcy" => "\u{41}", |
574 | | b"ZHcy" => "\u{41}", |
575 | | b"Zcy" => "\u{41}", |
576 | | b"Icy" => "\u{41}", |
577 | | b"Jcy" => "\u{41}", |
578 | | b"Kcy" => "\u{41}", |
579 | | b"Lcy" => "\u{41}", |
580 | | b"Mcy" => "\u{41}", |
581 | | b"Ncy" => "\u{41}", |
582 | | b"Ocy" => "\u{41}", |
583 | | b"Pcy" => "\u{41}", |
584 | | b"Rcy" => "\u{42}", |
585 | | b"Scy" => "\u{42}", |
586 | | b"Tcy" => "\u{42}", |
587 | | b"Ucy" => "\u{42}", |
588 | | b"Fcy" => "\u{42}", |
589 | | b"KHcy" => "\u{42}", |
590 | | b"TScy" => "\u{42}", |
591 | | b"CHcy" => "\u{42}", |
592 | | b"SHcy" => "\u{42}", |
593 | | b"SHCHcy" => "\u{42}", |
594 | | b"HARDcy" => "\u{42}", |
595 | | b"Ycy" => "\u{42}", |
596 | | b"SOFTcy" => "\u{42}", |
597 | | b"Ecy" => "\u{42}", |
598 | | b"YUcy" => "\u{42}", |
599 | | b"YAcy" => "\u{42}", |
600 | | b"acy" => "\u{43}", |
601 | | b"bcy" => "\u{43}", |
602 | | b"vcy" => "\u{43}", |
603 | | b"gcy" => "\u{43}", |
604 | | b"dcy" => "\u{43}", |
605 | | b"iecy" => "\u{43}", |
606 | | b"zhcy" => "\u{43}", |
607 | | b"zcy" => "\u{43}", |
608 | | b"icy" => "\u{43}", |
609 | | b"jcy" => "\u{43}", |
610 | | b"kcy" => "\u{43}", |
611 | | b"lcy" => "\u{43}", |
612 | | b"mcy" => "\u{43}", |
613 | | b"ncy" => "\u{43}", |
614 | | b"ocy" => "\u{43}", |
615 | | b"pcy" => "\u{43}", |
616 | | b"rcy" => "\u{44}", |
617 | | b"scy" => "\u{44}", |
618 | | b"tcy" => "\u{44}", |
619 | | b"ucy" => "\u{44}", |
620 | | b"fcy" => "\u{44}", |
621 | | b"khcy" => "\u{44}", |
622 | | b"tscy" => "\u{44}", |
623 | | b"chcy" => "\u{44}", |
624 | | b"shcy" => "\u{44}", |
625 | | b"shchcy" => "\u{44}", |
626 | | b"hardcy" => "\u{44}", |
627 | | b"ycy" => "\u{44}", |
628 | | b"softcy" => "\u{44}", |
629 | | b"ecy" => "\u{44}", |
630 | | b"yucy" => "\u{44}", |
631 | | b"yacy" => "\u{44}", |
632 | | b"iocy" => "\u{45}", |
633 | | b"djcy" => "\u{45}", |
634 | | b"gjcy" => "\u{45}", |
635 | | b"jukcy" => "\u{45}", |
636 | | b"dscy" => "\u{45}", |
637 | | b"iukcy" => "\u{45}", |
638 | | b"yicy" => "\u{45}", |
639 | | b"jsercy" => "\u{45}", |
640 | | b"ljcy" => "\u{45}", |
641 | | b"njcy" => "\u{45}", |
642 | | b"tshcy" => "\u{45}", |
643 | | b"kjcy" => "\u{45}", |
644 | | b"ubrcy" => "\u{45}", |
645 | | b"dzcy" => "\u{45}", |
646 | | b"ensp" => "\u{2002}", |
647 | | b"emsp" => "\u{2003}", |
648 | | b"emsp13" => "\u{2004}", |
649 | | b"emsp14" => "\u{2005}", |
650 | | b"numsp" => "\u{2007}", |
651 | | b"puncsp" => "\u{2008}", |
652 | | b"thinsp" | b"ThinSpace" => "\u{2009}", |
653 | | b"hairsp" | b"VeryThinSpace" => "\u{200A}", |
654 | | b"ZeroWidthSpace" |
655 | | | b"NegativeVeryThinSpace" |
656 | | | b"NegativeThinSpace" |
657 | | | b"NegativeMediumSpace" |
658 | | | b"NegativeThickSpace" => "\u{200B}", |
659 | | b"zwnj" => "\u{200C}", |
660 | | b"zwj" => "\u{200D}", |
661 | | b"lrm" => "\u{200E}", |
662 | | b"rlm" => "\u{200F}", |
663 | | b"hyphen" | b"dash" => "\u{2010}", |
664 | | b"ndash" => "\u{2013}", |
665 | | b"mdash" => "\u{2014}", |
666 | | b"horbar" => "\u{2015}", |
667 | | b"Verbar" | b"Vert" => "\u{2016}", |
668 | | b"lsquo" | b"OpenCurlyQuote" => "\u{2018}", |
669 | | b"rsquo" | b"rsquor" | b"CloseCurlyQuote" => "\u{2019}", |
670 | | b"lsquor" | b"sbquo" => "\u{201A}", |
671 | | b"ldquo" | b"OpenCurlyDoubleQuote" => "\u{201C}", |
672 | | b"rdquo" | b"rdquor" | b"CloseCurlyDoubleQuote" => "\u{201D}", |
673 | | b"ldquor" | b"bdquo" => "\u{201E}", |
674 | | b"dagger" => "\u{2020}", |
675 | | b"Dagger" | b"ddagger" => "\u{2021}", |
676 | | b"bull" | b"bullet" => "\u{2022}", |
677 | | b"nldr" => "\u{2025}", |
678 | | b"hellip" | b"mldr" => "\u{2026}", |
679 | | b"permil" => "\u{2030}", |
680 | | b"pertenk" => "\u{2031}", |
681 | | b"prime" => "\u{2032}", |
682 | | b"Prime" => "\u{2033}", |
683 | | b"tprime" => "\u{2034}", |
684 | | b"bprime" | b"backprime" => "\u{2035}", |
685 | | b"lsaquo" => "\u{2039}", |
686 | | b"rsaquo" => "\u{203A}", |
687 | | b"oline" => "\u{203E}", |
688 | | b"caret" => "\u{2041}", |
689 | | b"hybull" => "\u{2043}", |
690 | | b"frasl" => "\u{2044}", |
691 | | b"bsemi" => "\u{204F}", |
692 | | b"qprime" => "\u{2057}", |
693 | | b"MediumSpace" => "\u{205F}", |
694 | | b"NoBreak" => "\u{2060}", |
695 | | b"ApplyFunction" | b"af" => "\u{2061}", |
696 | | b"InvisibleTimes" | b"it" => "\u{2062}", |
697 | | b"InvisibleComma" | b"ic" => "\u{2063}", |
698 | | b"euro" => "\u{20AC}", |
699 | | b"tdot" | b"TripleDot" => "\u{20DB}", |
700 | | b"DotDot" => "\u{20DC}", |
701 | | b"Copf" | b"complexes" => "\u{2102}", |
702 | | b"incare" => "\u{2105}", |
703 | | b"gscr" => "\u{210A}", |
704 | | b"hamilt" | b"HilbertSpace" | b"Hscr" => "\u{210B}", |
705 | | b"Hfr" | b"Poincareplane" => "\u{210C}", |
706 | | b"quaternions" | b"Hopf" => "\u{210D}", |
707 | | b"planckh" => "\u{210E}", |
708 | | b"planck" | b"hbar" | b"plankv" | b"hslash" => "\u{210F}", |
709 | | b"Iscr" | b"imagline" => "\u{2110}", |
710 | | b"image" | b"Im" | b"imagpart" | b"Ifr" => "\u{2111}", |
711 | | b"Lscr" | b"lagran" | b"Laplacetrf" => "\u{2112}", |
712 | | b"ell" => "\u{2113}", |
713 | | b"Nopf" | b"naturals" => "\u{2115}", |
714 | | b"numero" => "\u{2116}", |
715 | | b"copysr" => "\u{2117}", |
716 | | b"weierp" | b"wp" => "\u{2118}", |
717 | | b"Popf" | b"primes" => "\u{2119}", |
718 | | b"rationals" | b"Qopf" => "\u{211A}", |
719 | | b"Rscr" | b"realine" => "\u{211B}", |
720 | | b"real" | b"Re" | b"realpart" | b"Rfr" => "\u{211C}", |
721 | | b"reals" | b"Ropf" => "\u{211D}", |
722 | | b"rx" => "\u{211E}", |
723 | | b"trade" | b"TRADE" => "\u{2122}", |
724 | | b"integers" | b"Zopf" => "\u{2124}", |
725 | | b"ohm" => "\u{2126}", |
726 | | b"mho" => "\u{2127}", |
727 | | b"Zfr" | b"zeetrf" => "\u{2128}", |
728 | | b"iiota" => "\u{2129}", |
729 | | b"angst" => "\u{212B}", |
730 | | b"bernou" | b"Bernoullis" | b"Bscr" => "\u{212C}", |
731 | | b"Cfr" | b"Cayleys" => "\u{212D}", |
732 | | b"escr" => "\u{212F}", |
733 | | b"Escr" | b"expectation" => "\u{2130}", |
734 | | b"Fscr" | b"Fouriertrf" => "\u{2131}", |
735 | | b"phmmat" | b"Mellintrf" | b"Mscr" => "\u{2133}", |
736 | | b"order" | b"orderof" | b"oscr" => "\u{2134}", |
737 | | b"alefsym" | b"aleph" => "\u{2135}", |
738 | | b"beth" => "\u{2136}", |
739 | | b"gimel" => "\u{2137}", |
740 | | b"daleth" => "\u{2138}", |
741 | | b"CapitalDifferentialD" | b"DD" => "\u{2145}", |
742 | | b"DifferentialD" | b"dd" => "\u{2146}", |
743 | | b"ExponentialE" | b"exponentiale" | b"ee" => "\u{2147}", |
744 | | b"ImaginaryI" | b"ii" => "\u{2148}", |
745 | | b"frac13" => "\u{2153}", |
746 | | b"frac23" => "\u{2154}", |
747 | | b"frac15" => "\u{2155}", |
748 | | b"frac25" => "\u{2156}", |
749 | | b"frac35" => "\u{2157}", |
750 | | b"frac45" => "\u{2158}", |
751 | | b"frac16" => "\u{2159}", |
752 | | b"frac56" => "\u{215A}", |
753 | | b"frac18" => "\u{215B}", |
754 | | b"frac38" => "\u{215C}", |
755 | | b"frac58" => "\u{215D}", |
756 | | b"frac78" => "\u{215E}", |
757 | | b"larr" | b"leftarrow" | b"LeftArrow" | b"slarr" | b"ShortLeftArrow" => "\u{2190}", |
758 | | b"uarr" | b"uparrow" | b"UpArrow" | b"ShortUpArrow" => "\u{2191}", |
759 | | b"rarr" | b"rightarrow" | b"RightArrow" | b"srarr" | b"ShortRightArrow" => "\u{2192}", |
760 | | b"darr" | b"downarrow" | b"DownArrow" | b"ShortDownArrow" => "\u{2193}", |
761 | | b"harr" | b"leftrightarrow" | b"LeftRightArrow" => "\u{2194}", |
762 | | b"varr" | b"updownarrow" | b"UpDownArrow" => "\u{2195}", |
763 | | b"nwarr" | b"UpperLeftArrow" | b"nwarrow" => "\u{2196}", |
764 | | b"nearr" | b"UpperRightArrow" | b"nearrow" => "\u{2197}", |
765 | | b"searr" | b"searrow" | b"LowerRightArrow" => "\u{2198}", |
766 | | b"swarr" | b"swarrow" | b"LowerLeftArrow" => "\u{2199}", |
767 | | b"nlarr" | b"nleftarrow" => "\u{219A}", |
768 | | b"nrarr" | b"nrightarrow" => "\u{219B}", |
769 | | b"rarrw" | b"rightsquigarrow" => "\u{219D}", |
770 | | b"Larr" | b"twoheadleftarrow" => "\u{219E}", |
771 | | b"Uarr" => "\u{219F}", |
772 | | b"Rarr" | b"twoheadrightarrow" => "\u{21A0}", |
773 | | b"Darr" => "\u{21A1}", |
774 | | b"larrtl" | b"leftarrowtail" => "\u{21A2}", |
775 | | b"rarrtl" | b"rightarrowtail" => "\u{21A3}", |
776 | | b"LeftTeeArrow" | b"mapstoleft" => "\u{21A4}", |
777 | | b"UpTeeArrow" | b"mapstoup" => "\u{21A5}", |
778 | | b"map" | b"RightTeeArrow" | b"mapsto" => "\u{21A6}", |
779 | | b"DownTeeArrow" | b"mapstodown" => "\u{21A7}", |
780 | | b"larrhk" | b"hookleftarrow" => "\u{21A9}", |
781 | | b"rarrhk" | b"hookrightarrow" => "\u{21AA}", |
782 | | b"larrlp" | b"looparrowleft" => "\u{21AB}", |
783 | | b"rarrlp" | b"looparrowright" => "\u{21AC}", |
784 | | b"harrw" | b"leftrightsquigarrow" => "\u{21AD}", |
785 | | b"nharr" | b"nleftrightarrow" => "\u{21AE}", |
786 | | b"lsh" | b"Lsh" => "\u{21B0}", |
787 | | b"rsh" | b"Rsh" => "\u{21B1}", |
788 | | b"ldsh" => "\u{21B2}", |
789 | | b"rdsh" => "\u{21B3}", |
790 | | b"crarr" => "\u{21B5}", |
791 | | b"cularr" | b"curvearrowleft" => "\u{21B6}", |
792 | | b"curarr" | b"curvearrowright" => "\u{21B7}", |
793 | | b"olarr" | b"circlearrowleft" => "\u{21BA}", |
794 | | b"orarr" | b"circlearrowright" => "\u{21BB}", |
795 | | b"lharu" | b"LeftVector" | b"leftharpoonup" => "\u{21BC}", |
796 | | b"lhard" | b"leftharpoondown" | b"DownLeftVector" => "\u{21BD}", |
797 | | b"uharr" | b"upharpoonright" | b"RightUpVector" => "\u{21BE}", |
798 | | b"uharl" | b"upharpoonleft" | b"LeftUpVector" => "\u{21BF}", |
799 | | b"rharu" | b"RightVector" | b"rightharpoonup" => "\u{21C0}", |
800 | | b"rhard" | b"rightharpoondown" | b"DownRightVector" => "\u{21C1}", |
801 | | b"dharr" | b"RightDownVector" | b"downharpoonright" => "\u{21C2}", |
802 | | b"dharl" | b"LeftDownVector" | b"downharpoonleft" => "\u{21C3}", |
803 | | b"rlarr" | b"rightleftarrows" | b"RightArrowLeftArrow" => "\u{21C4}", |
804 | | b"udarr" | b"UpArrowDownArrow" => "\u{21C5}", |
805 | | b"lrarr" | b"leftrightarrows" | b"LeftArrowRightArrow" => "\u{21C6}", |
806 | | b"llarr" | b"leftleftarrows" => "\u{21C7}", |
807 | | b"uuarr" | b"upuparrows" => "\u{21C8}", |
808 | | b"rrarr" | b"rightrightarrows" => "\u{21C9}", |
809 | | b"ddarr" | b"downdownarrows" => "\u{21CA}", |
810 | | b"lrhar" | b"ReverseEquilibrium" | b"leftrightharpoons" => "\u{21CB}", |
811 | | b"rlhar" | b"rightleftharpoons" | b"Equilibrium" => "\u{21CC}", |
812 | | b"nlArr" | b"nLeftarrow" => "\u{21CD}", |
813 | | b"nhArr" | b"nLeftrightarrow" => "\u{21CE}", |
814 | | b"nrArr" | b"nRightarrow" => "\u{21CF}", |
815 | | b"lArr" | b"Leftarrow" | b"DoubleLeftArrow" => "\u{21D0}", |
816 | | b"uArr" | b"Uparrow" | b"DoubleUpArrow" => "\u{21D1}", |
817 | | b"rArr" | b"Rightarrow" | b"Implies" | b"DoubleRightArrow" => "\u{21D2}", |
818 | | b"dArr" | b"Downarrow" | b"DoubleDownArrow" => "\u{21D3}", |
819 | | b"hArr" | b"Leftrightarrow" | b"DoubleLeftRightArrow" | b"iff" => "\u{21D4}", |
820 | | b"vArr" | b"Updownarrow" | b"DoubleUpDownArrow" => "\u{21D5}", |
821 | | b"nwArr" => "\u{21D6}", |
822 | | b"neArr" => "\u{21D7}", |
823 | | b"seArr" => "\u{21D8}", |
824 | | b"swArr" => "\u{21D9}", |
825 | | b"lAarr" | b"Lleftarrow" => "\u{21DA}", |
826 | | b"rAarr" | b"Rrightarrow" => "\u{21DB}", |
827 | | b"zigrarr" => "\u{21DD}", |
828 | | b"larrb" | b"LeftArrowBar" => "\u{21E4}", |
829 | | b"rarrb" | b"RightArrowBar" => "\u{21E5}", |
830 | | b"duarr" | b"DownArrowUpArrow" => "\u{21F5}", |
831 | | b"loarr" => "\u{21FD}", |
832 | | b"roarr" => "\u{21FE}", |
833 | | b"hoarr" => "\u{21FF}", |
834 | | b"forall" | b"ForAll" => "\u{2200}", |
835 | | b"comp" | b"complement" => "\u{2201}", |
836 | | b"part" | b"PartialD" => "\u{2202}", |
837 | | b"exist" | b"Exists" => "\u{2203}", |
838 | | b"nexist" | b"NotExists" | b"nexists" => "\u{2204}", |
839 | | b"empty" | b"emptyset" | b"emptyv" | b"varnothing" => "\u{2205}", |
840 | | b"nabla" | b"Del" => "\u{2207}", |
841 | | b"isin" | b"isinv" | b"Element" | b"in" => "\u{2208}", |
842 | | b"notin" | b"NotElement" | b"notinva" => "\u{2209}", |
843 | | b"niv" | b"ReverseElement" | b"ni" | b"SuchThat" => "\u{220B}", |
844 | | b"notni" | b"notniva" | b"NotReverseElement" => "\u{220C}", |
845 | | b"prod" | b"Product" => "\u{220F}", |
846 | | b"coprod" | b"Coproduct" => "\u{2210}", |
847 | | b"sum" | b"Sum" => "\u{2211}", |
848 | | b"minus" => "\u{2212}", |
849 | | b"mnplus" | b"mp" | b"MinusPlus" => "\u{2213}", |
850 | | b"plusdo" | b"dotplus" => "\u{2214}", |
851 | | b"setmn" | b"setminus" | b"Backslash" | b"ssetmn" | b"smallsetminus" => "\u{2216}", |
852 | | b"lowast" => "\u{2217}", |
853 | | b"compfn" | b"SmallCircle" => "\u{2218}", |
854 | | b"radic" | b"Sqrt" => "\u{221A}", |
855 | | b"prop" | b"propto" | b"Proportional" | b"vprop" | b"varpropto" => "\u{221D}", |
856 | | b"infin" => "\u{221E}", |
857 | | b"angrt" => "\u{221F}", |
858 | | b"ang" | b"angle" => "\u{2220}", |
859 | | b"angmsd" | b"measuredangle" => "\u{2221}", |
860 | | b"angsph" => "\u{2222}", |
861 | | b"mid" | b"VerticalBar" | b"smid" | b"shortmid" => "\u{2223}", |
862 | | b"nmid" | b"NotVerticalBar" | b"nsmid" | b"nshortmid" => "\u{2224}", |
863 | | b"par" | b"parallel" | b"DoubleVerticalBar" | b"spar" | b"shortparallel" => "\u{2225}", |
864 | | b"npar" | b"nparallel" | b"NotDoubleVerticalBar" | b"nspar" | b"nshortparallel" => { |
865 | | "\u{2226}" |
866 | | } |
867 | | b"and" | b"wedge" => "\u{2227}", |
868 | | b"or" | b"vee" => "\u{2228}", |
869 | | b"cap" => "\u{2229}", |
870 | | b"cup" => "\u{222A}", |
871 | | b"int" | b"Integral" => "\u{222B}", |
872 | | b"Int" => "\u{222C}", |
873 | | b"tint" | b"iiint" => "\u{222D}", |
874 | | b"conint" | b"oint" | b"ContourIntegral" => "\u{222E}", |
875 | | b"Conint" | b"DoubleContourIntegral" => "\u{222F}", |
876 | | b"Cconint" => "\u{2230}", |
877 | | b"cwint" => "\u{2231}", |
878 | | b"cwconint" | b"ClockwiseContourIntegral" => "\u{2232}", |
879 | | b"awconint" | b"CounterClockwiseContourIntegral" => "\u{2233}", |
880 | | b"there4" | b"therefore" | b"Therefore" => "\u{2234}", |
881 | | b"becaus" | b"because" | b"Because" => "\u{2235}", |
882 | | b"ratio" => "\u{2236}", |
883 | | b"Colon" | b"Proportion" => "\u{2237}", |
884 | | b"minusd" | b"dotminus" => "\u{2238}", |
885 | | b"mDDot" => "\u{223A}", |
886 | | b"homtht" => "\u{223B}", |
887 | | b"sim" | b"Tilde" | b"thksim" | b"thicksim" => "\u{223C}", |
888 | | b"bsim" | b"backsim" => "\u{223D}", |
889 | | b"ac" | b"mstpos" => "\u{223E}", |
890 | | b"acd" => "\u{223F}", |
891 | | b"wreath" | b"VerticalTilde" | b"wr" => "\u{2240}", |
892 | | b"nsim" | b"NotTilde" => "\u{2241}", |
893 | | b"esim" | b"EqualTilde" | b"eqsim" => "\u{2242}", |
894 | | b"sime" | b"TildeEqual" | b"simeq" => "\u{2243}", |
895 | | b"nsime" | b"nsimeq" | b"NotTildeEqual" => "\u{2244}", |
896 | | b"cong" | b"TildeFullEqual" => "\u{2245}", |
897 | | b"simne" => "\u{2246}", |
898 | | b"ncong" | b"NotTildeFullEqual" => "\u{2247}", |
899 | | b"asymp" | b"ap" | b"TildeTilde" | b"approx" | b"thkap" | b"thickapprox" => "\u{2248}", |
900 | | b"nap" | b"NotTildeTilde" | b"napprox" => "\u{2249}", |
901 | | b"ape" | b"approxeq" => "\u{224A}", |
902 | | b"apid" => "\u{224B}", |
903 | | b"bcong" | b"backcong" => "\u{224C}", |
904 | | b"asympeq" | b"CupCap" => "\u{224D}", |
905 | | b"bump" | b"HumpDownHump" | b"Bumpeq" => "\u{224E}", |
906 | | b"bumpe" | b"HumpEqual" | b"bumpeq" => "\u{224F}", |
907 | | b"esdot" | b"DotEqual" | b"doteq" => "\u{2250}", |
908 | | b"eDot" | b"doteqdot" => "\u{2251}", |
909 | | b"efDot" | b"fallingdotseq" => "\u{2252}", |
910 | | b"erDot" | b"risingdotseq" => "\u{2253}", |
911 | | b"colone" | b"coloneq" | b"Assign" => "\u{2254}", |
912 | | b"ecolon" | b"eqcolon" => "\u{2255}", |
913 | | b"ecir" | b"eqcirc" => "\u{2256}", |
914 | | b"cire" | b"circeq" => "\u{2257}", |
915 | | b"wedgeq" => "\u{2259}", |
916 | | b"veeeq" => "\u{225A}", |
917 | | b"trie" | b"triangleq" => "\u{225C}", |
918 | | b"equest" | b"questeq" => "\u{225F}", |
919 | | b"ne" | b"NotEqual" => "\u{2260}", |
920 | | b"equiv" | b"Congruent" => "\u{2261}", |
921 | | b"nequiv" | b"NotCongruent" => "\u{2262}", |
922 | | b"le" | b"leq" => "\u{2264}", |
923 | | b"ge" | b"GreaterEqual" | b"geq" => "\u{2265}", |
924 | | b"lE" | b"LessFullEqual" | b"leqq" => "\u{2266}", |
925 | | b"gE" | b"GreaterFullEqual" | b"geqq" => "\u{2267}", |
926 | | b"lnE" | b"lneqq" => "\u{2268}", |
927 | | b"gnE" | b"gneqq" => "\u{2269}", |
928 | | b"Lt" | b"NestedLessLess" | b"ll" => "\u{226A}", |
929 | | b"Gt" | b"NestedGreaterGreater" | b"gg" => "\u{226B}", |
930 | | b"twixt" | b"between" => "\u{226C}", |
931 | | b"NotCupCap" => "\u{226D}", |
932 | | b"nlt" | b"NotLess" | b"nless" => "\u{226E}", |
933 | | b"ngt" | b"NotGreater" | b"ngtr" => "\u{226F}", |
934 | | b"nle" | b"NotLessEqual" | b"nleq" => "\u{2270}", |
935 | | b"nge" | b"NotGreaterEqual" | b"ngeq" => "\u{2271}", |
936 | | b"lsim" | b"LessTilde" | b"lesssim" => "\u{2272}", |
937 | | b"gsim" | b"gtrsim" | b"GreaterTilde" => "\u{2273}", |
938 | | b"nlsim" | b"NotLessTilde" => "\u{2274}", |
939 | | b"ngsim" | b"NotGreaterTilde" => "\u{2275}", |
940 | | b"lg" | b"lessgtr" | b"LessGreater" => "\u{2276}", |
941 | | b"gl" | b"gtrless" | b"GreaterLess" => "\u{2277}", |
942 | | b"ntlg" | b"NotLessGreater" => "\u{2278}", |
943 | | b"ntgl" | b"NotGreaterLess" => "\u{2279}", |
944 | | b"pr" | b"Precedes" | b"prec" => "\u{227A}", |
945 | | b"sc" | b"Succeeds" | b"succ" => "\u{227B}", |
946 | | b"prcue" | b"PrecedesSlantEqual" | b"preccurlyeq" => "\u{227C}", |
947 | | b"sccue" | b"SucceedsSlantEqual" | b"succcurlyeq" => "\u{227D}", |
948 | | b"prsim" | b"precsim" | b"PrecedesTilde" => "\u{227E}", |
949 | | b"scsim" | b"succsim" | b"SucceedsTilde" => "\u{227F}", |
950 | | b"npr" | b"nprec" | b"NotPrecedes" => "\u{2280}", |
951 | | b"nsc" | b"nsucc" | b"NotSucceeds" => "\u{2281}", |
952 | | b"sub" | b"subset" => "\u{2282}", |
953 | | b"sup" | b"supset" | b"Superset" => "\u{2283}", |
954 | | b"nsub" => "\u{2284}", |
955 | | b"nsup" => "\u{2285}", |
956 | | b"sube" | b"SubsetEqual" | b"subseteq" => "\u{2286}", |
957 | | b"supe" | b"supseteq" | b"SupersetEqual" => "\u{2287}", |
958 | | b"nsube" | b"nsubseteq" | b"NotSubsetEqual" => "\u{2288}", |
959 | | b"nsupe" | b"nsupseteq" | b"NotSupersetEqual" => "\u{2289}", |
960 | | b"subne" | b"subsetneq" => "\u{228A}", |
961 | | b"supne" | b"supsetneq" => "\u{228B}", |
962 | | b"cupdot" => "\u{228D}", |
963 | | b"uplus" | b"UnionPlus" => "\u{228E}", |
964 | | b"sqsub" | b"SquareSubset" | b"sqsubset" => "\u{228F}", |
965 | | b"sqsup" | b"SquareSuperset" | b"sqsupset" => "\u{2290}", |
966 | | b"sqsube" | b"SquareSubsetEqual" | b"sqsubseteq" => "\u{2291}", |
967 | | b"sqsupe" | b"SquareSupersetEqual" | b"sqsupseteq" => "\u{2292}", |
968 | | b"sqcap" | b"SquareIntersection" => "\u{2293}", |
969 | | b"sqcup" | b"SquareUnion" => "\u{2294}", |
970 | | b"oplus" | b"CirclePlus" => "\u{2295}", |
971 | | b"ominus" | b"CircleMinus" => "\u{2296}", |
972 | | b"otimes" | b"CircleTimes" => "\u{2297}", |
973 | | b"osol" => "\u{2298}", |
974 | | b"odot" | b"CircleDot" => "\u{2299}", |
975 | | b"ocir" | b"circledcirc" => "\u{229A}", |
976 | | b"oast" | b"circledast" => "\u{229B}", |
977 | | b"odash" | b"circleddash" => "\u{229D}", |
978 | | b"plusb" | b"boxplus" => "\u{229E}", |
979 | | b"minusb" | b"boxminus" => "\u{229F}", |
980 | | b"timesb" | b"boxtimes" => "\u{22A0}", |
981 | | b"sdotb" | b"dotsquare" => "\u{22A1}", |
982 | | b"vdash" | b"RightTee" => "\u{22A2}", |
983 | | b"dashv" | b"LeftTee" => "\u{22A3}", |
984 | | b"top" | b"DownTee" => "\u{22A4}", |
985 | | b"bottom" | b"bot" | b"perp" | b"UpTee" => "\u{22A5}", |
986 | | b"models" => "\u{22A7}", |
987 | | b"vDash" | b"DoubleRightTee" => "\u{22A8}", |
988 | | b"Vdash" => "\u{22A9}", |
989 | | b"Vvdash" => "\u{22AA}", |
990 | | b"VDash" => "\u{22AB}", |
991 | | b"nvdash" => "\u{22AC}", |
992 | | b"nvDash" => "\u{22AD}", |
993 | | b"nVdash" => "\u{22AE}", |
994 | | b"nVDash" => "\u{22AF}", |
995 | | b"prurel" => "\u{22B0}", |
996 | | b"vltri" | b"vartriangleleft" | b"LeftTriangle" => "\u{22B2}", |
997 | | b"vrtri" | b"vartriangleright" | b"RightTriangle" => "\u{22B3}", |
998 | | b"ltrie" | b"trianglelefteq" | b"LeftTriangleEqual" => "\u{22B4}", |
999 | | b"rtrie" | b"trianglerighteq" | b"RightTriangleEqual" => "\u{22B5}", |
1000 | | b"origof" => "\u{22B6}", |
1001 | | b"imof" => "\u{22B7}", |
1002 | | b"mumap" | b"multimap" => "\u{22B8}", |
1003 | | b"hercon" => "\u{22B9}", |
1004 | | b"intcal" | b"intercal" => "\u{22BA}", |
1005 | | b"veebar" => "\u{22BB}", |
1006 | | b"barvee" => "\u{22BD}", |
1007 | | b"angrtvb" => "\u{22BE}", |
1008 | | b"lrtri" => "\u{22BF}", |
1009 | | b"xwedge" | b"Wedge" | b"bigwedge" => "\u{22C0}", |
1010 | | b"xvee" | b"Vee" | b"bigvee" => "\u{22C1}", |
1011 | | b"xcap" | b"Intersection" | b"bigcap" => "\u{22C2}", |
1012 | | b"xcup" | b"Union" | b"bigcup" => "\u{22C3}", |
1013 | | b"diam" | b"diamond" | b"Diamond" => "\u{22C4}", |
1014 | | b"sdot" => "\u{22C5}", |
1015 | | b"sstarf" | b"Star" => "\u{22C6}", |
1016 | | b"divonx" | b"divideontimes" => "\u{22C7}", |
1017 | | b"bowtie" => "\u{22C8}", |
1018 | | b"ltimes" => "\u{22C9}", |
1019 | | b"rtimes" => "\u{22CA}", |
1020 | | b"lthree" | b"leftthreetimes" => "\u{22CB}", |
1021 | | b"rthree" | b"rightthreetimes" => "\u{22CC}", |
1022 | | b"bsime" | b"backsimeq" => "\u{22CD}", |
1023 | | b"cuvee" | b"curlyvee" => "\u{22CE}", |
1024 | | b"cuwed" | b"curlywedge" => "\u{22CF}", |
1025 | | b"Sub" | b"Subset" => "\u{22D0}", |
1026 | | b"Sup" | b"Supset" => "\u{22D1}", |
1027 | | b"Cap" => "\u{22D2}", |
1028 | | b"Cup" => "\u{22D3}", |
1029 | | b"fork" | b"pitchfork" => "\u{22D4}", |
1030 | | b"epar" => "\u{22D5}", |
1031 | | b"ltdot" | b"lessdot" => "\u{22D6}", |
1032 | | b"gtdot" | b"gtrdot" => "\u{22D7}", |
1033 | | b"Ll" => "\u{22D8}", |
1034 | | b"Gg" | b"ggg" => "\u{22D9}", |
1035 | | b"leg" | b"LessEqualGreater" | b"lesseqgtr" => "\u{22DA}", |
1036 | | b"gel" | b"gtreqless" | b"GreaterEqualLess" => "\u{22DB}", |
1037 | | b"cuepr" | b"curlyeqprec" => "\u{22DE}", |
1038 | | b"cuesc" | b"curlyeqsucc" => "\u{22DF}", |
1039 | | b"nprcue" | b"NotPrecedesSlantEqual" => "\u{22E0}", |
1040 | | b"nsccue" | b"NotSucceedsSlantEqual" => "\u{22E1}", |
1041 | | b"nsqsube" | b"NotSquareSubsetEqual" => "\u{22E2}", |
1042 | | b"nsqsupe" | b"NotSquareSupersetEqual" => "\u{22E3}", |
1043 | | b"lnsim" => "\u{22E6}", |
1044 | | b"gnsim" => "\u{22E7}", |
1045 | | b"prnsim" | b"precnsim" => "\u{22E8}", |
1046 | | b"scnsim" | b"succnsim" => "\u{22E9}", |
1047 | | b"nltri" | b"ntriangleleft" | b"NotLeftTriangle" => "\u{22EA}", |
1048 | | b"nrtri" | b"ntriangleright" | b"NotRightTriangle" => "\u{22EB}", |
1049 | | b"nltrie" | b"ntrianglelefteq" | b"NotLeftTriangleEqual" => "\u{22EC}", |
1050 | | b"nrtrie" | b"ntrianglerighteq" | b"NotRightTriangleEqual" => "\u{22ED}", |
1051 | | b"vellip" => "\u{22EE}", |
1052 | | b"ctdot" => "\u{22EF}", |
1053 | | b"utdot" => "\u{22F0}", |
1054 | | b"dtdot" => "\u{22F1}", |
1055 | | b"disin" => "\u{22F2}", |
1056 | | b"isinsv" => "\u{22F3}", |
1057 | | b"isins" => "\u{22F4}", |
1058 | | b"isindot" => "\u{22F5}", |
1059 | | b"notinvc" => "\u{22F6}", |
1060 | | b"notinvb" => "\u{22F7}", |
1061 | | b"isinE" => "\u{22F9}", |
1062 | | b"nisd" => "\u{22FA}", |
1063 | | b"xnis" => "\u{22FB}", |
1064 | | b"nis" => "\u{22FC}", |
1065 | | b"notnivc" => "\u{22FD}", |
1066 | | b"notnivb" => "\u{22FE}", |
1067 | | b"barwed" | b"barwedge" => "\u{2305}", |
1068 | | b"Barwed" | b"doublebarwedge" => "\u{2306}", |
1069 | | b"lceil" | b"LeftCeiling" => "\u{2308}", |
1070 | | b"rceil" | b"RightCeiling" => "\u{2309}", |
1071 | | b"lfloor" | b"LeftFloor" => "\u{230A}", |
1072 | | b"rfloor" | b"RightFloor" => "\u{230B}", |
1073 | | b"drcrop" => "\u{230C}", |
1074 | | b"dlcrop" => "\u{230D}", |
1075 | | b"urcrop" => "\u{230E}", |
1076 | | b"ulcrop" => "\u{230F}", |
1077 | | b"bnot" => "\u{2310}", |
1078 | | b"profline" => "\u{2312}", |
1079 | | b"profsurf" => "\u{2313}", |
1080 | | b"telrec" => "\u{2315}", |
1081 | | b"target" => "\u{2316}", |
1082 | | b"ulcorn" | b"ulcorner" => "\u{231C}", |
1083 | | b"urcorn" | b"urcorner" => "\u{231D}", |
1084 | | b"dlcorn" | b"llcorner" => "\u{231E}", |
1085 | | b"drcorn" | b"lrcorner" => "\u{231F}", |
1086 | | b"frown" | b"sfrown" => "\u{2322}", |
1087 | | b"smile" | b"ssmile" => "\u{2323}", |
1088 | | b"cylcty" => "\u{232D}", |
1089 | | b"profalar" => "\u{232E}", |
1090 | | b"topbot" => "\u{2336}", |
1091 | | b"ovbar" => "\u{233D}", |
1092 | | b"solbar" => "\u{233F}", |
1093 | | b"angzarr" => "\u{237C}", |
1094 | | b"lmoust" | b"lmoustache" => "\u{23B0}", |
1095 | | b"rmoust" | b"rmoustache" => "\u{23B1}", |
1096 | | b"tbrk" | b"OverBracket" => "\u{23B4}", |
1097 | | b"bbrk" | b"UnderBracket" => "\u{23B5}", |
1098 | | b"bbrktbrk" => "\u{23B6}", |
1099 | | b"OverParenthesis" => "\u{23DC}", |
1100 | | b"UnderParenthesis" => "\u{23DD}", |
1101 | | b"OverBrace" => "\u{23DE}", |
1102 | | b"UnderBrace" => "\u{23DF}", |
1103 | | b"trpezium" => "\u{23E2}", |
1104 | | b"elinters" => "\u{23E7}", |
1105 | | b"blank" => "\u{2423}", |
1106 | | b"oS" | b"circledS" => "\u{24C8}", |
1107 | | b"boxh" | b"HorizontalLine" => "\u{2500}", |
1108 | | b"boxv" => "\u{2502}", |
1109 | | b"boxdr" => "\u{250C}", |
1110 | | b"boxdl" => "\u{2510}", |
1111 | | b"boxur" => "\u{2514}", |
1112 | | b"boxul" => "\u{2518}", |
1113 | | b"boxvr" => "\u{251C}", |
1114 | | b"boxvl" => "\u{2524}", |
1115 | | b"boxhd" => "\u{252C}", |
1116 | | b"boxhu" => "\u{2534}", |
1117 | | b"boxvh" => "\u{253C}", |
1118 | | b"boxH" => "\u{2550}", |
1119 | | b"boxV" => "\u{2551}", |
1120 | | b"boxdR" => "\u{2552}", |
1121 | | b"boxDr" => "\u{2553}", |
1122 | | b"boxDR" => "\u{2554}", |
1123 | | b"boxdL" => "\u{2555}", |
1124 | | b"boxDl" => "\u{2556}", |
1125 | | b"boxDL" => "\u{2557}", |
1126 | | b"boxuR" => "\u{2558}", |
1127 | | b"boxUr" => "\u{2559}", |
1128 | | b"boxUR" => "\u{255A}", |
1129 | | b"boxuL" => "\u{255B}", |
1130 | | b"boxUl" => "\u{255C}", |
1131 | | b"boxUL" => "\u{255D}", |
1132 | | b"boxvR" => "\u{255E}", |
1133 | | b"boxVr" => "\u{255F}", |
1134 | | b"boxVR" => "\u{2560}", |
1135 | | b"boxvL" => "\u{2561}", |
1136 | | b"boxVl" => "\u{2562}", |
1137 | | b"boxVL" => "\u{2563}", |
1138 | | b"boxHd" => "\u{2564}", |
1139 | | b"boxhD" => "\u{2565}", |
1140 | | b"boxHD" => "\u{2566}", |
1141 | | b"boxHu" => "\u{2567}", |
1142 | | b"boxhU" => "\u{2568}", |
1143 | | b"boxHU" => "\u{2569}", |
1144 | | b"boxvH" => "\u{256A}", |
1145 | | b"boxVh" => "\u{256B}", |
1146 | | b"boxVH" => "\u{256C}", |
1147 | | b"uhblk" => "\u{2580}", |
1148 | | b"lhblk" => "\u{2584}", |
1149 | | b"block" => "\u{2588}", |
1150 | | b"blk14" => "\u{2591}", |
1151 | | b"blk12" => "\u{2592}", |
1152 | | b"blk34" => "\u{2593}", |
1153 | | b"squ" | b"square" | b"Square" => "\u{25A1}", |
1154 | | b"squf" | b"squarf" | b"blacksquare" | b"FilledVerySmallSquare" => "\u{25AA}", |
1155 | | b"EmptyVerySmallSquare" => "\u{25AB}", |
1156 | | b"rect" => "\u{25AD}", |
1157 | | b"marker" => "\u{25AE}", |
1158 | | b"fltns" => "\u{25B1}", |
1159 | | b"xutri" | b"bigtriangleup" => "\u{25B3}", |
1160 | | b"utrif" | b"blacktriangle" => "\u{25B4}", |
1161 | | b"utri" | b"triangle" => "\u{25B5}", |
1162 | | b"rtrif" | b"blacktriangleright" => "\u{25B8}", |
1163 | | b"rtri" | b"triangleright" => "\u{25B9}", |
1164 | | b"xdtri" | b"bigtriangledown" => "\u{25BD}", |
1165 | | b"dtrif" | b"blacktriangledown" => "\u{25BE}", |
1166 | | b"dtri" | b"triangledown" => "\u{25BF}", |
1167 | | b"ltrif" | b"blacktriangleleft" => "\u{25C2}", |
1168 | | b"ltri" | b"triangleleft" => "\u{25C3}", |
1169 | | b"loz" | b"lozenge" => "\u{25CA}", |
1170 | | b"cir" => "\u{25CB}", |
1171 | | b"tridot" => "\u{25EC}", |
1172 | | b"xcirc" | b"bigcirc" => "\u{25EF}", |
1173 | | b"ultri" => "\u{25F8}", |
1174 | | b"urtri" => "\u{25F9}", |
1175 | | b"lltri" => "\u{25FA}", |
1176 | | b"EmptySmallSquare" => "\u{25FB}", |
1177 | | b"FilledSmallSquare" => "\u{25FC}", |
1178 | | b"starf" | b"bigstar" => "\u{2605}", |
1179 | | b"star" => "\u{2606}", |
1180 | | b"phone" => "\u{260E}", |
1181 | | b"female" => "\u{2640}", |
1182 | | b"male" => "\u{2642}", |
1183 | | b"spades" | b"spadesuit" => "\u{2660}", |
1184 | | b"clubs" | b"clubsuit" => "\u{2663}", |
1185 | | b"hearts" | b"heartsuit" => "\u{2665}", |
1186 | | b"diams" | b"diamondsuit" => "\u{2666}", |
1187 | | b"sung" => "\u{266A}", |
1188 | | b"flat" => "\u{266D}", |
1189 | | b"natur" | b"natural" => "\u{266E}", |
1190 | | b"sharp" => "\u{266F}", |
1191 | | b"check" | b"checkmark" => "\u{2713}", |
1192 | | b"cross" => "\u{2717}", |
1193 | | b"malt" | b"maltese" => "\u{2720}", |
1194 | | b"sext" => "\u{2736}", |
1195 | | b"VerticalSeparator" => "\u{2758}", |
1196 | | b"lbbrk" => "\u{2772}", |
1197 | | b"rbbrk" => "\u{2773}", |
1198 | | b"lobrk" | b"LeftDoubleBracket" => "\u{27E6}", |
1199 | | b"robrk" | b"RightDoubleBracket" => "\u{27E7}", |
1200 | | b"lang" | b"LeftAngleBracket" | b"langle" => "\u{27E8}", |
1201 | | b"rang" | b"RightAngleBracket" | b"rangle" => "\u{27E9}", |
1202 | | b"Lang" => "\u{27EA}", |
1203 | | b"Rang" => "\u{27EB}", |
1204 | | b"loang" => "\u{27EC}", |
1205 | | b"roang" => "\u{27ED}", |
1206 | | b"xlarr" | b"longleftarrow" | b"LongLeftArrow" => "\u{27F5}", |
1207 | | b"xrarr" | b"longrightarrow" | b"LongRightArrow" => "\u{27F6}", |
1208 | | b"xharr" | b"longleftrightarrow" | b"LongLeftRightArrow" => "\u{27F7}", |
1209 | | b"xlArr" | b"Longleftarrow" | b"DoubleLongLeftArrow" => "\u{27F8}", |
1210 | | b"xrArr" | b"Longrightarrow" | b"DoubleLongRightArrow" => "\u{27F9}", |
1211 | | b"xhArr" | b"Longleftrightarrow" | b"DoubleLongLeftRightArrow" => "\u{27FA}", |
1212 | | b"xmap" | b"longmapsto" => "\u{27FC}", |
1213 | | b"dzigrarr" => "\u{27FF}", |
1214 | | b"nvlArr" => "\u{2902}", |
1215 | | b"nvrArr" => "\u{2903}", |
1216 | | b"nvHarr" => "\u{2904}", |
1217 | | b"Map" => "\u{2905}", |
1218 | | b"lbarr" => "\u{290C}", |
1219 | | b"rbarr" | b"bkarow" => "\u{290D}", |
1220 | | b"lBarr" => "\u{290E}", |
1221 | | b"rBarr" | b"dbkarow" => "\u{290F}", |
1222 | | b"RBarr" | b"drbkarow" => "\u{2910}", |
1223 | | b"DDotrahd" => "\u{2911}", |
1224 | | b"UpArrowBar" => "\u{2912}", |
1225 | | b"DownArrowBar" => "\u{2913}", |
1226 | | b"Rarrtl" => "\u{2916}", |
1227 | | b"latail" => "\u{2919}", |
1228 | | b"ratail" => "\u{291A}", |
1229 | | b"lAtail" => "\u{291B}", |
1230 | | b"rAtail" => "\u{291C}", |
1231 | | b"larrfs" => "\u{291D}", |
1232 | | b"rarrfs" => "\u{291E}", |
1233 | | b"larrbfs" => "\u{291F}", |
1234 | | b"rarrbfs" => "\u{2920}", |
1235 | | b"nwarhk" => "\u{2923}", |
1236 | | b"nearhk" => "\u{2924}", |
1237 | | b"searhk" | b"hksearow" => "\u{2925}", |
1238 | | b"swarhk" | b"hkswarow" => "\u{2926}", |
1239 | | b"nwnear" => "\u{2927}", |
1240 | | b"nesear" | b"toea" => "\u{2928}", |
1241 | | b"seswar" | b"tosa" => "\u{2929}", |
1242 | | b"swnwar" => "\u{292A}", |
1243 | | b"rarrc" => "\u{2933}", |
1244 | | b"cudarrr" => "\u{2935}", |
1245 | | b"ldca" => "\u{2936}", |
1246 | | b"rdca" => "\u{2937}", |
1247 | | b"cudarrl" => "\u{2938}", |
1248 | | b"larrpl" => "\u{2939}", |
1249 | | b"curarrm" => "\u{293C}", |
1250 | | b"cularrp" => "\u{293D}", |
1251 | | b"rarrpl" => "\u{2945}", |
1252 | | b"harrcir" => "\u{2948}", |
1253 | | b"Uarrocir" => "\u{2949}", |
1254 | | b"lurdshar" => "\u{294A}", |
1255 | | b"ldrushar" => "\u{294B}", |
1256 | | b"LeftRightVector" => "\u{294E}", |
1257 | | b"RightUpDownVector" => "\u{294F}", |
1258 | | b"DownLeftRightVector" => "\u{2950}", |
1259 | | b"LeftUpDownVector" => "\u{2951}", |
1260 | | b"LeftVectorBar" => "\u{2952}", |
1261 | | b"RightVectorBar" => "\u{2953}", |
1262 | | b"RightUpVectorBar" => "\u{2954}", |
1263 | | b"RightDownVectorBar" => "\u{2955}", |
1264 | | b"DownLeftVectorBar" => "\u{2956}", |
1265 | | b"DownRightVectorBar" => "\u{2957}", |
1266 | | b"LeftUpVectorBar" => "\u{2958}", |
1267 | | b"LeftDownVectorBar" => "\u{2959}", |
1268 | | b"LeftTeeVector" => "\u{295A}", |
1269 | | b"RightTeeVector" => "\u{295B}", |
1270 | | b"RightUpTeeVector" => "\u{295C}", |
1271 | | b"RightDownTeeVector" => "\u{295D}", |
1272 | | b"DownLeftTeeVector" => "\u{295E}", |
1273 | | b"DownRightTeeVector" => "\u{295F}", |
1274 | | b"LeftUpTeeVector" => "\u{2960}", |
1275 | | b"LeftDownTeeVector" => "\u{2961}", |
1276 | | b"lHar" => "\u{2962}", |
1277 | | b"uHar" => "\u{2963}", |
1278 | | b"rHar" => "\u{2964}", |
1279 | | b"dHar" => "\u{2965}", |
1280 | | b"luruhar" => "\u{2966}", |
1281 | | b"ldrdhar" => "\u{2967}", |
1282 | | b"ruluhar" => "\u{2968}", |
1283 | | b"rdldhar" => "\u{2969}", |
1284 | | b"lharul" => "\u{296A}", |
1285 | | b"llhard" => "\u{296B}", |
1286 | | b"rharul" => "\u{296C}", |
1287 | | b"lrhard" => "\u{296D}", |
1288 | | b"udhar" | b"UpEquilibrium" => "\u{296E}", |
1289 | | b"duhar" | b"ReverseUpEquilibrium" => "\u{296F}", |
1290 | | b"RoundImplies" => "\u{2970}", |
1291 | | b"erarr" => "\u{2971}", |
1292 | | b"simrarr" => "\u{2972}", |
1293 | | b"larrsim" => "\u{2973}", |
1294 | | b"rarrsim" => "\u{2974}", |
1295 | | b"rarrap" => "\u{2975}", |
1296 | | b"ltlarr" => "\u{2976}", |
1297 | | b"gtrarr" => "\u{2978}", |
1298 | | b"subrarr" => "\u{2979}", |
1299 | | b"suplarr" => "\u{297B}", |
1300 | | b"lfisht" => "\u{297C}", |
1301 | | b"rfisht" => "\u{297D}", |
1302 | | b"ufisht" => "\u{297E}", |
1303 | | b"dfisht" => "\u{297F}", |
1304 | | b"lopar" => "\u{2985}", |
1305 | | b"ropar" => "\u{2986}", |
1306 | | b"lbrke" => "\u{298B}", |
1307 | | b"rbrke" => "\u{298C}", |
1308 | | b"lbrkslu" => "\u{298D}", |
1309 | | b"rbrksld" => "\u{298E}", |
1310 | | b"lbrksld" => "\u{298F}", |
1311 | | b"rbrkslu" => "\u{2990}", |
1312 | | b"langd" => "\u{2991}", |
1313 | | b"rangd" => "\u{2992}", |
1314 | | b"lparlt" => "\u{2993}", |
1315 | | b"rpargt" => "\u{2994}", |
1316 | | b"gtlPar" => "\u{2995}", |
1317 | | b"ltrPar" => "\u{2996}", |
1318 | | b"vzigzag" => "\u{299A}", |
1319 | | b"vangrt" => "\u{299C}", |
1320 | | b"angrtvbd" => "\u{299D}", |
1321 | | b"ange" => "\u{29A4}", |
1322 | | b"range" => "\u{29A5}", |
1323 | | b"dwangle" => "\u{29A6}", |
1324 | | b"uwangle" => "\u{29A7}", |
1325 | | b"angmsdaa" => "\u{29A8}", |
1326 | | b"angmsdab" => "\u{29A9}", |
1327 | | b"angmsdac" => "\u{29AA}", |
1328 | | b"angmsdad" => "\u{29AB}", |
1329 | | b"angmsdae" => "\u{29AC}", |
1330 | | b"angmsdaf" => "\u{29AD}", |
1331 | | b"angmsdag" => "\u{29AE}", |
1332 | | b"angmsdah" => "\u{29AF}", |
1333 | | b"bemptyv" => "\u{29B0}", |
1334 | | b"demptyv" => "\u{29B1}", |
1335 | | b"cemptyv" => "\u{29B2}", |
1336 | | b"raemptyv" => "\u{29B3}", |
1337 | | b"laemptyv" => "\u{29B4}", |
1338 | | b"ohbar" => "\u{29B5}", |
1339 | | b"omid" => "\u{29B6}", |
1340 | | b"opar" => "\u{29B7}", |
1341 | | b"operp" => "\u{29B9}", |
1342 | | b"olcross" => "\u{29BB}", |
1343 | | b"odsold" => "\u{29BC}", |
1344 | | b"olcir" => "\u{29BE}", |
1345 | | b"ofcir" => "\u{29BF}", |
1346 | | b"olt" => "\u{29C0}", |
1347 | | b"ogt" => "\u{29C1}", |
1348 | | b"cirscir" => "\u{29C2}", |
1349 | | b"cirE" => "\u{29C3}", |
1350 | | b"solb" => "\u{29C4}", |
1351 | | b"bsolb" => "\u{29C5}", |
1352 | | b"boxbox" => "\u{29C9}", |
1353 | | b"trisb" => "\u{29CD}", |
1354 | | b"rtriltri" => "\u{29CE}", |
1355 | | b"LeftTriangleBar" => "\u{29CF}", |
1356 | | b"RightTriangleBar" => "\u{29D0}", |
1357 | | b"race" => "\u{29DA}", |
1358 | | b"iinfin" => "\u{29DC}", |
1359 | | b"infintie" => "\u{29DD}", |
1360 | | b"nvinfin" => "\u{29DE}", |
1361 | | b"eparsl" => "\u{29E3}", |
1362 | | b"smeparsl" => "\u{29E4}", |
1363 | | b"eqvparsl" => "\u{29E5}", |
1364 | | b"lozf" | b"blacklozenge" => "\u{29EB}", |
1365 | | b"RuleDelayed" => "\u{29F4}", |
1366 | | b"dsol" => "\u{29F6}", |
1367 | | b"xodot" | b"bigodot" => "\u{2A00}", |
1368 | | b"xoplus" | b"bigoplus" => "\u{2A01}", |
1369 | | b"xotime" | b"bigotimes" => "\u{2A02}", |
1370 | | b"xuplus" | b"biguplus" => "\u{2A04}", |
1371 | | b"xsqcup" | b"bigsqcup" => "\u{2A06}", |
1372 | | b"qint" | b"iiiint" => "\u{2A0C}", |
1373 | | b"fpartint" => "\u{2A0D}", |
1374 | | b"cirfnint" => "\u{2A10}", |
1375 | | b"awint" => "\u{2A11}", |
1376 | | b"rppolint" => "\u{2A12}", |
1377 | | b"scpolint" => "\u{2A13}", |
1378 | | b"npolint" => "\u{2A14}", |
1379 | | b"pointint" => "\u{2A15}", |
1380 | | b"quatint" => "\u{2A16}", |
1381 | | b"intlarhk" => "\u{2A17}", |
1382 | | b"pluscir" => "\u{2A22}", |
1383 | | b"plusacir" => "\u{2A23}", |
1384 | | b"simplus" => "\u{2A24}", |
1385 | | b"plusdu" => "\u{2A25}", |
1386 | | b"plussim" => "\u{2A26}", |
1387 | | b"plustwo" => "\u{2A27}", |
1388 | | b"mcomma" => "\u{2A29}", |
1389 | | b"minusdu" => "\u{2A2A}", |
1390 | | b"loplus" => "\u{2A2D}", |
1391 | | b"roplus" => "\u{2A2E}", |
1392 | | b"Cross" => "\u{2A2F}", |
1393 | | b"timesd" => "\u{2A30}", |
1394 | | b"timesbar" => "\u{2A31}", |
1395 | | b"smashp" => "\u{2A33}", |
1396 | | b"lotimes" => "\u{2A34}", |
1397 | | b"rotimes" => "\u{2A35}", |
1398 | | b"otimesas" => "\u{2A36}", |
1399 | | b"Otimes" => "\u{2A37}", |
1400 | | b"odiv" => "\u{2A38}", |
1401 | | b"triplus" => "\u{2A39}", |
1402 | | b"triminus" => "\u{2A3A}", |
1403 | | b"tritime" => "\u{2A3B}", |
1404 | | b"iprod" | b"intprod" => "\u{2A3C}", |
1405 | | b"amalg" => "\u{2A3F}", |
1406 | | b"capdot" => "\u{2A40}", |
1407 | | b"ncup" => "\u{2A42}", |
1408 | | b"ncap" => "\u{2A43}", |
1409 | | b"capand" => "\u{2A44}", |
1410 | | b"cupor" => "\u{2A45}", |
1411 | | b"cupcap" => "\u{2A46}", |
1412 | | b"capcup" => "\u{2A47}", |
1413 | | b"cupbrcap" => "\u{2A48}", |
1414 | | b"capbrcup" => "\u{2A49}", |
1415 | | b"cupcup" => "\u{2A4A}", |
1416 | | b"capcap" => "\u{2A4B}", |
1417 | | b"ccups" => "\u{2A4C}", |
1418 | | b"ccaps" => "\u{2A4D}", |
1419 | | b"ccupssm" => "\u{2A50}", |
1420 | | b"And" => "\u{2A53}", |
1421 | | b"Or" => "\u{2A54}", |
1422 | | b"andand" => "\u{2A55}", |
1423 | | b"oror" => "\u{2A56}", |
1424 | | b"orslope" => "\u{2A57}", |
1425 | | b"andslope" => "\u{2A58}", |
1426 | | b"andv" => "\u{2A5A}", |
1427 | | b"orv" => "\u{2A5B}", |
1428 | | b"andd" => "\u{2A5C}", |
1429 | | b"ord" => "\u{2A5D}", |
1430 | | b"wedbar" => "\u{2A5F}", |
1431 | | b"sdote" => "\u{2A66}", |
1432 | | b"simdot" => "\u{2A6A}", |
1433 | | b"congdot" => "\u{2A6D}", |
1434 | | b"easter" => "\u{2A6E}", |
1435 | | b"apacir" => "\u{2A6F}", |
1436 | | b"apE" => "\u{2A70}", |
1437 | | b"eplus" => "\u{2A71}", |
1438 | | b"pluse" => "\u{2A72}", |
1439 | | b"Esim" => "\u{2A73}", |
1440 | | b"Colone" => "\u{2A74}", |
1441 | | b"Equal" => "\u{2A75}", |
1442 | | b"eDDot" | b"ddotseq" => "\u{2A77}", |
1443 | | b"equivDD" => "\u{2A78}", |
1444 | | b"ltcir" => "\u{2A79}", |
1445 | | b"gtcir" => "\u{2A7A}", |
1446 | | b"ltquest" => "\u{2A7B}", |
1447 | | b"gtquest" => "\u{2A7C}", |
1448 | | b"les" | b"LessSlantEqual" | b"leqslant" => "\u{2A7D}", |
1449 | | b"ges" | b"GreaterSlantEqual" | b"geqslant" => "\u{2A7E}", |
1450 | | b"lesdot" => "\u{2A7F}", |
1451 | | b"gesdot" => "\u{2A80}", |
1452 | | b"lesdoto" => "\u{2A81}", |
1453 | | b"gesdoto" => "\u{2A82}", |
1454 | | b"lesdotor" => "\u{2A83}", |
1455 | | b"gesdotol" => "\u{2A84}", |
1456 | | b"lap" | b"lessapprox" => "\u{2A85}", |
1457 | | b"gap" | b"gtrapprox" => "\u{2A86}", |
1458 | | b"lne" | b"lneq" => "\u{2A87}", |
1459 | | b"gne" | b"gneq" => "\u{2A88}", |
1460 | | b"lnap" | b"lnapprox" => "\u{2A89}", |
1461 | | b"gnap" | b"gnapprox" => "\u{2A8A}", |
1462 | | b"lEg" | b"lesseqqgtr" => "\u{2A8B}", |
1463 | | b"gEl" | b"gtreqqless" => "\u{2A8C}", |
1464 | | b"lsime" => "\u{2A8D}", |
1465 | | b"gsime" => "\u{2A8E}", |
1466 | | b"lsimg" => "\u{2A8F}", |
1467 | | b"gsiml" => "\u{2A90}", |
1468 | | b"lgE" => "\u{2A91}", |
1469 | | b"glE" => "\u{2A92}", |
1470 | | b"lesges" => "\u{2A93}", |
1471 | | b"gesles" => "\u{2A94}", |
1472 | | b"els" | b"eqslantless" => "\u{2A95}", |
1473 | | b"egs" | b"eqslantgtr" => "\u{2A96}", |
1474 | | b"elsdot" => "\u{2A97}", |
1475 | | b"egsdot" => "\u{2A98}", |
1476 | | b"el" => "\u{2A99}", |
1477 | | b"eg" => "\u{2A9A}", |
1478 | | b"siml" => "\u{2A9D}", |
1479 | | b"simg" => "\u{2A9E}", |
1480 | | b"simlE" => "\u{2A9F}", |
1481 | | b"simgE" => "\u{2AA0}", |
1482 | | b"LessLess" => "\u{2AA1}", |
1483 | | b"GreaterGreater" => "\u{2AA2}", |
1484 | | b"glj" => "\u{2AA4}", |
1485 | | b"gla" => "\u{2AA5}", |
1486 | | b"ltcc" => "\u{2AA6}", |
1487 | | b"gtcc" => "\u{2AA7}", |
1488 | | b"lescc" => "\u{2AA8}", |
1489 | | b"gescc" => "\u{2AA9}", |
1490 | | b"smt" => "\u{2AAA}", |
1491 | | b"lat" => "\u{2AAB}", |
1492 | | b"smte" => "\u{2AAC}", |
1493 | | b"late" => "\u{2AAD}", |
1494 | | b"bumpE" => "\u{2AAE}", |
1495 | | b"pre" | b"preceq" | b"PrecedesEqual" => "\u{2AAF}", |
1496 | | b"sce" | b"succeq" | b"SucceedsEqual" => "\u{2AB0}", |
1497 | | b"prE" => "\u{2AB3}", |
1498 | | b"scE" => "\u{2AB4}", |
1499 | | b"prnE" | b"precneqq" => "\u{2AB5}", |
1500 | | b"scnE" | b"succneqq" => "\u{2AB6}", |
1501 | | b"prap" | b"precapprox" => "\u{2AB7}", |
1502 | | b"scap" | b"succapprox" => "\u{2AB8}", |
1503 | | b"prnap" | b"precnapprox" => "\u{2AB9}", |
1504 | | b"scnap" | b"succnapprox" => "\u{2ABA}", |
1505 | | b"Pr" => "\u{2ABB}", |
1506 | | b"Sc" => "\u{2ABC}", |
1507 | | b"subdot" => "\u{2ABD}", |
1508 | | b"supdot" => "\u{2ABE}", |
1509 | | b"subplus" => "\u{2ABF}", |
1510 | | b"supplus" => "\u{2AC0}", |
1511 | | b"submult" => "\u{2AC1}", |
1512 | | b"supmult" => "\u{2AC2}", |
1513 | | b"subedot" => "\u{2AC3}", |
1514 | | b"supedot" => "\u{2AC4}", |
1515 | | b"subE" | b"subseteqq" => "\u{2AC5}", |
1516 | | b"supE" | b"supseteqq" => "\u{2AC6}", |
1517 | | b"subsim" => "\u{2AC7}", |
1518 | | b"supsim" => "\u{2AC8}", |
1519 | | b"subnE" | b"subsetneqq" => "\u{2ACB}", |
1520 | | b"supnE" | b"supsetneqq" => "\u{2ACC}", |
1521 | | b"csub" => "\u{2ACF}", |
1522 | | b"csup" => "\u{2AD0}", |
1523 | | b"csube" => "\u{2AD1}", |
1524 | | b"csupe" => "\u{2AD2}", |
1525 | | b"subsup" => "\u{2AD3}", |
1526 | | b"supsub" => "\u{2AD4}", |
1527 | | b"subsub" => "\u{2AD5}", |
1528 | | b"supsup" => "\u{2AD6}", |
1529 | | b"suphsub" => "\u{2AD7}", |
1530 | | b"supdsub" => "\u{2AD8}", |
1531 | | b"forkv" => "\u{2AD9}", |
1532 | | b"topfork" => "\u{2ADA}", |
1533 | | b"mlcp" => "\u{2ADB}", |
1534 | | b"Dashv" | b"DoubleLeftTee" => "\u{2AE4}", |
1535 | | b"Vdashl" => "\u{2AE6}", |
1536 | | b"Barv" => "\u{2AE7}", |
1537 | | b"vBar" => "\u{2AE8}", |
1538 | | b"vBarv" => "\u{2AE9}", |
1539 | | b"Vbar" => "\u{2AEB}", |
1540 | | b"Not" => "\u{2AEC}", |
1541 | | b"bNot" => "\u{2AED}", |
1542 | | b"rnmid" => "\u{2AEE}", |
1543 | | b"cirmid" => "\u{2AEF}", |
1544 | | b"midcir" => "\u{2AF0}", |
1545 | | b"topcir" => "\u{2AF1}", |
1546 | | b"nhpar" => "\u{2AF2}", |
1547 | | b"parsim" => "\u{2AF3}", |
1548 | | b"parsl" => "\u{2AFD}", |
1549 | | b"fflig" => "\u{FB00}", |
1550 | | b"filig" => "\u{FB01}", |
1551 | | b"fllig" => "\u{FB02}", |
1552 | | b"ffilig" => "\u{FB03}", |
1553 | | b"ffllig" => "\u{FB04}", |
1554 | | b"Ascr" => "\u{1D49}", |
1555 | | b"Cscr" => "\u{1D49}", |
1556 | | b"Dscr" => "\u{1D49}", |
1557 | | b"Gscr" => "\u{1D4A}", |
1558 | | b"Jscr" => "\u{1D4A}", |
1559 | | b"Kscr" => "\u{1D4A}", |
1560 | | b"Nscr" => "\u{1D4A}", |
1561 | | b"Oscr" => "\u{1D4A}", |
1562 | | b"Pscr" => "\u{1D4A}", |
1563 | | b"Qscr" => "\u{1D4A}", |
1564 | | b"Sscr" => "\u{1D4A}", |
1565 | | b"Tscr" => "\u{1D4A}", |
1566 | | b"Uscr" => "\u{1D4B}", |
1567 | | b"Vscr" => "\u{1D4B}", |
1568 | | b"Wscr" => "\u{1D4B}", |
1569 | | b"Xscr" => "\u{1D4B}", |
1570 | | b"Yscr" => "\u{1D4B}", |
1571 | | b"Zscr" => "\u{1D4B}", |
1572 | | b"ascr" => "\u{1D4B}", |
1573 | | b"bscr" => "\u{1D4B}", |
1574 | | b"cscr" => "\u{1D4B}", |
1575 | | b"dscr" => "\u{1D4B}", |
1576 | | b"fscr" => "\u{1D4B}", |
1577 | | b"hscr" => "\u{1D4B}", |
1578 | | b"iscr" => "\u{1D4B}", |
1579 | | b"jscr" => "\u{1D4B}", |
1580 | | b"kscr" => "\u{1D4C}", |
1581 | | b"lscr" => "\u{1D4C}", |
1582 | | b"mscr" => "\u{1D4C}", |
1583 | | b"nscr" => "\u{1D4C}", |
1584 | | b"pscr" => "\u{1D4C}", |
1585 | | b"qscr" => "\u{1D4C}", |
1586 | | b"rscr" => "\u{1D4C}", |
1587 | | b"sscr" => "\u{1D4C}", |
1588 | | b"tscr" => "\u{1D4C}", |
1589 | | b"uscr" => "\u{1D4C}", |
1590 | | b"vscr" => "\u{1D4C}", |
1591 | | b"wscr" => "\u{1D4C}", |
1592 | | b"xscr" => "\u{1D4C}", |
1593 | | b"yscr" => "\u{1D4C}", |
1594 | | b"zscr" => "\u{1D4C}", |
1595 | | b"Afr" => "\u{1D50}", |
1596 | | b"Bfr" => "\u{1D50}", |
1597 | | b"Dfr" => "\u{1D50}", |
1598 | | b"Efr" => "\u{1D50}", |
1599 | | b"Ffr" => "\u{1D50}", |
1600 | | b"Gfr" => "\u{1D50}", |
1601 | | b"Jfr" => "\u{1D50}", |
1602 | | b"Kfr" => "\u{1D50}", |
1603 | | b"Lfr" => "\u{1D50}", |
1604 | | b"Mfr" => "\u{1D51}", |
1605 | | b"Nfr" => "\u{1D51}", |
1606 | | b"Ofr" => "\u{1D51}", |
1607 | | b"Pfr" => "\u{1D51}", |
1608 | | b"Qfr" => "\u{1D51}", |
1609 | | b"Sfr" => "\u{1D51}", |
1610 | | b"Tfr" => "\u{1D51}", |
1611 | | b"Ufr" => "\u{1D51}", |
1612 | | b"Vfr" => "\u{1D51}", |
1613 | | b"Wfr" => "\u{1D51}", |
1614 | | b"Xfr" => "\u{1D51}", |
1615 | | b"Yfr" => "\u{1D51}", |
1616 | | b"afr" => "\u{1D51}", |
1617 | | b"bfr" => "\u{1D51}", |
1618 | | b"cfr" => "\u{1D52}", |
1619 | | b"dfr" => "\u{1D52}", |
1620 | | b"efr" => "\u{1D52}", |
1621 | | b"ffr" => "\u{1D52}", |
1622 | | b"gfr" => "\u{1D52}", |
1623 | | b"hfr" => "\u{1D52}", |
1624 | | b"ifr" => "\u{1D52}", |
1625 | | b"jfr" => "\u{1D52}", |
1626 | | b"kfr" => "\u{1D52}", |
1627 | | b"lfr" => "\u{1D52}", |
1628 | | b"mfr" => "\u{1D52}", |
1629 | | b"nfr" => "\u{1D52}", |
1630 | | b"ofr" => "\u{1D52}", |
1631 | | b"pfr" => "\u{1D52}", |
1632 | | b"qfr" => "\u{1D52}", |
1633 | | b"rfr" => "\u{1D52}", |
1634 | | b"sfr" => "\u{1D53}", |
1635 | | b"tfr" => "\u{1D53}", |
1636 | | b"ufr" => "\u{1D53}", |
1637 | | b"vfr" => "\u{1D53}", |
1638 | | b"wfr" => "\u{1D53}", |
1639 | | b"xfr" => "\u{1D53}", |
1640 | | b"yfr" => "\u{1D53}", |
1641 | | b"zfr" => "\u{1D53}", |
1642 | | b"Aopf" => "\u{1D53}", |
1643 | | b"Bopf" => "\u{1D53}", |
1644 | | b"Dopf" => "\u{1D53}", |
1645 | | b"Eopf" => "\u{1D53}", |
1646 | | b"Fopf" => "\u{1D53}", |
1647 | | b"Gopf" => "\u{1D53}", |
1648 | | b"Iopf" => "\u{1D54}", |
1649 | | b"Jopf" => "\u{1D54}", |
1650 | | b"Kopf" => "\u{1D54}", |
1651 | | b"Lopf" => "\u{1D54}", |
1652 | | b"Mopf" => "\u{1D54}", |
1653 | | b"Oopf" => "\u{1D54}", |
1654 | | b"Sopf" => "\u{1D54}", |
1655 | | b"Topf" => "\u{1D54}", |
1656 | | b"Uopf" => "\u{1D54}", |
1657 | | b"Vopf" => "\u{1D54}", |
1658 | | b"Wopf" => "\u{1D54}", |
1659 | | b"Xopf" => "\u{1D54}", |
1660 | | b"Yopf" => "\u{1D55}", |
1661 | | b"aopf" => "\u{1D55}", |
1662 | | b"bopf" => "\u{1D55}", |
1663 | | b"copf" => "\u{1D55}", |
1664 | | b"dopf" => "\u{1D55}", |
1665 | | b"eopf" => "\u{1D55}", |
1666 | | b"fopf" => "\u{1D55}", |
1667 | | b"gopf" => "\u{1D55}", |
1668 | | b"hopf" => "\u{1D55}", |
1669 | | b"iopf" => "\u{1D55}", |
1670 | | b"jopf" => "\u{1D55}", |
1671 | | b"kopf" => "\u{1D55}", |
1672 | | b"lopf" => "\u{1D55}", |
1673 | | b"mopf" => "\u{1D55}", |
1674 | | b"nopf" => "\u{1D55}", |
1675 | | b"oopf" => "\u{1D56}", |
1676 | | b"popf" => "\u{1D56}", |
1677 | | b"qopf" => "\u{1D56}", |
1678 | | b"ropf" => "\u{1D56}", |
1679 | | b"sopf" => "\u{1D56}", |
1680 | | b"topf" => "\u{1D56}", |
1681 | | b"uopf" => "\u{1D56}", |
1682 | | b"vopf" => "\u{1D56}", |
1683 | | b"wopf" => "\u{1D56}", |
1684 | | b"xopf" => "\u{1D56}", |
1685 | | b"yopf" => "\u{1D56}", |
1686 | | b"zopf" => "\u{1D56}", |
1687 | | _ => return None, |
1688 | | }; |
1689 | | Some(s) |
1690 | | } |
1691 | | |
1692 | 0 | fn parse_number(bytes: &str, range: Range<usize>) -> Result<char, EscapeError> { |
1693 | 0 | let code = if let Some(hex_digits) = bytes.strip_prefix('x') { |
1694 | 0 | parse_hexadecimal(hex_digits) |
1695 | | } else { |
1696 | 0 | parse_decimal(bytes) |
1697 | 0 | }?; |
1698 | 0 | if code == 0 { |
1699 | 0 | return Err(EscapeError::EntityWithNull(range)); |
1700 | 0 | } |
1701 | 0 | match std::char::from_u32(code) { |
1702 | 0 | Some(c) => Ok(c), |
1703 | 0 | None => Err(EscapeError::InvalidCodepoint(code)), |
1704 | | } |
1705 | 0 | } |
1706 | | |
1707 | 0 | fn parse_hexadecimal(bytes: &str) -> Result<u32, EscapeError> { |
1708 | 0 | // maximum code is 0x10FFFF => 6 characters |
1709 | 0 | if bytes.len() > 6 { |
1710 | 0 | return Err(EscapeError::TooLongHexadecimal); |
1711 | 0 | } |
1712 | 0 | let mut code = 0; |
1713 | 0 | for b in bytes.bytes() { |
1714 | 0 | code <<= 4; |
1715 | 0 | code += match b { |
1716 | 0 | b'0'..=b'9' => b - b'0', |
1717 | 0 | b'a'..=b'f' => b - b'a' + 10, |
1718 | 0 | b'A'..=b'F' => b - b'A' + 10, |
1719 | 0 | b => return Err(EscapeError::InvalidHexadecimal(b as char)), |
1720 | | } as u32; |
1721 | | } |
1722 | 0 | Ok(code) |
1723 | 0 | } |
1724 | | |
1725 | 0 | fn parse_decimal(bytes: &str) -> Result<u32, EscapeError> { |
1726 | 0 | // maximum code is 0x10FFFF = 1114111 => 7 characters |
1727 | 0 | if bytes.len() > 7 { |
1728 | 0 | return Err(EscapeError::TooLongDecimal); |
1729 | 0 | } |
1730 | 0 | let mut code = 0; |
1731 | 0 | for b in bytes.bytes() { |
1732 | 0 | code *= 10; |
1733 | 0 | code += match b { |
1734 | 0 | b'0'..=b'9' => b - b'0', |
1735 | 0 | b => return Err(EscapeError::InvalidDecimal(b as char)), |
1736 | | } as u32; |
1737 | | } |
1738 | 0 | Ok(code) |
1739 | 0 | } |
1740 | | |
1741 | | #[test] |
1742 | | fn test_unescape() { |
1743 | | let unchanged = unescape("test").unwrap(); |
1744 | | // assert_eq does not check that Cow is borrowed, but we explicitly use Cow |
1745 | | // because it influences diff |
1746 | | // TODO: use assert_matches! when stabilized and other features will bump MSRV |
1747 | | assert_eq!(unchanged, Cow::Borrowed("test")); |
1748 | | assert!(matches!(unchanged, Cow::Borrowed(_))); |
1749 | | |
1750 | | assert_eq!(unescape("<test>").unwrap(), "<test>"); |
1751 | | assert_eq!(unescape("0").unwrap(), "0"); |
1752 | | assert_eq!(unescape("0").unwrap(), "0"); |
1753 | | assert!(unescape("&foo;").is_err()); |
1754 | | } |
1755 | | |
1756 | | #[test] |
1757 | | fn test_unescape_with() { |
1758 | | let custom_entities = |ent: &str| match ent { |
1759 | | "foo" => Some("BAR"), |
1760 | | _ => None, |
1761 | | }; |
1762 | | |
1763 | | let unchanged = unescape_with("test", custom_entities).unwrap(); |
1764 | | // assert_eq does not check that Cow is borrowed, but we explicitly use Cow |
1765 | | // because it influences diff |
1766 | | // TODO: use assert_matches! when stabilized and other features will bump MSRV |
1767 | | assert_eq!(unchanged, Cow::Borrowed("test")); |
1768 | | assert!(matches!(unchanged, Cow::Borrowed(_))); |
1769 | | |
1770 | | assert_eq!( |
1771 | | unescape_with("<test>", custom_entities).unwrap(), |
1772 | | "<test>" |
1773 | | ); |
1774 | | assert_eq!(unescape_with("0", custom_entities).unwrap(), "0"); |
1775 | | assert_eq!(unescape_with("0", custom_entities).unwrap(), "0"); |
1776 | | assert_eq!(unescape_with("&foo;", custom_entities).unwrap(), "BAR"); |
1777 | | assert!(unescape_with("&fop;", custom_entities).is_err()); |
1778 | | } |
1779 | | |
1780 | | #[test] |
1781 | | fn test_escape() { |
1782 | | let unchanged = escape("test"); |
1783 | | // assert_eq does not check that Cow is borrowed, but we explicitly use Cow |
1784 | | // because it influences diff |
1785 | | // TODO: use assert_matches! when stabilized and other features will bump MSRV |
1786 | | assert_eq!(unchanged, Cow::Borrowed("test")); |
1787 | | assert!(matches!(unchanged, Cow::Borrowed(_))); |
1788 | | |
1789 | | assert_eq!(escape("<test>"), "<test>"); |
1790 | | assert_eq!(escape("\"a\"bc"), ""a"bc"); |
1791 | | assert_eq!(escape("\"a\"b&c"), ""a"b&c"); |
1792 | | assert_eq!( |
1793 | | escape("prefix_\"a\"b&<>c"), |
1794 | | "prefix_"a"b&<>c" |
1795 | | ); |
1796 | | } |
1797 | | |
1798 | | #[test] |
1799 | | fn test_partial_escape() { |
1800 | | let unchanged = partial_escape("test"); |
1801 | | // assert_eq does not check that Cow is borrowed, but we explicitly use Cow |
1802 | | // because it influences diff |
1803 | | // TODO: use assert_matches! when stabilized and other features will bump MSRV |
1804 | | assert_eq!(unchanged, Cow::Borrowed("test")); |
1805 | | assert!(matches!(unchanged, Cow::Borrowed(_))); |
1806 | | |
1807 | | assert_eq!(partial_escape("<test>"), "<test>"); |
1808 | | assert_eq!(partial_escape("\"a\"bc"), "\"a\"bc"); |
1809 | | assert_eq!(partial_escape("\"a\"b&c"), "\"a\"b&c"); |
1810 | | assert_eq!( |
1811 | | partial_escape("prefix_\"a\"b&<>c"), |
1812 | | "prefix_\"a\"b&<>c" |
1813 | | ); |
1814 | | } |