From 5d1abc0c886bcf1d76edc1480fc882138e6e9170 Mon Sep 17 00:00:00 2001 From: Joshua Thijssen Date: Wed, 16 Aug 2023 14:03:20 +0200 Subject: [PATCH] setup tokens so they are usable. Also some reformatting through rustfmt --- src/html5_parser/consume_char_refs.rs | 811 ++-- src/html5_parser/emitter.rs | 138 +- src/html5_parser/input_stream.rs | 65 +- src/html5_parser/mod.rs | 81 +- src/html5_parser/node.rs | 84 +- src/html5_parser/token.rs | 97 + src/html5_parser/token_named_characters.rs | 4478 ++++++++++---------- src/html5_parser/token_replacements.rs | 78 +- src/html5_parser/token_states.rs | 1 + src/html5_parser/tokenizer.rs | 574 +-- src/main.rs | 8 +- 11 files changed, 3198 insertions(+), 3217 deletions(-) create mode 100755 src/html5_parser/token.rs diff --git a/src/html5_parser/consume_char_refs.rs b/src/html5_parser/consume_char_refs.rs index 1f13900e1..50402bce0 100644 --- a/src/html5_parser/consume_char_refs.rs +++ b/src/html5_parser/consume_char_refs.rs @@ -1,405 +1,406 @@ -use crate::html5_parser::token_named_characters::TOKEN_NAMED_CHARS; -use crate::html5_parser::token_replacements::TOKEN_REPLACEMENTS; -use crate::html5_parser::tokenizer::Tokenizer; - -use super::tokenizer::CHAR_REPLACEMENT; - -// All references are to chapters in https://dev.w3.org/html5/spec-LC/tokenization.html - -impl<'a> Tokenizer<'a> { - // Consumes a character reference and places this in the tokenizer consume buffer - // ref: 8.2.4.69 Tokenizing character references - pub fn consume_character_reference(&mut self, additional_allowed_char: Option, as_attribute: bool) -> Option { - self.clear_consume_buffer(); - - if as_attribute { - // When we are inside an attribute context, things (will/might) be different. Not sure how yet. - } - - let c = match self.stream.read_char() { - Some(c) => c, - None => { - return None; - } - }; - - // Characters that aren't allowed - let mut chars = vec![ - crate::html5_parser::tokenizer::CHAR_TAB, - crate::html5_parser::tokenizer::CHAR_LF, - crate::html5_parser::tokenizer::CHAR_FF, - crate::html5_parser::tokenizer::CHAR_SPACE, - '<', - '&' - ]; - - // The name is weird: addiitonal_allowed_chars, but it would be a char that is NOT allowed (?) - if additional_allowed_char.is_some() { - chars.push(additional_allowed_char.unwrap()) - } - - if chars.contains(&c) { - self.stream.unread(); - return None; - } - - // Consume a number when we found &# - if c == '#' { - self.consume('&'); - self.consume(c); - if self.consume_number().is_err() { - self.stream.unread(); - return None; - } - - return Some(self.get_consumed_str()); - } - - // Consume anything else when we found & with another char after (ie: ») - self.stream.unread(); - if self.consume_entity(as_attribute).is_err() { - self.stream.unread(); - return None; - } - - return Some(self.get_consumed_str()); - } - - // Consume a number like #x1234, #123 etc - fn consume_number(&mut self) -> Result { - let mut str_num = String::new(); - - // Save current position for easy recovery - let cp = self.stream.tell(); - - // Is the char a 'X' or 'x', then we must try and fetch hex digits, otherwise just 0..9 - let mut is_hex = false; - let hex = match self.stream.look_ahead(0) { - Some(hex) => hex, - None => { - return Err(String::new()); - } - }; - - if hex == 'x' || hex == 'X' { - is_hex = true; - - // Consume the 'x' character - let c = match self.stream.read_char() { - Some(c) => c, - None => { - self.stream.seek(cp); - return Err(String::new()); - } - }; - - self.consume(c); - }; - - let mut i = 0; - loop { - let c = match self.stream.read_char() { - Some(c) => c, - None => { - self.stream.seek(cp); - return Err(String::new()); - } - }; - - if is_hex && c.is_ascii_hexdigit() { - str_num.push(c); - self.consume(c); - } else if !is_hex && c.is_ascii_digit() { - str_num.push(c); - self.consume(c); - } else { - self.stream.unread(); - break; - } - - i += 1; - } - - // Fetch next character - let c = match self.stream.read_char() { - Some(c) => c, - None => { - self.stream.seek(cp); - return Err(String::new()); - } - }; - - // Next character MUST be ; - if c != ';' { - self.parse_error("expected a ';'"); - self.stream.seek(cp); - return Err(String::new()); - } - - self.consume(c); - - // If we found ;. we need to check how many digits we have parsed. It needs to be at least 1, - if i == 0 { - self.parse_error("didn't expect #;"); - self.stream.seek(cp); - return Err(String::new()); - } - - // check if we need to replace the character. First convert the number to a uint, and use that - // to check if it exists in the replacements table. - let num = match u32::from_str_radix(&*str_num, if is_hex { 16 } else { 10 }) { - Ok(n) => n, - Err(_) => 0, // lets pretend that an invalid value is set to 0 - }; - - if TOKEN_REPLACEMENTS.contains_key(&num) { - self.clear_consume_buffer(); - self.consume(*TOKEN_REPLACEMENTS.get(&num).unwrap()); - return Ok(String::new()); - } - - // Next, check if we are in the 0xD800..0xDFFF or 0x10FFFF range, if so, replace - if (num > 0xD800 && num < 0xDFFF) || (num > 0x10FFFFF) { - self.parse_error("within reserved codepoint range, but replaced"); - self.clear_consume_buffer(); - self.consume(crate::html5_parser::tokenizer::CHAR_REPLACEMENT); - return Ok(String::new()); - } - - // Check if it's in a reserved range, in that case, we ignore the data - if self.in_reserved_number_range(num) { - self.parse_error("within reserved codepoint range, ignored"); - self.clear_consume_buffer(); - return Ok(String::new()); - } - - self.clear_consume_buffer(); - self.consume(std::char::from_u32(num).unwrap_or(CHAR_REPLACEMENT)); - - return Ok(String::new()); - } - - // Returns if the given codepoint number is in a reserved range (as defined in - // https://dev.w3.org/html5/spec-LC/tokenization.html#consume-a-character-reference) - fn in_reserved_number_range(&self, codepoint: u32) -> bool { - if - (0x1..=0x0008).contains(&codepoint) || - (0x000E..=0x001F).contains(&codepoint) || - (0x007F..=0x009F).contains(&codepoint) || - (0xFDD0..=0xFDEF).contains(&codepoint) || - (0x000E..=0x001F).contains(&codepoint) || - (0x000E..=0x001F).contains(&codepoint) || - (0x000E..=0x001F).contains(&codepoint) || - (0x000E..=0x001F).contains(&codepoint) || - (0x000E..=0x001F).contains(&codepoint) || - [ - 0x000B, 0xFFFE, 0xFFFF, 0x1FFFE, 0x1FFFF, 0x2FFFE, 0x2FFFF, 0x3FFFE, 0x3FFFF, - 0x4FFFE, 0x4FFFF, 0x5FFFE, 0x5FFFF, 0x6FFFE, 0x6FFFF, 0x7FFFE, 0x7FFFF, - 0x8FFFE, 0x8FFFF, 0x9FFFE, 0x9FFFF, 0xAFFFE, 0xAFFFF, 0xBFFFE, 0xBFFFF, - 0xCFFFE, 0xCFFFF, 0xDFFFE, 0xDFFFF, 0xEFFFE, 0xEFFFF, 0xFFFFE, 0xFFFFF, - 0x10FFFE, 0x10FFFF - ].contains(&codepoint) { - return true; - } - - return false; - } - - // This will consume an entity that does not start with &# (ie: » &#copy;) - fn consume_entity(&mut self, as_attribute: bool) -> Result { - - // Processing is based on the golang.org/x/net/html package - - let mut capture = String::new(); - - loop { - let c = self.stream.read_char(); - match c { - Some(c) => { - capture.push(c); - - // If we captured [azAZ09], just continue the capture - if 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' || '0' <= c && c <= '9' { - continue; - } - - break; - } - None => { - self.parse_error("unexpected end of stream"); - self.consume('&'); - self.consume_string(capture); - return Ok(String::new()); - } - } - } - - // At this point, we have a consume buffer with the entity name in it. We need to check if it's a known entity - - if capture.len() == 0 { - // If we found nohting (ie: &;) - self.parse_error("expected entity name"); - return Err(String::new()); - - // } else if as_attribute { - // @TODO: implement this - // If we need to consume an entity as an attribute, we need to check if the next character is a valid - // attribute stuff - - } else if TOKEN_NAMED_CHARS.contains_key(capture.as_str()) { - // If we found a known entity, we need to replace it - - let entity = TOKEN_NAMED_CHARS.get(capture.as_str()).unwrap(); - self.consume_string((*entity).to_string()); - return Ok(String::new()); - - } else if ! as_attribute { - // If we found some text, but it's not an entity. We decrease the text until we find something that matches an entity. - let mut max_len = capture.len(); - - // Largest entity is 6 chars. We don't need to check for more - if max_len > 6 { - max_len = 6; - } - - for j in (1..=max_len).rev() { - let substr: String = capture.chars().take(j).collect(); - if TOKEN_NAMED_CHARS.contains_key(substr.as_str()) { - let entity = TOKEN_NAMED_CHARS.get(substr.as_str()).unwrap(); - self.consume_string((*entity).to_string()); - self.consume_string(capture.chars().skip(j).collect()); - return Ok(String::new()); - } - } - } - - self.consume('&'); - self.consume_string(capture.to_string()); - return Ok(String::new()); - } -} - -#[cfg(test)] -mod tests { - use crate::html5_parser::input_stream::InputStream; - use super::*; - - macro_rules! token_tests { - ($($name:ident : $value:expr)*) => { - $( - #[test] - fn $name() { - let (input, expected) = $value; - - let mut is = InputStream::new(); - is.read_from_str(input, None); - let mut tok = Tokenizer::new(&mut is); - let t = tok.next_token(); - assert_eq!(expected, t.to_string()); - } - )* - } - } - - token_tests! { - // Numbers - token_0: (" ", "str[\n]") - token_1: ("�", "str[�]") - token_2: ("�", "str[�]") - token_3: ("�", "str[�]") // replace with replacement char - token_4: ("�", "str[�]") // replace with replacement char - token_5: ("뻯", "str[뻯]") - token_6: ("", "str[]") // reserved codepoint - token_7: ("&#;", "str[&]") - token_8: ("&;", "str[&;]") - token_9: ("&", "str[&]") - token_10: ("", "str[]") // reserved codepoint - token_11: ("", "str[]") // reserved codepoint - token_12: ("", "str[]") // reserved codepoint - token_13: ("", "str[]") // reserved codepoint - token_14: (" ", "str[\t]") - token_15: ("", "str[]") // reserved codepoint - token_16: ("﷐", "str[]") // reserved codepoint - - // Entities - token_100: ("©", "str[©]") - token_101: ("©Thing;", "str[©Thing;]") - token_102: ("»", "str[»]") - token_103: ("«", "str[«]") - token_104: ("¬", "str[¬]") - token_105: ("¬it;", "str[¬it;]") - token_106: ("∉", "str[∉]") - token_107: ("&fo", "str[&fo]") - token_108: ("&xxx", "str[&xxx]") - token_109: ("©", "str[©]") - token_110: ("© ", "str[© ]") - token_111: ("©a", "str[©a]") - token_112: ("©a;", "str[©a;]") - token_113: ("©", "str[©]") - token_114: ("©&", "str[©&]") - token_115: ("©a ", "str[©a ]") - // token_116: ("©X ", "str[&]") // What should this be? - - - // ChatGPT generated tests - token_200: ("©", "str[©]") - token_201: ("© ", "str[© ]") - token_202: ("©", "str[©]") - token_203: ("©", "str[©]") - token_204: ("<", "str[<]") - token_205: ("&unknown;", "str[&unknown;]") - token_206: ("<", "str[<]") - token_207: ("<", "str[<]") - token_208: ("&", "str[&]") - token_209: ("€", "str[€]") - token_210: (">", "str[>]") - token_211: ("®", "str[®]") - token_212: ("®", "str[®]") - token_213: ("®", "str[®]") - token_214: (""", "str[\"]") - token_215: (""", "str[\"]") - token_216: (""", "str[\"]") - token_217: ("'", "str[']") - token_218: ("'", "str[']") - token_219: ("'", "str[']") - token_220: ("!", "str[!]") - token_221: ("!", "str[!]") - token_222: ("#", "str[#]") - token_223: ("#", "str[#]") - token_224: ("$", "str[$]") - token_225: ("$", "str[$]") - token_226: ("%", "str[%]") - token_227: ("%", "str[%]") - token_228: ("*", "str[*]") - token_229: ("*", "str[*]") - token_230: ("+", "str[+]") - token_231: ("+", "str[+]") - token_232: (",", "str[,]") - token_233: (",", "str[,]") - token_234: ("−", "str[−]") - token_235: ("-", "str[-]") - token_236: (".", "str[.]") - token_237: (".", "str[.]") - token_238: ("/", "str[/]") - token_239: ("/", "str[/]") - token_240: (":", "str[:]") - token_241: (":", "str[:]") - token_242: (";", "str[;]") - token_243: (";", "str[;]") - token_244: ("=", "str[=]") - token_245: ("=", "str[=]") - token_246: ("?", "str[?]") - token_247: ("?", "str[?]") - token_248: ("@", "str[@]") - token_249: ("@", "str[@]") - token_250: ("©", "str[©]") - token_251: ("€", "str[€]") - token_252: ("Ÿ", "str[Ÿ]") - token_253: ("", "str[]") - token_254: ("�", "str[�]") - token_255: ("�", "str[�]") - token_256: ("&unknownchar;", "str[&unknownchar;]") - token_257: ("�", "str[�]") - token_259: (" ", "str[]") - } -} +use crate::html5_parser::token_named_characters::TOKEN_NAMED_CHARS; +use crate::html5_parser::token_replacements::TOKEN_REPLACEMENTS; +use crate::html5_parser::tokenizer::Tokenizer; + +use super::tokenizer::CHAR_REPLACEMENT; + +// All references are to chapters in https://dev.w3.org/html5/spec-LC/tokenization.html + +impl<'a> Tokenizer<'a> { + // Consumes a character reference and places this in the tokenizer consume buffer + // ref: 8.2.4.69 Tokenizing character references + pub fn consume_character_reference( + &mut self, + additional_allowed_char: Option, + as_attribute: bool, + ) -> Option { + // self.clear_consume_buffer(); + + if as_attribute { + // When we are inside an attribute context, things (will/might) be different. Not sure how yet. + } + + let c = match self.stream.read_char() { + Some(c) => c, + None => { + return None; + } + }; + + // Characters that aren't allowed + let mut chars = vec![ + crate::html5_parser::tokenizer::CHAR_TAB, + crate::html5_parser::tokenizer::CHAR_LF, + crate::html5_parser::tokenizer::CHAR_FF, + crate::html5_parser::tokenizer::CHAR_SPACE, + '<', + '&', + ]; + + // The name is weird: addiitonal_allowed_chars, but it would be a char that is NOT allowed (?) + if additional_allowed_char.is_some() { + chars.push(additional_allowed_char.unwrap()) + } + + if chars.contains(&c) { + self.stream.unread(); + return None; + } + + // Consume a number when we found &# + if c == '#' { + self.consume('&'); + self.consume(c); + if self.consume_number().is_err() { + self.stream.unread(); + return None; + } + + return Some(self.get_consumed_str()); + } + + // Consume anything else when we found & with another char after (ie: ») + self.stream.unread(); + if self.consume_entity(as_attribute).is_err() { + self.stream.unread(); + return None; + } + + return Some(self.get_consumed_str()); + } + + // Consume a number like #x1234, #123 etc + fn consume_number(&mut self) -> Result { + let mut str_num = String::new(); + + // Save current position for easy recovery + let cp = self.stream.tell(); + + // Is the char a 'X' or 'x', then we must try and fetch hex digits, otherwise just 0..9 + let mut is_hex = false; + let hex = match self.stream.look_ahead(0) { + Some(hex) => hex, + None => { + return Err(String::new()); + } + }; + + if hex == 'x' || hex == 'X' { + is_hex = true; + + // Consume the 'x' character + let c = match self.stream.read_char() { + Some(c) => c, + None => { + self.stream.seek(cp); + return Err(String::new()); + } + }; + + self.consume(c); + }; + + let mut i = 0; + loop { + let c = match self.stream.read_char() { + Some(c) => c, + None => { + self.stream.seek(cp); + return Err(String::new()); + } + }; + + if is_hex && c.is_ascii_hexdigit() { + str_num.push(c); + self.consume(c); + } else if !is_hex && c.is_ascii_digit() { + str_num.push(c); + self.consume(c); + } else { + self.stream.unread(); + break; + } + + i += 1; + } + + // Fetch next character + let c = match self.stream.read_char() { + Some(c) => c, + None => { + self.stream.seek(cp); + return Err(String::new()); + } + }; + + // Next character MUST be ; + if c != ';' { + self.parse_error("expected a ';'"); + self.stream.seek(cp); + return Err(String::new()); + } + + self.consume(c); + + // If we found ;. we need to check how many digits we have parsed. It needs to be at least 1, + if i == 0 { + self.parse_error("didn't expect #;"); + self.stream.seek(cp); + return Err(String::new()); + } + + // check if we need to replace the character. First convert the number to a uint, and use that + // to check if it exists in the replacements table. + let num = match u32::from_str_radix(&*str_num, if is_hex { 16 } else { 10 }) { + Ok(n) => n, + Err(_) => 0, // lets pretend that an invalid value is set to 0 + }; + + if TOKEN_REPLACEMENTS.contains_key(&num) { + // self.clear_consume_buffer(); + self.consume(*TOKEN_REPLACEMENTS.get(&num).unwrap()); + return Ok(String::new()); + } + + // Next, check if we are in the 0xD800..0xDFFF or 0x10FFFF range, if so, replace + if (num > 0xD800 && num < 0xDFFF) || (num > 0x10FFFFF) { + self.parse_error("within reserved codepoint range, but replaced"); + // self.clear_consume_buffer(); + self.consume(crate::html5_parser::tokenizer::CHAR_REPLACEMENT); + return Ok(String::new()); + } + + // Check if it's in a reserved range, in that case, we ignore the data + if self.in_reserved_number_range(num) { + self.parse_error("within reserved codepoint range, ignored"); + // self.clear_consume_buffer(); + return Ok(String::new()); + } + + // self.clear_consume_buffer(); + self.consume(std::char::from_u32(num).unwrap_or(CHAR_REPLACEMENT)); + + return Ok(String::new()); + } + + // Returns if the given codepoint number is in a reserved range (as defined in + // https://dev.w3.org/html5/spec-LC/tokenization.html#consume-a-character-reference) + fn in_reserved_number_range(&self, codepoint: u32) -> bool { + if (0x1..=0x0008).contains(&codepoint) + || (0x000E..=0x001F).contains(&codepoint) + || (0x007F..=0x009F).contains(&codepoint) + || (0xFDD0..=0xFDEF).contains(&codepoint) + || (0x000E..=0x001F).contains(&codepoint) + || (0x000E..=0x001F).contains(&codepoint) + || (0x000E..=0x001F).contains(&codepoint) + || (0x000E..=0x001F).contains(&codepoint) + || (0x000E..=0x001F).contains(&codepoint) + || [ + 0x000B, 0xFFFE, 0xFFFF, 0x1FFFE, 0x1FFFF, 0x2FFFE, 0x2FFFF, 0x3FFFE, 0x3FFFF, + 0x4FFFE, 0x4FFFF, 0x5FFFE, 0x5FFFF, 0x6FFFE, 0x6FFFF, 0x7FFFE, 0x7FFFF, 0x8FFFE, + 0x8FFFF, 0x9FFFE, 0x9FFFF, 0xAFFFE, 0xAFFFF, 0xBFFFE, 0xBFFFF, 0xCFFFE, 0xCFFFF, + 0xDFFFE, 0xDFFFF, 0xEFFFE, 0xEFFFF, 0xFFFFE, 0xFFFFF, 0x10FFFE, 0x10FFFF, + ] + .contains(&codepoint) + { + return true; + } + + return false; + } + + // This will consume an entity that does not start with &# (ie: » &#copy;) + fn consume_entity(&mut self, as_attribute: bool) -> Result { + // Processing is based on the golang.org/x/net/html package + + let mut capture = String::new(); + + loop { + let c = self.stream.read_char(); + match c { + Some(c) => { + capture.push(c); + + // If we captured [azAZ09], just continue the capture + if 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' || '0' <= c && c <= '9' { + continue; + } + + break; + } + None => { + self.parse_error("unexpected end of stream"); + self.consume('&'); + self.consume_string(capture); + return Ok(String::new()); + } + } + } + + // At this point, we have a consume buffer with the entity name in it. We need to check if it's a known entity + + if capture.len() == 0 { + // If we found nohting (ie: &;) + self.parse_error("expected entity name"); + return Err(String::new()); + + // } else if as_attribute { + // @TODO: implement this + // If we need to consume an entity as an attribute, we need to check if the next character is a valid + // attribute stuff + } else if TOKEN_NAMED_CHARS.contains_key(capture.as_str()) { + // If we found a known entity, we need to replace it + + let entity = TOKEN_NAMED_CHARS.get(capture.as_str()).unwrap(); + self.consume_string((*entity).to_string()); + return Ok(String::new()); + } else if !as_attribute { + // If we found some text, but it's not an entity. We decrease the text until we find something that matches an entity. + let mut max_len = capture.len(); + + // Largest entity is 6 chars. We don't need to check for more + if max_len > 6 { + max_len = 6; + } + + for j in (1..=max_len).rev() { + let substr: String = capture.chars().take(j).collect(); + if TOKEN_NAMED_CHARS.contains_key(substr.as_str()) { + let entity = TOKEN_NAMED_CHARS.get(substr.as_str()).unwrap(); + self.consume_string((*entity).to_string()); + self.consume_string(capture.chars().skip(j).collect()); + return Ok(String::new()); + } + } + } + + self.consume('&'); + self.consume_string(capture.to_string()); + return Ok(String::new()); + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::html5_parser::input_stream::InputStream; + + macro_rules! entity_tests { + ($($name:ident : $value:expr)*) => { + $( + #[test] + fn $name() { + let (input, expected) = $value; + + let mut is = InputStream::new(); + is.read_from_str(input, None); + let mut tok = Tokenizer::new(&mut is); + let t = tok.next_token(); + assert_eq!(expected, t.to_string()); + } + )* + } + } + + entity_tests! { + // Numbers + entity_0: (" ", "str[\n]") + entity_1: ("�", "str[�]") + entity_2: ("�", "str[�]") + entity_3: ("�", "str[�]") // replace with replacement char + entity_4: ("�", "str[�]") // replace with replacement char + entity_5: ("뻯", "str[뻯]") + entity_6: ("", "str[]") // reserved codepoint + entity_7: ("&#;", "str[&]") + entity_8: ("&;", "str[&;]") + entity_9: ("&", "str[&]") + entity_10: ("", "str[]") // reserved codepoint + entity_11: ("", "str[]") // reserved codepoint + entity_12: ("", "str[]") // reserved codepoint + entity_13: ("", "str[]") // reserved codepoint + entity_14: (" ", "str[\t]") + entity_15: ("", "str[]") // reserved codepoint + entity_16: ("﷐", "str[]") // reserved codepoint + + // Entities + entity_100: ("©", "str[©]") + entity_101: ("©Thing;", "str[©Thing;]") + entity_102: ("»", "str[»]") + entity_103: ("«", "str[«]") + entity_104: ("¬", "str[¬]") + entity_105: ("¬it;", "str[¬it;]") + entity_106: ("∉", "str[∉]") + entity_107: ("&fo", "str[&fo]") + entity_108: ("&xxx", "str[&xxx]") + entity_109: ("©", "str[©]") + entity_110: ("© ", "str[© ]") + entity_111: ("©a", "str[©a]") + entity_112: ("©a;", "str[©a;]") + entity_113: ("©", "str[©]") + entity_114: ("©&", "str[©&]") + entity_115: ("©a ", "str[©a ]") + // entity_116: ("©X ", "str[&]") // What should this be? + + + // ChatGPT generated tests + entity_200: ("©", "str[©]") + entity_201: ("© ", "str[© ]") + entity_202: ("©", "str[©]") + entity_203: ("©", "str[©]") + entity_204: ("<", "str[<]") + entity_205: ("&unknown;", "str[&unknown;]") + entity_206: ("<", "str[<]") + entity_207: ("<", "str[<]") + entity_208: ("&", "str[&]") + entity_209: ("€", "str[€]") + entity_210: (">", "str[>]") + entity_211: ("®", "str[®]") + entity_212: ("®", "str[®]") + entity_213: ("®", "str[®]") + entity_214: (""", "str[\"]") + entity_215: (""", "str[\"]") + entity_216: (""", "str[\"]") + entity_217: ("'", "str[']") + entity_218: ("'", "str[']") + entity_219: ("'", "str[']") + entity_220: ("!", "str[!]") + entity_221: ("!", "str[!]") + entity_222: ("#", "str[#]") + entity_223: ("#", "str[#]") + entity_224: ("$", "str[$]") + entity_225: ("$", "str[$]") + entity_226: ("%", "str[%]") + entity_227: ("%", "str[%]") + entity_228: ("*", "str[*]") + entity_229: ("*", "str[*]") + entity_230: ("+", "str[+]") + entity_231: ("+", "str[+]") + entity_232: (",", "str[,]") + entity_233: (",", "str[,]") + entity_234: ("−", "str[−]") + entity_235: ("-", "str[-]") + entity_236: (".", "str[.]") + entity_237: (".", "str[.]") + entity_238: ("/", "str[/]") + entity_239: ("/", "str[/]") + entity_240: (":", "str[:]") + entity_241: (":", "str[:]") + entity_242: (";", "str[;]") + entity_243: (";", "str[;]") + entity_244: ("=", "str[=]") + entity_245: ("=", "str[=]") + entity_246: ("?", "str[?]") + entity_247: ("?", "str[?]") + entity_248: ("@", "str[@]") + entity_249: ("@", "str[@]") + entity_250: ("©", "str[©]") + entity_251: ("€", "str[€]") + entity_252: ("Ÿ", "str[Ÿ]") + entity_253: ("", "str[]") + entity_254: ("�", "str[�]") + entity_255: ("�", "str[�]") + entity_256: ("&unknownchar;", "str[&unknownchar;]") + entity_257: ("�", "str[�]") + entity_259: (" ", "str[]") + } +} diff --git a/src/html5_parser/emitter.rs b/src/html5_parser/emitter.rs index 095516574..50e1a8c00 100644 --- a/src/html5_parser/emitter.rs +++ b/src/html5_parser/emitter.rs @@ -1,70 +1,68 @@ -use std::fmt::{Display, Formatter}; -use crate::html5_parser::tokenizer::Token; - -pub(crate) trait Emitter: Display { - fn emit(&mut self, t: Token); -} - -// Emitter that will send the output to a string -struct StrEmitter { - output: String -} - -impl StrEmitter { - pub fn new() -> Self { - StrEmitter { - output: String::new(), - } - } -} - -impl Display for StrEmitter { - fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - write!(f, "{}", self.output) - } -} - -impl Emitter for StrEmitter { - fn emit(&mut self, _t: Token) { - // self.output.add(&*t.to_string()); - } -} - -// Default emitter that will emit tokens to the std output -pub struct IoEmitter { -} - -impl IoEmitter { - pub fn new() -> Self { - IoEmitter{} - } -} - -impl Display for IoEmitter { - fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - write!(f, "") - } -} - -// Implement the emit() function -impl Emitter for IoEmitter { - fn emit(&mut self, t: Token) { - println!("{}", t.to_string()); - } -} - -#[cfg(test)] -mod test { - - // #[test] - // fn test_emit() { - // let e = StrEmitter::new(); - // e.emit(Token::String(String::from("hello world"))); - // assert_eq!(e.output, "hello world"); - // - // let e = StrEmitter::new(); - // e.emit(Token::StartTag(StartTag::new("tag", true, None, ""))); - // assert_eq!(e.output, ""); - // } -} - +use crate::html5_parser::token::Token; +use std::fmt::{Display, Formatter}; + +pub(crate) trait Emitter: Display { + fn emit(&mut self, t: Token); +} + +// Emitter that will send the output to a string +struct StrEmitter { + output: String, +} + +impl StrEmitter { + pub fn new() -> Self { + StrEmitter { + output: String::new(), + } + } +} + +impl Display for StrEmitter { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.output) + } +} + +impl Emitter for StrEmitter { + fn emit(&mut self, _t: Token) { + // self.output.add(&*t.to_string()); + } +} + +// Default emitter that will emit tokens to the std output +pub struct IoEmitter {} + +impl IoEmitter { + pub fn new() -> Self { + IoEmitter {} + } +} + +impl Display for IoEmitter { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + write!(f, "") + } +} + +// Implement the emit() function +impl Emitter for IoEmitter { + fn emit(&mut self, t: Token) { + println!("{}", t.to_string()); + } +} + +#[cfg(test)] +mod test { + + // #[test] + // fn test_emit() { + // let e = StrEmitter::new(); + // e.emit(Token::String(String::from("hello world"))); + // assert_eq!(e.output, "hello world"); + // + // let e = StrEmitter::new(); + // e.emit(Token::StartTag(StartTag::new("tag", true, None, ""))); + // assert_eq!(e.output, ""); + // } +} diff --git a/src/html5_parser/input_stream.rs b/src/html5_parser/input_stream.rs index dc8f2c478..c3eba7c0c 100644 --- a/src/html5_parser/input_stream.rs +++ b/src/html5_parser/input_stream.rs @@ -5,32 +5,31 @@ use std::io::Read; // Encoding defines the way the buffer stream is read, as what defines a "character". #[derive(PartialEq)] pub enum Encoding { - UTF8, // Stream is of UTF8 characters - ASCII, // Stream is of 8bit ASCII - // Iso88591 // Stream is of iso_8859_1 - // More + UTF8, // Stream is of UTF8 characters + ASCII, // Stream is of 8bit ASCII + // Iso88591 // Stream is of iso_8859_1 + // More } // The confidence decides how confident we are that the input stream is of this encoding #[derive(PartialEq)] pub enum Confidence { - Tentative, // This encoding might be the one we need - Certain, // We are certain to use this encoding - // Irrelevant // There is no content encoding for this stream + Tentative, // This encoding might be the one we need + Certain, // We are certain to use this encoding + // Irrelevant // There is no content encoding for this stream } // HTML(5) input stream structure pub struct InputStream { - encoding: Encoding, // Current encoding - pub(crate) confidence: Confidence, // How confident are we that this is the correct encoding? - current: usize, // Current offset of the reader - length: usize, // Length (in bytes) of the buffer - buffer: Vec, // Reference to the actual buffer stream in characters - u8_buffer: Vec // Reference to the actual buffer stream in u8 bytes - // If all things are ok, both buffer and u8_buffer should refer to the same memory location + encoding: Encoding, // Current encoding + pub(crate) confidence: Confidence, // How confident are we that this is the correct encoding? + current: usize, // Current offset of the reader + length: usize, // Length (in bytes) of the buffer + buffer: Vec, // Reference to the actual buffer stream in characters + u8_buffer: Vec, // Reference to the actual buffer stream in u8 bytes + // If all things are ok, both buffer and u8_buffer should refer to the same memory location } - impl InputStream { // Create a new default empty input stream pub fn new() -> Self { @@ -55,20 +54,17 @@ impl InputStream { } // Returns true when the stream pointer is at the end of the stream - pub fn eof(&self) -> bool - { + pub fn eof(&self) -> bool { self.current >= self.length } // Reset the stream reader back to the start - pub fn reset(&mut self) - { + pub fn reset(&mut self) { self.current = 0 } // Seek explicit offset in the stream (based on chars) - pub fn seek(&mut self, mut off: usize) - { + pub fn seek(&mut self, mut off: usize) { if off > self.length { off = self.length } @@ -81,17 +77,15 @@ impl InputStream { } // Set the given confidence of the input stream encoding - pub fn set_confidence(&mut self, c: Confidence) - { + pub fn set_confidence(&mut self, c: Confidence) { self.confidence = c; } // Changes the encoding and if necessary, decodes the u8 buffer into the correct encoding - pub fn set_encoding(&mut self, e: Encoding) - { + pub fn set_encoding(&mut self, e: Encoding) { // Don't convert if the encoding is the same as it already is if self.encoding == e { - return + return; } self.force_set_encoding(e) @@ -111,7 +105,11 @@ impl InputStream { } Encoding::ASCII => { // Convert the string into characters so we can use easy indexing. Any non-ascii chars (> 0x7F) are converted to '?' - self.buffer = self.u8_buffer.iter().map(|&byte| if byte.is_ascii() { byte as char } else { '?' }).collect(); + self.buffer = self + .u8_buffer + .iter() + .map(|&byte| if byte.is_ascii() { byte as char } else { '?' }) + .collect(); self.length = self.buffer.len(); } } @@ -141,16 +139,15 @@ impl InputStream { } // Reads a character and increases the current pointer - pub(crate) fn read_char(&mut self) -> Option - { + pub(crate) fn read_char(&mut self) -> Option { if self.eof() { return None; } let c = self.buffer[self.current]; - self.current+=1; + self.current += 1; - return Some(c) + return Some(c); } pub(crate) fn unread(&mut self) { @@ -167,12 +164,12 @@ impl InputStream { // Trying to look after the stream if c + idx > self.length as i32 { - return None + return None; } // Trying to look before the stream if c + idx < 0 { - return None + return None; } Some(self.buffer[(c + idx) as usize]) @@ -271,4 +268,4 @@ mod test { is.seek(4); assert_eq!(is.look_ahead(-1).unwrap(), 'c'); } -} \ No newline at end of file +} diff --git a/src/html5_parser/mod.rs b/src/html5_parser/mod.rs index 564a57b13..6542c7feb 100644 --- a/src/html5_parser/mod.rs +++ b/src/html5_parser/mod.rs @@ -1,40 +1,41 @@ -pub mod input_stream; - -mod node; -mod tokenizer; -mod token_replacements; -mod token_states; -mod consume_char_refs; -mod token_named_characters; -mod emitter; - -use tokenizer::Tokenizer; -use input_stream::InputStream; -use node::Node; - -pub struct Html5Parser<'a> { - tokenizer: Tokenizer<'a>, -} - -impl<'a> Html5Parser<'a> { - // Creates a new parser object with the given input stream - pub fn new(stream: &'a mut InputStream) -> Self { - Html5Parser { - tokenizer: Tokenizer::new(stream), - } - } - - // Parses the input stream into a Node tree - pub fn parse(&mut self) -> Node { - // Tokenize stuff - - for _ in 1..=20 { - let t = self.tokenizer.next_token(); - println!("{}", t); - } - - let mut n = Node::new("root"); - n.add_child(Node::new("child")); - return n; - } -} \ No newline at end of file +pub mod input_stream; + +mod consume_char_refs; +mod emitter; +mod node; +mod token; +mod token_named_characters; +mod token_replacements; +mod token_states; +mod tokenizer; + +use input_stream::InputStream; +use node::Node; +use tokenizer::Tokenizer; + +pub struct Html5Parser<'a> { + tokenizer: Tokenizer<'a>, +} + +impl<'a> Html5Parser<'a> { + // Creates a new parser object with the given input stream + pub fn new(stream: &'a mut InputStream) -> Self { + Html5Parser { + tokenizer: Tokenizer::new(stream), + } + } + + // Parses the input stream into a Node tree + pub fn parse(&mut self) -> Node { + // Tokenize stuff + + for _ in 1..=20 { + let t = self.tokenizer.next_token(); + println!("{}", t.to_string()); + } + + let mut n = Node::new("root"); + n.add_child(Node::new("child")); + return n; + } +} diff --git a/src/html5_parser/node.rs b/src/html5_parser/node.rs index d4b8745e8..2e96b567f 100644 --- a/src/html5_parser/node.rs +++ b/src/html5_parser/node.rs @@ -1,42 +1,42 @@ -// A DOM node that has been generated by the parser. -pub struct Node<'a> { - value: &'a str, - children: Vec>, -} - -impl<'a> Node<'a> { - pub fn new(value: &'a str) -> Self { - Node { - value, - children: Vec::new(), - } - } - - pub fn add_child(&mut self, child: Node<'a>) { - self.children.push(child) - } -} - -#[cfg(test)] -mod test { - use super::*; - - #[test] - fn test_nodes() { - let mut n = Node::new("foo"); - assert_eq!(n.value, "foo"); - assert_eq!(n.children.len(), 0); - - let n2 = Node::new("bar"); - let n3 = Node::new("baz"); - n.add_child(n2); - n.add_child(n3); - assert_eq!(n.children.len(), 2); - - assert_eq!(n.children[0].value, "bar"); - assert_eq!(n.children[0].children.len(), 0); - - assert_eq!(n.children[1].value, "baz"); - assert_eq!(n.children[1].children.len(), 0); - } -} \ No newline at end of file +// A DOM node that has been generated by the parser. +pub struct Node<'a> { + value: &'a str, + children: Vec>, +} + +impl<'a> Node<'a> { + pub fn new(value: &'a str) -> Self { + Node { + value, + children: Vec::new(), + } + } + + pub fn add_child(&mut self, child: Node<'a>) { + self.children.push(child) + } +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn test_nodes() { + let mut n = Node::new("foo"); + assert_eq!(n.value, "foo"); + assert_eq!(n.children.len(), 0); + + let n2 = Node::new("bar"); + let n3 = Node::new("baz"); + n.add_child(n2); + n.add_child(n3); + assert_eq!(n.children.len(), 2); + + assert_eq!(n.children[0].value, "bar"); + assert_eq!(n.children[0].children.len(), 0); + + assert_eq!(n.children[1].value, "baz"); + assert_eq!(n.children[1].children.len(), 0); + } +} diff --git a/src/html5_parser/token.rs b/src/html5_parser/token.rs new file mode 100755 index 000000000..84849cd79 --- /dev/null +++ b/src/html5_parser/token.rs @@ -0,0 +1,97 @@ +// The different tokens types that can be emitted by the tokenizer +#[derive(Debug, PartialEq)] +pub enum TokenType { + DocTypeToken, + StartTagToken, + EndTagToken, + CommentToken, + TextToken, + EofToken, +} + +pub enum Token { + DocTypeToken { + name: String, + force_quirks: bool, + pub_identifier: Option, + sys_identifier: Option, + }, + StartTagToken { + name: String, + is_self_closing: bool, + attributes: Vec<(String, String)>, + }, + EndTagToken { + name: String, + }, + CommentToken { + value: String, + }, + TextToken { + value: String, + }, + EofToken, +} + +impl std::fmt::Display for Token { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + match self { + Token::DocTypeToken { + name, + force_quirks, + pub_identifier, + sys_identifier, + } => { + let mut result = format!("<{} ", name); + if *force_quirks { + result.push_str(" FORCE_QUIRKS!"); + } + if let Some(pub_id) = pub_identifier { + result.push_str(&format!(" {} ", pub_id)); + } + if let Some(sys_id) = sys_identifier { + result.push_str(&format!(" {} ", sys_id)); + } + result.push('>'); + write!(f, "{}", result) + } + Token::CommentToken { value } => write!(f, "", value), + Token::TextToken { value } => write!(f, "{}", value), + Token::StartTagToken { + name, + is_self_closing, + attributes, + } => { + let mut result = format!("<{}", name); + for (key, value) in attributes.iter() { + result.push_str(&format!(" {}=\"{}\"", key, value)); + } + if *is_self_closing { + result.push_str(" /"); + } + result.push('>'); + write!(f, "{}", result) + } + Token::EndTagToken { name } => write!(f, "", name), + Token::EofToken => write!(f, "EOF"), + } + } +} + +pub trait TokenTrait { + // Return the token type of the given token + fn type_of(&self) -> TokenType; +} + +impl TokenTrait for Token { + fn type_of(&self) -> TokenType { + match self { + Token::DocTypeToken { .. } => TokenType::DocTypeToken, + Token::StartTagToken { .. } => TokenType::StartTagToken, + Token::EndTagToken { .. } => TokenType::EndTagToken, + Token::CommentToken { .. } => TokenType::CommentToken, + Token::TextToken { .. } => TokenType::TextToken, + Token::EofToken => TokenType::EofToken, + } + } +} diff --git a/src/html5_parser/token_named_characters.rs b/src/html5_parser/token_named_characters.rs index a44878615..335c2287d 100644 --- a/src/html5_parser/token_named_characters.rs +++ b/src/html5_parser/token_named_characters.rs @@ -1,2239 +1,2239 @@ -use phf::phf_map; - -// Converted from golang.org/x/net/html/entity.go -// Taken from https://dev.w3.org/html5/spec-LC/named-character-references.html#named-character-references - -pub static TOKEN_NAMED_CHARS: phf::Map<&'static str, &'static str> = phf_map! { - "AElig;" => "\u{00C6}", - "AMP;" => "\u{0026}", - "Aacute;" => "\u{00C1}", - "Abreve;" => "\u{0102}", - "Acirc;" => "\u{00C2}", - "Acy;" => "\u{0410}", - "Afr;" => "\u{1D504}", - "Agrave;" => "\u{00C0}", - "Alpha;" => "\u{0391}", - "Amacr;" => "\u{0100}", - "And;" => "\u{2A53}", - "Aogon;" => "\u{0104}", - "Aopf;" => "\u{1D538}", - "ApplyFunction;" => "\u{2061}", - "Aring;" => "\u{00C5}", - "Ascr;" => "\u{1D49C}", - "Assign;" => "\u{2254}", - "Atilde;" => "\u{00C3}", - "Auml;" => "\u{00C4}", - "Backslash;" => "\u{2216}", - "Barv;" => "\u{2AE7}", - "Barwed;" => "\u{2306}", - "Bcy;" => "\u{0411}", - "Because;" => "\u{2235}", - "Bernoullis;" => "\u{212C}", - "Beta;" => "\u{0392}", - "Bfr;" => "\u{1D505}", - "Bopf;" => "\u{1D539}", - "Breve;" => "\u{02D8}", - "Bscr;" => "\u{212C}", - "Bumpeq;" => "\u{224E}", - "CHcy;" => "\u{0427}", - "COPY;" => "\u{00A9}", - "Cacute;" => "\u{0106}", - "Cap;" => "\u{22D2}", - "CapitalDifferentialD;" => "\u{2145}", - "Cayleys;" => "\u{212D}", - "Ccaron;" => "\u{010C}", - "Ccedil;" => "\u{00C7}", - "Ccirc;" => "\u{0108}", - "Cconint;" => "\u{2230}", - "Cdot;" => "\u{010A}", - "Cedilla;" => "\u{00B8}", - "CenterDot;" => "\u{00B7}", - "Cfr;" => "\u{212D}", - "Chi;" => "\u{03A7}", - "CircleDot;" => "\u{2299}", - "CircleMinus;" => "\u{2296}", - "CirclePlus;" => "\u{2295}", - "CircleTimes;" => "\u{2297}", - "ClockwiseContourIntegral;" => "\u{2232}", - "CloseCurlyDoubleQuote;" => "\u{201D}", - "CloseCurlyQuote;" => "\u{2019}", - "Colon;" => "\u{2237}", - "Colone;" => "\u{2A74}", - "Congruent;" => "\u{2261}", - "Conint;" => "\u{222F}", - "ContourIntegral;" => "\u{222E}", - "Copf;" => "\u{2102}", - "Coproduct;" => "\u{2210}", - "CounterClockwiseContourIntegral;" => "\u{2233}", - "Cross;" => "\u{2A2F}", - "Cscr;" => "\u{1D49E}", - "Cup;" => "\u{22D3}", - "CupCap;" => "\u{224D}", - "DD;" => "\u{2145}", - "DDotrahd;" => "\u{2911}", - "DJcy;" => "\u{0402}", - "DScy;" => "\u{0405}", - "DZcy;" => "\u{040F}", - "Dagger;" => "\u{2021}", - "Darr;" => "\u{21A1}", - "Dashv;" => "\u{2AE4}", - "Dcaron;" => "\u{010E}", - "Dcy;" => "\u{0414}", - "Del;" => "\u{2207}", - "Delta;" => "\u{0394}", - "Dfr;" => "\u{1D507}", - "DiacriticalAcute;" => "\u{00B4}", - "DiacriticalDot;" => "\u{02D9}", - "DiacriticalDoubleAcute;" => "\u{02DD}", - "DiacriticalGrave;" => "\u{0060}", - "DiacriticalTilde;" => "\u{02DC}", - "Diamond;" => "\u{22C4}", - "DifferentialD;" => "\u{2146}", - "Dopf;" => "\u{1D53B}", - "Dot;" => "\u{00A8}", - "DotDot;" => "\u{20DC}", - "DotEqual;" => "\u{2250}", - "DoubleContourIntegral;" => "\u{222F}", - "DoubleDot;" => "\u{00A8}", - "DoubleDownArrow;" => "\u{21D3}", - "DoubleLeftArrow;" => "\u{21D0}", - "DoubleLeftRightArrow;" => "\u{21D4}", - "DoubleLeftTee;" => "\u{2AE4}", - "DoubleLongLeftArrow;" => "\u{27F8}", - "DoubleLongLeftRightArrow;" => "\u{27FA}", - "DoubleLongRightArrow;" => "\u{27F9}", - "DoubleRightArrow;" => "\u{21D2}", - "DoubleRightTee;" => "\u{22A8}", - "DoubleUpArrow;" => "\u{21D1}", - "DoubleUpDownArrow;" => "\u{21D5}", - "DoubleVerticalBar;" => "\u{2225}", - "DownArrow;" => "\u{2193}", - "DownArrowBar;" => "\u{2913}", - "DownArrowUpArrow;" => "\u{21F5}", - "DownBreve;" => "\u{0311}", - "DownLeftRightVector;" => "\u{2950}", - "DownLeftTeeVector;" => "\u{295E}", - "DownLeftVector;" => "\u{21BD}", - "DownLeftVectorBar;" => "\u{2956}", - "DownRightTeeVector;" => "\u{295F}", - "DownRightVector;" => "\u{21C1}", - "DownRightVectorBar;" => "\u{2957}", - "DownTee;" => "\u{22A4}", - "DownTeeArrow;" => "\u{21A7}", - "Downarrow;" => "\u{21D3}", - "Dscr;" => "\u{1D49F}", - "Dstrok;" => "\u{0110}", - "ENG;" => "\u{014A}", - "ETH;" => "\u{00D0}", - "Eacute;" => "\u{00C9}", - "Ecaron;" => "\u{011A}", - "Ecirc;" => "\u{00CA}", - "Ecy;" => "\u{042D}", - "Edot;" => "\u{0116}", - "Efr;" => "\u{1D508}", - "Egrave;" => "\u{00C8}", - "Element;" => "\u{2208}", - "Emacr;" => "\u{0112}", - "EmptySmallSquare;" => "\u{25FB}", - "EmptyVerySmallSquare;" => "\u{25AB}", - "Eogon;" => "\u{0118}", - "Eopf;" => "\u{1D53C}", - "Epsilon;" => "\u{0395}", - "Equal;" => "\u{2A75}", - "EqualTilde;" => "\u{2242}", - "Equilibrium;" => "\u{21CC}", - "Escr;" => "\u{2130}", - "Esim;" => "\u{2A73}", - "Eta;" => "\u{0397}", - "Euml;" => "\u{00CB}", - "Exists;" => "\u{2203}", - "ExponentialE;" => "\u{2147}", - "Fcy;" => "\u{0424}", - "Ffr;" => "\u{1D509}", - "FilledSmallSquare;" => "\u{25FC}", - "FilledVerySmallSquare;" => "\u{25AA}", - "Fopf;" => "\u{1D53D}", - "ForAll;" => "\u{2200}", - "Fouriertrf;" => "\u{2131}", - "Fscr;" => "\u{2131}", - "GJcy;" => "\u{0403}", - "GT;" => "\u{003E}", - "Gamma;" => "\u{0393}", - "Gammad;" => "\u{03DC}", - "Gbreve;" => "\u{011E}", - "Gcedil;" => "\u{0122}", - "Gcirc;" => "\u{011C}", - "Gcy;" => "\u{0413}", - "Gdot;" => "\u{0120}", - "Gfr;" => "\u{1D50A}", - "Gg;" => "\u{22D9}", - "Gopf;" => "\u{1D53E}", - "GreaterEqual;" => "\u{2265}", - "GreaterEqualLess;" => "\u{22DB}", - "GreaterFullEqual;" => "\u{2267}", - "GreaterGreater;" => "\u{2AA2}", - "GreaterLess;" => "\u{2277}", - "GreaterSlantEqual;" => "\u{2A7E}", - "GreaterTilde;" => "\u{2273}", - "Gscr;" => "\u{1D4A2}", - "Gt;" => "\u{226B}", - "HARDcy;" => "\u{042A}", - "Hacek;" => "\u{02C7}", - "Hat;" => "\u{005E}", - "Hcirc;" => "\u{0124}", - "Hfr;" => "\u{210C}", - "HilbertSpace;" => "\u{210B}", - "Hopf;" => "\u{210D}", - "HorizontalLine;" => "\u{2500}", - "Hscr;" => "\u{210B}", - "Hstrok;" => "\u{0126}", - "HumpDownHump;" => "\u{224E}", - "HumpEqual;" => "\u{224F}", - "IEcy;" => "\u{0415}", - "IJlig;" => "\u{0132}", - "IOcy;" => "\u{0401}", - "Iacute;" => "\u{00CD}", - "Icirc;" => "\u{00CE}", - "Icy;" => "\u{0418}", - "Idot;" => "\u{0130}", - "Ifr;" => "\u{2111}", - "Igrave;" => "\u{00CC}", - "Im;" => "\u{2111}", - "Imacr;" => "\u{012A}", - "ImaginaryI;" => "\u{2148}", - "Implies;" => "\u{21D2}", - "Int;" => "\u{222C}", - "Integral;" => "\u{222B}", - "Intersection;" => "\u{22C2}", - "InvisibleComma;" => "\u{2063}", - "InvisibleTimes;" => "\u{2062}", - "Iogon;" => "\u{012E}", - "Iopf;" => "\u{1D540}", - "Iota;" => "\u{0399}", - "Iscr;" => "\u{2110}", - "Itilde;" => "\u{0128}", - "Iukcy;" => "\u{0406}", - "Iuml;" => "\u{00CF}", - "Jcirc;" => "\u{0134}", - "Jcy;" => "\u{0419}", - "Jfr;" => "\u{1D50D}", - "Jopf;" => "\u{1D541}", - "Jscr;" => "\u{1D4A5}", - "Jsercy;" => "\u{0408}", - "Jukcy;" => "\u{0404}", - "KHcy;" => "\u{0425}", - "KJcy;" => "\u{040C}", - "Kappa;" => "\u{039A}", - "Kcedil;" => "\u{0136}", - "Kcy;" => "\u{041A}", - "Kfr;" => "\u{1D50E}", - "Kopf;" => "\u{1D542}", - "Kscr;" => "\u{1D4A6}", - "LJcy;" => "\u{0409}", - "LT;" => "\u{003C}", - "Lacute;" => "\u{0139}", - "Lambda;" => "\u{039B}", - "Lang;" => "\u{27EA}", - "Laplacetrf;" => "\u{2112}", - "Larr;" => "\u{219E}", - "Lcaron;" => "\u{013D}", - "Lcedil;" => "\u{013B}", - "Lcy;" => "\u{041B}", - "LeftAngleBracket;" => "\u{27E8}", - "LeftArrow;" => "\u{2190}", - "LeftArrowBar;" => "\u{21E4}", - "LeftArrowRightArrow;" => "\u{21C6}", - "LeftCeiling;" => "\u{2308}", - "LeftDoubleBracket;" => "\u{27E6}", - "LeftDownTeeVector;" => "\u{2961}", - "LeftDownVector;" => "\u{21C3}", - "LeftDownVectorBar;" => "\u{2959}", - "LeftFloor;" => "\u{230A}", - "LeftRightArrow;" => "\u{2194}", - "LeftRightVector;" => "\u{294E}", - "LeftTee;" => "\u{22A3}", - "LeftTeeArrow;" => "\u{21A4}", - "LeftTeeVector;" => "\u{295A}", - "LeftTriangle;" => "\u{22B2}", - "LeftTriangleBar;" => "\u{29CF}", - "LeftTriangleEqual;" => "\u{22B4}", - "LeftUpDownVector;" => "\u{2951}", - "LeftUpTeeVector;" => "\u{2960}", - "LeftUpVector;" => "\u{21BF}", - "LeftUpVectorBar;" => "\u{2958}", - "LeftVector;" => "\u{21BC}", - "LeftVectorBar;" => "\u{2952}", - "Leftarrow;" => "\u{21D0}", - "Leftrightarrow;" => "\u{21D4}", - "LessEqualGreater;" => "\u{22DA}", - "LessFullEqual;" => "\u{2266}", - "LessGreater;" => "\u{2276}", - "LessLess;" => "\u{2AA1}", - "LessSlantEqual;" => "\u{2A7D}", - "LessTilde;" => "\u{2272}", - "Lfr;" => "\u{1D50F}", - "Ll;" => "\u{22D8}", - "Lleftarrow;" => "\u{21DA}", - "Lmidot;" => "\u{013F}", - "LongLeftArrow;" => "\u{27F5}", - "LongLeftRightArrow;" => "\u{27F7}", - "LongRightArrow;" => "\u{27F6}", - "Longleftarrow;" => "\u{27F8}", - "Longleftrightarrow;" => "\u{27FA}", - "Longrightarrow;" => "\u{27F9}", - "Lopf;" => "\u{1D543}", - "LowerLeftArrow;" => "\u{2199}", - "LowerRightArrow;" => "\u{2198}", - "Lscr;" => "\u{2112}", - "Lsh;" => "\u{21B0}", - "Lstrok;" => "\u{0141}", - "Lt;" => "\u{226A}", - "Map;" => "\u{2905}", - "Mcy;" => "\u{041C}", - "MediumSpace;" => "\u{205F}", - "Mellintrf;" => "\u{2133}", - "Mfr;" => "\u{1D510}", - "MinusPlus;" => "\u{2213}", - "Mopf;" => "\u{1D544}", - "Mscr;" => "\u{2133}", - "Mu;" => "\u{039C}", - "NJcy;" => "\u{040A}", - "Nacute;" => "\u{0143}", - "Ncaron;" => "\u{0147}", - "Ncedil;" => "\u{0145}", - "Ncy;" => "\u{041D}", - "NegativeMediumSpace;" => "\u{200B}", - "NegativeThickSpace;" => "\u{200B}", - "NegativeThinSpace;" => "\u{200B}", - "NegativeVeryThinSpace;" => "\u{200B}", - "NestedGreaterGreater;" => "\u{226B}", - "NestedLessLess;" => "\u{226A}", - "NewLine;" => "\u{000A}", - "Nfr;" => "\u{1D511}", - "NoBreak;" => "\u{2060}", - "NonBreakingSpace;" => "\u{00A0}", - "Nopf;" => "\u{2115}", - "Not;" => "\u{2AEC}", - "NotCongruent;" => "\u{2262}", - "NotCupCap;" => "\u{226D}", - "NotDoubleVerticalBar;" => "\u{2226}", - "NotElement;" => "\u{2209}", - "NotEqual;" => "\u{2260}", - "NotExists;" => "\u{2204}", - "NotGreater;" => "\u{226F}", - "NotGreaterEqual;" => "\u{2271}", - "NotGreaterLess;" => "\u{2279}", - "NotGreaterTilde;" => "\u{2275}", - "NotLeftTriangle;" => "\u{22EA}", - "NotLeftTriangleEqual;" => "\u{22EC}", - "NotLess;" => "\u{226E}", - "NotLessEqual;" => "\u{2270}", - "NotLessGreater;" => "\u{2278}", - "NotLessTilde;" => "\u{2274}", - "NotPrecedes;" => "\u{2280}", - "NotPrecedesSlantEqual;" => "\u{22E0}", - "NotReverseElement;" => "\u{220C}", - "NotRightTriangle;" => "\u{22EB}", - "NotRightTriangleEqual;" => "\u{22ED}", - "NotSquareSubsetEqual;" => "\u{22E2}", - "NotSquareSupersetEqual;" => "\u{22E3}", - "NotSubsetEqual;" => "\u{2288}", - "NotSucceeds;" => "\u{2281}", - "NotSucceedsSlantEqual;" => "\u{22E1}", - "NotSupersetEqual;" => "\u{2289}", - "NotTilde;" => "\u{2241}", - "NotTildeEqual;" => "\u{2244}", - "NotTildeFullEqual;" => "\u{2247}", - "NotTildeTilde;" => "\u{2249}", - "NotVerticalBar;" => "\u{2224}", - "Nscr;" => "\u{1D4A9}", - "Ntilde;" => "\u{00D1}", - "Nu;" => "\u{039D}", - "OElig;" => "\u{0152}", - "Oacute;" => "\u{00D3}", - "Ocirc;" => "\u{00D4}", - "Ocy;" => "\u{041E}", - "Odblac;" => "\u{0150}", - "Ofr;" => "\u{1D512}", - "Ograve;" => "\u{00D2}", - "Omacr;" => "\u{014C}", - "Omega;" => "\u{03A9}", - "Omicron;" => "\u{039F}", - "Oopf;" => "\u{1D546}", - "OpenCurlyDoubleQuote;" => "\u{201C}", - "OpenCurlyQuote;" => "\u{2018}", - "Or;" => "\u{2A54}", - "Oscr;" => "\u{1D4AA}", - "Oslash;" => "\u{00D8}", - "Otilde;" => "\u{00D5}", - "Otimes;" => "\u{2A37}", - "Ouml;" => "\u{00D6}", - "OverBar;" => "\u{203E}", - "OverBrace;" => "\u{23DE}", - "OverBracket;" => "\u{23B4}", - "OverParenthesis;" => "\u{23DC}", - "PartialD;" => "\u{2202}", - "Pcy;" => "\u{041F}", - "Pfr;" => "\u{1D513}", - "Phi;" => "\u{03A6}", - "Pi;" => "\u{03A0}", - "PlusMinus;" => "\u{00B1}", - "Poincareplane;" => "\u{210C}", - "Popf;" => "\u{2119}", - "Pr;" => "\u{2ABB}", - "Precedes;" => "\u{227A}", - "PrecedesEqual;" => "\u{2AAF}", - "PrecedesSlantEqual;" => "\u{227C}", - "PrecedesTilde;" => "\u{227E}", - "Prime;" => "\u{2033}", - "Product;" => "\u{220F}", - "Proportion;" => "\u{2237}", - "Proportional;" => "\u{221D}", - "Pscr;" => "\u{1D4AB}", - "Psi;" => "\u{03A8}", - "QUOT;" => "\u{0022}", - "Qfr;" => "\u{1D514}", - "Qopf;" => "\u{211A}", - "Qscr;" => "\u{1D4AC}", - "RBarr;" => "\u{2910}", - "REG;" => "\u{00AE}", - "Racute;" => "\u{0154}", - "Rang;" => "\u{27EB}", - "Rarr;" => "\u{21A0}", - "Rarrtl;" => "\u{2916}", - "Rcaron;" => "\u{0158}", - "Rcedil;" => "\u{0156}", - "Rcy;" => "\u{0420}", - "Re;" => "\u{211C}", - "ReverseElement;" => "\u{220B}", - "ReverseEquilibrium;" => "\u{21CB}", - "ReverseUpEquilibrium;" => "\u{296F}", - "Rfr;" => "\u{211C}", - "Rho;" => "\u{03A1}", - "RightAngleBracket;" => "\u{27E9}", - "RightArrow;" => "\u{2192}", - "RightArrowBar;" => "\u{21E5}", - "RightArrowLeftArrow;" => "\u{21C4}", - "RightCeiling;" => "\u{2309}", - "RightDoubleBracket;" => "\u{27E7}", - "RightDownTeeVector;" => "\u{295D}", - "RightDownVector;" => "\u{21C2}", - "RightDownVectorBar;" => "\u{2955}", - "RightFloor;" => "\u{230B}", - "RightTee;" => "\u{22A2}", - "RightTeeArrow;" => "\u{21A6}", - "RightTeeVector;" => "\u{295B}", - "RightTriangle;" => "\u{22B3}", - "RightTriangleBar;" => "\u{29D0}", - "RightTriangleEqual;" => "\u{22B5}", - "RightUpDownVector;" => "\u{294F}", - "RightUpTeeVector;" => "\u{295C}", - "RightUpVector;" => "\u{21BE}", - "RightUpVectorBar;" => "\u{2954}", - "RightVector;" => "\u{21C0}", - "RightVectorBar;" => "\u{2953}", - "Rightarrow;" => "\u{21D2}", - "Ropf;" => "\u{211D}", - "RoundImplies;" => "\u{2970}", - "Rrightarrow;" => "\u{21DB}", - "Rscr;" => "\u{211B}", - "Rsh;" => "\u{21B1}", - "RuleDelayed;" => "\u{29F4}", - "SHCHcy;" => "\u{0429}", - "SHcy;" => "\u{0428}", - "SOFTcy;" => "\u{042C}", - "Sacute;" => "\u{015A}", - "Sc;" => "\u{2ABC}", - "Scaron;" => "\u{0160}", - "Scedil;" => "\u{015E}", - "Scirc;" => "\u{015C}", - "Scy;" => "\u{0421}", - "Sfr;" => "\u{1D516}", - "ShortDownArrow;" => "\u{2193}", - "ShortLeftArrow;" => "\u{2190}", - "ShortRightArrow;" => "\u{2192}", - "ShortUpArrow;" => "\u{2191}", - "Sigma;" => "\u{03A3}", - "SmallCircle;" => "\u{2218}", - "Sopf;" => "\u{1D54A}", - "Sqrt;" => "\u{221A}", - "Square;" => "\u{25A1}", - "SquareIntersection;" => "\u{2293}", - "SquareSubset;" => "\u{228F}", - "SquareSubsetEqual;" => "\u{2291}", - "SquareSuperset;" => "\u{2290}", - "SquareSupersetEqual;" => "\u{2292}", - "SquareUnion;" => "\u{2294}", - "Sscr;" => "\u{1D4AE}", - "Star;" => "\u{22C6}", - "Sub;" => "\u{22D0}", - "Subset;" => "\u{22D0}", - "SubsetEqual;" => "\u{2286}", - "Succeeds;" => "\u{227B}", - "SucceedsEqual;" => "\u{2AB0}", - "SucceedsSlantEqual;" => "\u{227D}", - "SucceedsTilde;" => "\u{227F}", - "SuchThat;" => "\u{220B}", - "Sum;" => "\u{2211}", - "Sup;" => "\u{22D1}", - "Superset;" => "\u{2283}", - "SupersetEqual;" => "\u{2287}", - "Supset;" => "\u{22D1}", - "THORN;" => "\u{00DE}", - "TRADE;" => "\u{2122}", - "TSHcy;" => "\u{040B}", - "TScy;" => "\u{0426}", - "Tab;" => "\u{0009}", - "Tau;" => "\u{03A4}", - "Tcaron;" => "\u{0164}", - "Tcedil;" => "\u{0162}", - "Tcy;" => "\u{0422}", - "Tfr;" => "\u{1D517}", - "Therefore;" => "\u{2234}", - "Theta;" => "\u{0398}", - "ThinSpace;" => "\u{2009}", - "Tilde;" => "\u{223C}", - "TildeEqual;" => "\u{2243}", - "TildeFullEqual;" => "\u{2245}", - "TildeTilde;" => "\u{2248}", - "Topf;" => "\u{1D54B}", - "TripleDot;" => "\u{20DB}", - "Tscr;" => "\u{1D4AF}", - "Tstrok;" => "\u{0166}", - "Uacute;" => "\u{00DA}", - "Uarr;" => "\u{219F}", - "Uarrocir;" => "\u{2949}", - "Ubrcy;" => "\u{040E}", - "Ubreve;" => "\u{016C}", - "Ucirc;" => "\u{00DB}", - "Ucy;" => "\u{0423}", - "Udblac;" => "\u{0170}", - "Ufr;" => "\u{1D518}", - "Ugrave;" => "\u{00D9}", - "Umacr;" => "\u{016A}", - "UnderBar;" => "\u{005F}", - "UnderBrace;" => "\u{23DF}", - "UnderBracket;" => "\u{23B5}", - "UnderParenthesis;" => "\u{23DD}", - "Union;" => "\u{22C3}", - "UnionPlus;" => "\u{228E}", - "Uogon;" => "\u{0172}", - "Uopf;" => "\u{1D54C}", - "UpArrow;" => "\u{2191}", - "UpArrowBar;" => "\u{2912}", - "UpArrowDownArrow;" => "\u{21C5}", - "UpDownArrow;" => "\u{2195}", - "UpEquilibrium;" => "\u{296E}", - "UpTee;" => "\u{22A5}", - "UpTeeArrow;" => "\u{21A5}", - "Uparrow;" => "\u{21D1}", - "Updownarrow;" => "\u{21D5}", - "UpperLeftArrow;" => "\u{2196}", - "UpperRightArrow;" => "\u{2197}", - "Upsi;" => "\u{03D2}", - "Upsilon;" => "\u{03A5}", - "Uring;" => "\u{016E}", - "Uscr;" => "\u{1D4B0}", - "Utilde;" => "\u{0168}", - "Uuml;" => "\u{00DC}", - "VDash;" => "\u{22AB}", - "Vbar;" => "\u{2AEB}", - "Vcy;" => "\u{0412}", - "Vdash;" => "\u{22A9}", - "Vdashl;" => "\u{2AE6}", - "Vee;" => "\u{22C1}", - "Verbar;" => "\u{2016}", - "Vert;" => "\u{2016}", - "VerticalBar;" => "\u{2223}", - "VerticalLine;" => "\u{007C}", - "VerticalSeparator;" => "\u{2758}", - "VerticalTilde;" => "\u{2240}", - "VeryThinSpace;" => "\u{200A}", - "Vfr;" => "\u{1D519}", - "Vopf;" => "\u{1D54D}", - "Vscr;" => "\u{1D4B1}", - "Vvdash;" => "\u{22AA}", - "Wcirc;" => "\u{0174}", - "Wedge;" => "\u{22C0}", - "Wfr;" => "\u{1D51A}", - "Wopf;" => "\u{1D54E}", - "Wscr;" => "\u{1D4B2}", - "Xfr;" => "\u{1D51B}", - "Xi;" => "\u{039E}", - "Xopf;" => "\u{1D54F}", - "Xscr;" => "\u{1D4B3}", - "YAcy;" => "\u{042F}", - "YIcy;" => "\u{0407}", - "YUcy;" => "\u{042E}", - "Yacute;" => "\u{00DD}", - "Ycirc;" => "\u{0176}", - "Ycy;" => "\u{042B}", - "Yfr;" => "\u{1D51C}", - "Yopf;" => "\u{1D550}", - "Yscr;" => "\u{1D4B4}", - "Yuml;" => "\u{0178}", - "ZHcy;" => "\u{0416}", - "Zacute;" => "\u{0179}", - "Zcaron;" => "\u{017D}", - "Zcy;" => "\u{0417}", - "Zdot;" => "\u{017B}", - "ZeroWidthSpace;" => "\u{200B}", - "Zeta;" => "\u{0396}", - "Zfr;" => "\u{2128}", - "Zopf;" => "\u{2124}", - "Zscr;" => "\u{1D4B5}", - "aacute;" => "\u{00E1}", - "abreve;" => "\u{0103}", - "ac;" => "\u{223E}", - "acd;" => "\u{223F}", - "acirc;" => "\u{00E2}", - "acute;" => "\u{00B4}", - "acy;" => "\u{0430}", - "aelig;" => "\u{00E6}", - "af;" => "\u{2061}", - "afr;" => "\u{1D51E}", - "agrave;" => "\u{00E0}", - "alefsym;" => "\u{2135}", - "aleph;" => "\u{2135}", - "alpha;" => "\u{03B1}", - "amacr;" => "\u{0101}", - "amalg;" => "\u{2A3F}", - "amp;" => "\u{0026}", - "and;" => "\u{2227}", - "andand;" => "\u{2A55}", - "andd;" => "\u{2A5C}", - "andslope;" => "\u{2A58}", - "andv;" => "\u{2A5A}", - "ang;" => "\u{2220}", - "ange;" => "\u{29A4}", - "angle;" => "\u{2220}", - "angmsd;" => "\u{2221}", - "angmsdaa;" => "\u{29A8}", - "angmsdab;" => "\u{29A9}", - "angmsdac;" => "\u{29AA}", - "angmsdad;" => "\u{29AB}", - "angmsdae;" => "\u{29AC}", - "angmsdaf;" => "\u{29AD}", - "angmsdag;" => "\u{29AE}", - "angmsdah;" => "\u{29AF}", - "angrt;" => "\u{221F}", - "angrtvb;" => "\u{22BE}", - "angrtvbd;" => "\u{299D}", - "angsph;" => "\u{2222}", - "angst;" => "\u{00C5}", - "angzarr;" => "\u{237C}", - "aogon;" => "\u{0105}", - "aopf;" => "\u{1D552}", - "ap;" => "\u{2248}", - "apE;" => "\u{2A70}", - "apacir;" => "\u{2A6F}", - "ape;" => "\u{224A}", - "apid;" => "\u{224B}", - "apos;" => "\u{0027}", - "approx;" => "\u{2248}", - "approxeq;" => "\u{224A}", - "aring;" => "\u{00E5}", - "ascr;" => "\u{1D4B6}", - "ast;" => "\u{002A}", - "asymp;" => "\u{2248}", - "asympeq;" => "\u{224D}", - "atilde;" => "\u{00E3}", - "auml;" => "\u{00E4}", - "awconint;" => "\u{2233}", - "awint;" => "\u{2A11}", - "bNot;" => "\u{2AED}", - "backcong;" => "\u{224C}", - "backepsilon;" => "\u{03F6}", - "backprime;" => "\u{2035}", - "backsim;" => "\u{223D}", - "backsimeq;" => "\u{22CD}", - "barvee;" => "\u{22BD}", - "barwed;" => "\u{2305}", - "barwedge;" => "\u{2305}", - "bbrk;" => "\u{23B5}", - "bbrktbrk;" => "\u{23B6}", - "bcong;" => "\u{224C}", - "bcy;" => "\u{0431}", - "bdquo;" => "\u{201E}", - "becaus;" => "\u{2235}", - "because;" => "\u{2235}", - "bemptyv;" => "\u{29B0}", - "bepsi;" => "\u{03F6}", - "bernou;" => "\u{212C}", - "beta;" => "\u{03B2}", - "beth;" => "\u{2136}", - "between;" => "\u{226C}", - "bfr;" => "\u{1D51F}", - "bigcap;" => "\u{22C2}", - "bigcirc;" => "\u{25EF}", - "bigcup;" => "\u{22C3}", - "bigodot;" => "\u{2A00}", - "bigoplus;" => "\u{2A01}", - "bigotimes;" => "\u{2A02}", - "bigsqcup;" => "\u{2A06}", - "bigstar;" => "\u{2605}", - "bigtriangledown;" => "\u{25BD}", - "bigtriangleup;" => "\u{25B3}", - "biguplus;" => "\u{2A04}", - "bigvee;" => "\u{22C1}", - "bigwedge;" => "\u{22C0}", - "bkarow;" => "\u{290D}", - "blacklozenge;" => "\u{29EB}", - "blacksquare;" => "\u{25AA}", - "blacktriangle;" => "\u{25B4}", - "blacktriangledown;" => "\u{25BE}", - "blacktriangleleft;" => "\u{25C2}", - "blacktriangleright;" => "\u{25B8}", - "blank;" => "\u{2423}", - "blk12;" => "\u{2592}", - "blk14;" => "\u{2591}", - "blk34;" => "\u{2593}", - "block;" => "\u{2588}", - "bnot;" => "\u{2310}", - "bopf;" => "\u{1D553}", - "bot;" => "\u{22A5}", - "bottom;" => "\u{22A5}", - "bowtie;" => "\u{22C8}", - "boxDL;" => "\u{2557}", - "boxDR;" => "\u{2554}", - "boxDl;" => "\u{2556}", - "boxDr;" => "\u{2553}", - "boxH;" => "\u{2550}", - "boxHD;" => "\u{2566}", - "boxHU;" => "\u{2569}", - "boxHd;" => "\u{2564}", - "boxHu;" => "\u{2567}", - "boxUL;" => "\u{255D}", - "boxUR;" => "\u{255A}", - "boxUl;" => "\u{255C}", - "boxUr;" => "\u{2559}", - "boxV;" => "\u{2551}", - "boxVH;" => "\u{256C}", - "boxVL;" => "\u{2563}", - "boxVR;" => "\u{2560}", - "boxVh;" => "\u{256B}", - "boxVl;" => "\u{2562}", - "boxVr;" => "\u{255F}", - "boxbox;" => "\u{29C9}", - "boxdL;" => "\u{2555}", - "boxdR;" => "\u{2552}", - "boxdl;" => "\u{2510}", - "boxdr;" => "\u{250C}", - "boxh;" => "\u{2500}", - "boxhD;" => "\u{2565}", - "boxhU;" => "\u{2568}", - "boxhd;" => "\u{252C}", - "boxhu;" => "\u{2534}", - "boxminus;" => "\u{229F}", - "boxplus;" => "\u{229E}", - "boxtimes;" => "\u{22A0}", - "boxuL;" => "\u{255B}", - "boxuR;" => "\u{2558}", - "boxul;" => "\u{2518}", - "boxur;" => "\u{2514}", - "boxv;" => "\u{2502}", - "boxvH;" => "\u{256A}", - "boxvL;" => "\u{2561}", - "boxvR;" => "\u{255E}", - "boxvh;" => "\u{253C}", - "boxvl;" => "\u{2524}", - "boxvr;" => "\u{251C}", - "bprime;" => "\u{2035}", - "breve;" => "\u{02D8}", - "brvbar;" => "\u{00A6}", - "bscr;" => "\u{1D4B7}", - "bsemi;" => "\u{204F}", - "bsim;" => "\u{223D}", - "bsime;" => "\u{22CD}", - "bsol;" => "\u{005C}", - "bsolb;" => "\u{29C5}", - "bsolhsub;" => "\u{27C8}", - "bull;" => "\u{2022}", - "bullet;" => "\u{2022}", - "bump;" => "\u{224E}", - "bumpE;" => "\u{2AAE}", - "bumpe;" => "\u{224F}", - "bumpeq;" => "\u{224F}", - "cacute;" => "\u{0107}", - "cap;" => "\u{2229}", - "capand;" => "\u{2A44}", - "capbrcup;" => "\u{2A49}", - "capcap;" => "\u{2A4B}", - "capcup;" => "\u{2A47}", - "capdot;" => "\u{2A40}", - "caret;" => "\u{2041}", - "caron;" => "\u{02C7}", - "ccaps;" => "\u{2A4D}", - "ccaron;" => "\u{010D}", - "ccedil;" => "\u{00E7}", - "ccirc;" => "\u{0109}", - "ccups;" => "\u{2A4C}", - "ccupssm;" => "\u{2A50}", - "cdot;" => "\u{010B}", - "cedil;" => "\u{00B8}", - "cemptyv;" => "\u{29B2}", - "cent;" => "\u{00A2}", - "centerdot;" => "\u{00B7}", - "cfr;" => "\u{1D520}", - "chcy;" => "\u{0447}", - "check;" => "\u{2713}", - "checkmark;" => "\u{2713}", - "chi;" => "\u{03C7}", - "cir;" => "\u{25CB}", - "cirE;" => "\u{29C3}", - "circ;" => "\u{02C6}", - "circeq;" => "\u{2257}", - "circlearrowleft;" => "\u{21BA}", - "circlearrowright;" => "\u{21BB}", - "circledR;" => "\u{00AE}", - "circledS;" => "\u{24C8}", - "circledast;" => "\u{229B}", - "circledcirc;" => "\u{229A}", - "circleddash;" => "\u{229D}", - "cire;" => "\u{2257}", - "cirfnint;" => "\u{2A10}", - "cirmid;" => "\u{2AEF}", - "cirscir;" => "\u{29C2}", - "clubs;" => "\u{2663}", - "clubsuit;" => "\u{2663}", - "colon;" => "\u{003A}", - "colone;" => "\u{2254}", - "coloneq;" => "\u{2254}", - "comma;" => "\u{002C}", - "commat;" => "\u{0040}", - "comp;" => "\u{2201}", - "compfn;" => "\u{2218}", - "complement;" => "\u{2201}", - "complexes;" => "\u{2102}", - "cong;" => "\u{2245}", - "congdot;" => "\u{2A6D}", - "conint;" => "\u{222E}", - "copf;" => "\u{1D554}", - "coprod;" => "\u{2210}", - "copy;" => "\u{00A9}", - "copysr;" => "\u{2117}", - "crarr;" => "\u{21B5}", - "cross;" => "\u{2717}", - "cscr;" => "\u{1D4B8}", - "csub;" => "\u{2ACF}", - "csube;" => "\u{2AD1}", - "csup;" => "\u{2AD0}", - "csupe;" => "\u{2AD2}", - "ctdot;" => "\u{22EF}", - "cudarrl;" => "\u{2938}", - "cudarrr;" => "\u{2935}", - "cuepr;" => "\u{22DE}", - "cuesc;" => "\u{22DF}", - "cularr;" => "\u{21B6}", - "cularrp;" => "\u{293D}", - "cup;" => "\u{222A}", - "cupbrcap;" => "\u{2A48}", - "cupcap;" => "\u{2A46}", - "cupcup;" => "\u{2A4A}", - "cupdot;" => "\u{228D}", - "cupor;" => "\u{2A45}", - "curarr;" => "\u{21B7}", - "curarrm;" => "\u{293C}", - "curlyeqprec;" => "\u{22DE}", - "curlyeqsucc;" => "\u{22DF}", - "curlyvee;" => "\u{22CE}", - "curlywedge;" => "\u{22CF}", - "curren;" => "\u{00A4}", - "curvearrowleft;" => "\u{21B6}", - "curvearrowright;" => "\u{21B7}", - "cuvee;" => "\u{22CE}", - "cuwed;" => "\u{22CF}", - "cwconint;" => "\u{2232}", - "cwint;" => "\u{2231}", - "cylcty;" => "\u{232D}", - "dArr;" => "\u{21D3}", - "dHar;" => "\u{2965}", - "dagger;" => "\u{2020}", - "daleth;" => "\u{2138}", - "darr;" => "\u{2193}", - "dash;" => "\u{2010}", - "dashv;" => "\u{22A3}", - "dbkarow;" => "\u{290F}", - "dblac;" => "\u{02DD}", - "dcaron;" => "\u{010F}", - "dcy;" => "\u{0434}", - "dd;" => "\u{2146}", - "ddagger;" => "\u{2021}", - "ddarr;" => "\u{21CA}", - "ddotseq;" => "\u{2A77}", - "deg;" => "\u{00B0}", - "delta;" => "\u{03B4}", - "demptyv;" => "\u{29B1}", - "dfisht;" => "\u{297F}", - "dfr;" => "\u{1D521}", - "dharl;" => "\u{21C3}", - "dharr;" => "\u{21C2}", - "diam;" => "\u{22C4}", - "diamond;" => "\u{22C4}", - "diamondsuit;" => "\u{2666}", - "diams;" => "\u{2666}", - "die;" => "\u{00A8}", - "digamma;" => "\u{03DD}", - "disin;" => "\u{22F2}", - "div;" => "\u{00F7}", - "divide;" => "\u{00F7}", - "divideontimes;" => "\u{22C7}", - "divonx;" => "\u{22C7}", - "djcy;" => "\u{0452}", - "dlcorn;" => "\u{231E}", - "dlcrop;" => "\u{230D}", - "dollar;" => "\u{0024}", - "dopf;" => "\u{1D555}", - "dot;" => "\u{02D9}", - "doteq;" => "\u{2250}", - "doteqdot;" => "\u{2251}", - "dotminus;" => "\u{2238}", - "dotplus;" => "\u{2214}", - "dotsquare;" => "\u{22A1}", - "doublebarwedge;" => "\u{2306}", - "downarrow;" => "\u{2193}", - "downdownarrows;" => "\u{21CA}", - "downharpoonleft;" => "\u{21C3}", - "downharpoonright;" => "\u{21C2}", - "drbkarow;" => "\u{2910}", - "drcorn;" => "\u{231F}", - "drcrop;" => "\u{230C}", - "dscr;" => "\u{1D4B9}", - "dscy;" => "\u{0455}", - "dsol;" => "\u{29F6}", - "dstrok;" => "\u{0111}", - "dtdot;" => "\u{22F1}", - "dtri;" => "\u{25BF}", - "dtrif;" => "\u{25BE}", - "duarr;" => "\u{21F5}", - "duhar;" => "\u{296F}", - "dwangle;" => "\u{29A6}", - "dzcy;" => "\u{045F}", - "dzigrarr;" => "\u{27FF}", - "eDDot;" => "\u{2A77}", - "eDot;" => "\u{2251}", - "eacute;" => "\u{00E9}", - "easter;" => "\u{2A6E}", - "ecaron;" => "\u{011B}", - "ecir;" => "\u{2256}", - "ecirc;" => "\u{00EA}", - "ecolon;" => "\u{2255}", - "ecy;" => "\u{044D}", - "edot;" => "\u{0117}", - "ee;" => "\u{2147}", - "efDot;" => "\u{2252}", - "efr;" => "\u{1D522}", - "eg;" => "\u{2A9A}", - "egrave;" => "\u{00E8}", - "egs;" => "\u{2A96}", - "egsdot;" => "\u{2A98}", - "el;" => "\u{2A99}", - "elinters;" => "\u{23E7}", - "ell;" => "\u{2113}", - "els;" => "\u{2A95}", - "elsdot;" => "\u{2A97}", - "emacr;" => "\u{0113}", - "empty;" => "\u{2205}", - "emptyset;" => "\u{2205}", - "emptyv;" => "\u{2205}", - "emsp;" => "\u{2003}", - "emsp13;" => "\u{2004}", - "emsp14;" => "\u{2005}", - "eng;" => "\u{014B}", - "ensp;" => "\u{2002}", - "eogon;" => "\u{0119}", - "eopf;" => "\u{1D556}", - "epar;" => "\u{22D5}", - "eparsl;" => "\u{29E3}", - "eplus;" => "\u{2A71}", - "epsi;" => "\u{03B5}", - "epsilon;" => "\u{03B5}", - "epsiv;" => "\u{03F5}", - "eqcirc;" => "\u{2256}", - "eqcolon;" => "\u{2255}", - "eqsim;" => "\u{2242}", - "eqslantgtr;" => "\u{2A96}", - "eqslantless;" => "\u{2A95}", - "equals;" => "\u{003D}", - "equest;" => "\u{225F}", - "equiv;" => "\u{2261}", - "equivDD;" => "\u{2A78}", - "eqvparsl;" => "\u{29E5}", - "erDot;" => "\u{2253}", - "erarr;" => "\u{2971}", - "escr;" => "\u{212F}", - "esdot;" => "\u{2250}", - "esim;" => "\u{2242}", - "eta;" => "\u{03B7}", - "eth;" => "\u{00F0}", - "euml;" => "\u{00EB}", - "euro;" => "\u{20AC}", - "excl;" => "\u{0021}", - "exist;" => "\u{2203}", - "expectation;" => "\u{2130}", - "exponentiale;" => "\u{2147}", - "fallingdotseq;" => "\u{2252}", - "fcy;" => "\u{0444}", - "female;" => "\u{2640}", - "ffilig;" => "\u{FB03}", - "fflig;" => "\u{FB00}", - "ffllig;" => "\u{FB04}", - "ffr;" => "\u{1D523}", - "filig;" => "\u{FB01}", - "flat;" => "\u{266D}", - "fllig;" => "\u{FB02}", - "fltns;" => "\u{25B1}", - "fnof;" => "\u{0192}", - "fopf;" => "\u{1D557}", - "forall;" => "\u{2200}", - "fork;" => "\u{22D4}", - "forkv;" => "\u{2AD9}", - "fpartint;" => "\u{2A0D}", - "frac12;" => "\u{00BD}", - "frac13;" => "\u{2153}", - "frac14;" => "\u{00BC}", - "frac15;" => "\u{2155}", - "frac16;" => "\u{2159}", - "frac18;" => "\u{215B}", - "frac23;" => "\u{2154}", - "frac25;" => "\u{2156}", - "frac34;" => "\u{00BE}", - "frac35;" => "\u{2157}", - "frac38;" => "\u{215C}", - "frac45;" => "\u{2158}", - "frac56;" => "\u{215A}", - "frac58;" => "\u{215D}", - "frac78;" => "\u{215E}", - "frasl;" => "\u{2044}", - "frown;" => "\u{2322}", - "fscr;" => "\u{1D4BB}", - "gE;" => "\u{2267}", - "gEl;" => "\u{2A8C}", - "gacute;" => "\u{01F5}", - "gamma;" => "\u{03B3}", - "gammad;" => "\u{03DD}", - "gap;" => "\u{2A86}", - "gbreve;" => "\u{011F}", - "gcirc;" => "\u{011D}", - "gcy;" => "\u{0433}", - "gdot;" => "\u{0121}", - "ge;" => "\u{2265}", - "gel;" => "\u{22DB}", - "geq;" => "\u{2265}", - "geqq;" => "\u{2267}", - "geqslant;" => "\u{2A7E}", - "ges;" => "\u{2A7E}", - "gescc;" => "\u{2AA9}", - "gesdot;" => "\u{2A80}", - "gesdoto;" => "\u{2A82}", - "gesdotol;" => "\u{2A84}", - "gesles;" => "\u{2A94}", - "gfr;" => "\u{1D524}", - "gg;" => "\u{226B}", - "ggg;" => "\u{22D9}", - "gimel;" => "\u{2137}", - "gjcy;" => "\u{0453}", - "gl;" => "\u{2277}", - "glE;" => "\u{2A92}", - "gla;" => "\u{2AA5}", - "glj;" => "\u{2AA4}", - "gnE;" => "\u{2269}", - "gnap;" => "\u{2A8A}", - "gnapprox;" => "\u{2A8A}", - "gne;" => "\u{2A88}", - "gneq;" => "\u{2A88}", - "gneqq;" => "\u{2269}", - "gnsim;" => "\u{22E7}", - "gopf;" => "\u{1D558}", - "grave;" => "\u{0060}", - "gscr;" => "\u{210A}", - "gsim;" => "\u{2273}", - "gsime;" => "\u{2A8E}", - "gsiml;" => "\u{2A90}", - "gt;" => "\u{003E}", - "gtcc;" => "\u{2AA7}", - "gtcir;" => "\u{2A7A}", - "gtdot;" => "\u{22D7}", - "gtlPar;" => "\u{2995}", - "gtquest;" => "\u{2A7C}", - "gtrapprox;" => "\u{2A86}", - "gtrarr;" => "\u{2978}", - "gtrdot;" => "\u{22D7}", - "gtreqless;" => "\u{22DB}", - "gtreqqless;" => "\u{2A8C}", - "gtrless;" => "\u{2277}", - "gtrsim;" => "\u{2273}", - "hArr;" => "\u{21D4}", - "hairsp;" => "\u{200A}", - "half;" => "\u{00BD}", - "hamilt;" => "\u{210B}", - "hardcy;" => "\u{044A}", - "harr;" => "\u{2194}", - "harrcir;" => "\u{2948}", - "harrw;" => "\u{21AD}", - "hbar;" => "\u{210F}", - "hcirc;" => "\u{0125}", - "hearts;" => "\u{2665}", - "heartsuit;" => "\u{2665}", - "hellip;" => "\u{2026}", - "hercon;" => "\u{22B9}", - "hfr;" => "\u{1D525}", - "hksearow;" => "\u{2925}", - "hkswarow;" => "\u{2926}", - "hoarr;" => "\u{21FF}", - "homtht;" => "\u{223B}", - "hookleftarrow;" => "\u{21A9}", - "hookrightarrow;" => "\u{21AA}", - "hopf;" => "\u{1D559}", - "horbar;" => "\u{2015}", - "hscr;" => "\u{1D4BD}", - "hslash;" => "\u{210F}", - "hstrok;" => "\u{0127}", - "hybull;" => "\u{2043}", - "hyphen;" => "\u{2010}", - "iacute;" => "\u{00ED}", - "ic;" => "\u{2063}", - "icirc;" => "\u{00EE}", - "icy;" => "\u{0438}", - "iecy;" => "\u{0435}", - "iexcl;" => "\u{00A1}", - "iff;" => "\u{21D4}", - "ifr;" => "\u{1D526}", - "igrave;" => "\u{00EC}", - "ii;" => "\u{2148}", - "iiiint;" => "\u{2A0C}", - "iiint;" => "\u{222D}", - "iinfin;" => "\u{29DC}", - "iiota;" => "\u{2129}", - "ijlig;" => "\u{0133}", - "imacr;" => "\u{012B}", - "image;" => "\u{2111}", - "imagline;" => "\u{2110}", - "imagpart;" => "\u{2111}", - "imath;" => "\u{0131}", - "imof;" => "\u{22B7}", - "imped;" => "\u{01B5}", - "in;" => "\u{2208}", - "incare;" => "\u{2105}", - "infin;" => "\u{221E}", - "infintie;" => "\u{29DD}", - "inodot;" => "\u{0131}", - "int;" => "\u{222B}", - "intcal;" => "\u{22BA}", - "integers;" => "\u{2124}", - "intercal;" => "\u{22BA}", - "intlarhk;" => "\u{2A17}", - "intprod;" => "\u{2A3C}", - "iocy;" => "\u{0451}", - "iogon;" => "\u{012F}", - "iopf;" => "\u{1D55A}", - "iota;" => "\u{03B9}", - "iprod;" => "\u{2A3C}", - "iquest;" => "\u{00BF}", - "iscr;" => "\u{1D4BE}", - "isin;" => "\u{2208}", - "isinE;" => "\u{22F9}", - "isindot;" => "\u{22F5}", - "isins;" => "\u{22F4}", - "isinsv;" => "\u{22F3}", - "isinv;" => "\u{2208}", - "it;" => "\u{2062}", - "itilde;" => "\u{0129}", - "iukcy;" => "\u{0456}", - "iuml;" => "\u{00EF}", - "jcirc;" => "\u{0135}", - "jcy;" => "\u{0439}", - "jfr;" => "\u{1D527}", - "jmath;" => "\u{0237}", - "jopf;" => "\u{1D55B}", - "jscr;" => "\u{1D4BF}", - "jsercy;" => "\u{0458}", - "jukcy;" => "\u{0454}", - "kappa;" => "\u{03BA}", - "kappav;" => "\u{03F0}", - "kcedil;" => "\u{0137}", - "kcy;" => "\u{043A}", - "kfr;" => "\u{1D528}", - "kgreen;" => "\u{0138}", - "khcy;" => "\u{0445}", - "kjcy;" => "\u{045C}", - "kopf;" => "\u{1D55C}", - "kscr;" => "\u{1D4C0}", - "lAarr;" => "\u{21DA}", - "lArr;" => "\u{21D0}", - "lAtail;" => "\u{291B}", - "lBarr;" => "\u{290E}", - "lE;" => "\u{2266}", - "lEg;" => "\u{2A8B}", - "lHar;" => "\u{2962}", - "lacute;" => "\u{013A}", - "laemptyv;" => "\u{29B4}", - "lagran;" => "\u{2112}", - "lambda;" => "\u{03BB}", - "lang;" => "\u{27E8}", - "langd;" => "\u{2991}", - "langle;" => "\u{27E8}", - "lap;" => "\u{2A85}", - "laquo;" => "\u{00AB}", - "larr;" => "\u{2190}", - "larrb;" => "\u{21E4}", - "larrbfs;" => "\u{291F}", - "larrfs;" => "\u{291D}", - "larrhk;" => "\u{21A9}", - "larrlp;" => "\u{21AB}", - "larrpl;" => "\u{2939}", - "larrsim;" => "\u{2973}", - "larrtl;" => "\u{21A2}", - "lat;" => "\u{2AAB}", - "latail;" => "\u{2919}", - "late;" => "\u{2AAD}", - "lbarr;" => "\u{290C}", - "lbbrk;" => "\u{2772}", - "lbrace;" => "\u{007B}", - "lbrack;" => "\u{005B}", - "lbrke;" => "\u{298B}", - "lbrksld;" => "\u{298F}", - "lbrkslu;" => "\u{298D}", - "lcaron;" => "\u{013E}", - "lcedil;" => "\u{013C}", - "lceil;" => "\u{2308}", - "lcub;" => "\u{007B}", - "lcy;" => "\u{043B}", - "ldca;" => "\u{2936}", - "ldquo;" => "\u{201C}", - "ldquor;" => "\u{201E}", - "ldrdhar;" => "\u{2967}", - "ldrushar;" => "\u{294B}", - "ldsh;" => "\u{21B2}", - "le;" => "\u{2264}", - "leftarrow;" => "\u{2190}", - "leftarrowtail;" => "\u{21A2}", - "leftharpoondown;" => "\u{21BD}", - "leftharpoonup;" => "\u{21BC}", - "leftleftarrows;" => "\u{21C7}", - "leftrightarrow;" => "\u{2194}", - "leftrightarrows;" => "\u{21C6}", - "leftrightharpoons;" => "\u{21CB}", - "leftrightsquigarrow;" => "\u{21AD}", - "leftthreetimes;" => "\u{22CB}", - "leg;" => "\u{22DA}", - "leq;" => "\u{2264}", - "leqq;" => "\u{2266}", - "leqslant;" => "\u{2A7D}", - "les;" => "\u{2A7D}", - "lescc;" => "\u{2AA8}", - "lesdot;" => "\u{2A7F}", - "lesdoto;" => "\u{2A81}", - "lesdotor;" => "\u{2A83}", - "lesges;" => "\u{2A93}", - "lessapprox;" => "\u{2A85}", - "lessdot;" => "\u{22D6}", - "lesseqgtr;" => "\u{22DA}", - "lesseqqgtr;" => "\u{2A8B}", - "lessgtr;" => "\u{2276}", - "lesssim;" => "\u{2272}", - "lfisht;" => "\u{297C}", - "lfloor;" => "\u{230A}", - "lfr;" => "\u{1D529}", - "lg;" => "\u{2276}", - "lgE;" => "\u{2A91}", - "lhard;" => "\u{21BD}", - "lharu;" => "\u{21BC}", - "lharul;" => "\u{296A}", - "lhblk;" => "\u{2584}", - "ljcy;" => "\u{0459}", - "ll;" => "\u{226A}", - "llarr;" => "\u{21C7}", - "llcorner;" => "\u{231E}", - "llhard;" => "\u{296B}", - "lltri;" => "\u{25FA}", - "lmidot;" => "\u{0140}", - "lmoust;" => "\u{23B0}", - "lmoustache;" => "\u{23B0}", - "lnE;" => "\u{2268}", - "lnap;" => "\u{2A89}", - "lnapprox;" => "\u{2A89}", - "lne;" => "\u{2A87}", - "lneq;" => "\u{2A87}", - "lneqq;" => "\u{2268}", - "lnsim;" => "\u{22E6}", - "loang;" => "\u{27EC}", - "loarr;" => "\u{21FD}", - "lobrk;" => "\u{27E6}", - "longleftarrow;" => "\u{27F5}", - "longleftrightarrow;" => "\u{27F7}", - "longmapsto;" => "\u{27FC}", - "longrightarrow;" => "\u{27F6}", - "looparrowleft;" => "\u{21AB}", - "looparrowright;" => "\u{21AC}", - "lopar;" => "\u{2985}", - "lopf;" => "\u{1D55D}", - "loplus;" => "\u{2A2D}", - "lotimes;" => "\u{2A34}", - "lowast;" => "\u{2217}", - "lowbar;" => "\u{005F}", - "loz;" => "\u{25CA}", - "lozenge;" => "\u{25CA}", - "lozf;" => "\u{29EB}", - "lpar;" => "\u{0028}", - "lparlt;" => "\u{2993}", - "lrarr;" => "\u{21C6}", - "lrcorner;" => "\u{231F}", - "lrhar;" => "\u{21CB}", - "lrhard;" => "\u{296D}", - "lrm;" => "\u{200E}", - "lrtri;" => "\u{22BF}", - "lsaquo;" => "\u{2039}", - "lscr;" => "\u{1D4C1}", - "lsh;" => "\u{21B0}", - "lsim;" => "\u{2272}", - "lsime;" => "\u{2A8D}", - "lsimg;" => "\u{2A8F}", - "lsqb;" => "\u{005B}", - "lsquo;" => "\u{2018}", - "lsquor;" => "\u{201A}", - "lstrok;" => "\u{0142}", - "lt;" => "\u{003C}", - "ltcc;" => "\u{2AA6}", - "ltcir;" => "\u{2A79}", - "ltdot;" => "\u{22D6}", - "lthree;" => "\u{22CB}", - "ltimes;" => "\u{22C9}", - "ltlarr;" => "\u{2976}", - "ltquest;" => "\u{2A7B}", - "ltrPar;" => "\u{2996}", - "ltri;" => "\u{25C3}", - "ltrie;" => "\u{22B4}", - "ltrif;" => "\u{25C2}", - "lurdshar;" => "\u{294A}", - "luruhar;" => "\u{2966}", - "mDDot;" => "\u{223A}", - "macr;" => "\u{00AF}", - "male;" => "\u{2642}", - "malt;" => "\u{2720}", - "maltese;" => "\u{2720}", - "map;" => "\u{21A6}", - "mapsto;" => "\u{21A6}", - "mapstodown;" => "\u{21A7}", - "mapstoleft;" => "\u{21A4}", - "mapstoup;" => "\u{21A5}", - "marker;" => "\u{25AE}", - "mcomma;" => "\u{2A29}", - "mcy;" => "\u{043C}", - "mdash;" => "\u{2014}", - "measuredangle;" => "\u{2221}", - "mfr;" => "\u{1D52A}", - "mho;" => "\u{2127}", - "micro;" => "\u{00B5}", - "mid;" => "\u{2223}", - "midast;" => "\u{002A}", - "midcir;" => "\u{2AF0}", - "middot;" => "\u{00B7}", - "minus;" => "\u{2212}", - "minusb;" => "\u{229F}", - "minusd;" => "\u{2238}", - "minusdu;" => "\u{2A2A}", - "mlcp;" => "\u{2ADB}", - "mldr;" => "\u{2026}", - "mnplus;" => "\u{2213}", - "models;" => "\u{22A7}", - "mopf;" => "\u{1D55E}", - "mp;" => "\u{2213}", - "mscr;" => "\u{1D4C2}", - "mstpos;" => "\u{223E}", - "mu;" => "\u{03BC}", - "multimap;" => "\u{22B8}", - "mumap;" => "\u{22B8}", - "nLeftarrow;" => "\u{21CD}", - "nLeftrightarrow;" => "\u{21CE}", - "nRightarrow;" => "\u{21CF}", - "nVDash;" => "\u{22AF}", - "nVdash;" => "\u{22AE}", - "nabla;" => "\u{2207}", - "nacute;" => "\u{0144}", - "nap;" => "\u{2249}", - "napos;" => "\u{0149}", - "napprox;" => "\u{2249}", - "natur;" => "\u{266E}", - "natural;" => "\u{266E}", - "naturals;" => "\u{2115}", - "nbsp;" => "\u{00A0}", - "ncap;" => "\u{2A43}", - "ncaron;" => "\u{0148}", - "ncedil;" => "\u{0146}", - "ncong;" => "\u{2247}", - "ncup;" => "\u{2A42}", - "ncy;" => "\u{043D}", - "ndash;" => "\u{2013}", - "ne;" => "\u{2260}", - "neArr;" => "\u{21D7}", - "nearhk;" => "\u{2924}", - "nearr;" => "\u{2197}", - "nearrow;" => "\u{2197}", - "nequiv;" => "\u{2262}", - "nesear;" => "\u{2928}", - "nexist;" => "\u{2204}", - "nexists;" => "\u{2204}", - "nfr;" => "\u{1D52B}", - "nge;" => "\u{2271}", - "ngeq;" => "\u{2271}", - "ngsim;" => "\u{2275}", - "ngt;" => "\u{226F}", - "ngtr;" => "\u{226F}", - "nhArr;" => "\u{21CE}", - "nharr;" => "\u{21AE}", - "nhpar;" => "\u{2AF2}", - "ni;" => "\u{220B}", - "nis;" => "\u{22FC}", - "nisd;" => "\u{22FA}", - "niv;" => "\u{220B}", - "njcy;" => "\u{045A}", - "nlArr;" => "\u{21CD}", - "nlarr;" => "\u{219A}", - "nldr;" => "\u{2025}", - "nle;" => "\u{2270}", - "nleftarrow;" => "\u{219A}", - "nleftrightarrow;" => "\u{21AE}", - "nleq;" => "\u{2270}", - "nless;" => "\u{226E}", - "nlsim;" => "\u{2274}", - "nlt;" => "\u{226E}", - "nltri;" => "\u{22EA}", - "nltrie;" => "\u{22EC}", - "nmid;" => "\u{2224}", - "nopf;" => "\u{1D55F}", - "not;" => "\u{00AC}", - "notin;" => "\u{2209}", - "notinva;" => "\u{2209}", - "notinvb;" => "\u{22F7}", - "notinvc;" => "\u{22F6}", - "notni;" => "\u{220C}", - "notniva;" => "\u{220C}", - "notnivb;" => "\u{22FE}", - "notnivc;" => "\u{22FD}", - "npar;" => "\u{2226}", - "nparallel;" => "\u{2226}", - "npolint;" => "\u{2A14}", - "npr;" => "\u{2280}", - "nprcue;" => "\u{22E0}", - "nprec;" => "\u{2280}", - "nrArr;" => "\u{21CF}", - "nrarr;" => "\u{219B}", - "nrightarrow;" => "\u{219B}", - "nrtri;" => "\u{22EB}", - "nrtrie;" => "\u{22ED}", - "nsc;" => "\u{2281}", - "nsccue;" => "\u{22E1}", - "nscr;" => "\u{1D4C3}", - "nshortmid;" => "\u{2224}", - "nshortparallel;" => "\u{2226}", - "nsim;" => "\u{2241}", - "nsime;" => "\u{2244}", - "nsimeq;" => "\u{2244}", - "nsmid;" => "\u{2224}", - "nspar;" => "\u{2226}", - "nsqsube;" => "\u{22E2}", - "nsqsupe;" => "\u{22E3}", - "nsub;" => "\u{2284}", - "nsube;" => "\u{2288}", - "nsubseteq;" => "\u{2288}", - "nsucc;" => "\u{2281}", - "nsup;" => "\u{2285}", - "nsupe;" => "\u{2289}", - "nsupseteq;" => "\u{2289}", - "ntgl;" => "\u{2279}", - "ntilde;" => "\u{00F1}", - "ntlg;" => "\u{2278}", - "ntriangleleft;" => "\u{22EA}", - "ntrianglelefteq;" => "\u{22EC}", - "ntriangleright;" => "\u{22EB}", - "ntrianglerighteq;" => "\u{22ED}", - "nu;" => "\u{03BD}", - "num;" => "\u{0023}", - "numero;" => "\u{2116}", - "numsp;" => "\u{2007}", - "nvDash;" => "\u{22AD}", - "nvHarr;" => "\u{2904}", - "nvdash;" => "\u{22AC}", - "nvinfin;" => "\u{29DE}", - "nvlArr;" => "\u{2902}", - "nvrArr;" => "\u{2903}", - "nwArr;" => "\u{21D6}", - "nwarhk;" => "\u{2923}", - "nwarr;" => "\u{2196}", - "nwarrow;" => "\u{2196}", - "nwnear;" => "\u{2927}", - "oS;" => "\u{24C8}", - "oacute;" => "\u{00F3}", - "oast;" => "\u{229B}", - "ocir;" => "\u{229A}", - "ocirc;" => "\u{00F4}", - "ocy;" => "\u{043E}", - "odash;" => "\u{229D}", - "odblac;" => "\u{0151}", - "odiv;" => "\u{2A38}", - "odot;" => "\u{2299}", - "odsold;" => "\u{29BC}", - "oelig;" => "\u{0153}", - "ofcir;" => "\u{29BF}", - "ofr;" => "\u{1D52C}", - "ogon;" => "\u{02DB}", - "ograve;" => "\u{00F2}", - "ogt;" => "\u{29C1}", - "ohbar;" => "\u{29B5}", - "ohm;" => "\u{03A9}", - "oint;" => "\u{222E}", - "olarr;" => "\u{21BA}", - "olcir;" => "\u{29BE}", - "olcross;" => "\u{29BB}", - "oline;" => "\u{203E}", - "olt;" => "\u{29C0}", - "omacr;" => "\u{014D}", - "omega;" => "\u{03C9}", - "omicron;" => "\u{03BF}", - "omid;" => "\u{29B6}", - "ominus;" => "\u{2296}", - "oopf;" => "\u{1D560}", - "opar;" => "\u{29B7}", - "operp;" => "\u{29B9}", - "oplus;" => "\u{2295}", - "or;" => "\u{2228}", - "orarr;" => "\u{21BB}", - "ord;" => "\u{2A5D}", - "order;" => "\u{2134}", - "orderof;" => "\u{2134}", - "ordf;" => "\u{00AA}", - "ordm;" => "\u{00BA}", - "origof;" => "\u{22B6}", - "oror;" => "\u{2A56}", - "orslope;" => "\u{2A57}", - "orv;" => "\u{2A5B}", - "oscr;" => "\u{2134}", - "oslash;" => "\u{00F8}", - "osol;" => "\u{2298}", - "otilde;" => "\u{00F5}", - "otimes;" => "\u{2297}", - "otimesas;" => "\u{2A36}", - "ouml;" => "\u{00F6}", - "ovbar;" => "\u{233D}", - "par;" => "\u{2225}", - "para;" => "\u{00B6}", - "parallel;" => "\u{2225}", - "parsim;" => "\u{2AF3}", - "parsl;" => "\u{2AFD}", - "part;" => "\u{2202}", - "pcy;" => "\u{043F}", - "percnt;" => "\u{0025}", - "period;" => "\u{002E}", - "permil;" => "\u{2030}", - "perp;" => "\u{22A5}", - "pertenk;" => "\u{2031}", - "pfr;" => "\u{1D52D}", - "phi;" => "\u{03C6}", - "phiv;" => "\u{03D5}", - "phmmat;" => "\u{2133}", - "phone;" => "\u{260E}", - "pi;" => "\u{03C0}", - "pitchfork;" => "\u{22D4}", - "piv;" => "\u{03D6}", - "planck;" => "\u{210F}", - "planckh;" => "\u{210E}", - "plankv;" => "\u{210F}", - "plus;" => "\u{002B}", - "plusacir;" => "\u{2A23}", - "plusb;" => "\u{229E}", - "pluscir;" => "\u{2A22}", - "plusdo;" => "\u{2214}", - "plusdu;" => "\u{2A25}", - "pluse;" => "\u{2A72}", - "plusmn;" => "\u{00B1}", - "plussim;" => "\u{2A26}", - "plustwo;" => "\u{2A27}", - "pm;" => "\u{00B1}", - "pointint;" => "\u{2A15}", - "popf;" => "\u{1D561}", - "pound;" => "\u{00A3}", - "pr;" => "\u{227A}", - "prE;" => "\u{2AB3}", - "prap;" => "\u{2AB7}", - "prcue;" => "\u{227C}", - "pre;" => "\u{2AAF}", - "prec;" => "\u{227A}", - "precapprox;" => "\u{2AB7}", - "preccurlyeq;" => "\u{227C}", - "preceq;" => "\u{2AAF}", - "precnapprox;" => "\u{2AB9}", - "precneqq;" => "\u{2AB5}", - "precnsim;" => "\u{22E8}", - "precsim;" => "\u{227E}", - "prime;" => "\u{2032}", - "primes;" => "\u{2119}", - "prnE;" => "\u{2AB5}", - "prnap;" => "\u{2AB9}", - "prnsim;" => "\u{22E8}", - "prod;" => "\u{220F}", - "profalar;" => "\u{232E}", - "profline;" => "\u{2312}", - "profsurf;" => "\u{2313}", - "prop;" => "\u{221D}", - "propto;" => "\u{221D}", - "prsim;" => "\u{227E}", - "prurel;" => "\u{22B0}", - "pscr;" => "\u{1D4C5}", - "psi;" => "\u{03C8}", - "puncsp;" => "\u{2008}", - "qfr;" => "\u{1D52E}", - "qint;" => "\u{2A0C}", - "qopf;" => "\u{1D562}", - "qprime;" => "\u{2057}", - "qscr;" => "\u{1D4C6}", - "quaternions;" => "\u{210D}", - "quatint;" => "\u{2A16}", - "quest;" => "\u{003F}", - "questeq;" => "\u{225F}", - "quot;" => "\u{0022}", - "rAarr;" => "\u{21DB}", - "rArr;" => "\u{21D2}", - "rAtail;" => "\u{291C}", - "rBarr;" => "\u{290F}", - "rHar;" => "\u{2964}", - "racute;" => "\u{0155}", - "radic;" => "\u{221A}", - "raemptyv;" => "\u{29B3}", - "rang;" => "\u{27E9}", - "rangd;" => "\u{2992}", - "range;" => "\u{29A5}", - "rangle;" => "\u{27E9}", - "raquo;" => "\u{00BB}", - "rarr;" => "\u{2192}", - "rarrap;" => "\u{2975}", - "rarrb;" => "\u{21E5}", - "rarrbfs;" => "\u{2920}", - "rarrc;" => "\u{2933}", - "rarrfs;" => "\u{291E}", - "rarrhk;" => "\u{21AA}", - "rarrlp;" => "\u{21AC}", - "rarrpl;" => "\u{2945}", - "rarrsim;" => "\u{2974}", - "rarrtl;" => "\u{21A3}", - "rarrw;" => "\u{219D}", - "ratail;" => "\u{291A}", - "ratio;" => "\u{2236}", - "rationals;" => "\u{211A}", - "rbarr;" => "\u{290D}", - "rbbrk;" => "\u{2773}", - "rbrace;" => "\u{007D}", - "rbrack;" => "\u{005D}", - "rbrke;" => "\u{298C}", - "rbrksld;" => "\u{298E}", - "rbrkslu;" => "\u{2990}", - "rcaron;" => "\u{0159}", - "rcedil;" => "\u{0157}", - "rceil;" => "\u{2309}", - "rcub;" => "\u{007D}", - "rcy;" => "\u{0440}", - "rdca;" => "\u{2937}", - "rdldhar;" => "\u{2969}", - "rdquo;" => "\u{201D}", - "rdquor;" => "\u{201D}", - "rdsh;" => "\u{21B3}", - "real;" => "\u{211C}", - "realine;" => "\u{211B}", - "realpart;" => "\u{211C}", - "reals;" => "\u{211D}", - "rect;" => "\u{25AD}", - "reg;" => "\u{00AE}", - "rfisht;" => "\u{297D}", - "rfloor;" => "\u{230B}", - "rfr;" => "\u{1D52F}", - "rhard;" => "\u{21C1}", - "rharu;" => "\u{21C0}", - "rharul;" => "\u{296C}", - "rho;" => "\u{03C1}", - "rhov;" => "\u{03F1}", - "rightarrow;" => "\u{2192}", - "rightarrowtail;" => "\u{21A3}", - "rightharpoondown;" => "\u{21C1}", - "rightharpoonup;" => "\u{21C0}", - "rightleftarrows;" => "\u{21C4}", - "rightleftharpoons;" => "\u{21CC}", - "rightrightarrows;" => "\u{21C9}", - "rightsquigarrow;" => "\u{219D}", - "rightthreetimes;" => "\u{22CC}", - "ring;" => "\u{02DA}", - "risingdotseq;" => "\u{2253}", - "rlarr;" => "\u{21C4}", - "rlhar;" => "\u{21CC}", - "rlm;" => "\u{200F}", - "rmoust;" => "\u{23B1}", - "rmoustache;" => "\u{23B1}", - "rnmid;" => "\u{2AEE}", - "roang;" => "\u{27ED}", - "roarr;" => "\u{21FE}", - "robrk;" => "\u{27E7}", - "ropar;" => "\u{2986}", - "ropf;" => "\u{1D563}", - "roplus;" => "\u{2A2E}", - "rotimes;" => "\u{2A35}", - "rpar;" => "\u{0029}", - "rpargt;" => "\u{2994}", - "rppolint;" => "\u{2A12}", - "rrarr;" => "\u{21C9}", - "rsaquo;" => "\u{203A}", - "rscr;" => "\u{1D4C7}", - "rsh;" => "\u{21B1}", - "rsqb;" => "\u{005D}", - "rsquo;" => "\u{2019}", - "rsquor;" => "\u{2019}", - "rthree;" => "\u{22CC}", - "rtimes;" => "\u{22CA}", - "rtri;" => "\u{25B9}", - "rtrie;" => "\u{22B5}", - "rtrif;" => "\u{25B8}", - "rtriltri;" => "\u{29CE}", - "ruluhar;" => "\u{2968}", - "rx;" => "\u{211E}", - "sacute;" => "\u{015B}", - "sbquo;" => "\u{201A}", - "sc;" => "\u{227B}", - "scE;" => "\u{2AB4}", - "scap;" => "\u{2AB8}", - "scaron;" => "\u{0161}", - "sccue;" => "\u{227D}", - "sce;" => "\u{2AB0}", - "scedil;" => "\u{015F}", - "scirc;" => "\u{015D}", - "scnE;" => "\u{2AB6}", - "scnap;" => "\u{2ABA}", - "scnsim;" => "\u{22E9}", - "scpolint;" => "\u{2A13}", - "scsim;" => "\u{227F}", - "scy;" => "\u{0441}", - "sdot;" => "\u{22C5}", - "sdotb;" => "\u{22A1}", - "sdote;" => "\u{2A66}", - "seArr;" => "\u{21D8}", - "searhk;" => "\u{2925}", - "searr;" => "\u{2198}", - "searrow;" => "\u{2198}", - "sect;" => "\u{00A7}", - "semi;" => "\u{003B}", - "seswar;" => "\u{2929}", - "setminus;" => "\u{2216}", - "setmn;" => "\u{2216}", - "sext;" => "\u{2736}", - "sfr;" => "\u{1D530}", - "sfrown;" => "\u{2322}", - "sharp;" => "\u{266F}", - "shchcy;" => "\u{0449}", - "shcy;" => "\u{0448}", - "shortmid;" => "\u{2223}", - "shortparallel;" => "\u{2225}", - "shy;" => "\u{00AD}", - "sigma;" => "\u{03C3}", - "sigmaf;" => "\u{03C2}", - "sigmav;" => "\u{03C2}", - "sim;" => "\u{223C}", - "simdot;" => "\u{2A6A}", - "sime;" => "\u{2243}", - "simeq;" => "\u{2243}", - "simg;" => "\u{2A9E}", - "simgE;" => "\u{2AA0}", - "siml;" => "\u{2A9D}", - "simlE;" => "\u{2A9F}", - "simne;" => "\u{2246}", - "simplus;" => "\u{2A24}", - "simrarr;" => "\u{2972}", - "slarr;" => "\u{2190}", - "smallsetminus;" => "\u{2216}", - "smashp;" => "\u{2A33}", - "smeparsl;" => "\u{29E4}", - "smid;" => "\u{2223}", - "smile;" => "\u{2323}", - "smt;" => "\u{2AAA}", - "smte;" => "\u{2AAC}", - "softcy;" => "\u{044C}", - "sol;" => "\u{002F}", - "solb;" => "\u{29C4}", - "solbar;" => "\u{233F}", - "sopf;" => "\u{1D564}", - "spades;" => "\u{2660}", - "spadesuit;" => "\u{2660}", - "spar;" => "\u{2225}", - "sqcap;" => "\u{2293}", - "sqcup;" => "\u{2294}", - "sqsub;" => "\u{228F}", - "sqsube;" => "\u{2291}", - "sqsubset;" => "\u{228F}", - "sqsubseteq;" => "\u{2291}", - "sqsup;" => "\u{2290}", - "sqsupe;" => "\u{2292}", - "sqsupset;" => "\u{2290}", - "sqsupseteq;" => "\u{2292}", - "squ;" => "\u{25A1}", - "square;" => "\u{25A1}", - "squarf;" => "\u{25AA}", - "squf;" => "\u{25AA}", - "srarr;" => "\u{2192}", - "sscr;" => "\u{1D4C8}", - "ssetmn;" => "\u{2216}", - "ssmile;" => "\u{2323}", - "sstarf;" => "\u{22C6}", - "star;" => "\u{2606}", - "starf;" => "\u{2605}", - "straightepsilon;" => "\u{03F5}", - "straightphi;" => "\u{03D5}", - "strns;" => "\u{00AF}", - "sub;" => "\u{2282}", - "subE;" => "\u{2AC5}", - "subdot;" => "\u{2ABD}", - "sube;" => "\u{2286}", - "subedot;" => "\u{2AC3}", - "submult;" => "\u{2AC1}", - "subnE;" => "\u{2ACB}", - "subne;" => "\u{228A}", - "subplus;" => "\u{2ABF}", - "subrarr;" => "\u{2979}", - "subset;" => "\u{2282}", - "subseteq;" => "\u{2286}", - "subseteqq;" => "\u{2AC5}", - "subsetneq;" => "\u{228A}", - "subsetneqq;" => "\u{2ACB}", - "subsim;" => "\u{2AC7}", - "subsub;" => "\u{2AD5}", - "subsup;" => "\u{2AD3}", - "succ;" => "\u{227B}", - "succapprox;" => "\u{2AB8}", - "succcurlyeq;" => "\u{227D}", - "succeq;" => "\u{2AB0}", - "succnapprox;" => "\u{2ABA}", - "succneqq;" => "\u{2AB6}", - "succnsim;" => "\u{22E9}", - "succsim;" => "\u{227F}", - "sum;" => "\u{2211}", - "sung;" => "\u{266A}", - "sup;" => "\u{2283}", - "sup1;" => "\u{00B9}", - "sup2;" => "\u{00B2}", - "sup3;" => "\u{00B3}", - "supE;" => "\u{2AC6}", - "supdot;" => "\u{2ABE}", - "supdsub;" => "\u{2AD8}", - "supe;" => "\u{2287}", - "supedot;" => "\u{2AC4}", - "suphsol;" => "\u{27C9}", - "suphsub;" => "\u{2AD7}", - "suplarr;" => "\u{297B}", - "supmult;" => "\u{2AC2}", - "supnE;" => "\u{2ACC}", - "supne;" => "\u{228B}", - "supplus;" => "\u{2AC0}", - "supset;" => "\u{2283}", - "supseteq;" => "\u{2287}", - "supseteqq;" => "\u{2AC6}", - "supsetneq;" => "\u{228B}", - "supsetneqq;" => "\u{2ACC}", - "supsim;" => "\u{2AC8}", - "supsub;" => "\u{2AD4}", - "supsup;" => "\u{2AD6}", - "swArr;" => "\u{21D9}", - "swarhk;" => "\u{2926}", - "swarr;" => "\u{2199}", - "swarrow;" => "\u{2199}", - "swnwar;" => "\u{292A}", - "szlig;" => "\u{00DF}", - "target;" => "\u{2316}", - "tau;" => "\u{03C4}", - "tbrk;" => "\u{23B4}", - "tcaron;" => "\u{0165}", - "tcedil;" => "\u{0163}", - "tcy;" => "\u{0442}", - "tdot;" => "\u{20DB}", - "telrec;" => "\u{2315}", - "tfr;" => "\u{1D531}", - "there4;" => "\u{2234}", - "therefore;" => "\u{2234}", - "theta;" => "\u{03B8}", - "thetasym;" => "\u{03D1}", - "thetav;" => "\u{03D1}", - "thickapprox;" => "\u{2248}", - "thicksim;" => "\u{223C}", - "thinsp;" => "\u{2009}", - "thkap;" => "\u{2248}", - "thksim;" => "\u{223C}", - "thorn;" => "\u{00FE}", - "tilde;" => "\u{02DC}", - "times;" => "\u{00D7}", - "timesb;" => "\u{22A0}", - "timesbar;" => "\u{2A31}", - "timesd;" => "\u{2A30}", - "tint;" => "\u{222D}", - "toea;" => "\u{2928}", - "top;" => "\u{22A4}", - "topbot;" => "\u{2336}", - "topcir;" => "\u{2AF1}", - "topf;" => "\u{1D565}", - "topfork;" => "\u{2ADA}", - "tosa;" => "\u{2929}", - "tprime;" => "\u{2034}", - "trade;" => "\u{2122}", - "triangle;" => "\u{25B5}", - "triangledown;" => "\u{25BF}", - "triangleleft;" => "\u{25C3}", - "trianglelefteq;" => "\u{22B4}", - "triangleq;" => "\u{225C}", - "triangleright;" => "\u{25B9}", - "trianglerighteq;" => "\u{22B5}", - "tridot;" => "\u{25EC}", - "trie;" => "\u{225C}", - "triminus;" => "\u{2A3A}", - "triplus;" => "\u{2A39}", - "trisb;" => "\u{29CD}", - "tritime;" => "\u{2A3B}", - "trpezium;" => "\u{23E2}", - "tscr;" => "\u{1D4C9}", - "tscy;" => "\u{0446}", - "tshcy;" => "\u{045B}", - "tstrok;" => "\u{0167}", - "twixt;" => "\u{226C}", - "twoheadleftarrow;" => "\u{219E}", - "twoheadrightarrow;" => "\u{21A0}", - "uArr;" => "\u{21D1}", - "uHar;" => "\u{2963}", - "uacute;" => "\u{00FA}", - "uarr;" => "\u{2191}", - "ubrcy;" => "\u{045E}", - "ubreve;" => "\u{016D}", - "ucirc;" => "\u{00FB}", - "ucy;" => "\u{0443}", - "udarr;" => "\u{21C5}", - "udblac;" => "\u{0171}", - "udhar;" => "\u{296E}", - "ufisht;" => "\u{297E}", - "ufr;" => "\u{1D532}", - "ugrave;" => "\u{00F9}", - "uharl;" => "\u{21BF}", - "uharr;" => "\u{21BE}", - "uhblk;" => "\u{2580}", - "ulcorn;" => "\u{231C}", - "ulcorner;" => "\u{231C}", - "ulcrop;" => "\u{230F}", - "ultri;" => "\u{25F8}", - "umacr;" => "\u{016B}", - "uml;" => "\u{00A8}", - "uogon;" => "\u{0173}", - "uopf;" => "\u{1D566}", - "uparrow;" => "\u{2191}", - "updownarrow;" => "\u{2195}", - "upharpoonleft;" => "\u{21BF}", - "upharpoonright;" => "\u{21BE}", - "uplus;" => "\u{228E}", - "upsi;" => "\u{03C5}", - "upsih;" => "\u{03D2}", - "upsilon;" => "\u{03C5}", - "upuparrows;" => "\u{21C8}", - "urcorn;" => "\u{231D}", - "urcorner;" => "\u{231D}", - "urcrop;" => "\u{230E}", - "uring;" => "\u{016F}", - "urtri;" => "\u{25F9}", - "uscr;" => "\u{1D4CA}", - "utdot;" => "\u{22F0}", - "utilde;" => "\u{0169}", - "utri;" => "\u{25B5}", - "utrif;" => "\u{25B4}", - "uuarr;" => "\u{21C8}", - "uuml;" => "\u{00FC}", - "uwangle;" => "\u{29A7}", - "vArr;" => "\u{21D5}", - "vBar;" => "\u{2AE8}", - "vBarv;" => "\u{2AE9}", - "vDash;" => "\u{22A8}", - "vangrt;" => "\u{299C}", - "varepsilon;" => "\u{03F5}", - "varkappa;" => "\u{03F0}", - "varnothing;" => "\u{2205}", - "varphi;" => "\u{03D5}", - "varpi;" => "\u{03D6}", - "varpropto;" => "\u{221D}", - "varr;" => "\u{2195}", - "varrho;" => "\u{03F1}", - "varsigma;" => "\u{03C2}", - "vartheta;" => "\u{03D1}", - "vartriangleleft;" => "\u{22B2}", - "vartriangleright;" => "\u{22B3}", - "vcy;" => "\u{0432}", - "vdash;" => "\u{22A2}", - "vee;" => "\u{2228}", - "veebar;" => "\u{22BB}", - "veeeq;" => "\u{225A}", - "vellip;" => "\u{22EE}", - "verbar;" => "\u{007C}", - "vert;" => "\u{007C}", - "vfr;" => "\u{1D533}", - "vltri;" => "\u{22B2}", - "vopf;" => "\u{1D567}", - "vprop;" => "\u{221D}", - "vrtri;" => "\u{22B3}", - "vscr;" => "\u{1D4CB}", - "vzigzag;" => "\u{299A}", - "wcirc;" => "\u{0175}", - "wedbar;" => "\u{2A5F}", - "wedge;" => "\u{2227}", - "wedgeq;" => "\u{2259}", - "weierp;" => "\u{2118}", - "wfr;" => "\u{1D534}", - "wopf;" => "\u{1D568}", - "wp;" => "\u{2118}", - "wr;" => "\u{2240}", - "wreath;" => "\u{2240}", - "wscr;" => "\u{1D4CC}", - "xcap;" => "\u{22C2}", - "xcirc;" => "\u{25EF}", - "xcup;" => "\u{22C3}", - "xdtri;" => "\u{25BD}", - "xfr;" => "\u{1D535}", - "xhArr;" => "\u{27FA}", - "xharr;" => "\u{27F7}", - "xi;" => "\u{03BE}", - "xlArr;" => "\u{27F8}", - "xlarr;" => "\u{27F5}", - "xmap;" => "\u{27FC}", - "xnis;" => "\u{22FB}", - "xodot;" => "\u{2A00}", - "xopf;" => "\u{1D569}", - "xoplus;" => "\u{2A01}", - "xotime;" => "\u{2A02}", - "xrArr;" => "\u{27F9}", - "xrarr;" => "\u{27F6}", - "xscr;" => "\u{1D4CD}", - "xsqcup;" => "\u{2A06}", - "xuplus;" => "\u{2A04}", - "xutri;" => "\u{25B3}", - "xvee;" => "\u{22C1}", - "xwedge;" => "\u{22C0}", - "yacute;" => "\u{00FD}", - "yacy;" => "\u{044F}", - "ycirc;" => "\u{0177}", - "ycy;" => "\u{044B}", - "yen;" => "\u{00A5}", - "yfr;" => "\u{1D536}", - "yicy;" => "\u{0457}", - "yopf;" => "\u{1D56A}", - "yscr;" => "\u{1D4CE}", - "yucy;" => "\u{044E}", - "yuml;" => "\u{00FF}", - "zacute;" => "\u{017A}", - "zcaron;" => "\u{017E}", - "zcy;" => "\u{0437}", - "zdot;" => "\u{017C}", - "zeetrf;" => "\u{2128}", - "zeta;" => "\u{03B6}", - "zfr;" => "\u{1D537}", - "zhcy;" => "\u{0436}", - "zigrarr;" => "\u{21DD}", - "zopf;" => "\u{1D56B}", - "zscr;" => "\u{1D4CF}", - "zwj;" => "\u{200D}", - "zwnj;" => "\u{200C}", - "AElig" => "\u{00C6}", - "AMP" => "\u{0026}", - "Aacute" => "\u{00C1}", - "Acirc" => "\u{00C2}", - "Agrave" => "\u{00C0}", - "Aring" => "\u{00C5}", - "Atilde" => "\u{00C3}", - "Auml" => "\u{00C4}", - "COPY" => "\u{00A9}", - "Ccedil" => "\u{00C7}", - "ETH" => "\u{00D0}", - "Eacute" => "\u{00C9}", - "Ecirc" => "\u{00CA}", - "Egrave" => "\u{00C8}", - "Euml" => "\u{00CB}", - "GT" => "\u{003E}", - "Iacute" => "\u{00CD}", - "Icirc" => "\u{00CE}", - "Igrave" => "\u{00CC}", - "Iuml" => "\u{00CF}", - "LT" => "\u{003C}", - "Ntilde" => "\u{00D1}", - "Oacute" => "\u{00D3}", - "Ocirc" => "\u{00D4}", - "Ograve" => "\u{00D2}", - "Oslash" => "\u{00D8}", - "Otilde" => "\u{00D5}", - "Ouml" => "\u{00D6}", - "QUOT" => "\u{0022}", - "REG" => "\u{00AE}", - "THORN" => "\u{00DE}", - "Uacute" => "\u{00DA}", - "Ucirc" => "\u{00DB}", - "Ugrave" => "\u{00D9}", - "Uuml" => "\u{00DC}", - "Yacute" => "\u{00DD}", - "aacute" => "\u{00E1}", - "acirc" => "\u{00E2}", - "acute" => "\u{00B4}", - "aelig" => "\u{00E6}", - "agrave" => "\u{00E0}", - "amp" => "\u{0026}", - "aring" => "\u{00E5}", - "atilde" => "\u{00E3}", - "auml" => "\u{00E4}", - "brvbar" => "\u{00A6}", - "ccedil" => "\u{00E7}", - "cedil" => "\u{00B8}", - "cent" => "\u{00A2}", - "copy" => "\u{00A9}", - "curren" => "\u{00A4}", - "deg" => "\u{00B0}", - "divide" => "\u{00F7}", - "eacute" => "\u{00E9}", - "ecirc" => "\u{00EA}", - "egrave" => "\u{00E8}", - "eth" => "\u{00F0}", - "euml" => "\u{00EB}", - "frac12" => "\u{00BD}", - "frac14" => "\u{00BC}", - "frac34" => "\u{00BE}", - "gt" => "\u{003E}", - "iacute" => "\u{00ED}", - "icirc" => "\u{00EE}", - "iexcl" => "\u{00A1}", - "igrave" => "\u{00EC}", - "iquest" => "\u{00BF}", - "iuml" => "\u{00EF}", - "laquo" => "\u{00AB}", - "lt" => "\u{003C}", - "macr" => "\u{00AF}", - "micro" => "\u{00B5}", - "middot" => "\u{00B7}", - "nbsp" => "\u{00A0}", - "not" => "\u{00AC}", - "ntilde" => "\u{00F1}", - "oacute" => "\u{00F3}", - "ocirc" => "\u{00F4}", - "ograve" => "\u{00F2}", - "ordf" => "\u{00AA}", - "ordm" => "\u{00BA}", - "oslash" => "\u{00F8}", - "otilde" => "\u{00F5}", - "ouml" => "\u{00F6}", - "para" => "\u{00B6}", - "plusmn" => "\u{00B1}", - "pound" => "\u{00A3}", - "quot" => "\u{0022}", - "raquo" => "\u{00BB}", - "reg" => "\u{00AE}", - "sect" => "\u{00A7}", - "shy" => "\u{00AD}", - "sup1" => "\u{00B9}", - "sup2" => "\u{00B2}", - "sup3" => "\u{00B3}", - "szlig" => "\u{00DF}", - "thorn" => "\u{00FE}", - "times" => "\u{00D7}", - "uacute" => "\u{00FA}", - "ucirc" => "\u{00FB}", - "ugrave" => "\u{00F9}", - "uml" => "\u{00A8}", - "uuml" => "\u{00FC}", - "yacute" => "\u{00FD}", - "yen" => "\u{00A5}", - "yuml" => "\u{00FF}", - - "nLt;" =>"\u{226A}{20D2}", - "nGt;" =>"\u{226B}{20D2}", - "NotEqualTilde;" =>"\u{2242}{0338}", - "NotGreaterFullEqual;" =>"\u{2267}{0338}", - "NotGreaterGreater;" =>"\u{226B}{0338}", - "NotGreaterSlantEqual;" =>"\u{2A7E}{0338}", - "NotHumpDownHump;" =>"\u{224E}{0338}", - "NotHumpEqual;" =>"\u{224F}{0338}", - "NotLeftTriangleBar;" =>"\u{29CF}{0338}", - "NotLessLess;" =>"\u{226A}{0338}", - "NotLessSlantEqual;" =>"\u{2A7D}{0338}", - "NotNestedGreaterGreater;" =>"\u{2AA2}{0338}", - "NotNestedLessLess;" =>"\u{2AA1}{0338}", - "NotPrecedesEqual;" =>"\u{2AAF}{0338}", - "NotRightTriangleBar;" =>"\u{29D0}{0338}", - "NotSquareSubset;" =>"\u{228F}{0338}", - "NotSquareSuperset;" =>"\u{2290}{0338}", - "NotSubset;" =>"\u{2282}{20D2}", - "NotSucceedsEqual;" =>"\u{2AB0}{0338}", - "NotSucceedsTilde;" =>"\u{227F}{0338}", - "NotSuperset;" =>"\u{2283}{20D2}", - "ThickSpace;" =>"\u{205F}{200A}", - "acE;" =>"\u{223E}{0333}", - "bne;" =>"\u{003D}{20E5}", - "bnequiv;" =>"\u{2261}{20E5}", - "caps;" =>"\u{2229}{FE00}", - "cups;" =>"\u{222A}{FE00}", - "fjlig;" =>"\u{0066}{006A}", - "gesl;" =>"\u{22DB}{FE00}", - "gvertneqq;" =>"\u{2269}{FE00}", - "gvnE;" =>"\u{2269}{FE00}", - "lates;" =>"\u{2AAD}{FE00}", - "lesg;" =>"\u{22DA}{FE00}", - "lvertneqq;" =>"\u{2268}{FE00}", - "lvnE;" =>"\u{2268}{FE00}", - "nGg;" =>"\u{22D9}{0338}", - "nGtv;" =>"\u{226B}{0338}", - "nLl;" =>"\u{22D8}{0338}", - "nLtv;" =>"\u{226A}{0338}", - "nang;" =>"\u{2220}{20D2}", - "napE;" =>"\u{2A70}{0338}", - "napid;" =>"\u{224B}{0338}", - "nbump;" =>"\u{224E}{0338}", - "nbumpe;" =>"\u{224F}{0338}", - "ncongdot;" =>"\u{2A6D}{0338}", - "nedot;" =>"\u{2250}{0338}", - "nesim;" =>"\u{2242}{0338}", - "ngE;" =>"\u{2267}{0338}", - "ngeqq;" =>"\u{2267}{0338}", - "ngeqslant;" =>"\u{2A7E}{0338}", - "nges;" =>"\u{2A7E}{0338}", - "nlE;" =>"\u{2266}{0338}", - "nleqq;" =>"\u{2266}{0338}", - "nleqslant;" =>"\u{2A7D}{0338}", - "nles;" =>"\u{2A7D}{0338}", - "notinE;" =>"\u{22F9}{0338}", - "notindot;" =>"\u{22F5}{0338}", - "nparsl;" =>"\u{2AFD}{20E5}", - "npart;" =>"\u{2202}{0338}", - "npre;" =>"\u{2AAF}{0338}", - "npreceq;" =>"\u{2AAF}{0338}", - "nrarrc;" =>"\u{2933}{0338}", - "nrarrw;" =>"\u{219D}{0338}", - "nsce;" =>"\u{2AB0}{0338}", - "nsubE;" =>"\u{2AC5}{0338}", - "nsubset;" =>"\u{2282}{20D2}", - "nsubseteqq;" =>"\u{2AC5}{0338}", - "nsucceq;" =>"\u{2AB0}{0338}", - "nsupE;" =>"\u{2AC6}{0338}", - "nsupset;" =>"\u{2283}{20D2}", - "nsupseteqq;" =>"\u{2AC6}{0338}", - "nvap;" =>"\u{224D}{20D2}", - "nvge;" =>"\u{2265}{20D2}", - "nvgt;" =>"\u{003E}{20D2}", - "nvle;" =>"\u{2264}{20D2}", - "nvlt;" =>"\u{003C}{20D2}", - "nvltrie;" =>"\u{22B4}{20D2}", - "nvrtrie;" =>"\u{22B5}{20D2}", - "nvsim;" =>"\u{223C}{20D2}", - "race;" =>"\u{223D}{0331}", - "smtes;" =>"\u{2AAC}{FE00}", - "sqcaps;" =>"\u{2293}{FE00}", - "sqcups;" =>"\u{2294}{FE00}", - "varsubsetneq;" =>"\u{228A}{FE00}", - "varsubsetneqq;" =>"\u{2ACB}{FE00}", - "varsupsetneq;" =>"\u{228B}{FE00}", - "varsupsetneqq;" =>"\u{2ACC}{FE00}", - "vnsub;" =>"\u{2282}{20D2}", - "vnsup;" =>"\u{2283}{20D2}", - "vsubnE;" =>"\u{2ACB}{FE00}", - "vsubne;" =>"\u{228A}{FE00}", - "vsupnE;" =>"\u{2ACC}{FE00}", - "vsupne;" =>"\u{228B}{FE00}", -}; \ No newline at end of file +use phf::phf_map; + +// Converted from golang.org/x/net/html/entity.go +// Taken from https://dev.w3.org/html5/spec-LC/named-character-references.html#named-character-references + +pub static TOKEN_NAMED_CHARS: phf::Map<&'static str, &'static str> = phf_map! { + "AElig;" => "\u{00C6}", + "AMP;" => "\u{0026}", + "Aacute;" => "\u{00C1}", + "Abreve;" => "\u{0102}", + "Acirc;" => "\u{00C2}", + "Acy;" => "\u{0410}", + "Afr;" => "\u{1D504}", + "Agrave;" => "\u{00C0}", + "Alpha;" => "\u{0391}", + "Amacr;" => "\u{0100}", + "And;" => "\u{2A53}", + "Aogon;" => "\u{0104}", + "Aopf;" => "\u{1D538}", + "ApplyFunction;" => "\u{2061}", + "Aring;" => "\u{00C5}", + "Ascr;" => "\u{1D49C}", + "Assign;" => "\u{2254}", + "Atilde;" => "\u{00C3}", + "Auml;" => "\u{00C4}", + "Backslash;" => "\u{2216}", + "Barv;" => "\u{2AE7}", + "Barwed;" => "\u{2306}", + "Bcy;" => "\u{0411}", + "Because;" => "\u{2235}", + "Bernoullis;" => "\u{212C}", + "Beta;" => "\u{0392}", + "Bfr;" => "\u{1D505}", + "Bopf;" => "\u{1D539}", + "Breve;" => "\u{02D8}", + "Bscr;" => "\u{212C}", + "Bumpeq;" => "\u{224E}", + "CHcy;" => "\u{0427}", + "COPY;" => "\u{00A9}", + "Cacute;" => "\u{0106}", + "Cap;" => "\u{22D2}", + "CapitalDifferentialD;" => "\u{2145}", + "Cayleys;" => "\u{212D}", + "Ccaron;" => "\u{010C}", + "Ccedil;" => "\u{00C7}", + "Ccirc;" => "\u{0108}", + "Cconint;" => "\u{2230}", + "Cdot;" => "\u{010A}", + "Cedilla;" => "\u{00B8}", + "CenterDot;" => "\u{00B7}", + "Cfr;" => "\u{212D}", + "Chi;" => "\u{03A7}", + "CircleDot;" => "\u{2299}", + "CircleMinus;" => "\u{2296}", + "CirclePlus;" => "\u{2295}", + "CircleTimes;" => "\u{2297}", + "ClockwiseContourIntegral;" => "\u{2232}", + "CloseCurlyDoubleQuote;" => "\u{201D}", + "CloseCurlyQuote;" => "\u{2019}", + "Colon;" => "\u{2237}", + "Colone;" => "\u{2A74}", + "Congruent;" => "\u{2261}", + "Conint;" => "\u{222F}", + "ContourIntegral;" => "\u{222E}", + "Copf;" => "\u{2102}", + "Coproduct;" => "\u{2210}", + "CounterClockwiseContourIntegral;" => "\u{2233}", + "Cross;" => "\u{2A2F}", + "Cscr;" => "\u{1D49E}", + "Cup;" => "\u{22D3}", + "CupCap;" => "\u{224D}", + "DD;" => "\u{2145}", + "DDotrahd;" => "\u{2911}", + "DJcy;" => "\u{0402}", + "DScy;" => "\u{0405}", + "DZcy;" => "\u{040F}", + "Dagger;" => "\u{2021}", + "Darr;" => "\u{21A1}", + "Dashv;" => "\u{2AE4}", + "Dcaron;" => "\u{010E}", + "Dcy;" => "\u{0414}", + "Del;" => "\u{2207}", + "Delta;" => "\u{0394}", + "Dfr;" => "\u{1D507}", + "DiacriticalAcute;" => "\u{00B4}", + "DiacriticalDot;" => "\u{02D9}", + "DiacriticalDoubleAcute;" => "\u{02DD}", + "DiacriticalGrave;" => "\u{0060}", + "DiacriticalTilde;" => "\u{02DC}", + "Diamond;" => "\u{22C4}", + "DifferentialD;" => "\u{2146}", + "Dopf;" => "\u{1D53B}", + "Dot;" => "\u{00A8}", + "DotDot;" => "\u{20DC}", + "DotEqual;" => "\u{2250}", + "DoubleContourIntegral;" => "\u{222F}", + "DoubleDot;" => "\u{00A8}", + "DoubleDownArrow;" => "\u{21D3}", + "DoubleLeftArrow;" => "\u{21D0}", + "DoubleLeftRightArrow;" => "\u{21D4}", + "DoubleLeftTee;" => "\u{2AE4}", + "DoubleLongLeftArrow;" => "\u{27F8}", + "DoubleLongLeftRightArrow;" => "\u{27FA}", + "DoubleLongRightArrow;" => "\u{27F9}", + "DoubleRightArrow;" => "\u{21D2}", + "DoubleRightTee;" => "\u{22A8}", + "DoubleUpArrow;" => "\u{21D1}", + "DoubleUpDownArrow;" => "\u{21D5}", + "DoubleVerticalBar;" => "\u{2225}", + "DownArrow;" => "\u{2193}", + "DownArrowBar;" => "\u{2913}", + "DownArrowUpArrow;" => "\u{21F5}", + "DownBreve;" => "\u{0311}", + "DownLeftRightVector;" => "\u{2950}", + "DownLeftTeeVector;" => "\u{295E}", + "DownLeftVector;" => "\u{21BD}", + "DownLeftVectorBar;" => "\u{2956}", + "DownRightTeeVector;" => "\u{295F}", + "DownRightVector;" => "\u{21C1}", + "DownRightVectorBar;" => "\u{2957}", + "DownTee;" => "\u{22A4}", + "DownTeeArrow;" => "\u{21A7}", + "Downarrow;" => "\u{21D3}", + "Dscr;" => "\u{1D49F}", + "Dstrok;" => "\u{0110}", + "ENG;" => "\u{014A}", + "ETH;" => "\u{00D0}", + "Eacute;" => "\u{00C9}", + "Ecaron;" => "\u{011A}", + "Ecirc;" => "\u{00CA}", + "Ecy;" => "\u{042D}", + "Edot;" => "\u{0116}", + "Efr;" => "\u{1D508}", + "Egrave;" => "\u{00C8}", + "Element;" => "\u{2208}", + "Emacr;" => "\u{0112}", + "EmptySmallSquare;" => "\u{25FB}", + "EmptyVerySmallSquare;" => "\u{25AB}", + "Eogon;" => "\u{0118}", + "Eopf;" => "\u{1D53C}", + "Epsilon;" => "\u{0395}", + "Equal;" => "\u{2A75}", + "EqualTilde;" => "\u{2242}", + "Equilibrium;" => "\u{21CC}", + "Escr;" => "\u{2130}", + "Esim;" => "\u{2A73}", + "Eta;" => "\u{0397}", + "Euml;" => "\u{00CB}", + "Exists;" => "\u{2203}", + "ExponentialE;" => "\u{2147}", + "Fcy;" => "\u{0424}", + "Ffr;" => "\u{1D509}", + "FilledSmallSquare;" => "\u{25FC}", + "FilledVerySmallSquare;" => "\u{25AA}", + "Fopf;" => "\u{1D53D}", + "ForAll;" => "\u{2200}", + "Fouriertrf;" => "\u{2131}", + "Fscr;" => "\u{2131}", + "GJcy;" => "\u{0403}", + "GT;" => "\u{003E}", + "Gamma;" => "\u{0393}", + "Gammad;" => "\u{03DC}", + "Gbreve;" => "\u{011E}", + "Gcedil;" => "\u{0122}", + "Gcirc;" => "\u{011C}", + "Gcy;" => "\u{0413}", + "Gdot;" => "\u{0120}", + "Gfr;" => "\u{1D50A}", + "Gg;" => "\u{22D9}", + "Gopf;" => "\u{1D53E}", + "GreaterEqual;" => "\u{2265}", + "GreaterEqualLess;" => "\u{22DB}", + "GreaterFullEqual;" => "\u{2267}", + "GreaterGreater;" => "\u{2AA2}", + "GreaterLess;" => "\u{2277}", + "GreaterSlantEqual;" => "\u{2A7E}", + "GreaterTilde;" => "\u{2273}", + "Gscr;" => "\u{1D4A2}", + "Gt;" => "\u{226B}", + "HARDcy;" => "\u{042A}", + "Hacek;" => "\u{02C7}", + "Hat;" => "\u{005E}", + "Hcirc;" => "\u{0124}", + "Hfr;" => "\u{210C}", + "HilbertSpace;" => "\u{210B}", + "Hopf;" => "\u{210D}", + "HorizontalLine;" => "\u{2500}", + "Hscr;" => "\u{210B}", + "Hstrok;" => "\u{0126}", + "HumpDownHump;" => "\u{224E}", + "HumpEqual;" => "\u{224F}", + "IEcy;" => "\u{0415}", + "IJlig;" => "\u{0132}", + "IOcy;" => "\u{0401}", + "Iacute;" => "\u{00CD}", + "Icirc;" => "\u{00CE}", + "Icy;" => "\u{0418}", + "Idot;" => "\u{0130}", + "Ifr;" => "\u{2111}", + "Igrave;" => "\u{00CC}", + "Im;" => "\u{2111}", + "Imacr;" => "\u{012A}", + "ImaginaryI;" => "\u{2148}", + "Implies;" => "\u{21D2}", + "Int;" => "\u{222C}", + "Integral;" => "\u{222B}", + "Intersection;" => "\u{22C2}", + "InvisibleComma;" => "\u{2063}", + "InvisibleTimes;" => "\u{2062}", + "Iogon;" => "\u{012E}", + "Iopf;" => "\u{1D540}", + "Iota;" => "\u{0399}", + "Iscr;" => "\u{2110}", + "Itilde;" => "\u{0128}", + "Iukcy;" => "\u{0406}", + "Iuml;" => "\u{00CF}", + "Jcirc;" => "\u{0134}", + "Jcy;" => "\u{0419}", + "Jfr;" => "\u{1D50D}", + "Jopf;" => "\u{1D541}", + "Jscr;" => "\u{1D4A5}", + "Jsercy;" => "\u{0408}", + "Jukcy;" => "\u{0404}", + "KHcy;" => "\u{0425}", + "KJcy;" => "\u{040C}", + "Kappa;" => "\u{039A}", + "Kcedil;" => "\u{0136}", + "Kcy;" => "\u{041A}", + "Kfr;" => "\u{1D50E}", + "Kopf;" => "\u{1D542}", + "Kscr;" => "\u{1D4A6}", + "LJcy;" => "\u{0409}", + "LT;" => "\u{003C}", + "Lacute;" => "\u{0139}", + "Lambda;" => "\u{039B}", + "Lang;" => "\u{27EA}", + "Laplacetrf;" => "\u{2112}", + "Larr;" => "\u{219E}", + "Lcaron;" => "\u{013D}", + "Lcedil;" => "\u{013B}", + "Lcy;" => "\u{041B}", + "LeftAngleBracket;" => "\u{27E8}", + "LeftArrow;" => "\u{2190}", + "LeftArrowBar;" => "\u{21E4}", + "LeftArrowRightArrow;" => "\u{21C6}", + "LeftCeiling;" => "\u{2308}", + "LeftDoubleBracket;" => "\u{27E6}", + "LeftDownTeeVector;" => "\u{2961}", + "LeftDownVector;" => "\u{21C3}", + "LeftDownVectorBar;" => "\u{2959}", + "LeftFloor;" => "\u{230A}", + "LeftRightArrow;" => "\u{2194}", + "LeftRightVector;" => "\u{294E}", + "LeftTee;" => "\u{22A3}", + "LeftTeeArrow;" => "\u{21A4}", + "LeftTeeVector;" => "\u{295A}", + "LeftTriangle;" => "\u{22B2}", + "LeftTriangleBar;" => "\u{29CF}", + "LeftTriangleEqual;" => "\u{22B4}", + "LeftUpDownVector;" => "\u{2951}", + "LeftUpTeeVector;" => "\u{2960}", + "LeftUpVector;" => "\u{21BF}", + "LeftUpVectorBar;" => "\u{2958}", + "LeftVector;" => "\u{21BC}", + "LeftVectorBar;" => "\u{2952}", + "Leftarrow;" => "\u{21D0}", + "Leftrightarrow;" => "\u{21D4}", + "LessEqualGreater;" => "\u{22DA}", + "LessFullEqual;" => "\u{2266}", + "LessGreater;" => "\u{2276}", + "LessLess;" => "\u{2AA1}", + "LessSlantEqual;" => "\u{2A7D}", + "LessTilde;" => "\u{2272}", + "Lfr;" => "\u{1D50F}", + "Ll;" => "\u{22D8}", + "Lleftarrow;" => "\u{21DA}", + "Lmidot;" => "\u{013F}", + "LongLeftArrow;" => "\u{27F5}", + "LongLeftRightArrow;" => "\u{27F7}", + "LongRightArrow;" => "\u{27F6}", + "Longleftarrow;" => "\u{27F8}", + "Longleftrightarrow;" => "\u{27FA}", + "Longrightarrow;" => "\u{27F9}", + "Lopf;" => "\u{1D543}", + "LowerLeftArrow;" => "\u{2199}", + "LowerRightArrow;" => "\u{2198}", + "Lscr;" => "\u{2112}", + "Lsh;" => "\u{21B0}", + "Lstrok;" => "\u{0141}", + "Lt;" => "\u{226A}", + "Map;" => "\u{2905}", + "Mcy;" => "\u{041C}", + "MediumSpace;" => "\u{205F}", + "Mellintrf;" => "\u{2133}", + "Mfr;" => "\u{1D510}", + "MinusPlus;" => "\u{2213}", + "Mopf;" => "\u{1D544}", + "Mscr;" => "\u{2133}", + "Mu;" => "\u{039C}", + "NJcy;" => "\u{040A}", + "Nacute;" => "\u{0143}", + "Ncaron;" => "\u{0147}", + "Ncedil;" => "\u{0145}", + "Ncy;" => "\u{041D}", + "NegativeMediumSpace;" => "\u{200B}", + "NegativeThickSpace;" => "\u{200B}", + "NegativeThinSpace;" => "\u{200B}", + "NegativeVeryThinSpace;" => "\u{200B}", + "NestedGreaterGreater;" => "\u{226B}", + "NestedLessLess;" => "\u{226A}", + "NewLine;" => "\u{000A}", + "Nfr;" => "\u{1D511}", + "NoBreak;" => "\u{2060}", + "NonBreakingSpace;" => "\u{00A0}", + "Nopf;" => "\u{2115}", + "Not;" => "\u{2AEC}", + "NotCongruent;" => "\u{2262}", + "NotCupCap;" => "\u{226D}", + "NotDoubleVerticalBar;" => "\u{2226}", + "NotElement;" => "\u{2209}", + "NotEqual;" => "\u{2260}", + "NotExists;" => "\u{2204}", + "NotGreater;" => "\u{226F}", + "NotGreaterEqual;" => "\u{2271}", + "NotGreaterLess;" => "\u{2279}", + "NotGreaterTilde;" => "\u{2275}", + "NotLeftTriangle;" => "\u{22EA}", + "NotLeftTriangleEqual;" => "\u{22EC}", + "NotLess;" => "\u{226E}", + "NotLessEqual;" => "\u{2270}", + "NotLessGreater;" => "\u{2278}", + "NotLessTilde;" => "\u{2274}", + "NotPrecedes;" => "\u{2280}", + "NotPrecedesSlantEqual;" => "\u{22E0}", + "NotReverseElement;" => "\u{220C}", + "NotRightTriangle;" => "\u{22EB}", + "NotRightTriangleEqual;" => "\u{22ED}", + "NotSquareSubsetEqual;" => "\u{22E2}", + "NotSquareSupersetEqual;" => "\u{22E3}", + "NotSubsetEqual;" => "\u{2288}", + "NotSucceeds;" => "\u{2281}", + "NotSucceedsSlantEqual;" => "\u{22E1}", + "NotSupersetEqual;" => "\u{2289}", + "NotTilde;" => "\u{2241}", + "NotTildeEqual;" => "\u{2244}", + "NotTildeFullEqual;" => "\u{2247}", + "NotTildeTilde;" => "\u{2249}", + "NotVerticalBar;" => "\u{2224}", + "Nscr;" => "\u{1D4A9}", + "Ntilde;" => "\u{00D1}", + "Nu;" => "\u{039D}", + "OElig;" => "\u{0152}", + "Oacute;" => "\u{00D3}", + "Ocirc;" => "\u{00D4}", + "Ocy;" => "\u{041E}", + "Odblac;" => "\u{0150}", + "Ofr;" => "\u{1D512}", + "Ograve;" => "\u{00D2}", + "Omacr;" => "\u{014C}", + "Omega;" => "\u{03A9}", + "Omicron;" => "\u{039F}", + "Oopf;" => "\u{1D546}", + "OpenCurlyDoubleQuote;" => "\u{201C}", + "OpenCurlyQuote;" => "\u{2018}", + "Or;" => "\u{2A54}", + "Oscr;" => "\u{1D4AA}", + "Oslash;" => "\u{00D8}", + "Otilde;" => "\u{00D5}", + "Otimes;" => "\u{2A37}", + "Ouml;" => "\u{00D6}", + "OverBar;" => "\u{203E}", + "OverBrace;" => "\u{23DE}", + "OverBracket;" => "\u{23B4}", + "OverParenthesis;" => "\u{23DC}", + "PartialD;" => "\u{2202}", + "Pcy;" => "\u{041F}", + "Pfr;" => "\u{1D513}", + "Phi;" => "\u{03A6}", + "Pi;" => "\u{03A0}", + "PlusMinus;" => "\u{00B1}", + "Poincareplane;" => "\u{210C}", + "Popf;" => "\u{2119}", + "Pr;" => "\u{2ABB}", + "Precedes;" => "\u{227A}", + "PrecedesEqual;" => "\u{2AAF}", + "PrecedesSlantEqual;" => "\u{227C}", + "PrecedesTilde;" => "\u{227E}", + "Prime;" => "\u{2033}", + "Product;" => "\u{220F}", + "Proportion;" => "\u{2237}", + "Proportional;" => "\u{221D}", + "Pscr;" => "\u{1D4AB}", + "Psi;" => "\u{03A8}", + "QUOT;" => "\u{0022}", + "Qfr;" => "\u{1D514}", + "Qopf;" => "\u{211A}", + "Qscr;" => "\u{1D4AC}", + "RBarr;" => "\u{2910}", + "REG;" => "\u{00AE}", + "Racute;" => "\u{0154}", + "Rang;" => "\u{27EB}", + "Rarr;" => "\u{21A0}", + "Rarrtl;" => "\u{2916}", + "Rcaron;" => "\u{0158}", + "Rcedil;" => "\u{0156}", + "Rcy;" => "\u{0420}", + "Re;" => "\u{211C}", + "ReverseElement;" => "\u{220B}", + "ReverseEquilibrium;" => "\u{21CB}", + "ReverseUpEquilibrium;" => "\u{296F}", + "Rfr;" => "\u{211C}", + "Rho;" => "\u{03A1}", + "RightAngleBracket;" => "\u{27E9}", + "RightArrow;" => "\u{2192}", + "RightArrowBar;" => "\u{21E5}", + "RightArrowLeftArrow;" => "\u{21C4}", + "RightCeiling;" => "\u{2309}", + "RightDoubleBracket;" => "\u{27E7}", + "RightDownTeeVector;" => "\u{295D}", + "RightDownVector;" => "\u{21C2}", + "RightDownVectorBar;" => "\u{2955}", + "RightFloor;" => "\u{230B}", + "RightTee;" => "\u{22A2}", + "RightTeeArrow;" => "\u{21A6}", + "RightTeeVector;" => "\u{295B}", + "RightTriangle;" => "\u{22B3}", + "RightTriangleBar;" => "\u{29D0}", + "RightTriangleEqual;" => "\u{22B5}", + "RightUpDownVector;" => "\u{294F}", + "RightUpTeeVector;" => "\u{295C}", + "RightUpVector;" => "\u{21BE}", + "RightUpVectorBar;" => "\u{2954}", + "RightVector;" => "\u{21C0}", + "RightVectorBar;" => "\u{2953}", + "Rightarrow;" => "\u{21D2}", + "Ropf;" => "\u{211D}", + "RoundImplies;" => "\u{2970}", + "Rrightarrow;" => "\u{21DB}", + "Rscr;" => "\u{211B}", + "Rsh;" => "\u{21B1}", + "RuleDelayed;" => "\u{29F4}", + "SHCHcy;" => "\u{0429}", + "SHcy;" => "\u{0428}", + "SOFTcy;" => "\u{042C}", + "Sacute;" => "\u{015A}", + "Sc;" => "\u{2ABC}", + "Scaron;" => "\u{0160}", + "Scedil;" => "\u{015E}", + "Scirc;" => "\u{015C}", + "Scy;" => "\u{0421}", + "Sfr;" => "\u{1D516}", + "ShortDownArrow;" => "\u{2193}", + "ShortLeftArrow;" => "\u{2190}", + "ShortRightArrow;" => "\u{2192}", + "ShortUpArrow;" => "\u{2191}", + "Sigma;" => "\u{03A3}", + "SmallCircle;" => "\u{2218}", + "Sopf;" => "\u{1D54A}", + "Sqrt;" => "\u{221A}", + "Square;" => "\u{25A1}", + "SquareIntersection;" => "\u{2293}", + "SquareSubset;" => "\u{228F}", + "SquareSubsetEqual;" => "\u{2291}", + "SquareSuperset;" => "\u{2290}", + "SquareSupersetEqual;" => "\u{2292}", + "SquareUnion;" => "\u{2294}", + "Sscr;" => "\u{1D4AE}", + "Star;" => "\u{22C6}", + "Sub;" => "\u{22D0}", + "Subset;" => "\u{22D0}", + "SubsetEqual;" => "\u{2286}", + "Succeeds;" => "\u{227B}", + "SucceedsEqual;" => "\u{2AB0}", + "SucceedsSlantEqual;" => "\u{227D}", + "SucceedsTilde;" => "\u{227F}", + "SuchThat;" => "\u{220B}", + "Sum;" => "\u{2211}", + "Sup;" => "\u{22D1}", + "Superset;" => "\u{2283}", + "SupersetEqual;" => "\u{2287}", + "Supset;" => "\u{22D1}", + "THORN;" => "\u{00DE}", + "TRADE;" => "\u{2122}", + "TSHcy;" => "\u{040B}", + "TScy;" => "\u{0426}", + "Tab;" => "\u{0009}", + "Tau;" => "\u{03A4}", + "Tcaron;" => "\u{0164}", + "Tcedil;" => "\u{0162}", + "Tcy;" => "\u{0422}", + "Tfr;" => "\u{1D517}", + "Therefore;" => "\u{2234}", + "Theta;" => "\u{0398}", + "ThinSpace;" => "\u{2009}", + "Tilde;" => "\u{223C}", + "TildeEqual;" => "\u{2243}", + "TildeFullEqual;" => "\u{2245}", + "TildeTilde;" => "\u{2248}", + "Topf;" => "\u{1D54B}", + "TripleDot;" => "\u{20DB}", + "Tscr;" => "\u{1D4AF}", + "Tstrok;" => "\u{0166}", + "Uacute;" => "\u{00DA}", + "Uarr;" => "\u{219F}", + "Uarrocir;" => "\u{2949}", + "Ubrcy;" => "\u{040E}", + "Ubreve;" => "\u{016C}", + "Ucirc;" => "\u{00DB}", + "Ucy;" => "\u{0423}", + "Udblac;" => "\u{0170}", + "Ufr;" => "\u{1D518}", + "Ugrave;" => "\u{00D9}", + "Umacr;" => "\u{016A}", + "UnderBar;" => "\u{005F}", + "UnderBrace;" => "\u{23DF}", + "UnderBracket;" => "\u{23B5}", + "UnderParenthesis;" => "\u{23DD}", + "Union;" => "\u{22C3}", + "UnionPlus;" => "\u{228E}", + "Uogon;" => "\u{0172}", + "Uopf;" => "\u{1D54C}", + "UpArrow;" => "\u{2191}", + "UpArrowBar;" => "\u{2912}", + "UpArrowDownArrow;" => "\u{21C5}", + "UpDownArrow;" => "\u{2195}", + "UpEquilibrium;" => "\u{296E}", + "UpTee;" => "\u{22A5}", + "UpTeeArrow;" => "\u{21A5}", + "Uparrow;" => "\u{21D1}", + "Updownarrow;" => "\u{21D5}", + "UpperLeftArrow;" => "\u{2196}", + "UpperRightArrow;" => "\u{2197}", + "Upsi;" => "\u{03D2}", + "Upsilon;" => "\u{03A5}", + "Uring;" => "\u{016E}", + "Uscr;" => "\u{1D4B0}", + "Utilde;" => "\u{0168}", + "Uuml;" => "\u{00DC}", + "VDash;" => "\u{22AB}", + "Vbar;" => "\u{2AEB}", + "Vcy;" => "\u{0412}", + "Vdash;" => "\u{22A9}", + "Vdashl;" => "\u{2AE6}", + "Vee;" => "\u{22C1}", + "Verbar;" => "\u{2016}", + "Vert;" => "\u{2016}", + "VerticalBar;" => "\u{2223}", + "VerticalLine;" => "\u{007C}", + "VerticalSeparator;" => "\u{2758}", + "VerticalTilde;" => "\u{2240}", + "VeryThinSpace;" => "\u{200A}", + "Vfr;" => "\u{1D519}", + "Vopf;" => "\u{1D54D}", + "Vscr;" => "\u{1D4B1}", + "Vvdash;" => "\u{22AA}", + "Wcirc;" => "\u{0174}", + "Wedge;" => "\u{22C0}", + "Wfr;" => "\u{1D51A}", + "Wopf;" => "\u{1D54E}", + "Wscr;" => "\u{1D4B2}", + "Xfr;" => "\u{1D51B}", + "Xi;" => "\u{039E}", + "Xopf;" => "\u{1D54F}", + "Xscr;" => "\u{1D4B3}", + "YAcy;" => "\u{042F}", + "YIcy;" => "\u{0407}", + "YUcy;" => "\u{042E}", + "Yacute;" => "\u{00DD}", + "Ycirc;" => "\u{0176}", + "Ycy;" => "\u{042B}", + "Yfr;" => "\u{1D51C}", + "Yopf;" => "\u{1D550}", + "Yscr;" => "\u{1D4B4}", + "Yuml;" => "\u{0178}", + "ZHcy;" => "\u{0416}", + "Zacute;" => "\u{0179}", + "Zcaron;" => "\u{017D}", + "Zcy;" => "\u{0417}", + "Zdot;" => "\u{017B}", + "ZeroWidthSpace;" => "\u{200B}", + "Zeta;" => "\u{0396}", + "Zfr;" => "\u{2128}", + "Zopf;" => "\u{2124}", + "Zscr;" => "\u{1D4B5}", + "aacute;" => "\u{00E1}", + "abreve;" => "\u{0103}", + "ac;" => "\u{223E}", + "acd;" => "\u{223F}", + "acirc;" => "\u{00E2}", + "acute;" => "\u{00B4}", + "acy;" => "\u{0430}", + "aelig;" => "\u{00E6}", + "af;" => "\u{2061}", + "afr;" => "\u{1D51E}", + "agrave;" => "\u{00E0}", + "alefsym;" => "\u{2135}", + "aleph;" => "\u{2135}", + "alpha;" => "\u{03B1}", + "amacr;" => "\u{0101}", + "amalg;" => "\u{2A3F}", + "amp;" => "\u{0026}", + "and;" => "\u{2227}", + "andand;" => "\u{2A55}", + "andd;" => "\u{2A5C}", + "andslope;" => "\u{2A58}", + "andv;" => "\u{2A5A}", + "ang;" => "\u{2220}", + "ange;" => "\u{29A4}", + "angle;" => "\u{2220}", + "angmsd;" => "\u{2221}", + "angmsdaa;" => "\u{29A8}", + "angmsdab;" => "\u{29A9}", + "angmsdac;" => "\u{29AA}", + "angmsdad;" => "\u{29AB}", + "angmsdae;" => "\u{29AC}", + "angmsdaf;" => "\u{29AD}", + "angmsdag;" => "\u{29AE}", + "angmsdah;" => "\u{29AF}", + "angrt;" => "\u{221F}", + "angrtvb;" => "\u{22BE}", + "angrtvbd;" => "\u{299D}", + "angsph;" => "\u{2222}", + "angst;" => "\u{00C5}", + "angzarr;" => "\u{237C}", + "aogon;" => "\u{0105}", + "aopf;" => "\u{1D552}", + "ap;" => "\u{2248}", + "apE;" => "\u{2A70}", + "apacir;" => "\u{2A6F}", + "ape;" => "\u{224A}", + "apid;" => "\u{224B}", + "apos;" => "\u{0027}", + "approx;" => "\u{2248}", + "approxeq;" => "\u{224A}", + "aring;" => "\u{00E5}", + "ascr;" => "\u{1D4B6}", + "ast;" => "\u{002A}", + "asymp;" => "\u{2248}", + "asympeq;" => "\u{224D}", + "atilde;" => "\u{00E3}", + "auml;" => "\u{00E4}", + "awconint;" => "\u{2233}", + "awint;" => "\u{2A11}", + "bNot;" => "\u{2AED}", + "backcong;" => "\u{224C}", + "backepsilon;" => "\u{03F6}", + "backprime;" => "\u{2035}", + "backsim;" => "\u{223D}", + "backsimeq;" => "\u{22CD}", + "barvee;" => "\u{22BD}", + "barwed;" => "\u{2305}", + "barwedge;" => "\u{2305}", + "bbrk;" => "\u{23B5}", + "bbrktbrk;" => "\u{23B6}", + "bcong;" => "\u{224C}", + "bcy;" => "\u{0431}", + "bdquo;" => "\u{201E}", + "becaus;" => "\u{2235}", + "because;" => "\u{2235}", + "bemptyv;" => "\u{29B0}", + "bepsi;" => "\u{03F6}", + "bernou;" => "\u{212C}", + "beta;" => "\u{03B2}", + "beth;" => "\u{2136}", + "between;" => "\u{226C}", + "bfr;" => "\u{1D51F}", + "bigcap;" => "\u{22C2}", + "bigcirc;" => "\u{25EF}", + "bigcup;" => "\u{22C3}", + "bigodot;" => "\u{2A00}", + "bigoplus;" => "\u{2A01}", + "bigotimes;" => "\u{2A02}", + "bigsqcup;" => "\u{2A06}", + "bigstar;" => "\u{2605}", + "bigtriangledown;" => "\u{25BD}", + "bigtriangleup;" => "\u{25B3}", + "biguplus;" => "\u{2A04}", + "bigvee;" => "\u{22C1}", + "bigwedge;" => "\u{22C0}", + "bkarow;" => "\u{290D}", + "blacklozenge;" => "\u{29EB}", + "blacksquare;" => "\u{25AA}", + "blacktriangle;" => "\u{25B4}", + "blacktriangledown;" => "\u{25BE}", + "blacktriangleleft;" => "\u{25C2}", + "blacktriangleright;" => "\u{25B8}", + "blank;" => "\u{2423}", + "blk12;" => "\u{2592}", + "blk14;" => "\u{2591}", + "blk34;" => "\u{2593}", + "block;" => "\u{2588}", + "bnot;" => "\u{2310}", + "bopf;" => "\u{1D553}", + "bot;" => "\u{22A5}", + "bottom;" => "\u{22A5}", + "bowtie;" => "\u{22C8}", + "boxDL;" => "\u{2557}", + "boxDR;" => "\u{2554}", + "boxDl;" => "\u{2556}", + "boxDr;" => "\u{2553}", + "boxH;" => "\u{2550}", + "boxHD;" => "\u{2566}", + "boxHU;" => "\u{2569}", + "boxHd;" => "\u{2564}", + "boxHu;" => "\u{2567}", + "boxUL;" => "\u{255D}", + "boxUR;" => "\u{255A}", + "boxUl;" => "\u{255C}", + "boxUr;" => "\u{2559}", + "boxV;" => "\u{2551}", + "boxVH;" => "\u{256C}", + "boxVL;" => "\u{2563}", + "boxVR;" => "\u{2560}", + "boxVh;" => "\u{256B}", + "boxVl;" => "\u{2562}", + "boxVr;" => "\u{255F}", + "boxbox;" => "\u{29C9}", + "boxdL;" => "\u{2555}", + "boxdR;" => "\u{2552}", + "boxdl;" => "\u{2510}", + "boxdr;" => "\u{250C}", + "boxh;" => "\u{2500}", + "boxhD;" => "\u{2565}", + "boxhU;" => "\u{2568}", + "boxhd;" => "\u{252C}", + "boxhu;" => "\u{2534}", + "boxminus;" => "\u{229F}", + "boxplus;" => "\u{229E}", + "boxtimes;" => "\u{22A0}", + "boxuL;" => "\u{255B}", + "boxuR;" => "\u{2558}", + "boxul;" => "\u{2518}", + "boxur;" => "\u{2514}", + "boxv;" => "\u{2502}", + "boxvH;" => "\u{256A}", + "boxvL;" => "\u{2561}", + "boxvR;" => "\u{255E}", + "boxvh;" => "\u{253C}", + "boxvl;" => "\u{2524}", + "boxvr;" => "\u{251C}", + "bprime;" => "\u{2035}", + "breve;" => "\u{02D8}", + "brvbar;" => "\u{00A6}", + "bscr;" => "\u{1D4B7}", + "bsemi;" => "\u{204F}", + "bsim;" => "\u{223D}", + "bsime;" => "\u{22CD}", + "bsol;" => "\u{005C}", + "bsolb;" => "\u{29C5}", + "bsolhsub;" => "\u{27C8}", + "bull;" => "\u{2022}", + "bullet;" => "\u{2022}", + "bump;" => "\u{224E}", + "bumpE;" => "\u{2AAE}", + "bumpe;" => "\u{224F}", + "bumpeq;" => "\u{224F}", + "cacute;" => "\u{0107}", + "cap;" => "\u{2229}", + "capand;" => "\u{2A44}", + "capbrcup;" => "\u{2A49}", + "capcap;" => "\u{2A4B}", + "capcup;" => "\u{2A47}", + "capdot;" => "\u{2A40}", + "caret;" => "\u{2041}", + "caron;" => "\u{02C7}", + "ccaps;" => "\u{2A4D}", + "ccaron;" => "\u{010D}", + "ccedil;" => "\u{00E7}", + "ccirc;" => "\u{0109}", + "ccups;" => "\u{2A4C}", + "ccupssm;" => "\u{2A50}", + "cdot;" => "\u{010B}", + "cedil;" => "\u{00B8}", + "cemptyv;" => "\u{29B2}", + "cent;" => "\u{00A2}", + "centerdot;" => "\u{00B7}", + "cfr;" => "\u{1D520}", + "chcy;" => "\u{0447}", + "check;" => "\u{2713}", + "checkmark;" => "\u{2713}", + "chi;" => "\u{03C7}", + "cir;" => "\u{25CB}", + "cirE;" => "\u{29C3}", + "circ;" => "\u{02C6}", + "circeq;" => "\u{2257}", + "circlearrowleft;" => "\u{21BA}", + "circlearrowright;" => "\u{21BB}", + "circledR;" => "\u{00AE}", + "circledS;" => "\u{24C8}", + "circledast;" => "\u{229B}", + "circledcirc;" => "\u{229A}", + "circleddash;" => "\u{229D}", + "cire;" => "\u{2257}", + "cirfnint;" => "\u{2A10}", + "cirmid;" => "\u{2AEF}", + "cirscir;" => "\u{29C2}", + "clubs;" => "\u{2663}", + "clubsuit;" => "\u{2663}", + "colon;" => "\u{003A}", + "colone;" => "\u{2254}", + "coloneq;" => "\u{2254}", + "comma;" => "\u{002C}", + "commat;" => "\u{0040}", + "comp;" => "\u{2201}", + "compfn;" => "\u{2218}", + "complement;" => "\u{2201}", + "complexes;" => "\u{2102}", + "cong;" => "\u{2245}", + "congdot;" => "\u{2A6D}", + "conint;" => "\u{222E}", + "copf;" => "\u{1D554}", + "coprod;" => "\u{2210}", + "copy;" => "\u{00A9}", + "copysr;" => "\u{2117}", + "crarr;" => "\u{21B5}", + "cross;" => "\u{2717}", + "cscr;" => "\u{1D4B8}", + "csub;" => "\u{2ACF}", + "csube;" => "\u{2AD1}", + "csup;" => "\u{2AD0}", + "csupe;" => "\u{2AD2}", + "ctdot;" => "\u{22EF}", + "cudarrl;" => "\u{2938}", + "cudarrr;" => "\u{2935}", + "cuepr;" => "\u{22DE}", + "cuesc;" => "\u{22DF}", + "cularr;" => "\u{21B6}", + "cularrp;" => "\u{293D}", + "cup;" => "\u{222A}", + "cupbrcap;" => "\u{2A48}", + "cupcap;" => "\u{2A46}", + "cupcup;" => "\u{2A4A}", + "cupdot;" => "\u{228D}", + "cupor;" => "\u{2A45}", + "curarr;" => "\u{21B7}", + "curarrm;" => "\u{293C}", + "curlyeqprec;" => "\u{22DE}", + "curlyeqsucc;" => "\u{22DF}", + "curlyvee;" => "\u{22CE}", + "curlywedge;" => "\u{22CF}", + "curren;" => "\u{00A4}", + "curvearrowleft;" => "\u{21B6}", + "curvearrowright;" => "\u{21B7}", + "cuvee;" => "\u{22CE}", + "cuwed;" => "\u{22CF}", + "cwconint;" => "\u{2232}", + "cwint;" => "\u{2231}", + "cylcty;" => "\u{232D}", + "dArr;" => "\u{21D3}", + "dHar;" => "\u{2965}", + "dagger;" => "\u{2020}", + "daleth;" => "\u{2138}", + "darr;" => "\u{2193}", + "dash;" => "\u{2010}", + "dashv;" => "\u{22A3}", + "dbkarow;" => "\u{290F}", + "dblac;" => "\u{02DD}", + "dcaron;" => "\u{010F}", + "dcy;" => "\u{0434}", + "dd;" => "\u{2146}", + "ddagger;" => "\u{2021}", + "ddarr;" => "\u{21CA}", + "ddotseq;" => "\u{2A77}", + "deg;" => "\u{00B0}", + "delta;" => "\u{03B4}", + "demptyv;" => "\u{29B1}", + "dfisht;" => "\u{297F}", + "dfr;" => "\u{1D521}", + "dharl;" => "\u{21C3}", + "dharr;" => "\u{21C2}", + "diam;" => "\u{22C4}", + "diamond;" => "\u{22C4}", + "diamondsuit;" => "\u{2666}", + "diams;" => "\u{2666}", + "die;" => "\u{00A8}", + "digamma;" => "\u{03DD}", + "disin;" => "\u{22F2}", + "div;" => "\u{00F7}", + "divide;" => "\u{00F7}", + "divideontimes;" => "\u{22C7}", + "divonx;" => "\u{22C7}", + "djcy;" => "\u{0452}", + "dlcorn;" => "\u{231E}", + "dlcrop;" => "\u{230D}", + "dollar;" => "\u{0024}", + "dopf;" => "\u{1D555}", + "dot;" => "\u{02D9}", + "doteq;" => "\u{2250}", + "doteqdot;" => "\u{2251}", + "dotminus;" => "\u{2238}", + "dotplus;" => "\u{2214}", + "dotsquare;" => "\u{22A1}", + "doublebarwedge;" => "\u{2306}", + "downarrow;" => "\u{2193}", + "downdownarrows;" => "\u{21CA}", + "downharpoonleft;" => "\u{21C3}", + "downharpoonright;" => "\u{21C2}", + "drbkarow;" => "\u{2910}", + "drcorn;" => "\u{231F}", + "drcrop;" => "\u{230C}", + "dscr;" => "\u{1D4B9}", + "dscy;" => "\u{0455}", + "dsol;" => "\u{29F6}", + "dstrok;" => "\u{0111}", + "dtdot;" => "\u{22F1}", + "dtri;" => "\u{25BF}", + "dtrif;" => "\u{25BE}", + "duarr;" => "\u{21F5}", + "duhar;" => "\u{296F}", + "dwangle;" => "\u{29A6}", + "dzcy;" => "\u{045F}", + "dzigrarr;" => "\u{27FF}", + "eDDot;" => "\u{2A77}", + "eDot;" => "\u{2251}", + "eacute;" => "\u{00E9}", + "easter;" => "\u{2A6E}", + "ecaron;" => "\u{011B}", + "ecir;" => "\u{2256}", + "ecirc;" => "\u{00EA}", + "ecolon;" => "\u{2255}", + "ecy;" => "\u{044D}", + "edot;" => "\u{0117}", + "ee;" => "\u{2147}", + "efDot;" => "\u{2252}", + "efr;" => "\u{1D522}", + "eg;" => "\u{2A9A}", + "egrave;" => "\u{00E8}", + "egs;" => "\u{2A96}", + "egsdot;" => "\u{2A98}", + "el;" => "\u{2A99}", + "elinters;" => "\u{23E7}", + "ell;" => "\u{2113}", + "els;" => "\u{2A95}", + "elsdot;" => "\u{2A97}", + "emacr;" => "\u{0113}", + "empty;" => "\u{2205}", + "emptyset;" => "\u{2205}", + "emptyv;" => "\u{2205}", + "emsp;" => "\u{2003}", + "emsp13;" => "\u{2004}", + "emsp14;" => "\u{2005}", + "eng;" => "\u{014B}", + "ensp;" => "\u{2002}", + "eogon;" => "\u{0119}", + "eopf;" => "\u{1D556}", + "epar;" => "\u{22D5}", + "eparsl;" => "\u{29E3}", + "eplus;" => "\u{2A71}", + "epsi;" => "\u{03B5}", + "epsilon;" => "\u{03B5}", + "epsiv;" => "\u{03F5}", + "eqcirc;" => "\u{2256}", + "eqcolon;" => "\u{2255}", + "eqsim;" => "\u{2242}", + "eqslantgtr;" => "\u{2A96}", + "eqslantless;" => "\u{2A95}", + "equals;" => "\u{003D}", + "equest;" => "\u{225F}", + "equiv;" => "\u{2261}", + "equivDD;" => "\u{2A78}", + "eqvparsl;" => "\u{29E5}", + "erDot;" => "\u{2253}", + "erarr;" => "\u{2971}", + "escr;" => "\u{212F}", + "esdot;" => "\u{2250}", + "esim;" => "\u{2242}", + "eta;" => "\u{03B7}", + "eth;" => "\u{00F0}", + "euml;" => "\u{00EB}", + "euro;" => "\u{20AC}", + "excl;" => "\u{0021}", + "exist;" => "\u{2203}", + "expectation;" => "\u{2130}", + "exponentiale;" => "\u{2147}", + "fallingdotseq;" => "\u{2252}", + "fcy;" => "\u{0444}", + "female;" => "\u{2640}", + "ffilig;" => "\u{FB03}", + "fflig;" => "\u{FB00}", + "ffllig;" => "\u{FB04}", + "ffr;" => "\u{1D523}", + "filig;" => "\u{FB01}", + "flat;" => "\u{266D}", + "fllig;" => "\u{FB02}", + "fltns;" => "\u{25B1}", + "fnof;" => "\u{0192}", + "fopf;" => "\u{1D557}", + "forall;" => "\u{2200}", + "fork;" => "\u{22D4}", + "forkv;" => "\u{2AD9}", + "fpartint;" => "\u{2A0D}", + "frac12;" => "\u{00BD}", + "frac13;" => "\u{2153}", + "frac14;" => "\u{00BC}", + "frac15;" => "\u{2155}", + "frac16;" => "\u{2159}", + "frac18;" => "\u{215B}", + "frac23;" => "\u{2154}", + "frac25;" => "\u{2156}", + "frac34;" => "\u{00BE}", + "frac35;" => "\u{2157}", + "frac38;" => "\u{215C}", + "frac45;" => "\u{2158}", + "frac56;" => "\u{215A}", + "frac58;" => "\u{215D}", + "frac78;" => "\u{215E}", + "frasl;" => "\u{2044}", + "frown;" => "\u{2322}", + "fscr;" => "\u{1D4BB}", + "gE;" => "\u{2267}", + "gEl;" => "\u{2A8C}", + "gacute;" => "\u{01F5}", + "gamma;" => "\u{03B3}", + "gammad;" => "\u{03DD}", + "gap;" => "\u{2A86}", + "gbreve;" => "\u{011F}", + "gcirc;" => "\u{011D}", + "gcy;" => "\u{0433}", + "gdot;" => "\u{0121}", + "ge;" => "\u{2265}", + "gel;" => "\u{22DB}", + "geq;" => "\u{2265}", + "geqq;" => "\u{2267}", + "geqslant;" => "\u{2A7E}", + "ges;" => "\u{2A7E}", + "gescc;" => "\u{2AA9}", + "gesdot;" => "\u{2A80}", + "gesdoto;" => "\u{2A82}", + "gesdotol;" => "\u{2A84}", + "gesles;" => "\u{2A94}", + "gfr;" => "\u{1D524}", + "gg;" => "\u{226B}", + "ggg;" => "\u{22D9}", + "gimel;" => "\u{2137}", + "gjcy;" => "\u{0453}", + "gl;" => "\u{2277}", + "glE;" => "\u{2A92}", + "gla;" => "\u{2AA5}", + "glj;" => "\u{2AA4}", + "gnE;" => "\u{2269}", + "gnap;" => "\u{2A8A}", + "gnapprox;" => "\u{2A8A}", + "gne;" => "\u{2A88}", + "gneq;" => "\u{2A88}", + "gneqq;" => "\u{2269}", + "gnsim;" => "\u{22E7}", + "gopf;" => "\u{1D558}", + "grave;" => "\u{0060}", + "gscr;" => "\u{210A}", + "gsim;" => "\u{2273}", + "gsime;" => "\u{2A8E}", + "gsiml;" => "\u{2A90}", + "gt;" => "\u{003E}", + "gtcc;" => "\u{2AA7}", + "gtcir;" => "\u{2A7A}", + "gtdot;" => "\u{22D7}", + "gtlPar;" => "\u{2995}", + "gtquest;" => "\u{2A7C}", + "gtrapprox;" => "\u{2A86}", + "gtrarr;" => "\u{2978}", + "gtrdot;" => "\u{22D7}", + "gtreqless;" => "\u{22DB}", + "gtreqqless;" => "\u{2A8C}", + "gtrless;" => "\u{2277}", + "gtrsim;" => "\u{2273}", + "hArr;" => "\u{21D4}", + "hairsp;" => "\u{200A}", + "half;" => "\u{00BD}", + "hamilt;" => "\u{210B}", + "hardcy;" => "\u{044A}", + "harr;" => "\u{2194}", + "harrcir;" => "\u{2948}", + "harrw;" => "\u{21AD}", + "hbar;" => "\u{210F}", + "hcirc;" => "\u{0125}", + "hearts;" => "\u{2665}", + "heartsuit;" => "\u{2665}", + "hellip;" => "\u{2026}", + "hercon;" => "\u{22B9}", + "hfr;" => "\u{1D525}", + "hksearow;" => "\u{2925}", + "hkswarow;" => "\u{2926}", + "hoarr;" => "\u{21FF}", + "homtht;" => "\u{223B}", + "hookleftarrow;" => "\u{21A9}", + "hookrightarrow;" => "\u{21AA}", + "hopf;" => "\u{1D559}", + "horbar;" => "\u{2015}", + "hscr;" => "\u{1D4BD}", + "hslash;" => "\u{210F}", + "hstrok;" => "\u{0127}", + "hybull;" => "\u{2043}", + "hyphen;" => "\u{2010}", + "iacute;" => "\u{00ED}", + "ic;" => "\u{2063}", + "icirc;" => "\u{00EE}", + "icy;" => "\u{0438}", + "iecy;" => "\u{0435}", + "iexcl;" => "\u{00A1}", + "iff;" => "\u{21D4}", + "ifr;" => "\u{1D526}", + "igrave;" => "\u{00EC}", + "ii;" => "\u{2148}", + "iiiint;" => "\u{2A0C}", + "iiint;" => "\u{222D}", + "iinfin;" => "\u{29DC}", + "iiota;" => "\u{2129}", + "ijlig;" => "\u{0133}", + "imacr;" => "\u{012B}", + "image;" => "\u{2111}", + "imagline;" => "\u{2110}", + "imagpart;" => "\u{2111}", + "imath;" => "\u{0131}", + "imof;" => "\u{22B7}", + "imped;" => "\u{01B5}", + "in;" => "\u{2208}", + "incare;" => "\u{2105}", + "infin;" => "\u{221E}", + "infintie;" => "\u{29DD}", + "inodot;" => "\u{0131}", + "int;" => "\u{222B}", + "intcal;" => "\u{22BA}", + "integers;" => "\u{2124}", + "intercal;" => "\u{22BA}", + "intlarhk;" => "\u{2A17}", + "intprod;" => "\u{2A3C}", + "iocy;" => "\u{0451}", + "iogon;" => "\u{012F}", + "iopf;" => "\u{1D55A}", + "iota;" => "\u{03B9}", + "iprod;" => "\u{2A3C}", + "iquest;" => "\u{00BF}", + "iscr;" => "\u{1D4BE}", + "isin;" => "\u{2208}", + "isinE;" => "\u{22F9}", + "isindot;" => "\u{22F5}", + "isins;" => "\u{22F4}", + "isinsv;" => "\u{22F3}", + "isinv;" => "\u{2208}", + "it;" => "\u{2062}", + "itilde;" => "\u{0129}", + "iukcy;" => "\u{0456}", + "iuml;" => "\u{00EF}", + "jcirc;" => "\u{0135}", + "jcy;" => "\u{0439}", + "jfr;" => "\u{1D527}", + "jmath;" => "\u{0237}", + "jopf;" => "\u{1D55B}", + "jscr;" => "\u{1D4BF}", + "jsercy;" => "\u{0458}", + "jukcy;" => "\u{0454}", + "kappa;" => "\u{03BA}", + "kappav;" => "\u{03F0}", + "kcedil;" => "\u{0137}", + "kcy;" => "\u{043A}", + "kfr;" => "\u{1D528}", + "kgreen;" => "\u{0138}", + "khcy;" => "\u{0445}", + "kjcy;" => "\u{045C}", + "kopf;" => "\u{1D55C}", + "kscr;" => "\u{1D4C0}", + "lAarr;" => "\u{21DA}", + "lArr;" => "\u{21D0}", + "lAtail;" => "\u{291B}", + "lBarr;" => "\u{290E}", + "lE;" => "\u{2266}", + "lEg;" => "\u{2A8B}", + "lHar;" => "\u{2962}", + "lacute;" => "\u{013A}", + "laemptyv;" => "\u{29B4}", + "lagran;" => "\u{2112}", + "lambda;" => "\u{03BB}", + "lang;" => "\u{27E8}", + "langd;" => "\u{2991}", + "langle;" => "\u{27E8}", + "lap;" => "\u{2A85}", + "laquo;" => "\u{00AB}", + "larr;" => "\u{2190}", + "larrb;" => "\u{21E4}", + "larrbfs;" => "\u{291F}", + "larrfs;" => "\u{291D}", + "larrhk;" => "\u{21A9}", + "larrlp;" => "\u{21AB}", + "larrpl;" => "\u{2939}", + "larrsim;" => "\u{2973}", + "larrtl;" => "\u{21A2}", + "lat;" => "\u{2AAB}", + "latail;" => "\u{2919}", + "late;" => "\u{2AAD}", + "lbarr;" => "\u{290C}", + "lbbrk;" => "\u{2772}", + "lbrace;" => "\u{007B}", + "lbrack;" => "\u{005B}", + "lbrke;" => "\u{298B}", + "lbrksld;" => "\u{298F}", + "lbrkslu;" => "\u{298D}", + "lcaron;" => "\u{013E}", + "lcedil;" => "\u{013C}", + "lceil;" => "\u{2308}", + "lcub;" => "\u{007B}", + "lcy;" => "\u{043B}", + "ldca;" => "\u{2936}", + "ldquo;" => "\u{201C}", + "ldquor;" => "\u{201E}", + "ldrdhar;" => "\u{2967}", + "ldrushar;" => "\u{294B}", + "ldsh;" => "\u{21B2}", + "le;" => "\u{2264}", + "leftarrow;" => "\u{2190}", + "leftarrowtail;" => "\u{21A2}", + "leftharpoondown;" => "\u{21BD}", + "leftharpoonup;" => "\u{21BC}", + "leftleftarrows;" => "\u{21C7}", + "leftrightarrow;" => "\u{2194}", + "leftrightarrows;" => "\u{21C6}", + "leftrightharpoons;" => "\u{21CB}", + "leftrightsquigarrow;" => "\u{21AD}", + "leftthreetimes;" => "\u{22CB}", + "leg;" => "\u{22DA}", + "leq;" => "\u{2264}", + "leqq;" => "\u{2266}", + "leqslant;" => "\u{2A7D}", + "les;" => "\u{2A7D}", + "lescc;" => "\u{2AA8}", + "lesdot;" => "\u{2A7F}", + "lesdoto;" => "\u{2A81}", + "lesdotor;" => "\u{2A83}", + "lesges;" => "\u{2A93}", + "lessapprox;" => "\u{2A85}", + "lessdot;" => "\u{22D6}", + "lesseqgtr;" => "\u{22DA}", + "lesseqqgtr;" => "\u{2A8B}", + "lessgtr;" => "\u{2276}", + "lesssim;" => "\u{2272}", + "lfisht;" => "\u{297C}", + "lfloor;" => "\u{230A}", + "lfr;" => "\u{1D529}", + "lg;" => "\u{2276}", + "lgE;" => "\u{2A91}", + "lhard;" => "\u{21BD}", + "lharu;" => "\u{21BC}", + "lharul;" => "\u{296A}", + "lhblk;" => "\u{2584}", + "ljcy;" => "\u{0459}", + "ll;" => "\u{226A}", + "llarr;" => "\u{21C7}", + "llcorner;" => "\u{231E}", + "llhard;" => "\u{296B}", + "lltri;" => "\u{25FA}", + "lmidot;" => "\u{0140}", + "lmoust;" => "\u{23B0}", + "lmoustache;" => "\u{23B0}", + "lnE;" => "\u{2268}", + "lnap;" => "\u{2A89}", + "lnapprox;" => "\u{2A89}", + "lne;" => "\u{2A87}", + "lneq;" => "\u{2A87}", + "lneqq;" => "\u{2268}", + "lnsim;" => "\u{22E6}", + "loang;" => "\u{27EC}", + "loarr;" => "\u{21FD}", + "lobrk;" => "\u{27E6}", + "longleftarrow;" => "\u{27F5}", + "longleftrightarrow;" => "\u{27F7}", + "longmapsto;" => "\u{27FC}", + "longrightarrow;" => "\u{27F6}", + "looparrowleft;" => "\u{21AB}", + "looparrowright;" => "\u{21AC}", + "lopar;" => "\u{2985}", + "lopf;" => "\u{1D55D}", + "loplus;" => "\u{2A2D}", + "lotimes;" => "\u{2A34}", + "lowast;" => "\u{2217}", + "lowbar;" => "\u{005F}", + "loz;" => "\u{25CA}", + "lozenge;" => "\u{25CA}", + "lozf;" => "\u{29EB}", + "lpar;" => "\u{0028}", + "lparlt;" => "\u{2993}", + "lrarr;" => "\u{21C6}", + "lrcorner;" => "\u{231F}", + "lrhar;" => "\u{21CB}", + "lrhard;" => "\u{296D}", + "lrm;" => "\u{200E}", + "lrtri;" => "\u{22BF}", + "lsaquo;" => "\u{2039}", + "lscr;" => "\u{1D4C1}", + "lsh;" => "\u{21B0}", + "lsim;" => "\u{2272}", + "lsime;" => "\u{2A8D}", + "lsimg;" => "\u{2A8F}", + "lsqb;" => "\u{005B}", + "lsquo;" => "\u{2018}", + "lsquor;" => "\u{201A}", + "lstrok;" => "\u{0142}", + "lt;" => "\u{003C}", + "ltcc;" => "\u{2AA6}", + "ltcir;" => "\u{2A79}", + "ltdot;" => "\u{22D6}", + "lthree;" => "\u{22CB}", + "ltimes;" => "\u{22C9}", + "ltlarr;" => "\u{2976}", + "ltquest;" => "\u{2A7B}", + "ltrPar;" => "\u{2996}", + "ltri;" => "\u{25C3}", + "ltrie;" => "\u{22B4}", + "ltrif;" => "\u{25C2}", + "lurdshar;" => "\u{294A}", + "luruhar;" => "\u{2966}", + "mDDot;" => "\u{223A}", + "macr;" => "\u{00AF}", + "male;" => "\u{2642}", + "malt;" => "\u{2720}", + "maltese;" => "\u{2720}", + "map;" => "\u{21A6}", + "mapsto;" => "\u{21A6}", + "mapstodown;" => "\u{21A7}", + "mapstoleft;" => "\u{21A4}", + "mapstoup;" => "\u{21A5}", + "marker;" => "\u{25AE}", + "mcomma;" => "\u{2A29}", + "mcy;" => "\u{043C}", + "mdash;" => "\u{2014}", + "measuredangle;" => "\u{2221}", + "mfr;" => "\u{1D52A}", + "mho;" => "\u{2127}", + "micro;" => "\u{00B5}", + "mid;" => "\u{2223}", + "midast;" => "\u{002A}", + "midcir;" => "\u{2AF0}", + "middot;" => "\u{00B7}", + "minus;" => "\u{2212}", + "minusb;" => "\u{229F}", + "minusd;" => "\u{2238}", + "minusdu;" => "\u{2A2A}", + "mlcp;" => "\u{2ADB}", + "mldr;" => "\u{2026}", + "mnplus;" => "\u{2213}", + "models;" => "\u{22A7}", + "mopf;" => "\u{1D55E}", + "mp;" => "\u{2213}", + "mscr;" => "\u{1D4C2}", + "mstpos;" => "\u{223E}", + "mu;" => "\u{03BC}", + "multimap;" => "\u{22B8}", + "mumap;" => "\u{22B8}", + "nLeftarrow;" => "\u{21CD}", + "nLeftrightarrow;" => "\u{21CE}", + "nRightarrow;" => "\u{21CF}", + "nVDash;" => "\u{22AF}", + "nVdash;" => "\u{22AE}", + "nabla;" => "\u{2207}", + "nacute;" => "\u{0144}", + "nap;" => "\u{2249}", + "napos;" => "\u{0149}", + "napprox;" => "\u{2249}", + "natur;" => "\u{266E}", + "natural;" => "\u{266E}", + "naturals;" => "\u{2115}", + "nbsp;" => "\u{00A0}", + "ncap;" => "\u{2A43}", + "ncaron;" => "\u{0148}", + "ncedil;" => "\u{0146}", + "ncong;" => "\u{2247}", + "ncup;" => "\u{2A42}", + "ncy;" => "\u{043D}", + "ndash;" => "\u{2013}", + "ne;" => "\u{2260}", + "neArr;" => "\u{21D7}", + "nearhk;" => "\u{2924}", + "nearr;" => "\u{2197}", + "nearrow;" => "\u{2197}", + "nequiv;" => "\u{2262}", + "nesear;" => "\u{2928}", + "nexist;" => "\u{2204}", + "nexists;" => "\u{2204}", + "nfr;" => "\u{1D52B}", + "nge;" => "\u{2271}", + "ngeq;" => "\u{2271}", + "ngsim;" => "\u{2275}", + "ngt;" => "\u{226F}", + "ngtr;" => "\u{226F}", + "nhArr;" => "\u{21CE}", + "nharr;" => "\u{21AE}", + "nhpar;" => "\u{2AF2}", + "ni;" => "\u{220B}", + "nis;" => "\u{22FC}", + "nisd;" => "\u{22FA}", + "niv;" => "\u{220B}", + "njcy;" => "\u{045A}", + "nlArr;" => "\u{21CD}", + "nlarr;" => "\u{219A}", + "nldr;" => "\u{2025}", + "nle;" => "\u{2270}", + "nleftarrow;" => "\u{219A}", + "nleftrightarrow;" => "\u{21AE}", + "nleq;" => "\u{2270}", + "nless;" => "\u{226E}", + "nlsim;" => "\u{2274}", + "nlt;" => "\u{226E}", + "nltri;" => "\u{22EA}", + "nltrie;" => "\u{22EC}", + "nmid;" => "\u{2224}", + "nopf;" => "\u{1D55F}", + "not;" => "\u{00AC}", + "notin;" => "\u{2209}", + "notinva;" => "\u{2209}", + "notinvb;" => "\u{22F7}", + "notinvc;" => "\u{22F6}", + "notni;" => "\u{220C}", + "notniva;" => "\u{220C}", + "notnivb;" => "\u{22FE}", + "notnivc;" => "\u{22FD}", + "npar;" => "\u{2226}", + "nparallel;" => "\u{2226}", + "npolint;" => "\u{2A14}", + "npr;" => "\u{2280}", + "nprcue;" => "\u{22E0}", + "nprec;" => "\u{2280}", + "nrArr;" => "\u{21CF}", + "nrarr;" => "\u{219B}", + "nrightarrow;" => "\u{219B}", + "nrtri;" => "\u{22EB}", + "nrtrie;" => "\u{22ED}", + "nsc;" => "\u{2281}", + "nsccue;" => "\u{22E1}", + "nscr;" => "\u{1D4C3}", + "nshortmid;" => "\u{2224}", + "nshortparallel;" => "\u{2226}", + "nsim;" => "\u{2241}", + "nsime;" => "\u{2244}", + "nsimeq;" => "\u{2244}", + "nsmid;" => "\u{2224}", + "nspar;" => "\u{2226}", + "nsqsube;" => "\u{22E2}", + "nsqsupe;" => "\u{22E3}", + "nsub;" => "\u{2284}", + "nsube;" => "\u{2288}", + "nsubseteq;" => "\u{2288}", + "nsucc;" => "\u{2281}", + "nsup;" => "\u{2285}", + "nsupe;" => "\u{2289}", + "nsupseteq;" => "\u{2289}", + "ntgl;" => "\u{2279}", + "ntilde;" => "\u{00F1}", + "ntlg;" => "\u{2278}", + "ntriangleleft;" => "\u{22EA}", + "ntrianglelefteq;" => "\u{22EC}", + "ntriangleright;" => "\u{22EB}", + "ntrianglerighteq;" => "\u{22ED}", + "nu;" => "\u{03BD}", + "num;" => "\u{0023}", + "numero;" => "\u{2116}", + "numsp;" => "\u{2007}", + "nvDash;" => "\u{22AD}", + "nvHarr;" => "\u{2904}", + "nvdash;" => "\u{22AC}", + "nvinfin;" => "\u{29DE}", + "nvlArr;" => "\u{2902}", + "nvrArr;" => "\u{2903}", + "nwArr;" => "\u{21D6}", + "nwarhk;" => "\u{2923}", + "nwarr;" => "\u{2196}", + "nwarrow;" => "\u{2196}", + "nwnear;" => "\u{2927}", + "oS;" => "\u{24C8}", + "oacute;" => "\u{00F3}", + "oast;" => "\u{229B}", + "ocir;" => "\u{229A}", + "ocirc;" => "\u{00F4}", + "ocy;" => "\u{043E}", + "odash;" => "\u{229D}", + "odblac;" => "\u{0151}", + "odiv;" => "\u{2A38}", + "odot;" => "\u{2299}", + "odsold;" => "\u{29BC}", + "oelig;" => "\u{0153}", + "ofcir;" => "\u{29BF}", + "ofr;" => "\u{1D52C}", + "ogon;" => "\u{02DB}", + "ograve;" => "\u{00F2}", + "ogt;" => "\u{29C1}", + "ohbar;" => "\u{29B5}", + "ohm;" => "\u{03A9}", + "oint;" => "\u{222E}", + "olarr;" => "\u{21BA}", + "olcir;" => "\u{29BE}", + "olcross;" => "\u{29BB}", + "oline;" => "\u{203E}", + "olt;" => "\u{29C0}", + "omacr;" => "\u{014D}", + "omega;" => "\u{03C9}", + "omicron;" => "\u{03BF}", + "omid;" => "\u{29B6}", + "ominus;" => "\u{2296}", + "oopf;" => "\u{1D560}", + "opar;" => "\u{29B7}", + "operp;" => "\u{29B9}", + "oplus;" => "\u{2295}", + "or;" => "\u{2228}", + "orarr;" => "\u{21BB}", + "ord;" => "\u{2A5D}", + "order;" => "\u{2134}", + "orderof;" => "\u{2134}", + "ordf;" => "\u{00AA}", + "ordm;" => "\u{00BA}", + "origof;" => "\u{22B6}", + "oror;" => "\u{2A56}", + "orslope;" => "\u{2A57}", + "orv;" => "\u{2A5B}", + "oscr;" => "\u{2134}", + "oslash;" => "\u{00F8}", + "osol;" => "\u{2298}", + "otilde;" => "\u{00F5}", + "otimes;" => "\u{2297}", + "otimesas;" => "\u{2A36}", + "ouml;" => "\u{00F6}", + "ovbar;" => "\u{233D}", + "par;" => "\u{2225}", + "para;" => "\u{00B6}", + "parallel;" => "\u{2225}", + "parsim;" => "\u{2AF3}", + "parsl;" => "\u{2AFD}", + "part;" => "\u{2202}", + "pcy;" => "\u{043F}", + "percnt;" => "\u{0025}", + "period;" => "\u{002E}", + "permil;" => "\u{2030}", + "perp;" => "\u{22A5}", + "pertenk;" => "\u{2031}", + "pfr;" => "\u{1D52D}", + "phi;" => "\u{03C6}", + "phiv;" => "\u{03D5}", + "phmmat;" => "\u{2133}", + "phone;" => "\u{260E}", + "pi;" => "\u{03C0}", + "pitchfork;" => "\u{22D4}", + "piv;" => "\u{03D6}", + "planck;" => "\u{210F}", + "planckh;" => "\u{210E}", + "plankv;" => "\u{210F}", + "plus;" => "\u{002B}", + "plusacir;" => "\u{2A23}", + "plusb;" => "\u{229E}", + "pluscir;" => "\u{2A22}", + "plusdo;" => "\u{2214}", + "plusdu;" => "\u{2A25}", + "pluse;" => "\u{2A72}", + "plusmn;" => "\u{00B1}", + "plussim;" => "\u{2A26}", + "plustwo;" => "\u{2A27}", + "pm;" => "\u{00B1}", + "pointint;" => "\u{2A15}", + "popf;" => "\u{1D561}", + "pound;" => "\u{00A3}", + "pr;" => "\u{227A}", + "prE;" => "\u{2AB3}", + "prap;" => "\u{2AB7}", + "prcue;" => "\u{227C}", + "pre;" => "\u{2AAF}", + "prec;" => "\u{227A}", + "precapprox;" => "\u{2AB7}", + "preccurlyeq;" => "\u{227C}", + "preceq;" => "\u{2AAF}", + "precnapprox;" => "\u{2AB9}", + "precneqq;" => "\u{2AB5}", + "precnsim;" => "\u{22E8}", + "precsim;" => "\u{227E}", + "prime;" => "\u{2032}", + "primes;" => "\u{2119}", + "prnE;" => "\u{2AB5}", + "prnap;" => "\u{2AB9}", + "prnsim;" => "\u{22E8}", + "prod;" => "\u{220F}", + "profalar;" => "\u{232E}", + "profline;" => "\u{2312}", + "profsurf;" => "\u{2313}", + "prop;" => "\u{221D}", + "propto;" => "\u{221D}", + "prsim;" => "\u{227E}", + "prurel;" => "\u{22B0}", + "pscr;" => "\u{1D4C5}", + "psi;" => "\u{03C8}", + "puncsp;" => "\u{2008}", + "qfr;" => "\u{1D52E}", + "qint;" => "\u{2A0C}", + "qopf;" => "\u{1D562}", + "qprime;" => "\u{2057}", + "qscr;" => "\u{1D4C6}", + "quaternions;" => "\u{210D}", + "quatint;" => "\u{2A16}", + "quest;" => "\u{003F}", + "questeq;" => "\u{225F}", + "quot;" => "\u{0022}", + "rAarr;" => "\u{21DB}", + "rArr;" => "\u{21D2}", + "rAtail;" => "\u{291C}", + "rBarr;" => "\u{290F}", + "rHar;" => "\u{2964}", + "racute;" => "\u{0155}", + "radic;" => "\u{221A}", + "raemptyv;" => "\u{29B3}", + "rang;" => "\u{27E9}", + "rangd;" => "\u{2992}", + "range;" => "\u{29A5}", + "rangle;" => "\u{27E9}", + "raquo;" => "\u{00BB}", + "rarr;" => "\u{2192}", + "rarrap;" => "\u{2975}", + "rarrb;" => "\u{21E5}", + "rarrbfs;" => "\u{2920}", + "rarrc;" => "\u{2933}", + "rarrfs;" => "\u{291E}", + "rarrhk;" => "\u{21AA}", + "rarrlp;" => "\u{21AC}", + "rarrpl;" => "\u{2945}", + "rarrsim;" => "\u{2974}", + "rarrtl;" => "\u{21A3}", + "rarrw;" => "\u{219D}", + "ratail;" => "\u{291A}", + "ratio;" => "\u{2236}", + "rationals;" => "\u{211A}", + "rbarr;" => "\u{290D}", + "rbbrk;" => "\u{2773}", + "rbrace;" => "\u{007D}", + "rbrack;" => "\u{005D}", + "rbrke;" => "\u{298C}", + "rbrksld;" => "\u{298E}", + "rbrkslu;" => "\u{2990}", + "rcaron;" => "\u{0159}", + "rcedil;" => "\u{0157}", + "rceil;" => "\u{2309}", + "rcub;" => "\u{007D}", + "rcy;" => "\u{0440}", + "rdca;" => "\u{2937}", + "rdldhar;" => "\u{2969}", + "rdquo;" => "\u{201D}", + "rdquor;" => "\u{201D}", + "rdsh;" => "\u{21B3}", + "real;" => "\u{211C}", + "realine;" => "\u{211B}", + "realpart;" => "\u{211C}", + "reals;" => "\u{211D}", + "rect;" => "\u{25AD}", + "reg;" => "\u{00AE}", + "rfisht;" => "\u{297D}", + "rfloor;" => "\u{230B}", + "rfr;" => "\u{1D52F}", + "rhard;" => "\u{21C1}", + "rharu;" => "\u{21C0}", + "rharul;" => "\u{296C}", + "rho;" => "\u{03C1}", + "rhov;" => "\u{03F1}", + "rightarrow;" => "\u{2192}", + "rightarrowtail;" => "\u{21A3}", + "rightharpoondown;" => "\u{21C1}", + "rightharpoonup;" => "\u{21C0}", + "rightleftarrows;" => "\u{21C4}", + "rightleftharpoons;" => "\u{21CC}", + "rightrightarrows;" => "\u{21C9}", + "rightsquigarrow;" => "\u{219D}", + "rightthreetimes;" => "\u{22CC}", + "ring;" => "\u{02DA}", + "risingdotseq;" => "\u{2253}", + "rlarr;" => "\u{21C4}", + "rlhar;" => "\u{21CC}", + "rlm;" => "\u{200F}", + "rmoust;" => "\u{23B1}", + "rmoustache;" => "\u{23B1}", + "rnmid;" => "\u{2AEE}", + "roang;" => "\u{27ED}", + "roarr;" => "\u{21FE}", + "robrk;" => "\u{27E7}", + "ropar;" => "\u{2986}", + "ropf;" => "\u{1D563}", + "roplus;" => "\u{2A2E}", + "rotimes;" => "\u{2A35}", + "rpar;" => "\u{0029}", + "rpargt;" => "\u{2994}", + "rppolint;" => "\u{2A12}", + "rrarr;" => "\u{21C9}", + "rsaquo;" => "\u{203A}", + "rscr;" => "\u{1D4C7}", + "rsh;" => "\u{21B1}", + "rsqb;" => "\u{005D}", + "rsquo;" => "\u{2019}", + "rsquor;" => "\u{2019}", + "rthree;" => "\u{22CC}", + "rtimes;" => "\u{22CA}", + "rtri;" => "\u{25B9}", + "rtrie;" => "\u{22B5}", + "rtrif;" => "\u{25B8}", + "rtriltri;" => "\u{29CE}", + "ruluhar;" => "\u{2968}", + "rx;" => "\u{211E}", + "sacute;" => "\u{015B}", + "sbquo;" => "\u{201A}", + "sc;" => "\u{227B}", + "scE;" => "\u{2AB4}", + "scap;" => "\u{2AB8}", + "scaron;" => "\u{0161}", + "sccue;" => "\u{227D}", + "sce;" => "\u{2AB0}", + "scedil;" => "\u{015F}", + "scirc;" => "\u{015D}", + "scnE;" => "\u{2AB6}", + "scnap;" => "\u{2ABA}", + "scnsim;" => "\u{22E9}", + "scpolint;" => "\u{2A13}", + "scsim;" => "\u{227F}", + "scy;" => "\u{0441}", + "sdot;" => "\u{22C5}", + "sdotb;" => "\u{22A1}", + "sdote;" => "\u{2A66}", + "seArr;" => "\u{21D8}", + "searhk;" => "\u{2925}", + "searr;" => "\u{2198}", + "searrow;" => "\u{2198}", + "sect;" => "\u{00A7}", + "semi;" => "\u{003B}", + "seswar;" => "\u{2929}", + "setminus;" => "\u{2216}", + "setmn;" => "\u{2216}", + "sext;" => "\u{2736}", + "sfr;" => "\u{1D530}", + "sfrown;" => "\u{2322}", + "sharp;" => "\u{266F}", + "shchcy;" => "\u{0449}", + "shcy;" => "\u{0448}", + "shortmid;" => "\u{2223}", + "shortparallel;" => "\u{2225}", + "shy;" => "\u{00AD}", + "sigma;" => "\u{03C3}", + "sigmaf;" => "\u{03C2}", + "sigmav;" => "\u{03C2}", + "sim;" => "\u{223C}", + "simdot;" => "\u{2A6A}", + "sime;" => "\u{2243}", + "simeq;" => "\u{2243}", + "simg;" => "\u{2A9E}", + "simgE;" => "\u{2AA0}", + "siml;" => "\u{2A9D}", + "simlE;" => "\u{2A9F}", + "simne;" => "\u{2246}", + "simplus;" => "\u{2A24}", + "simrarr;" => "\u{2972}", + "slarr;" => "\u{2190}", + "smallsetminus;" => "\u{2216}", + "smashp;" => "\u{2A33}", + "smeparsl;" => "\u{29E4}", + "smid;" => "\u{2223}", + "smile;" => "\u{2323}", + "smt;" => "\u{2AAA}", + "smte;" => "\u{2AAC}", + "softcy;" => "\u{044C}", + "sol;" => "\u{002F}", + "solb;" => "\u{29C4}", + "solbar;" => "\u{233F}", + "sopf;" => "\u{1D564}", + "spades;" => "\u{2660}", + "spadesuit;" => "\u{2660}", + "spar;" => "\u{2225}", + "sqcap;" => "\u{2293}", + "sqcup;" => "\u{2294}", + "sqsub;" => "\u{228F}", + "sqsube;" => "\u{2291}", + "sqsubset;" => "\u{228F}", + "sqsubseteq;" => "\u{2291}", + "sqsup;" => "\u{2290}", + "sqsupe;" => "\u{2292}", + "sqsupset;" => "\u{2290}", + "sqsupseteq;" => "\u{2292}", + "squ;" => "\u{25A1}", + "square;" => "\u{25A1}", + "squarf;" => "\u{25AA}", + "squf;" => "\u{25AA}", + "srarr;" => "\u{2192}", + "sscr;" => "\u{1D4C8}", + "ssetmn;" => "\u{2216}", + "ssmile;" => "\u{2323}", + "sstarf;" => "\u{22C6}", + "star;" => "\u{2606}", + "starf;" => "\u{2605}", + "straightepsilon;" => "\u{03F5}", + "straightphi;" => "\u{03D5}", + "strns;" => "\u{00AF}", + "sub;" => "\u{2282}", + "subE;" => "\u{2AC5}", + "subdot;" => "\u{2ABD}", + "sube;" => "\u{2286}", + "subedot;" => "\u{2AC3}", + "submult;" => "\u{2AC1}", + "subnE;" => "\u{2ACB}", + "subne;" => "\u{228A}", + "subplus;" => "\u{2ABF}", + "subrarr;" => "\u{2979}", + "subset;" => "\u{2282}", + "subseteq;" => "\u{2286}", + "subseteqq;" => "\u{2AC5}", + "subsetneq;" => "\u{228A}", + "subsetneqq;" => "\u{2ACB}", + "subsim;" => "\u{2AC7}", + "subsub;" => "\u{2AD5}", + "subsup;" => "\u{2AD3}", + "succ;" => "\u{227B}", + "succapprox;" => "\u{2AB8}", + "succcurlyeq;" => "\u{227D}", + "succeq;" => "\u{2AB0}", + "succnapprox;" => "\u{2ABA}", + "succneqq;" => "\u{2AB6}", + "succnsim;" => "\u{22E9}", + "succsim;" => "\u{227F}", + "sum;" => "\u{2211}", + "sung;" => "\u{266A}", + "sup;" => "\u{2283}", + "sup1;" => "\u{00B9}", + "sup2;" => "\u{00B2}", + "sup3;" => "\u{00B3}", + "supE;" => "\u{2AC6}", + "supdot;" => "\u{2ABE}", + "supdsub;" => "\u{2AD8}", + "supe;" => "\u{2287}", + "supedot;" => "\u{2AC4}", + "suphsol;" => "\u{27C9}", + "suphsub;" => "\u{2AD7}", + "suplarr;" => "\u{297B}", + "supmult;" => "\u{2AC2}", + "supnE;" => "\u{2ACC}", + "supne;" => "\u{228B}", + "supplus;" => "\u{2AC0}", + "supset;" => "\u{2283}", + "supseteq;" => "\u{2287}", + "supseteqq;" => "\u{2AC6}", + "supsetneq;" => "\u{228B}", + "supsetneqq;" => "\u{2ACC}", + "supsim;" => "\u{2AC8}", + "supsub;" => "\u{2AD4}", + "supsup;" => "\u{2AD6}", + "swArr;" => "\u{21D9}", + "swarhk;" => "\u{2926}", + "swarr;" => "\u{2199}", + "swarrow;" => "\u{2199}", + "swnwar;" => "\u{292A}", + "szlig;" => "\u{00DF}", + "target;" => "\u{2316}", + "tau;" => "\u{03C4}", + "tbrk;" => "\u{23B4}", + "tcaron;" => "\u{0165}", + "tcedil;" => "\u{0163}", + "tcy;" => "\u{0442}", + "tdot;" => "\u{20DB}", + "telrec;" => "\u{2315}", + "tfr;" => "\u{1D531}", + "there4;" => "\u{2234}", + "therefore;" => "\u{2234}", + "theta;" => "\u{03B8}", + "thetasym;" => "\u{03D1}", + "thetav;" => "\u{03D1}", + "thickapprox;" => "\u{2248}", + "thicksim;" => "\u{223C}", + "thinsp;" => "\u{2009}", + "thkap;" => "\u{2248}", + "thksim;" => "\u{223C}", + "thorn;" => "\u{00FE}", + "tilde;" => "\u{02DC}", + "times;" => "\u{00D7}", + "timesb;" => "\u{22A0}", + "timesbar;" => "\u{2A31}", + "timesd;" => "\u{2A30}", + "tint;" => "\u{222D}", + "toea;" => "\u{2928}", + "top;" => "\u{22A4}", + "topbot;" => "\u{2336}", + "topcir;" => "\u{2AF1}", + "topf;" => "\u{1D565}", + "topfork;" => "\u{2ADA}", + "tosa;" => "\u{2929}", + "tprime;" => "\u{2034}", + "trade;" => "\u{2122}", + "triangle;" => "\u{25B5}", + "triangledown;" => "\u{25BF}", + "triangleleft;" => "\u{25C3}", + "trianglelefteq;" => "\u{22B4}", + "triangleq;" => "\u{225C}", + "triangleright;" => "\u{25B9}", + "trianglerighteq;" => "\u{22B5}", + "tridot;" => "\u{25EC}", + "trie;" => "\u{225C}", + "triminus;" => "\u{2A3A}", + "triplus;" => "\u{2A39}", + "trisb;" => "\u{29CD}", + "tritime;" => "\u{2A3B}", + "trpezium;" => "\u{23E2}", + "tscr;" => "\u{1D4C9}", + "tscy;" => "\u{0446}", + "tshcy;" => "\u{045B}", + "tstrok;" => "\u{0167}", + "twixt;" => "\u{226C}", + "twoheadleftarrow;" => "\u{219E}", + "twoheadrightarrow;" => "\u{21A0}", + "uArr;" => "\u{21D1}", + "uHar;" => "\u{2963}", + "uacute;" => "\u{00FA}", + "uarr;" => "\u{2191}", + "ubrcy;" => "\u{045E}", + "ubreve;" => "\u{016D}", + "ucirc;" => "\u{00FB}", + "ucy;" => "\u{0443}", + "udarr;" => "\u{21C5}", + "udblac;" => "\u{0171}", + "udhar;" => "\u{296E}", + "ufisht;" => "\u{297E}", + "ufr;" => "\u{1D532}", + "ugrave;" => "\u{00F9}", + "uharl;" => "\u{21BF}", + "uharr;" => "\u{21BE}", + "uhblk;" => "\u{2580}", + "ulcorn;" => "\u{231C}", + "ulcorner;" => "\u{231C}", + "ulcrop;" => "\u{230F}", + "ultri;" => "\u{25F8}", + "umacr;" => "\u{016B}", + "uml;" => "\u{00A8}", + "uogon;" => "\u{0173}", + "uopf;" => "\u{1D566}", + "uparrow;" => "\u{2191}", + "updownarrow;" => "\u{2195}", + "upharpoonleft;" => "\u{21BF}", + "upharpoonright;" => "\u{21BE}", + "uplus;" => "\u{228E}", + "upsi;" => "\u{03C5}", + "upsih;" => "\u{03D2}", + "upsilon;" => "\u{03C5}", + "upuparrows;" => "\u{21C8}", + "urcorn;" => "\u{231D}", + "urcorner;" => "\u{231D}", + "urcrop;" => "\u{230E}", + "uring;" => "\u{016F}", + "urtri;" => "\u{25F9}", + "uscr;" => "\u{1D4CA}", + "utdot;" => "\u{22F0}", + "utilde;" => "\u{0169}", + "utri;" => "\u{25B5}", + "utrif;" => "\u{25B4}", + "uuarr;" => "\u{21C8}", + "uuml;" => "\u{00FC}", + "uwangle;" => "\u{29A7}", + "vArr;" => "\u{21D5}", + "vBar;" => "\u{2AE8}", + "vBarv;" => "\u{2AE9}", + "vDash;" => "\u{22A8}", + "vangrt;" => "\u{299C}", + "varepsilon;" => "\u{03F5}", + "varkappa;" => "\u{03F0}", + "varnothing;" => "\u{2205}", + "varphi;" => "\u{03D5}", + "varpi;" => "\u{03D6}", + "varpropto;" => "\u{221D}", + "varr;" => "\u{2195}", + "varrho;" => "\u{03F1}", + "varsigma;" => "\u{03C2}", + "vartheta;" => "\u{03D1}", + "vartriangleleft;" => "\u{22B2}", + "vartriangleright;" => "\u{22B3}", + "vcy;" => "\u{0432}", + "vdash;" => "\u{22A2}", + "vee;" => "\u{2228}", + "veebar;" => "\u{22BB}", + "veeeq;" => "\u{225A}", + "vellip;" => "\u{22EE}", + "verbar;" => "\u{007C}", + "vert;" => "\u{007C}", + "vfr;" => "\u{1D533}", + "vltri;" => "\u{22B2}", + "vopf;" => "\u{1D567}", + "vprop;" => "\u{221D}", + "vrtri;" => "\u{22B3}", + "vscr;" => "\u{1D4CB}", + "vzigzag;" => "\u{299A}", + "wcirc;" => "\u{0175}", + "wedbar;" => "\u{2A5F}", + "wedge;" => "\u{2227}", + "wedgeq;" => "\u{2259}", + "weierp;" => "\u{2118}", + "wfr;" => "\u{1D534}", + "wopf;" => "\u{1D568}", + "wp;" => "\u{2118}", + "wr;" => "\u{2240}", + "wreath;" => "\u{2240}", + "wscr;" => "\u{1D4CC}", + "xcap;" => "\u{22C2}", + "xcirc;" => "\u{25EF}", + "xcup;" => "\u{22C3}", + "xdtri;" => "\u{25BD}", + "xfr;" => "\u{1D535}", + "xhArr;" => "\u{27FA}", + "xharr;" => "\u{27F7}", + "xi;" => "\u{03BE}", + "xlArr;" => "\u{27F8}", + "xlarr;" => "\u{27F5}", + "xmap;" => "\u{27FC}", + "xnis;" => "\u{22FB}", + "xodot;" => "\u{2A00}", + "xopf;" => "\u{1D569}", + "xoplus;" => "\u{2A01}", + "xotime;" => "\u{2A02}", + "xrArr;" => "\u{27F9}", + "xrarr;" => "\u{27F6}", + "xscr;" => "\u{1D4CD}", + "xsqcup;" => "\u{2A06}", + "xuplus;" => "\u{2A04}", + "xutri;" => "\u{25B3}", + "xvee;" => "\u{22C1}", + "xwedge;" => "\u{22C0}", + "yacute;" => "\u{00FD}", + "yacy;" => "\u{044F}", + "ycirc;" => "\u{0177}", + "ycy;" => "\u{044B}", + "yen;" => "\u{00A5}", + "yfr;" => "\u{1D536}", + "yicy;" => "\u{0457}", + "yopf;" => "\u{1D56A}", + "yscr;" => "\u{1D4CE}", + "yucy;" => "\u{044E}", + "yuml;" => "\u{00FF}", + "zacute;" => "\u{017A}", + "zcaron;" => "\u{017E}", + "zcy;" => "\u{0437}", + "zdot;" => "\u{017C}", + "zeetrf;" => "\u{2128}", + "zeta;" => "\u{03B6}", + "zfr;" => "\u{1D537}", + "zhcy;" => "\u{0436}", + "zigrarr;" => "\u{21DD}", + "zopf;" => "\u{1D56B}", + "zscr;" => "\u{1D4CF}", + "zwj;" => "\u{200D}", + "zwnj;" => "\u{200C}", + "AElig" => "\u{00C6}", + "AMP" => "\u{0026}", + "Aacute" => "\u{00C1}", + "Acirc" => "\u{00C2}", + "Agrave" => "\u{00C0}", + "Aring" => "\u{00C5}", + "Atilde" => "\u{00C3}", + "Auml" => "\u{00C4}", + "COPY" => "\u{00A9}", + "Ccedil" => "\u{00C7}", + "ETH" => "\u{00D0}", + "Eacute" => "\u{00C9}", + "Ecirc" => "\u{00CA}", + "Egrave" => "\u{00C8}", + "Euml" => "\u{00CB}", + "GT" => "\u{003E}", + "Iacute" => "\u{00CD}", + "Icirc" => "\u{00CE}", + "Igrave" => "\u{00CC}", + "Iuml" => "\u{00CF}", + "LT" => "\u{003C}", + "Ntilde" => "\u{00D1}", + "Oacute" => "\u{00D3}", + "Ocirc" => "\u{00D4}", + "Ograve" => "\u{00D2}", + "Oslash" => "\u{00D8}", + "Otilde" => "\u{00D5}", + "Ouml" => "\u{00D6}", + "QUOT" => "\u{0022}", + "REG" => "\u{00AE}", + "THORN" => "\u{00DE}", + "Uacute" => "\u{00DA}", + "Ucirc" => "\u{00DB}", + "Ugrave" => "\u{00D9}", + "Uuml" => "\u{00DC}", + "Yacute" => "\u{00DD}", + "aacute" => "\u{00E1}", + "acirc" => "\u{00E2}", + "acute" => "\u{00B4}", + "aelig" => "\u{00E6}", + "agrave" => "\u{00E0}", + "amp" => "\u{0026}", + "aring" => "\u{00E5}", + "atilde" => "\u{00E3}", + "auml" => "\u{00E4}", + "brvbar" => "\u{00A6}", + "ccedil" => "\u{00E7}", + "cedil" => "\u{00B8}", + "cent" => "\u{00A2}", + "copy" => "\u{00A9}", + "curren" => "\u{00A4}", + "deg" => "\u{00B0}", + "divide" => "\u{00F7}", + "eacute" => "\u{00E9}", + "ecirc" => "\u{00EA}", + "egrave" => "\u{00E8}", + "eth" => "\u{00F0}", + "euml" => "\u{00EB}", + "frac12" => "\u{00BD}", + "frac14" => "\u{00BC}", + "frac34" => "\u{00BE}", + "gt" => "\u{003E}", + "iacute" => "\u{00ED}", + "icirc" => "\u{00EE}", + "iexcl" => "\u{00A1}", + "igrave" => "\u{00EC}", + "iquest" => "\u{00BF}", + "iuml" => "\u{00EF}", + "laquo" => "\u{00AB}", + "lt" => "\u{003C}", + "macr" => "\u{00AF}", + "micro" => "\u{00B5}", + "middot" => "\u{00B7}", + "nbsp" => "\u{00A0}", + "not" => "\u{00AC}", + "ntilde" => "\u{00F1}", + "oacute" => "\u{00F3}", + "ocirc" => "\u{00F4}", + "ograve" => "\u{00F2}", + "ordf" => "\u{00AA}", + "ordm" => "\u{00BA}", + "oslash" => "\u{00F8}", + "otilde" => "\u{00F5}", + "ouml" => "\u{00F6}", + "para" => "\u{00B6}", + "plusmn" => "\u{00B1}", + "pound" => "\u{00A3}", + "quot" => "\u{0022}", + "raquo" => "\u{00BB}", + "reg" => "\u{00AE}", + "sect" => "\u{00A7}", + "shy" => "\u{00AD}", + "sup1" => "\u{00B9}", + "sup2" => "\u{00B2}", + "sup3" => "\u{00B3}", + "szlig" => "\u{00DF}", + "thorn" => "\u{00FE}", + "times" => "\u{00D7}", + "uacute" => "\u{00FA}", + "ucirc" => "\u{00FB}", + "ugrave" => "\u{00F9}", + "uml" => "\u{00A8}", + "uuml" => "\u{00FC}", + "yacute" => "\u{00FD}", + "yen" => "\u{00A5}", + "yuml" => "\u{00FF}", + + "nLt;" =>"\u{226A}{20D2}", + "nGt;" =>"\u{226B}{20D2}", + "NotEqualTilde;" =>"\u{2242}{0338}", + "NotGreaterFullEqual;" =>"\u{2267}{0338}", + "NotGreaterGreater;" =>"\u{226B}{0338}", + "NotGreaterSlantEqual;" =>"\u{2A7E}{0338}", + "NotHumpDownHump;" =>"\u{224E}{0338}", + "NotHumpEqual;" =>"\u{224F}{0338}", + "NotLeftTriangleBar;" =>"\u{29CF}{0338}", + "NotLessLess;" =>"\u{226A}{0338}", + "NotLessSlantEqual;" =>"\u{2A7D}{0338}", + "NotNestedGreaterGreater;" =>"\u{2AA2}{0338}", + "NotNestedLessLess;" =>"\u{2AA1}{0338}", + "NotPrecedesEqual;" =>"\u{2AAF}{0338}", + "NotRightTriangleBar;" =>"\u{29D0}{0338}", + "NotSquareSubset;" =>"\u{228F}{0338}", + "NotSquareSuperset;" =>"\u{2290}{0338}", + "NotSubset;" =>"\u{2282}{20D2}", + "NotSucceedsEqual;" =>"\u{2AB0}{0338}", + "NotSucceedsTilde;" =>"\u{227F}{0338}", + "NotSuperset;" =>"\u{2283}{20D2}", + "ThickSpace;" =>"\u{205F}{200A}", + "acE;" =>"\u{223E}{0333}", + "bne;" =>"\u{003D}{20E5}", + "bnequiv;" =>"\u{2261}{20E5}", + "caps;" =>"\u{2229}{FE00}", + "cups;" =>"\u{222A}{FE00}", + "fjlig;" =>"\u{0066}{006A}", + "gesl;" =>"\u{22DB}{FE00}", + "gvertneqq;" =>"\u{2269}{FE00}", + "gvnE;" =>"\u{2269}{FE00}", + "lates;" =>"\u{2AAD}{FE00}", + "lesg;" =>"\u{22DA}{FE00}", + "lvertneqq;" =>"\u{2268}{FE00}", + "lvnE;" =>"\u{2268}{FE00}", + "nGg;" =>"\u{22D9}{0338}", + "nGtv;" =>"\u{226B}{0338}", + "nLl;" =>"\u{22D8}{0338}", + "nLtv;" =>"\u{226A}{0338}", + "nang;" =>"\u{2220}{20D2}", + "napE;" =>"\u{2A70}{0338}", + "napid;" =>"\u{224B}{0338}", + "nbump;" =>"\u{224E}{0338}", + "nbumpe;" =>"\u{224F}{0338}", + "ncongdot;" =>"\u{2A6D}{0338}", + "nedot;" =>"\u{2250}{0338}", + "nesim;" =>"\u{2242}{0338}", + "ngE;" =>"\u{2267}{0338}", + "ngeqq;" =>"\u{2267}{0338}", + "ngeqslant;" =>"\u{2A7E}{0338}", + "nges;" =>"\u{2A7E}{0338}", + "nlE;" =>"\u{2266}{0338}", + "nleqq;" =>"\u{2266}{0338}", + "nleqslant;" =>"\u{2A7D}{0338}", + "nles;" =>"\u{2A7D}{0338}", + "notinE;" =>"\u{22F9}{0338}", + "notindot;" =>"\u{22F5}{0338}", + "nparsl;" =>"\u{2AFD}{20E5}", + "npart;" =>"\u{2202}{0338}", + "npre;" =>"\u{2AAF}{0338}", + "npreceq;" =>"\u{2AAF}{0338}", + "nrarrc;" =>"\u{2933}{0338}", + "nrarrw;" =>"\u{219D}{0338}", + "nsce;" =>"\u{2AB0}{0338}", + "nsubE;" =>"\u{2AC5}{0338}", + "nsubset;" =>"\u{2282}{20D2}", + "nsubseteqq;" =>"\u{2AC5}{0338}", + "nsucceq;" =>"\u{2AB0}{0338}", + "nsupE;" =>"\u{2AC6}{0338}", + "nsupset;" =>"\u{2283}{20D2}", + "nsupseteqq;" =>"\u{2AC6}{0338}", + "nvap;" =>"\u{224D}{20D2}", + "nvge;" =>"\u{2265}{20D2}", + "nvgt;" =>"\u{003E}{20D2}", + "nvle;" =>"\u{2264}{20D2}", + "nvlt;" =>"\u{003C}{20D2}", + "nvltrie;" =>"\u{22B4}{20D2}", + "nvrtrie;" =>"\u{22B5}{20D2}", + "nvsim;" =>"\u{223C}{20D2}", + "race;" =>"\u{223D}{0331}", + "smtes;" =>"\u{2AAC}{FE00}", + "sqcaps;" =>"\u{2293}{FE00}", + "sqcups;" =>"\u{2294}{FE00}", + "varsubsetneq;" =>"\u{228A}{FE00}", + "varsubsetneqq;" =>"\u{2ACB}{FE00}", + "varsupsetneq;" =>"\u{228B}{FE00}", + "varsupsetneqq;" =>"\u{2ACC}{FE00}", + "vnsub;" =>"\u{2282}{20D2}", + "vnsup;" =>"\u{2283}{20D2}", + "vsubnE;" =>"\u{2ACB}{FE00}", + "vsubne;" =>"\u{228A}{FE00}", + "vsupnE;" =>"\u{2ACC}{FE00}", + "vsupne;" =>"\u{228B}{FE00}", +}; diff --git a/src/html5_parser/token_replacements.rs b/src/html5_parser/token_replacements.rs index 254af41de..3c5575fa3 100644 --- a/src/html5_parser/token_replacements.rs +++ b/src/html5_parser/token_replacements.rs @@ -1,39 +1,39 @@ -// These are token replacements as defined by -// https://dev.w3.org/html5/spec-LC/tokenization.html#consume-a-character-reference -// If a character (#0x80; for instance) is found, it must be replaced by the given character -pub static TOKEN_REPLACEMENTS: phf::Map = phf::phf_map! { - 0x00_u32 => '\u{FFFD}', - 0x0d_u32 => '\u{000D}', - 0x80_u32 => '\u{20AC}', - 0x81_u32 => '\u{0081}', - 0x82_u32 => '\u{201A}', - 0x83_u32 => '\u{0192}', - 0x84_u32 => '\u{201E}', - 0x85_u32 => '\u{2026}', - 0x86_u32 => '\u{2020}', - 0x87_u32 => '\u{2021}', - 0x88_u32 => '\u{02C6}', - 0x89_u32 => '\u{2030}', - 0x8A_u32 => '\u{0160}', - 0x8B_u32 => '\u{2039}', - 0x8C_u32 => '\u{0152}', - 0x8D_u32 => '\u{008D}', - 0x8E_u32 => '\u{017D}', - 0x8F_u32 => '\u{008F}', - 0x90_u32 => '\u{0090}', - 0x91_u32 => '\u{2018}', - 0x92_u32 => '\u{2019}', - 0x93_u32 => '\u{201C}', - 0x94_u32 => '\u{201D}', - 0x95_u32 => '\u{2022}', - 0x96_u32 => '\u{2013}', - 0x97_u32 => '\u{2014}', - 0x98_u32 => '\u{02DC}', - 0x99_u32 => '\u{2122}', - 0x9A_u32 => '\u{0161}', - 0x9B_u32 => '\u{203A}', - 0x9C_u32 => '\u{0153}', - 0x9D_u32 => '\u{009D}', - 0x9E_u32 => '\u{017E}', - 0x9F_u32 => '\u{0178}', -}; \ No newline at end of file +// These are token replacements as defined by +// https://dev.w3.org/html5/spec-LC/tokenization.html#consume-a-character-reference +// If a character (#0x80; for instance) is found, it must be replaced by the given character +pub static TOKEN_REPLACEMENTS: phf::Map = phf::phf_map! { + 0x00_u32 => '\u{FFFD}', + 0x0d_u32 => '\u{000D}', + 0x80_u32 => '\u{20AC}', + 0x81_u32 => '\u{0081}', + 0x82_u32 => '\u{201A}', + 0x83_u32 => '\u{0192}', + 0x84_u32 => '\u{201E}', + 0x85_u32 => '\u{2026}', + 0x86_u32 => '\u{2020}', + 0x87_u32 => '\u{2021}', + 0x88_u32 => '\u{02C6}', + 0x89_u32 => '\u{2030}', + 0x8A_u32 => '\u{0160}', + 0x8B_u32 => '\u{2039}', + 0x8C_u32 => '\u{0152}', + 0x8D_u32 => '\u{008D}', + 0x8E_u32 => '\u{017D}', + 0x8F_u32 => '\u{008F}', + 0x90_u32 => '\u{0090}', + 0x91_u32 => '\u{2018}', + 0x92_u32 => '\u{2019}', + 0x93_u32 => '\u{201C}', + 0x94_u32 => '\u{201D}', + 0x95_u32 => '\u{2022}', + 0x96_u32 => '\u{2013}', + 0x97_u32 => '\u{2014}', + 0x98_u32 => '\u{02DC}', + 0x99_u32 => '\u{2122}', + 0x9A_u32 => '\u{0161}', + 0x9B_u32 => '\u{203A}', + 0x9C_u32 => '\u{0153}', + 0x9D_u32 => '\u{009D}', + 0x9E_u32 => '\u{017E}', + 0x9F_u32 => '\u{0178}', +}; diff --git a/src/html5_parser/token_states.rs b/src/html5_parser/token_states.rs index cdee5208f..7b31e685c 100644 --- a/src/html5_parser/token_states.rs +++ b/src/html5_parser/token_states.rs @@ -1,4 +1,5 @@ // These are the states in which the tokenizer can be in. +#[derive(Debug)] pub enum State { DataState, CharacterReferenceInDataState, diff --git a/src/html5_parser/tokenizer.rs b/src/html5_parser/tokenizer.rs index 3a08d2747..4eab8b94c 100644 --- a/src/html5_parser/tokenizer.rs +++ b/src/html5_parser/tokenizer.rs @@ -1,345 +1,229 @@ -use std::collections::BTreeMap; -use std::fmt; -use std::fmt::Formatter; -use crate::html5_parser::input_stream::InputStream; -use crate::html5_parser::token_states::State; - -// Constants that are not directly captured as visible chars -pub const CHAR_TAB: char = '\u{0009}'; -pub const CHAR_LF: char = '\u{000A}'; -pub const CHAR_FF: char = '\u{000C}'; -pub const CHAR_SPACE: char = '\u{0020}'; -pub const CHAR_REPLACEMENT: char = '\u{FFFD}'; - - -// Represents an attribute in the foo=bar form -pub struct Attribute { - value: String, - name_span: String, - value_span: String, -} - -impl Attribute { - pub fn new(value: String, name_span: String, value_span: String) -> Self { - Attribute{ - value, - name_span, - value_span, - } - } -} - -impl fmt::Display for Attribute { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - write!(f, "{}", self.value) - } -} - -// Represents a start tag like '

', or even '
' -pub struct StartTag { - name: String, - self_closing: bool, - attributes: BTreeMap, - name_span: String -} - -impl StartTag { - pub fn new (name: String, self_closing: bool, name_span: String) -> Self { - StartTag{ - name, - self_closing, - attributes: Default::default(), - name_span, - } - } -} - -impl fmt::Display for StartTag { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - write!(f, "<{}{}>", self.name, if self.self_closing { "/" } else { "" }) - } -} - -// Represents an end tag

-pub struct EndTag { - name: String, - name_span: String, -} - -impl EndTag { - pub fn new(name: String, name_span: String) -> Self { - EndTag{ - name, - name_span, - } - } -} - -impl fmt::Display for EndTag { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - write!(f, "", self.name) - } -} - -// Represents a doctype -pub struct DocType { - force_quirks: bool, - name: String, - pub_identifier: Option, - sys_identifier: Option, -} - -impl fmt::Display for DocType { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - write!( - f, - "<{} {} {} {}>", - self.name, - if self.force_quirks { " FORCE_QUIRKS!" } else { " NO_FORCE_QUIRKS" }, - self.pub_identifier.as_ref().unwrap_or(&String::new()), - self.sys_identifier.as_ref().unwrap_or(&String::new()), - ) - } -} - -impl DocType { - pub fn new(name: String, force_quirks: bool, pub_id: Option, sys_id: Option) -> Self { - DocType{ - force_quirks, - name, - pub_identifier: pub_id, - sys_identifier: sys_id, - } - } -} - -// Errors produced by the tokenizer -#[derive(Debug)] -pub enum Error { - EndOfStream, - NullEncountered, -} - -// Different tokens types that can be emitted by the tokenizer -pub(crate) enum Token { - DocType(DocType), - StartTag(StartTag), - EndTag(EndTag), - Attribute(Attribute), - Comment(String), - String(String), - Error { - error: Error, - span: String - }, - EOF, -} - -impl fmt::Display for Token { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - Token::DocType(doctype) => write!(f, "doctype[{}]", doctype), - Token::StartTag(tag) => write!(f, "starttag[{}]", tag), - Token::EndTag(tag) => write!(f, "endtag[{}]", tag), - Token::Attribute(s) => write!(f, "attr[{}]", s), - Token::Comment(s) => write!(f, "comment[{}]", s), - Token::String(s) => write!(f, "str[{}]", s), - Token::Error { error, span} => write!(f, "err[{:?} {}]", error, span), - Token::EOF => write!(f, "eof[]"), - } - } -} - - -// The tokenizer will read the input stream and emit tokens that can be used by the parser. -pub struct Tokenizer<'a> { - pub stream: &'a mut InputStream, // HTML character input stream - pub state: State, // Current state of the tokenizer - pub consumed: Vec, // Current consumed characters for current token - pub tmp_buf: Vec, // temporary buffer - // pub emitter: &'a mut dyn Emitter, // Emitter trait that will emit the tokens during parsing -} - -impl<'a> Tokenizer<'a> { - - pub fn new(input: &'a mut InputStream /*, emitter: &'a mut dyn Emitter*/) -> Self { - return Tokenizer{ - stream: input, - state: State::DataState, - consumed: vec![], - tmp_buf: vec![], - // emitter, - } - } - - // Retrieves the next token from the input stream or Token::EOF when the end is reached - pub(crate) fn next_token(&mut self) -> Token { - loop { - match self.state { - State::DataState => { - let c = match self.stream.read_char() { - Some(c) => c, - None => { - self.parse_error("EOF"); - return Token::EOF; - } - }; - - match c { - '&' => self.state = State::CharacterReferenceInDataState, - '<' => self.state = State::TagOpenState, - '\u{0000}' => { - self.parse_error("NUL encountered in stream"); - return Token::Error { error: Error::NullEncountered, span: String::new() }; - } - _ => return Token::String(String::from(c)), - } - } - State::CharacterReferenceInDataState => { - // consume character reference - let t = match self.consume_character_reference(None, false) - { - Some(s) => Token::String(s), - None => Token::String(String::from('&')), - }; - - self.state = State::DataState; - return t - } - State::RcDataState => {} - State::CharacterReferenceInRcDataState => {} - State::RawTextState => {} - State::ScriptDataState => {} - State::PlaintextState => {} - State::TagOpenState => {} - State::EndTagOpenState => {} - State::TagNameState => {} - State::RcDataLessThanSignState => {} - State::RcDataEndTagOpenState => {} - State::RcDataEndTagNameState => {} - State::RawTextLessThanSignState => {} - State::RawTextEndTagOpenState => {} - State::RawTextEndTagNameState => {} - State::ScriptDataLessThenSignState => {} - State::ScriptDataEndTagOpenState => {} - State::ScriptDataEndTagNameState => {} - State::ScriptDataEscapeStartState => {} - State::ScriptDataEscapeStartDashState => {} - State::ScriptDataEscapedState => {} - State::ScriptDataEscapedDashState => {} - State::ScriptDataEscapedLessThanSignState => {} - State::ScriptDataEscapedEndTagOpenState => {} - State::ScriptDataEscapedEndTagNameState => {} - State::ScriptDataDoubleEscapeStartState => {} - State::ScriptDataDoubleEscapedState => {} - State::ScriptDataDoubleEscapedDashState => {} - State::ScriptDataDoubleEscapedDashDashState => {} - State::ScriptDataDoubleEscapedLessThanSignState => {} - State::ScriptDataDoubleEscapeEndState => {} - State::BeforeAttributeNameState => {} - State::AttributeNameState => {} - State::BeforeAttributeValueState => {} - State::AttributeValueDoubleQuotedState => {} - State::AttributeValueSingleQuotedState => {} - State::AttributeValueUnquotedState => {} - State::CharacterReferenceInAttributeValueState => {} - State::AfterAttributeValueQuotedState => {} - State::SelfClosingStartState => {} - State::BogusCommentState => {} - State::MarkupDeclarationOpenState => {} - State::CommentStartState => {} - State::CommentStartDashState => {} - State::CommentState => {} - State::CommentEndDashState => {} - State::CommentEndState => {} - State::CommentEndBangState => {} - State::DocTypeState => {} - State::BeforeDocTypeNameState => {} - State::DocTypeNameState => {} - State::AfterDocTypeNameState => {} - State::AfterDocTypePublicKeywordState => {} - State::BeforeDocTypePublicIdentifierState => {} - State::DocTypePublicIdentifierDoubleQuotedState => {} - State::DocTypePublicIdentifierSingleQuotedState => {} - State::AfterDoctypePublicIdentifierState => {} - State::BetweenDocTypePublicAndSystemIdentifiersState => {} - State::AfterDocTypeSystemKeywordState => {} - State::BeforeDocTypeSystemIdentifiedState => {} - State::DocTypeSystemIdentifierDoubleQuotedState => {} - State::DocTypeSystemIdentifierSingleQuotedState => {} - State::AfterDocTypeSystemIdentifiedState => {} - State::BogusDocTypeState => {} - State::CDataSectionState => {} - } - } - - // return Token::Error{error: Error::EndOfStream, span: String::from("")} - } - - // Consumes the given char so it can be stored in the next output token - pub(crate) fn consume(&mut self, c: char) { - // Add c to the current token data - self.consumed.push(c) - } - - pub(crate) fn consume_string(&mut self, s: String) { - // Add c to the current token data - for c in s.chars() { - self.consumed.push(c) - } - } - - // Return the length of the current consumed array. This allows easy return to a previous - // state if tokenizing needs to return. - pub(crate) fn get_consume_len(&self) -> usize { - return self.consumed.len(); - } - - // Resize the consumed array to the given len. Useful when we need to backtrack to a previous consumption state - pub(crate) fn reset_consume_len(&mut self, len: usize) - { - self.consumed.resize(len, 0 as char); - } - - pub fn get_consumed_str(&self) -> String { - self.consumed.iter().collect() - } - - // Clears the current consume buffer - pub(crate) fn clear_consume_buffer(&mut self) { - self.consumed.clear() - } - - // Creates a parser log error message - pub(crate) fn parse_error(&mut self, _str: &str) { - // Add to parse log - println!("parse_error: {}", _str) - } -} - - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_tokens() { - let t = Token::Comment(String::from("this is a comment")); - assert_eq!("comment[this is a comment]", t.to_string()); - - let t = Token::String(String::from("this is a string")); - assert_eq!("str[this is a string]", t.to_string()); - - let t = Token::StartTag(StartTag::new(String::from("tag"), true, String::from(""))); - assert_eq!("starttag[]", t.to_string()); - - let t = Token::StartTag(StartTag::new(String::from("tag"), false, String::from(""))); - assert_eq!("starttag[]", t.to_string()); - - let t = Token::EndTag(EndTag::new(String::from("tag"), String::from(""))); - assert_eq!("endtag[]", t.to_string()); - - let t = Token::DocType(DocType::new(String::from("html"), true, Option::from(String::from("foo")), Option::from(String::from("bar")))); - assert_eq!("doctype[]", t.to_string()); - } -} \ No newline at end of file +use crate::html5_parser::input_stream::InputStream; +use crate::html5_parser::token::Token; +use crate::html5_parser::token_states::State; + +// Constants that are not directly captured as visible chars +pub const CHAR_TAB: char = '\u{0009}'; +pub const CHAR_LF: char = '\u{000A}'; +pub const CHAR_FF: char = '\u{000C}'; +pub const CHAR_SPACE: char = '\u{0020}'; +pub const CHAR_REPLACEMENT: char = '\u{FFFD}'; + +// Errors produced by the tokenizer +#[derive(Debug)] +pub enum Error { + NullEncountered, +} + +// The tokenizer will read the input stream and emit tokens that can be used by the parser. +pub struct Tokenizer<'a> { + pub stream: &'a mut InputStream, // HTML character input stream + pub state: State, // Current state of the tokenizer + pub consumed: Vec, // Current consumed characters for current token + // pub emitter: &'a mut dyn Emitter, // Emitter trait that will emit the tokens during parsing +} + +impl<'a> Tokenizer<'a> { + pub fn new(input: &'a mut InputStream /*, emitter: &'a mut dyn Emitter*/) -> Self { + return Tokenizer { + stream: input, + state: State::DataState, + consumed: vec![], + // emitter, + }; + } + + // Retrieves the next token from the input stream or Token::EOF when the end is reached + pub(crate) fn next_token(&mut self) -> Token { + loop { + println!("state: {:?}", self.state); + println!("consumed: {:?}", self.consumed); + + match self.state { + State::DataState => { + let c = match self.stream.read_char() { + Some(c) => c, + None => { + self.parse_error("EOF"); + return Token::EofToken; + } + }; + + match c { + '&' => self.state = State::CharacterReferenceInDataState, + '<' => self.state = State::TagOpenState, + '\u{0000}' => { + self.parse_error("NUL encountered in stream"); + } + _ => self.consume(c), + } + } + State::CharacterReferenceInDataState => { + // consume character reference + self.consume_character_reference(None, false); + self.state = State::DataState; + } + State::RcDataState => {} + State::CharacterReferenceInRcDataState => {} + State::RawTextState => {} + State::ScriptDataState => {} + State::PlaintextState => {} + State::TagOpenState => {} + State::EndTagOpenState => {} + State::TagNameState => {} + State::RcDataLessThanSignState => {} + State::RcDataEndTagOpenState => {} + State::RcDataEndTagNameState => {} + State::RawTextLessThanSignState => {} + State::RawTextEndTagOpenState => {} + State::RawTextEndTagNameState => {} + State::ScriptDataLessThenSignState => {} + State::ScriptDataEndTagOpenState => {} + State::ScriptDataEndTagNameState => {} + State::ScriptDataEscapeStartState => {} + State::ScriptDataEscapeStartDashState => {} + State::ScriptDataEscapedState => {} + State::ScriptDataEscapedDashState => {} + State::ScriptDataEscapedLessThanSignState => {} + State::ScriptDataEscapedEndTagOpenState => {} + State::ScriptDataEscapedEndTagNameState => {} + State::ScriptDataDoubleEscapeStartState => {} + State::ScriptDataDoubleEscapedState => {} + State::ScriptDataDoubleEscapedDashState => {} + State::ScriptDataDoubleEscapedDashDashState => {} + State::ScriptDataDoubleEscapedLessThanSignState => {} + State::ScriptDataDoubleEscapeEndState => {} + State::BeforeAttributeNameState => {} + State::AttributeNameState => {} + State::BeforeAttributeValueState => {} + State::AttributeValueDoubleQuotedState => {} + State::AttributeValueSingleQuotedState => {} + State::AttributeValueUnquotedState => {} + State::CharacterReferenceInAttributeValueState => {} + State::AfterAttributeValueQuotedState => {} + State::SelfClosingStartState => {} + State::BogusCommentState => {} + State::MarkupDeclarationOpenState => {} + State::CommentStartState => {} + State::CommentStartDashState => {} + State::CommentState => {} + State::CommentEndDashState => {} + State::CommentEndState => {} + State::CommentEndBangState => {} + State::DocTypeState => {} + State::BeforeDocTypeNameState => {} + State::DocTypeNameState => {} + State::AfterDocTypeNameState => {} + State::AfterDocTypePublicKeywordState => {} + State::BeforeDocTypePublicIdentifierState => {} + State::DocTypePublicIdentifierDoubleQuotedState => {} + State::DocTypePublicIdentifierSingleQuotedState => {} + State::AfterDoctypePublicIdentifierState => {} + State::BetweenDocTypePublicAndSystemIdentifiersState => {} + State::AfterDocTypeSystemKeywordState => {} + State::BeforeDocTypeSystemIdentifiedState => {} + State::DocTypeSystemIdentifierDoubleQuotedState => {} + State::DocTypeSystemIdentifierSingleQuotedState => {} + State::AfterDocTypeSystemIdentifiedState => {} + State::BogusDocTypeState => {} + State::CDataSectionState => {} + } + } + + // return Token::Error{error: Error::EndOfStream, span: String::from("")} + } + + // Consumes the given char + pub(crate) fn consume(&mut self, c: char) { + // Add c to the current token data + self.consumed.push(c) + } + + // Consumes the given string + pub(crate) fn consume_string(&mut self, s: String) { + // Add c to the current token data + for c in s.chars() { + self.consumed.push(c) + } + } + + // Return the consumed string as a String + pub fn get_consumed_str(&self) -> String { + self.consumed.iter().collect() + } + + // Clears the current consume buffer + pub(crate) fn clear_consume_buffer(&mut self) { + self.consumed.clear() + } + + // Creates a parser log error message + pub(crate) fn parse_error(&mut self, _str: &str) { + // Add to parse log + println!("parse_error: {}", _str) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::html5_parser::token::{Token, TokenTrait, TokenType}; + + #[test] + fn test_tokens() { + let t = Token::CommentToken { + value: String::from("this is a comment"), + }; + assert_eq!("comment[this is a comment]", t.to_string()); + + let t = Token::TextToken { + value: String::from("this is a string"), + }; + assert_eq!("str[this is a string]", t.to_string()); + + let t = Token::StartTagToken { + name: String::from("tag"), + is_self_closing: true, + attributes: Vec::new(), + }; + assert_eq!("starttag[]", t.to_string()); + + let t = Token::StartTagToken { + name: String::from("tag"), + is_self_closing: false, + attributes: Vec::new(), + }; + assert_eq!("starttag[]", t.to_string()); + + let t = Token::EndTagToken { + name: String::from("tag"), + }; + assert_eq!("endtag[]", t.to_string()); + + let t = Token::DocTypeToken { + name: String::from("html"), + force_quirks: true, + pub_identifier: Option::from(String::from("foo")), + sys_identifier: Option::from(String::from("bar")), + }; + assert_eq!("doctype[]", t.to_string()); + } + + #[test] + fn test_tokenizer() { + let mut is = InputStream::new(); + is.read_from_str("This code is © 2023 €", None); + + let mut tkznr = Tokenizer::new(&mut is); + + let t = tkznr.next_token(); + assert_eq!(TokenType::TextToken, t.type_of()); + + if let Token::TextToken { value } = t { + assert_eq!("This code is © 2023 €", value); + } + + let t = tkznr.next_token(); + assert_eq!(TokenType::EofToken, t.type_of()); + } +} diff --git a/src/main.rs b/src/main.rs index ddaa2a26a..807d33f74 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,8 +3,8 @@ use std::fs::File; #[allow(dead_code)] mod html5_parser; -use html5_parser::input_stream::{InputStream, Encoding}; use html5_parser::input_stream::Confidence; +use html5_parser::input_stream::{Encoding, InputStream}; use html5_parser::Html5Parser; fn main() { @@ -12,14 +12,16 @@ fn main() { // We just read the stream from a file. It will use UTF8 as the default encoding. let mut stream = InputStream::new(); - stream.read_from_file(file, Some(Encoding::UTF8)).expect("can't read from file"); + stream + .read_from_file(file, Some(Encoding::UTF8)) + .expect("can't read from file"); stream.set_confidence(Confidence::Certain); // We COULD set the encoding based on external input, like the content-type HTTP header, or // maybe a user-setting, or something else that is set by the user-agent) // If the encoding confidence is not Confidence::Certain, we should detect the encoding. - if ! stream.is_certain_encoding() { + if !stream.is_certain_encoding() { stream.detect_encoding() }