diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/emitter.rs | 493 | ||||
-rw-r--r-- | src/entities.rs | 15633 | ||||
-rw-r--r-- | src/error.rs | 87 | ||||
-rw-r--r-- | src/lib.rs | 2112 | ||||
-rw-r--r-- | src/machine.rs | 164 | ||||
-rw-r--r-- | src/reader.rs | 114 |
6 files changed, 18603 insertions, 0 deletions
diff --git a/src/emitter.rs b/src/emitter.rs new file mode 100644 index 0000000..5bf1e0a --- /dev/null +++ b/src/emitter.rs @@ -0,0 +1,493 @@ +use std::collections::BTreeMap; +use std::collections::BTreeSet; +use std::collections::VecDeque; +use std::mem; + +use crate::Error; + +/// An emitter is an object providing methods to the tokenizer to produce tokens. +/// +/// Domain-specific applications of the HTML tokenizer can manually implement this trait to +/// customize per-token allocations, or avoid them altogether. +/// +/// An emitter is assumed to have these internal states: +/// +/// * _last start tag_: The most recently emitted start tag's name +/// * _current token_: Can be a tag, doctype or comment token. There's only one current token. +/// * _current attribute_: The currently processed HTML attribute, consisting of two strings for name and value. +/// +/// The following methods are describing what kind of behavior the WHATWG spec expects, but that +/// doesn't mean you need to follow it. For example: +/// +/// * If your usage of the tokenizer will ignore all errors, none of the error handling and +/// validation requirements apply to you. You can implement `emit_error` as noop and omit all +/// checks that would emit errors. +/// +/// * If you don't care about attributes at all, you can make all related methods a noop. +/// +/// The state machine needs to have a functional implementation of +/// `current_is_appropriate_end_tag_token` to do correct transitions, however. +pub trait Emitter { + /// The token type emitted by this emitter. This controls what type of values the [`crate::Tokenizer`] + /// yields when used as an iterator. + type Token; + + /// Set the name of the _last start tag_. + /// + /// This is primarily for testing purposes. This is *not* supposed to override the tag name of + /// the current tag. + fn set_last_start_tag(&mut self, last_start_tag: Option<&str>); + + /// The state machine has reached the end of the file. It will soon call `pop_token` for the + /// last time. + fn emit_eof(&mut self); + + /// A (probably recoverable) parsing error has occured. + fn emit_error(&mut self, error: Error); + + /// After every state change, the tokenizer calls this method to retrieve a new token that can + /// be returned via the tokenizer's iterator interface. + fn pop_token(&mut self) -> Option<Self::Token>; + + /// Emit a bunch of plain characters as character tokens. + fn emit_string(&mut self, c: &str); + + /// Set the _current token_ to a start tag. + fn init_start_tag(&mut self); + + /// Set the _current token_ to an end tag. + fn init_end_tag(&mut self); + + /// Set the _current token_ to a comment. + fn init_comment(&mut self); + + /// Emit the _current token_, assuming it is a tag. + /// + /// Also get the current attribute and append it to the to-be-emitted tag. See docstring for + /// [`Emitter::init_attribute`] for how duplicates should be handled. + /// + /// If a start tag is emitted, update the _last start tag_. + /// + /// If the current token is not a start/end tag, this method may panic. + fn emit_current_tag(&mut self); + + /// Emit the _current token_, assuming it is a comment. + /// + /// If the current token is not a comment, this method may panic. + fn emit_current_comment(&mut self); + + /// Emit the _current token_, assuming it is a doctype. + /// + /// If the current token is not a doctype, this method may panic. + fn emit_current_doctype(&mut self); + + /// Assuming the _current token_ is a start tag, set the self-closing flag. + /// + /// If the current token is not a start or end tag, this method may panic. + /// + /// If the current token is an end tag, the emitter should emit the + /// [`crate::Error::EndTagWithTrailingSolidus`] error. + fn set_self_closing(&mut self); + + /// Assuming the _current token_ is a doctype, set its "force quirks" flag to true. + /// + /// If the current token is not a doctype, this method pay panic. + fn set_force_quirks(&mut self); + + /// Assuming the _current token_ is a start/end tag, append a string to the current tag's name. + /// + /// If the current token is not a start or end tag, this method may panic. + fn push_tag_name(&mut self, s: &str); + + /// Assuming the _current token_ is a comment, append a string to the comment's contents. + /// + /// If the current token is not a comment, this method may panic. + fn push_comment(&mut self, s: &str); + + /// Assuming the _current token_ is a doctype, append a string to the doctype's name. + /// + /// If the current token is not a doctype, this method may panic. + fn push_doctype_name(&mut self, s: &str); + + /// Set the _current token_ to a new doctype token: + /// + /// * the name should be empty + /// * the "public identifier" should be null (different from empty) + /// * the "system identifier" should be null (different from empty) + /// * the "force quirks" flag should be `false` + fn init_doctype(&mut self); + + /// Set the _current attribute_ to a new one, starting with empty name and value strings. + /// + /// The old attribute, if any, should be put on the _current token_. If an attribute with that + /// name already exists, WHATWG says the new one should be ignored and a + /// [`crate::Error::DuplicateAttribute`] error should be emitted. + /// + /// If the current token is an end tag token, a [`crate::Error::EndTagWithAttributes`] error should be + /// emitted. + /// + /// If the current token is no tag at all, this method may panic. + fn init_attribute(&mut self); + + /// Append a string to the current attribute's name. + /// + /// If there is no current attribute, this method may panic. + fn push_attribute_name(&mut self, s: &str); + + /// Append a string to the current attribute's value. + /// + /// If there is no current attribute, this method may panic. + fn push_attribute_value(&mut self, s: &str); + + /// Assuming the _current token_ is a doctype, set its "public identifier" to the given string. + /// + /// If the current token is not a doctype, this method may panic. + fn set_doctype_public_identifier(&mut self, value: &str); + + /// Assuming the _current token_ is a doctype, set its "system identifier" to the given string. + /// + /// If the current token is not a doctype, this method may panic. + fn set_doctype_system_identifier(&mut self, value: &str); + + /// Assuming the _current token_ is a doctype, append a string to its "public identifier" to the given string. + /// + /// If the current token is not a doctype, this method may panic. + fn push_doctype_public_identifier(&mut self, s: &str); + + /// Assuming the _current token_ is a doctype, append a string to its "system identifier" to the given string. + /// + /// If the current token is not a doctype, this method may panic. + fn push_doctype_system_identifier(&mut self, s: &str); + + /// Return true if all of these hold. Return false otherwise. + /// + /// * the _current token_ is an end tag + /// * the _last start tag_ exists + /// * the current end tag token's name equals to the last start tag's name. + /// + /// See also [WHATWG's definition of "appropriate end tag + /// token"](https://html.spec.whatwg.org/#appropriate-end-tag-token). + fn current_is_appropriate_end_tag_token(&mut self) -> bool; +} + +/// The default implementation of [`crate::Emitter`], used to produce ("emit") tokens. +pub struct DefaultEmitter { + current_characters: String, + current_token: Option<Token>, + last_start_tag: String, + current_attribute: Option<(String, String)>, + seen_attributes: BTreeSet<String>, + emitted_tokens: VecDeque<Token>, +} + +impl Default for DefaultEmitter { + fn default() -> Self { + DefaultEmitter { + current_characters: String::new(), + current_token: None, + last_start_tag: String::new(), + current_attribute: None, + seen_attributes: BTreeSet::new(), + emitted_tokens: VecDeque::new(), + } + } +} + +impl DefaultEmitter { + fn emit_token(&mut self, token: Token) { + self.flush_current_characters(); + self.emitted_tokens.push_front(token); + } + + fn flush_current_attribute(&mut self) { + if let Some((k, v)) = self.current_attribute.take() { + match self.current_token { + Some(Token::StartTag(ref mut tag)) => { + let mut error = None; + tag.attributes + .entry(k) + .and_modify(|_| { + error = Some(Error::DuplicateAttribute); + }) + .or_insert(v); + + if let Some(e) = error { + self.emit_error(e); + } + } + Some(Token::EndTag(_)) => { + if !self.seen_attributes.insert(k) { + self.emit_error(Error::DuplicateAttribute); + } + } + _ => { + debug_assert!(false); + } + } + } + } + + fn flush_current_characters(&mut self) { + if self.current_characters.is_empty() { + return; + } + + let s = mem::take(&mut self.current_characters); + self.emit_token(Token::String(s)); + } +} + +impl Emitter for DefaultEmitter { + type Token = Token; + + fn set_last_start_tag(&mut self, last_start_tag: Option<&str>) { + self.last_start_tag.clear(); + self.last_start_tag + .push_str(last_start_tag.unwrap_or_default()); + } + + fn emit_eof(&mut self) { + self.flush_current_characters(); + } + + fn emit_error(&mut self, error: Error) { + // bypass character flushing in self.emit_token: we don't need the error location to be + // that exact + self.emitted_tokens.push_front(Token::Error(error)); + } + + fn pop_token(&mut self) -> Option<Self::Token> { + self.emitted_tokens.pop_back() + } + + fn emit_string(&mut self, s: &str) { + self.current_characters.push_str(s); + } + + fn init_start_tag(&mut self) { + self.current_token = Some(Token::StartTag(Default::default())); + } + fn init_end_tag(&mut self) { + self.current_token = Some(Token::EndTag(Default::default())); + self.seen_attributes.clear(); + } + + fn init_comment(&mut self) { + self.current_token = Some(Token::Comment(String::new())); + } + fn emit_current_tag(&mut self) { + self.flush_current_attribute(); + let mut token = self.current_token.take().unwrap(); + match token { + Token::EndTag(_) => { + if !self.seen_attributes.is_empty() { + self.emit_error(Error::EndTagWithAttributes); + } + self.seen_attributes.clear(); + } + Token::StartTag(ref mut _tag) => { + self.set_last_start_tag(Some(&_tag.name)); + } + _ => debug_assert!(false), + } + self.emit_token(token); + } + fn emit_current_comment(&mut self) { + let comment = self.current_token.take().unwrap(); + debug_assert!(matches!(comment, Token::Comment(_))); + self.emit_token(comment); + } + + fn emit_current_doctype(&mut self) { + let doctype = self.current_token.take().unwrap(); + debug_assert!(matches!(doctype, Token::Doctype(_))); + self.emit_token(doctype); + } + + fn set_self_closing(&mut self) { + let tag = self.current_token.as_mut().unwrap(); + match tag { + Token::StartTag(StartTag { + ref mut self_closing, + .. + }) => { + *self_closing = true; + } + Token::EndTag(_) => { + self.emit_error(Error::EndTagWithTrailingSolidus); + } + _ => { + debug_assert!(false); + } + } + } + fn set_force_quirks(&mut self) { + match self.current_token { + Some(Token::Doctype(ref mut doctype)) => doctype.force_quirks = true, + _ => debug_assert!(false), + } + } + fn push_tag_name(&mut self, s: &str) { + match self.current_token { + Some(Token::StartTag(StartTag { ref mut name, .. })) => { + name.push_str(s); + } + Some(Token::EndTag(EndTag { ref mut name, .. })) => { + name.push_str(s); + } + _ => debug_assert!(false), + } + } + + fn push_comment(&mut self, s: &str) { + match self.current_token { + Some(Token::Comment(ref mut data)) => data.push_str(s), + _ => debug_assert!(false), + } + } + + fn push_doctype_name(&mut self, s: &str) { + match self.current_token { + Some(Token::Doctype(ref mut doctype)) => doctype.name.push_str(s), + _ => debug_assert!(false), + } + } + fn init_doctype(&mut self) { + self.current_token = Some(Token::Doctype(Doctype { + name: String::new(), + force_quirks: false, + public_identifier: None, + system_identifier: None, + })); + } + + fn init_attribute(&mut self) { + self.flush_current_attribute(); + self.current_attribute = Some((String::new(), String::new())); + } + fn push_attribute_name(&mut self, s: &str) { + self.current_attribute.as_mut().unwrap().0.push_str(s); + } + fn push_attribute_value(&mut self, s: &str) { + self.current_attribute.as_mut().unwrap().1.push_str(s); + } + fn set_doctype_public_identifier(&mut self, value: &str) { + if let Some(Token::Doctype(Doctype { + ref mut public_identifier, + .. + })) = self.current_token + { + *public_identifier = Some(value.to_owned()); + } else { + debug_assert!(false); + } + } + fn set_doctype_system_identifier(&mut self, value: &str) { + if let Some(Token::Doctype(Doctype { + ref mut system_identifier, + .. + })) = self.current_token + { + *system_identifier = Some(value.to_owned()); + } else { + debug_assert!(false); + } + } + fn push_doctype_public_identifier(&mut self, s: &str) { + if let Some(Token::Doctype(Doctype { + public_identifier: Some(ref mut id), + .. + })) = self.current_token + { + id.push_str(s); + } else { + debug_assert!(false); + } + } + fn push_doctype_system_identifier(&mut self, s: &str) { + if let Some(Token::Doctype(Doctype { + system_identifier: Some(ref mut id), + .. + })) = self.current_token + { + id.push_str(s); + } else { + debug_assert!(false); + } + } + + fn current_is_appropriate_end_tag_token(&mut self) -> bool { + match self.current_token { + Some(Token::EndTag(ref tag)) => { + !self.last_start_tag.is_empty() && self.last_start_tag == tag.name + } + _ => false, + } + } +} + +/// A HTML end/close tag, such as `<p>` or `<a>`. +#[derive(Debug, Default, Eq, PartialEq)] +pub struct StartTag { + /// Whether this tag is self-closing. If it is self-closing, no following [`EndTag`] should be + /// expected. + pub self_closing: bool, + + /// The start tag's name, such as `"p"` or `"a"`. + pub name: String, + + /// A mapping for any HTML attributes this start tag may have. + /// + /// Duplicate attributes are ignored after the first one as per WHATWG spec. Implement your own + /// [`Emitter`] to tweak this behavior. + pub attributes: BTreeMap<String, String>, +} + +/// A HTML end/close tag, such as `</p>` or `</a>`. +#[derive(Debug, Default, Eq, PartialEq)] +pub struct EndTag { + /// The ending tag's name, such as `"p"` or `"a"`. + pub name: String, +} + +/// A doctype. Some examples: +/// +/// * `<!DOCTYPE {name}>` +/// * `<!DOCTYPE {name} PUBLIC '{public_identifier}'>` +/// * `<!DOCTYPE {name} SYSTEM '{system_identifier}'>` +/// * `<!DOCTYPE {name} PUBLIC '{public_identifier}' '{system_identifier}'>` +#[derive(Debug, Eq, PartialEq)] +pub struct Doctype { + /// The ["force quirks"](https://html.spec.whatwg.org/#force-quirks-flag) flag. + pub force_quirks: bool, + + /// The doctype's name. For HTML documents this is "html". + pub name: String, + + /// The doctype's public identifier. + pub public_identifier: Option<String>, + + /// The doctype's system identifier. + pub system_identifier: Option<String>, +} + +/// The token type used by default. You can define your own token type by implementing the +/// [`crate::Emitter`] trait and using [`crate::Tokenizer::new_with_emitter`]. +#[derive(Debug, Eq, PartialEq)] +pub enum Token { + /// A HTML start tag. + StartTag(StartTag), + /// A HTML end tag. + EndTag(EndTag), + /// A literal string. + String(String), + /// A HTML comment. + Comment(String), + /// A HTML doctype declaration. + Doctype(Doctype), + /// A HTML parsing error. + /// + /// Can be skipped over, the tokenizer is supposed to recover from the error and continues with + /// more tokens afterward. + Error(Error), +} diff --git a/src/entities.rs b/src/entities.rs new file mode 100644 index 0000000..1ab3ffb --- /dev/null +++ b/src/entities.rs @@ -0,0 +1,15633 @@ +// @generated +// this file is autogenerated by +// curl https://html.spec.whatwg.org/entities.json | python generate_entities.py + +pub struct CharRef { + /// Name as it appears escaped in HTML + pub name: &'static str, + /// Unescaped character codepoints + pub characters: &'static str, +} + +pub fn try_read_character_reference( + first_char: char, + mut try_read: impl FnMut(&str) -> bool, +) -> Option<CharRef> { + if first_char == 'C' && try_read("ounterClockwiseContourIntegral;") { + return Some(CharRef { + name: "ounterClockwiseContourIntegral;", + characters: "\u{2233}", + }); + } + + if first_char == 'C' && try_read("lockwiseContourIntegral;") { + return Some(CharRef { + name: "lockwiseContourIntegral;", + characters: "\u{2232}", + }); + } + + if first_char == 'D' && try_read("oubleLongLeftRightArrow;") { + return Some(CharRef { + name: "oubleLongLeftRightArrow;", + characters: "\u{27fa}", + }); + } + + if first_char == 'N' && try_read("otNestedGreaterGreater;") { + return Some(CharRef { + name: "otNestedGreaterGreater;", + characters: "\u{2aa2}\u{338}", + }); + } + + if first_char == 'D' && try_read("iacriticalDoubleAcute;") { + return Some(CharRef { + name: "iacriticalDoubleAcute;", + characters: "\u{2dd}", + }); + } + + if first_char == 'N' && try_read("otSquareSupersetEqual;") { + return Some(CharRef { + name: "otSquareSupersetEqual;", + characters: "\u{22e3}", + }); + } + + if first_char == 'C' && try_read("loseCurlyDoubleQuote;") { + return Some(CharRef { + name: "loseCurlyDoubleQuote;", + characters: "\u{201d}", + }); + } + + if first_char == 'D' && try_read("oubleContourIntegral;") { + return Some(CharRef { + name: "oubleContourIntegral;", + characters: "\u{222f}", + }); + } + + if first_char == 'F' && try_read("illedVerySmallSquare;") { + return Some(CharRef { + name: "illedVerySmallSquare;", + characters: "\u{25aa}", + }); + } + + if first_char == 'N' && try_read("egativeVeryThinSpace;") { + return Some(CharRef { + name: "egativeVeryThinSpace;", + characters: "\u{200b}", + }); + } + + if first_char == 'N' && try_read("otPrecedesSlantEqual;") { + return Some(CharRef { + name: "otPrecedesSlantEqual;", + characters: "\u{22e0}", + }); + } + + if first_char == 'N' && try_read("otRightTriangleEqual;") { + return Some(CharRef { + name: "otRightTriangleEqual;", + characters: "\u{22ed}", + }); + } + + if first_char == 'N' && try_read("otSucceedsSlantEqual;") { + return Some(CharRef { + name: "otSucceedsSlantEqual;", + characters: "\u{22e1}", + }); + } + + if first_char == 'C' && try_read("apitalDifferentialD;") { + return Some(CharRef { + name: "apitalDifferentialD;", + characters: "\u{2145}", + }); + } + + if first_char == 'D' && try_read("oubleLeftRightArrow;") { + return Some(CharRef { + name: "oubleLeftRightArrow;", + characters: "\u{21d4}", + }); + } + + if first_char == 'D' && try_read("oubleLongRightArrow;") { + return Some(CharRef { + name: "oubleLongRightArrow;", + characters: "\u{27f9}", + }); + } + + if first_char == 'E' && try_read("mptyVerySmallSquare;") { + return Some(CharRef { + name: "mptyVerySmallSquare;", + characters: "\u{25ab}", + }); + } + + if first_char == 'N' && try_read("estedGreaterGreater;") { + return Some(CharRef { + name: "estedGreaterGreater;", + characters: "\u{226b}", + }); + } + + if first_char == 'N' && try_read("otDoubleVerticalBar;") { + return Some(CharRef { + name: "otDoubleVerticalBar;", + characters: "\u{2226}", + }); + } + + if first_char == 'N' && try_read("otGreaterSlantEqual;") { + return Some(CharRef { + name: "otGreaterSlantEqual;", + characters: "\u{2a7e}\u{338}", + }); + } + + if first_char == 'N' && try_read("otLeftTriangleEqual;") { + return Some(CharRef { + name: "otLeftTriangleEqual;", + characters: "\u{22ec}", + }); + } + + if first_char == 'N' && try_read("otSquareSubsetEqual;") { + return Some(CharRef { + name: "otSquareSubsetEqual;", + characters: "\u{22e2}", + }); + } + + if first_char == 'O' && try_read("penCurlyDoubleQuote;") { + return Some(CharRef { + name: "penCurlyDoubleQuote;", + characters: "\u{201c}", + }); + } + + if first_char == 'R' && try_read("everseUpEquilibrium;") { + return Some(CharRef { + name: "everseUpEquilibrium;", + characters: "\u{296f}", + }); + } + + if first_char == 'D' && try_read("oubleLongLeftArrow;") { + return Some(CharRef { + name: "oubleLongLeftArrow;", + characters: "\u{27f8}", + }); + } + + if first_char == 'D' && try_read("ownLeftRightVector;") { + return Some(CharRef { + name: "ownLeftRightVector;", + characters: "\u{2950}", + }); + } + + if first_char == 'L' && try_read("eftArrowRightArrow;") { + return Some(CharRef { + name: "eftArrowRightArrow;", + characters: "\u{21c6}", + }); + } + + if first_char == 'N' && try_read("egativeMediumSpace;") { + return Some(CharRef { + name: "egativeMediumSpace;", + characters: "\u{200b}", + }); + } + + if first_char == 'N' && try_read("otGreaterFullEqual;") { + return Some(CharRef { + name: "otGreaterFullEqual;", + characters: "\u{2267}\u{338}", + }); + } + + if first_char == 'N' && try_read("otRightTriangleBar;") { + return Some(CharRef { + name: "otRightTriangleBar;", + characters: "\u{29d0}\u{338}", + }); + } + + if first_char == 'R' && try_read("ightArrowLeftArrow;") { + return Some(CharRef { + name: "ightArrowLeftArrow;", + characters: "\u{21c4}", + }); + } + + if first_char == 'S' && try_read("quareSupersetEqual;") { + return Some(CharRef { + name: "quareSupersetEqual;", + characters: "\u{2292}", + }); + } + + if first_char == 'l' && try_read("eftrightsquigarrow;") { + return Some(CharRef { + name: "eftrightsquigarrow;", + characters: "\u{21ad}", + }); + } + + if first_char == 'D' && try_read("ownRightTeeVector;") { + return Some(CharRef { + name: "ownRightTeeVector;", + characters: "\u{295f}", + }); + } + + if first_char == 'D' && try_read("ownRightVectorBar;") { + return Some(CharRef { + name: "ownRightVectorBar;", + characters: "\u{2957}", + }); + } + + if first_char == 'L' && try_read("ongLeftRightArrow;") { + return Some(CharRef { + name: "ongLeftRightArrow;", + characters: "\u{27f7}", + }); + } + + if first_char == 'L' && try_read("ongleftrightarrow;") { + return Some(CharRef { + name: "ongleftrightarrow;", + characters: "\u{27fa}", + }); + } + + if first_char == 'N' && try_read("egativeThickSpace;") { + return Some(CharRef { + name: "egativeThickSpace;", + characters: "\u{200b}", + }); + } + + if first_char == 'N' && try_read("otLeftTriangleBar;") { + return Some(CharRef { + name: "otLeftTriangleBar;", + characters: "\u{29cf}\u{338}", + }); + } + + if first_char == 'P' && try_read("recedesSlantEqual;") { + return Some(CharRef { + name: "recedesSlantEqual;", + characters: "\u{227c}", + }); + } + + if first_char == 'R' && try_read("everseEquilibrium;") { + return Some(CharRef { + name: "everseEquilibrium;", + characters: "\u{21cb}", + }); + } + + if first_char == 'R' && try_read("ightDoubleBracket;") { + return Some(CharRef { + name: "ightDoubleBracket;", + characters: "\u{27e7}", + }); + } + + if first_char == 'R' && try_read("ightDownTeeVector;") { + return Some(CharRef { + name: "ightDownTeeVector;", + characters: "\u{295d}", + }); + } + + if first_char == 'R' && try_read("ightDownVectorBar;") { + return Some(CharRef { + name: "ightDownVectorBar;", + characters: "\u{2955}", + }); + } + + if first_char == 'R' && try_read("ightTriangleEqual;") { + return Some(CharRef { + name: "ightTriangleEqual;", + characters: "\u{22b5}", + }); + } + + if first_char == 'S' && try_read("quareIntersection;") { + return Some(CharRef { + name: "quareIntersection;", + characters: "\u{2293}", + }); + } + + if first_char == 'S' && try_read("ucceedsSlantEqual;") { + return Some(CharRef { + name: "ucceedsSlantEqual;", + characters: "\u{227d}", + }); + } + + if first_char == 'b' && try_read("lacktriangleright;") { + return Some(CharRef { + name: "lacktriangleright;", + characters: "\u{25b8}", + }); + } + + if first_char == 'l' && try_read("ongleftrightarrow;") { + return Some(CharRef { + name: "ongleftrightarrow;", + characters: "\u{27f7}", + }); + } + + if first_char == 'D' && try_read("oubleUpDownArrow;") { + return Some(CharRef { + name: "oubleUpDownArrow;", + characters: "\u{21d5}", + }); + } + + if first_char == 'D' && try_read("oubleVerticalBar;") { + return Some(CharRef { + name: "oubleVerticalBar;", + characters: "\u{2225}", + }); + } + + if first_char == 'D' && try_read("ownLeftTeeVector;") { + return Some(CharRef { + name: "ownLeftTeeVector;", + characters: "\u{295e}", + }); + } + + if first_char == 'D' && try_read("ownLeftVectorBar;") { + return Some(CharRef { + name: "ownLeftVectorBar;", + characters: "\u{2956}", + }); + } + + if first_char == 'F' && try_read("illedSmallSquare;") { + return Some(CharRef { + name: "illedSmallSquare;", + characters: "\u{25fc}", + }); + } + + if first_char == 'G' && try_read("reaterSlantEqual;") { + return Some(CharRef { + name: "reaterSlantEqual;", + characters: "\u{2a7e}", + }); + } + + if first_char == 'L' && try_read("eftDoubleBracket;") { + return Some(CharRef { + name: "eftDoubleBracket;", + characters: "\u{27e6}", + }); + } + + if first_char == 'L' && try_read("eftDownTeeVector;") { + return Some(CharRef { + name: "eftDownTeeVector;", + characters: "\u{2961}", + }); + } + + if first_char == 'L' && try_read("eftDownVectorBar;") { + return Some(CharRef { + name: "eftDownVectorBar;", + characters: "\u{2959}", + }); + } + + if first_char == 'L' && try_read("eftTriangleEqual;") { + return Some(CharRef { + name: "eftTriangleEqual;", + characters: "\u{22b4}", + }); + } + + if first_char == 'N' && try_read("egativeThinSpace;") { + return Some(CharRef { + name: "egativeThinSpace;", + characters: "\u{200b}", + }); + } + + if first_char == 'N' && try_read("otGreaterGreater;") { + return Some(CharRef { + name: "otGreaterGreater;", + characters: "\u{226b}\u{338}", + }); + } + + if first_char == 'N' && try_read("otLessSlantEqual;") { + return Some(CharRef { + name: "otLessSlantEqual;", + characters: "\u{2a7d}\u{338}", + }); + } + + if first_char == 'N' && try_read("otNestedLessLess;") { + return Some(CharRef { + name: "otNestedLessLess;", + characters: "\u{2aa1}\u{338}", + }); + } + + if first_char == 'N' && try_read("otReverseElement;") { + return Some(CharRef { + name: "otReverseElement;", + characters: "\u{220c}", + }); + } + + if first_char == 'N' && try_read("otSquareSuperset;") { + return Some(CharRef { + name: "otSquareSuperset;", + characters: "\u{2290}\u{338}", + }); + } + + if first_char == 'N' && try_read("otTildeFullEqual;") { + return Some(CharRef { + name: "otTildeFullEqual;", + characters: "\u{2247}", + }); + } + + if first_char == 'R' && try_read("ightAngleBracket;") { + return Some(CharRef { + name: "ightAngleBracket;", + characters: "\u{27e9}", + }); + } + + if first_char == 'R' && try_read("ightUpDownVector;") { + return Some(CharRef { + name: "ightUpDownVector;", + characters: "\u{294f}", + }); + } + + if first_char == 'S' && try_read("quareSubsetEqual;") { + return Some(CharRef { + name: "quareSubsetEqual;", + characters: "\u{2291}", + }); + } + + if first_char == 'V' && try_read("erticalSeparator;") { + return Some(CharRef { + name: "erticalSeparator;", + characters: "\u{2758}", + }); + } + + if first_char == 'b' && try_read("lacktriangledown;") { + return Some(CharRef { + name: "lacktriangledown;", + characters: "\u{25be}", + }); + } + + if first_char == 'b' && try_read("lacktriangleleft;") { + return Some(CharRef { + name: "lacktriangleleft;", + characters: "\u{25c2}", + }); + } + + if first_char == 'l' && try_read("eftrightharpoons;") { + return Some(CharRef { + name: "eftrightharpoons;", + characters: "\u{21cb}", + }); + } + + if first_char == 'r' && try_read("ightleftharpoons;") { + return Some(CharRef { + name: "ightleftharpoons;", + characters: "\u{21cc}", + }); + } + + if first_char == 't' && try_read("woheadrightarrow;") { + return Some(CharRef { + name: "woheadrightarrow;", + characters: "\u{21a0}", + }); + } + + if first_char == 'D' && try_read("iacriticalAcute;") { + return Some(CharRef { + name: "iacriticalAcute;", + characters: "\u{b4}", + }); + } + + if first_char == 'D' && try_read("iacriticalGrave;") { + return Some(CharRef { + name: "iacriticalGrave;", + characters: "\u{60}", + }); + } + + if first_char == 'D' && try_read("iacriticalTilde;") { + return Some(CharRef { + name: "iacriticalTilde;", + characters: "\u{2dc}", + }); + } + + if first_char == 'D' && try_read("oubleRightArrow;") { + return Some(CharRef { + name: "oubleRightArrow;", + characters: "\u{21d2}", + }); + } + + if first_char == 'D' && try_read("ownArrowUpArrow;") { + return Some(CharRef { + name: "ownArrowUpArrow;", + characters: "\u{21f5}", + }); + } + + if first_char == 'E' && try_read("mptySmallSquare;") { + return Some(CharRef { + name: "mptySmallSquare;", + characters: "\u{25fb}", + }); + } + + if first_char == 'G' && try_read("reaterEqualLess;") { + return Some(CharRef { + name: "reaterEqualLess;", + characters: "\u{22db}", + }); + } + + if first_char == 'G' && try_read("reaterFullEqual;") { + return Some(CharRef { + name: "reaterFullEqual;", + characters: "\u{2267}", + }); + } + + if first_char == 'L' && try_read("eftAngleBracket;") { + return Some(CharRef { + name: "eftAngleBracket;", + characters: "\u{27e8}", + }); + } + + if first_char == 'L' && try_read("eftUpDownVector;") { + return Some(CharRef { + name: "eftUpDownVector;", + characters: "\u{2951}", + }); + } + + if first_char == 'L' && try_read("essEqualGreater;") { + return Some(CharRef { + name: "essEqualGreater;", + characters: "\u{22da}", + }); + } + + if first_char == 'N' && try_read("onBreakingSpace;") { + return Some(CharRef { + name: "onBreakingSpace;", + characters: "\u{a0}", + }); + } + + if first_char == 'N' && try_read("otPrecedesEqual;") { + return Some(CharRef { + name: "otPrecedesEqual;", + characters: "\u{2aaf}\u{338}", + }); + } + + if first_char == 'N' && try_read("otRightTriangle;") { + return Some(CharRef { + name: "otRightTriangle;", + characters: "\u{22eb}", + }); + } + + if first_char == 'N' && try_read("otSucceedsEqual;") { + return Some(CharRef { + name: "otSucceedsEqual;", + characters: "\u{2ab0}\u{338}", + }); + } + + if first_char == 'N' && try_read("otSucceedsTilde;") { + return Some(CharRef { + name: "otSucceedsTilde;", + characters: "\u{227f}\u{338}", + }); + } + + if first_char == 'N' && try_read("otSupersetEqual;") { + return Some(CharRef { + name: "otSupersetEqual;", + characters: "\u{2289}", + }); + } + + if first_char == 'R' && try_read("ightTriangleBar;") { + return Some(CharRef { + name: "ightTriangleBar;", + characters: "\u{29d0}", + }); + } + + if first_char == 'R' && try_read("ightUpTeeVector;") { + return Some(CharRef { + name: "ightUpTeeVector;", + characters: "\u{295c}", + }); + } + + if first_char == 'R' && try_read("ightUpVectorBar;") { + return Some(CharRef { + name: "ightUpVectorBar;", + characters: "\u{2954}", + }); + } + + if first_char == 'U' && try_read("nderParenthesis;") { + return Some(CharRef { + name: "nderParenthesis;", + characters: "\u{23dd}", + }); + } + + if first_char == 'U' && try_read("pArrowDownArrow;") { + return Some(CharRef { + name: "pArrowDownArrow;", + characters: "\u{21c5}", + }); + } + + if first_char == 'c' && try_read("irclearrowright;") { + return Some(CharRef { + name: "irclearrowright;", + characters: "\u{21bb}", + }); + } + + if first_char == 'd' && try_read("ownharpoonright;") { + return Some(CharRef { + name: "ownharpoonright;", + characters: "\u{21c2}", + }); + } + + if first_char == 'n' && try_read("trianglerighteq;") { + return Some(CharRef { + name: "trianglerighteq;", + characters: "\u{22ed}", + }); + } + + if first_char == 'r' && try_read("ightharpoondown;") { + return Some(CharRef { + name: "ightharpoondown;", + characters: "\u{21c1}", + }); + } + + if first_char == 'r' && try_read("ightrightarrows;") { + return Some(CharRef { + name: "ightrightarrows;", + characters: "\u{21c9}", + }); + } + + if first_char == 't' && try_read("woheadleftarrow;") { + return Some(CharRef { + name: "woheadleftarrow;", + characters: "\u{219e}", + }); + } + + if first_char == 'v' && try_read("artriangleright;") { + return Some(CharRef { + name: "artriangleright;", + characters: "\u{22b3}", + }); + } + + if first_char == 'C' && try_read("loseCurlyQuote;") { + return Some(CharRef { + name: "loseCurlyQuote;", + characters: "\u{2019}", + }); + } + + if first_char == 'C' && try_read("ontourIntegral;") { + return Some(CharRef { + name: "ontourIntegral;", + characters: "\u{222e}", + }); + } + + if first_char == 'D' && try_read("oubleDownArrow;") { + return Some(CharRef { + name: "oubleDownArrow;", + characters: "\u{21d3}", + }); + } + + if first_char == 'D' && try_read("oubleLeftArrow;") { + return Some(CharRef { + name: "oubleLeftArrow;", + characters: "\u{21d0}", + }); + } + + if first_char == 'D' && try_read("ownRightVector;") { + return Some(CharRef { + name: "ownRightVector;", + characters: "\u{21c1}", + }); + } + + if first_char == 'L' && try_read("eftRightVector;") { + return Some(CharRef { + name: "eftRightVector;", + characters: "\u{294e}", + }); + } + + if first_char == 'L' && try_read("eftTriangleBar;") { + return Some(CharRef { + name: "eftTriangleBar;", + characters: "\u{29cf}", + }); + } + + if first_char == 'L' && try_read("eftUpTeeVector;") { + return Some(CharRef { + name: "eftUpTeeVector;", + characters: "\u{2960}", + }); + } + + if first_char == 'L' && try_read("eftUpVectorBar;") { + return Some(CharRef { + name: "eftUpVectorBar;", + characters: "\u{2958}", + }); + } + + if first_char == 'L' && try_read("owerRightArrow;") { + return Some(CharRef { + name: "owerRightArrow;", + characters: "\u{2198}", + }); + } + + if first_char == 'N' && try_read("otGreaterEqual;") { + return Some(CharRef { + name: "otGreaterEqual;", + characters: "\u{2271}", + }); + } + + if first_char == 'N' && try_read("otGreaterTilde;") { + return Some(CharRef { + name: "otGreaterTilde;", + characters: "\u{2275}", + }); + } + + if first_char == 'N' && try_read("otHumpDownHump;") { + return Some(CharRef { + name: "otHumpDownHump;", + characters: "\u{224e}\u{338}", + }); + } + + if first_char == 'N' && try_read("otLeftTriangle;") { + return Some(CharRef { + name: "otLeftTriangle;", + characters: "\u{22ea}", + }); + } + + if first_char == 'N' && try_read("otSquareSubset;") { + return Some(CharRef { + name: "otSquareSubset;", + characters: "\u{228f}\u{338}", + }); + } + + if first_char == 'O' && try_read("verParenthesis;") { + return Some(CharRef { + name: "verParenthesis;", + characters: "\u{23dc}", + }); + } + + if first_char == 'R' && try_read("ightDownVector;") { + return Some(CharRef { + name: "ightDownVector;", + characters: "\u{21c2}", + }); + } + + if first_char == 'S' && try_read("hortRightArrow;") { + return Some(CharRef { + name: "hortRightArrow;", + characters: "\u{2192}", + }); + } + + if first_char == 'U' && try_read("pperRightArrow;") { + return Some(CharRef { + name: "pperRightArrow;", + characters: "\u{2197}", + }); + } + + if first_char == 'b' && try_read("igtriangledown;") { + return Some(CharRef { + name: "igtriangledown;", + characters: "\u{25bd}", + }); + } + + if first_char == 'c' && try_read("irclearrowleft;") { + return Some(CharRef { + name: "irclearrowleft;", + characters: "\u{21ba}", + }); + } + + if first_char == 'c' && try_read("urvearrowright;") { + return Some(CharRef { + name: "urvearrowright;", + characters: "\u{21b7}", + }); + } + + if first_char == 'd' && try_read("ownharpoonleft;") { + return Some(CharRef { + name: "ownharpoonleft;", + characters: "\u{21c3}", + }); + } + + if first_char == 'l' && try_read("eftharpoondown;") { + return Some(CharRef { + name: "eftharpoondown;", + characters: "\u{21bd}", + }); + } + + if first_char == 'l' && try_read("eftrightarrows;") { + return Some(CharRef { + name: "eftrightarrows;", + characters: "\u{21c6}", + }); + } + + if first_char == 'n' && try_read("Leftrightarrow;") { + return Some(CharRef { + name: "Leftrightarrow;", + characters: "\u{21ce}", + }); + } + + if first_char == 'n' && try_read("leftrightarrow;") { + return Some(CharRef { + name: "leftrightarrow;", + characters: "\u{21ae}", + }); + } + + if first_char == 'n' && try_read("trianglelefteq;") { + return Some(CharRef { + name: "trianglelefteq;", + characters: "\u{22ec}", + }); + } + + if first_char == 'r' && try_read("ightleftarrows;") { + return Some(CharRef { + name: "ightleftarrows;", + characters: "\u{21c4}", + }); + } + + if first_char == 'r' && try_read("ightsquigarrow;") { + return Some(CharRef { + name: "ightsquigarrow;", + characters: "\u{219d}", + }); + } + + if first_char == 'r' && try_read("ightthreetimes;") { + return Some(CharRef { + name: "ightthreetimes;", + characters: "\u{22cc}", + }); + } + + if first_char == 's' && try_read("traightepsilon;") { + return Some(CharRef { + name: "traightepsilon;", + characters: "\u{3f5}", + }); + } + + if first_char == 't' && try_read("rianglerighteq;") { + return Some(CharRef { + name: "rianglerighteq;", + characters: "\u{22b5}", + }); + } + + if first_char == 'v' && try_read("artriangleleft;") { + return Some(CharRef { + name: "artriangleleft;", + characters: "\u{22b2}", + }); + } + + if first_char == 'D' && try_read("iacriticalDot;") { + return Some(CharRef { + name: "iacriticalDot;", + characters: "\u{2d9}", + }); + } + + if first_char == 'D' && try_read("oubleRightTee;") { + return Some(CharRef { + name: "oubleRightTee;", + characters: "\u{22a8}", + }); + } + + if first_char == 'D' && try_read("ownLeftVector;") { + return Some(CharRef { + name: "ownLeftVector;", + characters: "\u{21bd}", + }); + } + + if first_char == 'G' && try_read("reaterGreater;") { + return Some(CharRef { + name: "reaterGreater;", + characters: "\u{2aa2}", + }); + } + + if first_char == 'H' && try_read("orizontalLine;") { + return Some(CharRef { + name: "orizontalLine;", + characters: "\u{2500}", + }); + } + + if first_char == 'I' && try_read("nvisibleComma;") { + return Some(CharRef { + name: "nvisibleComma;", + characters: "\u{2063}", + }); + } + + if first_char == 'I' && try_read("nvisibleTimes;") { + return Some(CharRef { + name: "nvisibleTimes;", + characters: "\u{2062}", + }); + } + + if first_char == 'L' && try_read("eftDownVector;") { + return Some(CharRef { + name: "eftDownVector;", + characters: "\u{21c3}", + }); + } + + if first_char == 'L' && try_read("eftRightArrow;") { + return Some(CharRef { + name: "eftRightArrow;", + characters: "\u{2194}", + }); + } + + if first_char == 'L' && try_read("eftrightarrow;") { + return Some(CharRef { + name: "eftrightarrow;", + characters: "\u{21d4}", + }); + } + + if first_char == 'L' && try_read("essSlantEqual;") { + return Some(CharRef { + name: "essSlantEqual;", + characters: "\u{2a7d}", + }); + } + + if first_char == 'L' && try_read("ongRightArrow;") { + return Some(CharRef { + name: "ongRightArrow;", + characters: "\u{27f6}", + }); + } + + if first_char == 'L' && try_read("ongrightarrow;") { + return Some(CharRef { + name: "ongrightarrow;", + characters: "\u{27f9}", + }); + } + + if first_char == 'L' && try_read("owerLeftArrow;") { + return Some(CharRef { + name: "owerLeftArrow;", + characters: "\u{2199}", + }); + } + + if first_char == 'N' && try_read("estedLessLess;") { + return Some(CharRef { + name: "estedLessLess;", + characters: "\u{226a}", + }); + } + + if first_char == 'N' && try_read("otGreaterLess;") { + return Some(CharRef { + name: "otGreaterLess;", + characters: "\u{2279}", + }); + } + + if first_char == 'N' && try_read("otLessGreater;") { + return Some(CharRef { + name: "otLessGreater;", + characters: "\u{2278}", + }); + } + + if first_char == 'N' && try_read("otSubsetEqual;") { + return Some(CharRef { + name: "otSubsetEqual;", + characters: "\u{2288}", + }); + } + + if first_char == 'N' && try_read("otVerticalBar;") { + return Some(CharRef { + name: "otVerticalBar;", + characters: "\u{2224}", + }); + } + + if first_char == 'O' && try_read("penCurlyQuote;") { + return Some(CharRef { + name: "penCurlyQuote;", + characters: "\u{2018}", + }); + } + + if first_char == 'R' && try_read("everseElement;") { + return Some(CharRef { + name: "everseElement;", + characters: "\u{220b}", + }); + } + + if first_char == 'R' && try_read("ightTeeVector;") { + return Some(CharRef { + name: "ightTeeVector;", + characters: "\u{295b}", + }); + } + + if first_char == 'R' && try_read("ightVectorBar;") { + return Some(CharRef { + name: "ightVectorBar;", + characters: "\u{2953}", + }); + } + + if first_char == 'S' && try_read("hortDownArrow;") { + return Some(CharRef { + name: "hortDownArrow;", + characters: "\u{2193}", + }); + } + + if first_char == 'S' && try_read("hortLeftArrow;") { + return Some(CharRef { + name: "hortLeftArrow;", + characters: "\u{2190}", + }); + } + + if first_char == 'S' && try_read("quareSuperset;") { + return Some(CharRef { + name: "quareSuperset;", + characters: "\u{2290}", + }); + } + + if first_char == 'T' && try_read("ildeFullEqual;") { + return Some(CharRef { + name: "ildeFullEqual;", + characters: "\u{2245}", + }); + } + + if first_char == 'U' && try_read("pperLeftArrow;") { + return Some(CharRef { + name: "pperLeftArrow;", + characters: "\u{2196}", + }); + } + + if first_char == 'Z' && try_read("eroWidthSpace;") { + return Some(CharRef { + name: "eroWidthSpace;", + characters: "\u{200b}", + }); + } + + if first_char == 'c' && try_read("urvearrowleft;") { + return Some(CharRef { + name: "urvearrowleft;", + characters: "\u{21b6}", + }); + } + + if first_char == 'd' && try_read("oublebarwedge;") { + return Some(CharRef { + name: "oublebarwedge;", + characters: "\u{2306}", + }); + } + + if first_char == 'd' && try_read("owndownarrows;") { + return Some(CharRef { + name: "owndownarrows;", + characters: "\u{21ca}", + }); + } + + if first_char == 'h' && try_read("ookrightarrow;") { + return Some(CharRef { + name: "ookrightarrow;", + characters: "\u{21aa}", + }); + } + + if first_char == 'l' && try_read("eftleftarrows;") { + return Some(CharRef { + name: "eftleftarrows;", + characters: "\u{21c7}", + }); + } + + if first_char == 'l' && try_read("eftrightarrow;") { + return Some(CharRef { + name: "eftrightarrow;", + characters: "\u{2194}", + }); + } + + if first_char == 'l' && try_read("eftthreetimes;") { + return Some(CharRef { + name: "eftthreetimes;", + characters: "\u{22cb}", + }); + } + + if first_char == 'l' && try_read("ongrightarrow;") { + return Some(CharRef { + name: "ongrightarrow;", + characters: "\u{27f6}", + }); + } + + if first_char == 'l' && try_read("ooparrowright;") { + return Some(CharRef { + name: "ooparrowright;", + characters: "\u{21ac}", + }); + } + + if first_char == 'n' && try_read("shortparallel;") { + return Some(CharRef { + name: "shortparallel;", + characters: "\u{2226}", + }); + } + + if first_char == 'n' && try_read("triangleright;") { + return Some(CharRef { + name: "triangleright;", + characters: "\u{22eb}", + }); + } + + if first_char == 'r' && try_read("ightarrowtail;") { + return Some(CharRef { + name: "ightarrowtail;", + characters: "\u{21a3}", + }); + } + + if first_char == 'r' && try_read("ightharpoonup;") { + return Some(CharRef { + name: "ightharpoonup;", + characters: "\u{21c0}", + }); + } + + if first_char == 't' && try_read("rianglelefteq;") { + return Some(CharRef { + name: "rianglelefteq;", + characters: "\u{22b4}", + }); + } + + if first_char == 'u' && try_read("pharpoonright;") { + return Some(CharRef { + name: "pharpoonright;", + characters: "\u{21be}", + }); + } + + if first_char == 'A' && try_read("pplyFunction;") { + return Some(CharRef { + name: "pplyFunction;", + characters: "\u{2061}", + }); + } + + if first_char == 'D' && try_read("ifferentialD;") { + return Some(CharRef { + name: "ifferentialD;", + characters: "\u{2146}", + }); + } + + if first_char == 'D' && try_read("oubleLeftTee;") { + return Some(CharRef { + name: "oubleLeftTee;", + characters: "\u{2ae4}", + }); + } + + if first_char == 'D' && try_read("oubleUpArrow;") { + return Some(CharRef { + name: "oubleUpArrow;", + characters: "\u{21d1}", + }); + } + + if first_char == 'L' && try_read("eftTeeVector;") { + return Some(CharRef { + name: "eftTeeVector;", + characters: "\u{295a}", + }); + } + + if first_char == 'L' && try_read("eftVectorBar;") { + return Some(CharRef { + name: "eftVectorBar;", + characters: "\u{2952}", + }); + } + + if first_char == 'L' && try_read("essFullEqual;") { + return Some(CharRef { + name: "essFullEqual;", + characters: "\u{2266}", + }); + } + + if first_char == 'L' && try_read("ongLeftArrow;") { + return Some(CharRef { + name: "ongLeftArrow;", + characters: "\u{27f5}", + }); + } + + if first_char == 'L' && try_read("ongleftarrow;") { + return Some(CharRef { + name: "ongleftarrow;", + characters: "\u{27f8}", + }); + } + + if first_char == 'N' && try_read("otEqualTilde;") { + return Some(CharRef { + name: "otEqualTilde;", + characters: "\u{2242}\u{338}", + }); + } + + if first_char == 'N' && try_read("otTildeEqual;") { + return Some(CharRef { + name: "otTildeEqual;", + characters: "\u{2244}", + }); + } + + if first_char == 'N' && try_read("otTildeTilde;") { + return Some(CharRef { + name: "otTildeTilde;", + characters: "\u{2249}", + }); + } + + if first_char == 'P' && try_read("oincareplane;") { + return Some(CharRef { + name: "oincareplane;", + characters: "\u{210c}", + }); + } + + if first_char == 'P' && try_read("recedesEqual;") { + return Some(CharRef { + name: "recedesEqual;", + characters: "\u{2aaf}", + }); + } + + if first_char == 'P' && try_read("recedesTilde;") { + return Some(CharRef { + name: "recedesTilde;", + characters: "\u{227e}", + }); + } + + if first_char == 'R' && try_read("ightArrowBar;") { + return Some(CharRef { + name: "ightArrowBar;", + characters: "\u{21e5}", + }); + } + + if first_char == 'R' && try_read("ightTeeArrow;") { + return Some(CharRef { + name: "ightTeeArrow;", + characters: "\u{21a6}", + }); + } + + if first_char == 'R' && try_read("ightTriangle;") { + return Some(CharRef { + name: "ightTriangle;", + characters: "\u{22b3}", + }); + } + + if first_char == 'R' && try_read("ightUpVector;") { + return Some(CharRef { + name: "ightUpVector;", + characters: "\u{21be}", + }); + } + + if first_char == 'S' && try_read("ucceedsEqual;") { + return Some(CharRef { + name: "ucceedsEqual;", + characters: "\u{2ab0}", + }); + } + + if first_char == 'S' && try_read("ucceedsTilde;") { + return Some(CharRef { + name: "ucceedsTilde;", + characters: "\u{227f}", + }); + } + + if first_char == 'S' && try_read("upersetEqual;") { + return Some(CharRef { + name: "upersetEqual;", + characters: "\u{2287}", + }); + } + + if first_char == 'U' && try_read("pEquilibrium;") { + return Some(CharRef { + name: "pEquilibrium;", + characters: "\u{296e}", + }); + } + + if first_char == 'V' && try_read("erticalTilde;") { + return Some(CharRef { + name: "erticalTilde;", + characters: "\u{2240}", + }); + } + + if first_char == 'V' && try_read("eryThinSpace;") { + return Some(CharRef { + name: "eryThinSpace;", + characters: "\u{200a}", + }); + } + + if first_char == 'b' && try_read("igtriangleup;") { + return Some(CharRef { + name: "igtriangleup;", + characters: "\u{25b3}", + }); + } + + if first_char == 'b' && try_read("lacktriangle;") { + return Some(CharRef { + name: "lacktriangle;", + characters: "\u{25b4}", + }); + } + + if first_char == 'd' && try_read("ivideontimes;") { + return Some(CharRef { + name: "ivideontimes;", + characters: "\u{22c7}", + }); + } + + if first_char == 'f' && try_read("allingdotseq;") { + return Some(CharRef { + name: "allingdotseq;", + characters: "\u{2252}", + }); + } + + if first_char == 'h' && try_read("ookleftarrow;") { + return Some(CharRef { + name: "ookleftarrow;", + characters: "\u{21a9}", + }); + } + + if first_char == 'l' && try_read("eftarrowtail;") { + return Some(CharRef { + name: "eftarrowtail;", + characters: "\u{21a2}", + }); + } + + if first_char == 'l' && try_read("eftharpoonup;") { + return Some(CharRef { + name: "eftharpoonup;", + characters: "\u{21bc}", + }); + } + + if first_char == 'l' && try_read("ongleftarrow;") { + return Some(CharRef { + name: "ongleftarrow;", + characters: "\u{27f5}", + }); + } + + if first_char == 'l' && try_read("ooparrowleft;") { + return Some(CharRef { + name: "ooparrowleft;", + characters: "\u{21ab}", + }); + } + + if first_char == 'm' && try_read("easuredangle;") { + return Some(CharRef { + name: "easuredangle;", + characters: "\u{2221}", + }); + } + + if first_char == 'n' && try_read("triangleleft;") { + return Some(CharRef { + name: "triangleleft;", + characters: "\u{22ea}", + }); + } + + if first_char == 's' && try_read("hortparallel;") { + return Some(CharRef { + name: "hortparallel;", + characters: "\u{2225}", + }); + } + + if first_char == 's' && try_read("mallsetminus;") { + return Some(CharRef { + name: "mallsetminus;", + characters: "\u{2216}", + }); + } + + if first_char == 't' && try_read("riangleright;") { + return Some(CharRef { + name: "riangleright;", + characters: "\u{25b9}", + }); + } + + if first_char == 'u' && try_read("pharpoonleft;") { + return Some(CharRef { + name: "pharpoonleft;", + characters: "\u{21bf}", + }); + } + + if first_char == 'v' && try_read("arsubsetneqq;") { + return Some(CharRef { + name: "arsubsetneqq;", + characters: "\u{2acb}\u{fe00}", + }); + } + + if first_char == 'v' && try_read("arsupsetneqq;") { + return Some(CharRef { + name: "arsupsetneqq;", + characters: "\u{2acc}\u{fe00}", + }); + } + + if first_char == 'D' && try_read("ownArrowBar;") { + return Some(CharRef { + name: "ownArrowBar;", + characters: "\u{2913}", + }); + } + + if first_char == 'D' && try_read("ownTeeArrow;") { + return Some(CharRef { + name: "ownTeeArrow;", + characters: "\u{21a7}", + }); + } + + if first_char == 'E' && try_read("xponentialE;") { + return Some(CharRef { + name: "xponentialE;", + characters: "\u{2147}", + }); + } + + if first_char == 'G' && try_read("reaterEqual;") { + return Some(CharRef { + name: "reaterEqual;", + characters: "\u{2265}", + }); + } + + if first_char == 'G' && try_read("reaterTilde;") { + return Some(CharRef { + name: "reaterTilde;", + characters: "\u{2273}", + }); + } + + if first_char == 'H' && try_read("ilbertSpace;") { + return Some(CharRef { + name: "ilbertSpace;", + characters: "\u{210b}", + }); + } + + if first_char == 'H' && try_read("umpDownHump;") { + return Some(CharRef { + name: "umpDownHump;", + characters: "\u{224e}", + }); + } + + if first_char == 'I' && try_read("ntersection;") { + return Some(CharRef { + name: "ntersection;", + characters: "\u{22c2}", + }); + } + + if first_char == 'L' && try_read("eftArrowBar;") { + return Some(CharRef { + name: "eftArrowBar;", + characters: "\u{21e4}", + }); + } + + if first_char == 'L' && try_read("eftTeeArrow;") { + return Some(CharRef { + name: "eftTeeArrow;", + characters: "\u{21a4}", + }); + } + + if first_char == 'L' && try_read("eftTriangle;") { + return Some(CharRef { + name: "eftTriangle;", + characters: "\u{22b2}", + }); + } + + if first_char == 'L' && try_read("eftUpVector;") { + return Some(CharRef { + name: "eftUpVector;", + characters: "\u{21bf}", + }); + } + + if first_char == 'N' && try_read("otCongruent;") { + return Some(CharRef { + name: "otCongruent;", + characters: "\u{2262}", + }); + } + + if first_char == 'N' && try_read("otHumpEqual;") { + return Some(CharRef { + name: "otHumpEqual;", + characters: "\u{224f}\u{338}", + }); + } + + if first_char == 'N' && try_read("otLessEqual;") { + return Some(CharRef { + name: "otLessEqual;", + characters: "\u{2270}", + }); + } + + if first_char == 'N' && try_read("otLessTilde;") { + return Some(CharRef { + name: "otLessTilde;", + characters: "\u{2274}", + }); + } + + if first_char == 'P' && try_read("roportional;") { + return Some(CharRef { + name: "roportional;", + characters: "\u{221d}", + }); + } + + if first_char == 'R' && try_read("ightCeiling;") { + return Some(CharRef { + name: "ightCeiling;", + characters: "\u{2309}", + }); + } + + if first_char == 'R' && try_read("oundImplies;") { + return Some(CharRef { + name: "oundImplies;", + characters: "\u{2970}", + }); + } + + if first_char == 'S' && try_read("hortUpArrow;") { + return Some(CharRef { + name: "hortUpArrow;", + characters: "\u{2191}", + }); + } + + if first_char == 'S' && try_read("quareSubset;") { + return Some(CharRef { + name: "quareSubset;", + characters: "\u{228f}", + }); + } + + if first_char == 'U' && try_read("nderBracket;") { + return Some(CharRef { + name: "nderBracket;", + characters: "\u{23b5}", + }); + } + + if first_char == 'V' && try_read("erticalLine;") { + return Some(CharRef { + name: "erticalLine;", + characters: "\u{7c}", + }); + } + + if first_char == 'b' && try_read("lacklozenge;") { + return Some(CharRef { + name: "lacklozenge;", + characters: "\u{29eb}", + }); + } + + if first_char == 'e' && try_read("xponentiale;") { + return Some(CharRef { + name: "xponentiale;", + characters: "\u{2147}", + }); + } + + if first_char == 'r' && try_read("isingdotseq;") { + return Some(CharRef { + name: "isingdotseq;", + characters: "\u{2253}", + }); + } + + if first_char == 't' && try_read("riangledown;") { + return Some(CharRef { + name: "riangledown;", + characters: "\u{25bf}", + }); + } + + if first_char == 't' && try_read("riangleleft;") { + return Some(CharRef { + name: "riangleleft;", + characters: "\u{25c3}", + }); + } + + if first_char == 'v' && try_read("arsubsetneq;") { + return Some(CharRef { + name: "arsubsetneq;", + characters: "\u{228a}\u{fe00}", + }); + } + + if first_char == 'v' && try_read("arsupsetneq;") { + return Some(CharRef { + name: "arsupsetneq;", + characters: "\u{228b}\u{fe00}", + }); + } + + if first_char == 'C' && try_read("ircleMinus;") { + return Some(CharRef { + name: "ircleMinus;", + characters: "\u{2296}", + }); + } + + if first_char == 'C' && try_read("ircleTimes;") { + return Some(CharRef { + name: "ircleTimes;", + characters: "\u{2297}", + }); + } + + if first_char == 'E' && try_read("quilibrium;") { + return Some(CharRef { + name: "quilibrium;", + characters: "\u{21cc}", + }); + } + + if first_char == 'G' && try_read("reaterLess;") { + return Some(CharRef { + name: "reaterLess;", + characters: "\u{2277}", + }); + } + + if first_char == 'L' && try_read("eftCeiling;") { + return Some(CharRef { + name: "eftCeiling;", + characters: "\u{2308}", + }); + } + + if first_char == 'L' && try_read("essGreater;") { + return Some(CharRef { + name: "essGreater;", + characters: "\u{2276}", + }); + } + + if first_char == 'M' && try_read("ediumSpace;") { + return Some(CharRef { + name: "ediumSpace;", + characters: "\u{205f}", + }); + } + + if first_char == 'N' && try_read("otLessLess;") { + return Some(CharRef { + name: "otLessLess;", + characters: "\u{226a}\u{338}", + }); + } + + if first_char == 'N' && try_read("otPrecedes;") { + return Some(CharRef { + name: "otPrecedes;", + characters: "\u{2280}", + }); + } + + if first_char == 'N' && try_read("otSucceeds;") { + return Some(CharRef { + name: "otSucceeds;", + characters: "\u{2281}", + }); + } + + if first_char == 'N' && try_read("otSuperset;") { + return Some(CharRef { + name: "otSuperset;", + characters: "\u{2283}\u{20d2}", + }); + } + + if first_char == 'O' && try_read("verBracket;") { + return Some(CharRef { + name: "verBracket;", + characters: "\u{23b4}", + }); + } + + if first_char == 'R' && try_read("ightVector;") { + return Some(CharRef { + name: "ightVector;", + characters: "\u{21c0}", + }); + } + + if first_char == 'R' && try_read("rightarrow;") { + return Some(CharRef { + name: "rightarrow;", + characters: "\u{21db}", + }); + } + + if first_char == 'R' && try_read("uleDelayed;") { + return Some(CharRef { + name: "uleDelayed;", + characters: "\u{29f4}", + }); + } + + if first_char == 'S' && try_read("mallCircle;") { + return Some(CharRef { + name: "mallCircle;", + characters: "\u{2218}", + }); + } + + if first_char == 'S' && try_read("quareUnion;") { + return Some(CharRef { + name: "quareUnion;", + characters: "\u{2294}", + }); + } + + if first_char == 'S' && try_read("ubsetEqual;") { + return Some(CharRef { + name: "ubsetEqual;", + characters: "\u{2286}", + }); + } + + if first_char == 'U' && try_read("pDownArrow;") { + return Some(CharRef { + name: "pDownArrow;", + characters: "\u{2195}", + }); + } + + if first_char == 'U' && try_read("pdownarrow;") { + return Some(CharRef { + name: "pdownarrow;", + characters: "\u{21d5}", + }); + } + + if first_char == 'V' && try_read("erticalBar;") { + return Some(CharRef { + name: "erticalBar;", + characters: "\u{2223}", + }); + } + + if first_char == 'b' && try_read("ackepsilon;") { + return Some(CharRef { + name: "ackepsilon;", + characters: "\u{3f6}", + }); + } + + if first_char == 'b' && try_read("lacksquare;") { + return Some(CharRef { + name: "lacksquare;", + characters: "\u{25aa}", + }); + } + + if first_char == 'c' && try_read("ircledcirc;") { + return Some(CharRef { + name: "ircledcirc;", + characters: "\u{229a}", + }); + } + + if first_char == 'c' && try_read("ircleddash;") { + return Some(CharRef { + name: "ircleddash;", + characters: "\u{229d}", + }); + } + + if first_char == 'c' && try_read("urlyeqprec;") { + return Some(CharRef { + name: "urlyeqprec;", + characters: "\u{22de}", + }); + } + + if first_char == 'c' && try_read("urlyeqsucc;") { + return Some(CharRef { + name: "urlyeqsucc;", + characters: "\u{22df}", + }); + } + + if first_char == 'd' && try_read("iamondsuit;") { + return Some(CharRef { + name: "iamondsuit;", + characters: "\u{2666}", + }); + } + + if first_char == 'e' && try_read("qslantless;") { + return Some(CharRef { + name: "qslantless;", + characters: "\u{2a95}", + }); + } + + if first_char == 'e' && try_read("xpectation;") { + return Some(CharRef { + name: "xpectation;", + characters: "\u{2130}", + }); + } + + if first_char == 'n' && try_read("Rightarrow;") { + return Some(CharRef { + name: "Rightarrow;", + characters: "\u{21cf}", + }); + } + + if first_char == 'n' && try_read("rightarrow;") { + return Some(CharRef { + name: "rightarrow;", + characters: "\u{219b}", + }); + } + + if first_char == 'p' && try_read("reccurlyeq;") { + return Some(CharRef { + name: "reccurlyeq;", + characters: "\u{227c}", + }); + } + + if first_char == 'p' && try_read("recnapprox;") { + return Some(CharRef { + name: "recnapprox;", + characters: "\u{2ab9}", + }); + } + + if first_char == 'q' && try_read("uaternions;") { + return Some(CharRef { + name: "uaternions;", + characters: "\u{210d}", + }); + } + + if first_char == 's' && try_read("traightphi;") { + return Some(CharRef { + name: "traightphi;", + characters: "\u{3d5}", + }); + } + + if first_char == 's' && try_read("ucccurlyeq;") { + return Some(CharRef { + name: "ucccurlyeq;", + characters: "\u{227d}", + }); + } + + if first_char == 's' && try_read("uccnapprox;") { + return Some(CharRef { + name: "uccnapprox;", + characters: "\u{2aba}", + }); + } + + if first_char == 't' && try_read("hickapprox;") { + return Some(CharRef { + name: "hickapprox;", + characters: "\u{2248}", + }); + } + + if first_char == 'u' && try_read("pdownarrow;") { + return Some(CharRef { + name: "pdownarrow;", + characters: "\u{2195}", + }); + } + + if first_char == 'B' && try_read("ernoullis;") { + return Some(CharRef { + name: "ernoullis;", + characters: "\u{212c}", + }); + } + + if first_char == 'C' && try_read("irclePlus;") { + return Some(CharRef { + name: "irclePlus;", + characters: "\u{2295}", + }); + } + + if first_char == 'E' && try_read("qualTilde;") { + return Some(CharRef { + name: "qualTilde;", + characters: "\u{2242}", + }); + } + + if first_char == 'F' && try_read("ouriertrf;") { + return Some(CharRef { + name: "ouriertrf;", + characters: "\u{2131}", + }); + } + + if first_char == 'I' && try_read("maginaryI;") { + return Some(CharRef { + name: "maginaryI;", + characters: "\u{2148}", + }); + } + + if first_char == 'L' && try_read("aplacetrf;") { + return Some(CharRef { + name: "aplacetrf;", + characters: "\u{2112}", + }); + } + + if first_char == 'L' && try_read("eftVector;") { + return Some(CharRef { + name: "eftVector;", + characters: "\u{21bc}", + }); + } + + if first_char == 'L' && try_read("leftarrow;") { + return Some(CharRef { + name: "leftarrow;", + characters: "\u{21da}", + }); + } + + if first_char == 'N' && try_read("otElement;") { + return Some(CharRef { + name: "otElement;", + characters: "\u{2209}", + }); + } + + if first_char == 'N' && try_read("otGreater;") { + return Some(CharRef { + name: "otGreater;", + characters: "\u{226f}", + }); + } + + if first_char == 'P' && try_read("roportion;") { + return Some(CharRef { + name: "roportion;", + characters: "\u{2237}", + }); + } + + if first_char == 'R' && try_read("ightArrow;") { + return Some(CharRef { + name: "ightArrow;", + characters: "\u{2192}", + }); + } + + if first_char == 'R' && try_read("ightFloor;") { + return Some(CharRef { + name: "ightFloor;", + characters: "\u{230b}", + }); + } + + if first_char == 'R' && try_read("ightarrow;") { + return Some(CharRef { + name: "ightarrow;", + characters: "\u{21d2}", + }); + } + + if first_char == 'T' && try_read("hickSpace;") { + return Some(CharRef { + name: "hickSpace;", + characters: "\u{205f}\u{200a}", + }); + } + + if first_char == 'T' && try_read("ildeEqual;") { + return Some(CharRef { + name: "ildeEqual;", + characters: "\u{2243}", + }); + } + + if first_char == 'T' && try_read("ildeTilde;") { + return Some(CharRef { + name: "ildeTilde;", + characters: "\u{2248}", + }); + } + + if first_char == 'U' && try_read("nderBrace;") { + return Some(CharRef { + name: "nderBrace;", + characters: "\u{23df}", + }); + } + + if first_char == 'U' && try_read("pArrowBar;") { + return Some(CharRef { + name: "pArrowBar;", + characters: "\u{2912}", + }); + } + + if first_char == 'U' && try_read("pTeeArrow;") { + return Some(CharRef { + name: "pTeeArrow;", + characters: "\u{21a5}", + }); + } + + if first_char == 'c' && try_read("ircledast;") { + return Some(CharRef { + name: "ircledast;", + characters: "\u{229b}", + }); + } + + if first_char == 'c' && try_read("omplement;") { + return Some(CharRef { + name: "omplement;", + characters: "\u{2201}", + }); + } + + if first_char == 'c' && try_read("urlywedge;") { + return Some(CharRef { + name: "urlywedge;", + characters: "\u{22cf}", + }); + } + + if first_char == 'e' && try_read("qslantgtr;") { + return Some(CharRef { + name: "qslantgtr;", + characters: "\u{2a96}", + }); + } + + if first_char == 'g' && try_read("treqqless;") { + return Some(CharRef { + name: "treqqless;", + characters: "\u{2a8c}", + }); + } + + if first_char == 'l' && try_read("essapprox;") { + return Some(CharRef { + name: "essapprox;", + characters: "\u{2a85}", + }); + } + + if first_char == 'l' && try_read("esseqqgtr;") { + return Some(CharRef { + name: "esseqqgtr;", + characters: "\u{2a8b}", + }); + } + + if first_char == 'l' && try_read("moustache;") { + return Some(CharRef { + name: "moustache;", + characters: "\u{23b0}", + }); + } + + if first_char == 'l' && try_read("ongmapsto;") { + return Some(CharRef { + name: "ongmapsto;", + characters: "\u{27fc}", + }); + } + + if first_char == 'm' && try_read("apstodown;") { + return Some(CharRef { + name: "apstodown;", + characters: "\u{21a7}", + }); + } + + if first_char == 'm' && try_read("apstoleft;") { + return Some(CharRef { + name: "apstoleft;", + characters: "\u{21a4}", + }); + } + + if first_char == 'n' && try_read("Leftarrow;") { + return Some(CharRef { + name: "Leftarrow;", + characters: "\u{21cd}", + }); + } + + if first_char == 'n' && try_read("leftarrow;") { + return Some(CharRef { + name: "leftarrow;", + characters: "\u{219a}", + }); + } + + if first_char == 'n' && try_read("subseteqq;") { + return Some(CharRef { + name: "subseteqq;", + characters: "\u{2ac5}\u{338}", + }); + } + + if first_char == 'n' && try_read("supseteqq;") { + return Some(CharRef { + name: "supseteqq;", + characters: "\u{2ac6}\u{338}", + }); + } + + if first_char == 'p' && try_read("recapprox;") { + return Some(CharRef { + name: "recapprox;", + characters: "\u{2ab7}", + }); + } + + if first_char == 'r' && try_read("ightarrow;") { + return Some(CharRef { + name: "ightarrow;", + characters: "\u{2192}", + }); + } + + if first_char == 'r' && try_read("moustache;") { + return Some(CharRef { + name: "moustache;", + characters: "\u{23b1}", + }); + } + + if first_char == 's' && try_read("qsubseteq;") { + return Some(CharRef { + name: "qsubseteq;", + characters: "\u{2291}", + }); + } + + if first_char == 's' && try_read("qsupseteq;") { + return Some(CharRef { + name: "qsupseteq;", + characters: "\u{2292}", + }); + } + + if first_char == 's' && try_read("ubsetneqq;") { + return Some(CharRef { + name: "ubsetneqq;", + characters: "\u{2acb}", + }); + } + + if first_char == 's' && try_read("uccapprox;") { + return Some(CharRef { + name: "uccapprox;", + characters: "\u{2ab8}", + }); + } + + if first_char == 's' && try_read("upsetneqq;") { + return Some(CharRef { + name: "upsetneqq;", + characters: "\u{2acc}", + }); + } + + if first_char == 'u' && try_read("puparrows;") { + return Some(CharRef { + name: "puparrows;", + characters: "\u{21c8}", + }); + } + + if first_char == 'v' && try_read("arepsilon;") { + return Some(CharRef { + name: "arepsilon;", + characters: "\u{3f5}", + }); + } + + if first_char == 'v' && try_read("arnothing;") { + return Some(CharRef { + name: "arnothing;", + characters: "\u{2205}", + }); + } + + if first_char == 'B' && try_read("ackslash;") { + return Some(CharRef { + name: "ackslash;", + characters: "\u{2216}", + }); + } + + if first_char == 'C' && try_read("enterDot;") { + return Some(CharRef { + name: "enterDot;", + characters: "\u{b7}", + }); + } + + if first_char == 'C' && try_read("ircleDot;") { + return Some(CharRef { + name: "ircleDot;", + characters: "\u{2299}", + }); + } + + if first_char == 'C' && try_read("ongruent;") { + return Some(CharRef { + name: "ongruent;", + characters: "\u{2261}", + }); + } + + if first_char == 'C' && try_read("oproduct;") { + return Some(CharRef { + name: "oproduct;", + characters: "\u{2210}", + }); + } + + if first_char == 'D' && try_read("oubleDot;") { + return Some(CharRef { + name: "oubleDot;", + characters: "\u{a8}", + }); + } + + if first_char == 'D' && try_read("ownArrow;") { + return Some(CharRef { + name: "ownArrow;", + characters: "\u{2193}", + }); + } + + if first_char == 'D' && try_read("ownBreve;") { + return Some(CharRef { + name: "ownBreve;", + characters: "\u{311}", + }); + } + + if first_char == 'D' && try_read("ownarrow;") { + return Some(CharRef { + name: "ownarrow;", + characters: "\u{21d3}", + }); + } + + if first_char == 'H' && try_read("umpEqual;") { + return Some(CharRef { + name: "umpEqual;", + characters: "\u{224f}", + }); + } + + if first_char == 'L' && try_read("eftArrow;") { + return Some(CharRef { + name: "eftArrow;", + characters: "\u{2190}", + }); + } + + if first_char == 'L' && try_read("eftFloor;") { + return Some(CharRef { + name: "eftFloor;", + characters: "\u{230a}", + }); + } + + if first_char == 'L' && try_read("eftarrow;") { + return Some(CharRef { + name: "eftarrow;", + characters: "\u{21d0}", + }); + } + + if first_char == 'L' && try_read("essTilde;") { + return Some(CharRef { + name: "essTilde;", + characters: "\u{2272}", + }); + } + + if first_char == 'M' && try_read("ellintrf;") { + return Some(CharRef { + name: "ellintrf;", + characters: "\u{2133}", + }); + } + + if first_char == 'M' && try_read("inusPlus;") { + return Some(CharRef { + name: "inusPlus;", + characters: "\u{2213}", + }); + } + + if first_char == 'N' && try_read("otCupCap;") { + return Some(CharRef { + name: "otCupCap;", + characters: "\u{226d}", + }); + } + + if first_char == 'N' && try_read("otExists;") { + return Some(CharRef { + name: "otExists;", + characters: "\u{2204}", + }); + } + + if first_char == 'N' && try_read("otSubset;") { + return Some(CharRef { + name: "otSubset;", + characters: "\u{2282}\u{20d2}", + }); + } + + if first_char == 'O' && try_read("verBrace;") { + return Some(CharRef { + name: "verBrace;", + characters: "\u{23de}", + }); + } + + if first_char == 'P' && try_read("lusMinus;") { + return Some(CharRef { + name: "lusMinus;", + characters: "\u{b1}", + }); + } + + if first_char == 'T' && try_read("herefore;") { + return Some(CharRef { + name: "herefore;", + characters: "\u{2234}", + }); + } + + if first_char == 'T' && try_read("hinSpace;") { + return Some(CharRef { + name: "hinSpace;", + characters: "\u{2009}", + }); + } + + if first_char == 'T' && try_read("ripleDot;") { + return Some(CharRef { + name: "ripleDot;", + characters: "\u{20db}", + }); + } + + if first_char == 'U' && try_read("nionPlus;") { + return Some(CharRef { + name: "nionPlus;", + characters: "\u{228e}", + }); + } + + if first_char == 'b' && try_read("ackprime;") { + return Some(CharRef { + name: "ackprime;", + characters: "\u{2035}", + }); + } + + if first_char == 'b' && try_read("acksimeq;") { + return Some(CharRef { + name: "acksimeq;", + characters: "\u{22cd}", + }); + } + + if first_char == 'b' && try_read("igotimes;") { + return Some(CharRef { + name: "igotimes;", + characters: "\u{2a02}", + }); + } + + if first_char == 'c' && try_read("enterdot;") { + return Some(CharRef { + name: "enterdot;", + characters: "\u{b7}", + }); + } + + if first_char == 'c' && try_read("heckmark;") { + return Some(CharRef { + name: "heckmark;", + characters: "\u{2713}", + }); + } + + if first_char == 'c' && try_read("omplexes;") { + return Some(CharRef { + name: "omplexes;", + characters: "\u{2102}", + }); + } + + if first_char == 'd' && try_read("otsquare;") { + return Some(CharRef { + name: "otsquare;", + characters: "\u{22a1}", + }); + } + + if first_char == 'd' && try_read("ownarrow;") { + return Some(CharRef { + name: "ownarrow;", + characters: "\u{2193}", + }); + } + + if first_char == 'g' && try_read("trapprox;") { + return Some(CharRef { + name: "trapprox;", + characters: "\u{2a86}", + }); + } + + if first_char == 'g' && try_read("treqless;") { + return Some(CharRef { + name: "treqless;", + characters: "\u{22db}", + }); + } + + if first_char == 'g' && try_read("vertneqq;") { + return Some(CharRef { + name: "vertneqq;", + characters: "\u{2269}\u{fe00}", + }); + } + + if first_char == 'h' && try_read("eartsuit;") { + return Some(CharRef { + name: "eartsuit;", + characters: "\u{2665}", + }); + } + + if first_char == 'l' && try_read("eftarrow;") { + return Some(CharRef { + name: "eftarrow;", + characters: "\u{2190}", + }); + } + + if first_char == 'l' && try_read("esseqgtr;") { + return Some(CharRef { + name: "esseqgtr;", + characters: "\u{22da}", + }); + } + + if first_char == 'l' && try_read("vertneqq;") { + return Some(CharRef { + name: "vertneqq;", + characters: "\u{2268}\u{fe00}", + }); + } + + if first_char == 'n' && try_read("geqslant;") { + return Some(CharRef { + name: "geqslant;", + characters: "\u{2a7e}\u{338}", + }); + } + + if first_char == 'n' && try_read("leqslant;") { + return Some(CharRef { + name: "leqslant;", + characters: "\u{2a7d}\u{338}", + }); + } + + if first_char == 'n' && try_read("parallel;") { + return Some(CharRef { + name: "parallel;", + characters: "\u{2226}", + }); + } + + if first_char == 'n' && try_read("shortmid;") { + return Some(CharRef { + name: "shortmid;", + characters: "\u{2224}", + }); + } + + if first_char == 'n' && try_read("subseteq;") { + return Some(CharRef { + name: "subseteq;", + characters: "\u{2288}", + }); + } + + if first_char == 'n' && try_read("supseteq;") { + return Some(CharRef { + name: "supseteq;", + characters: "\u{2289}", + }); + } + + if first_char == 'p' && try_read("itchfork;") { + return Some(CharRef { + name: "itchfork;", + characters: "\u{22d4}", + }); + } + + if first_char == 'r' && try_read("ationals;") { + return Some(CharRef { + name: "ationals;", + characters: "\u{211a}", + }); + } + + if first_char == 's' && try_read("padesuit;") { + return Some(CharRef { + name: "padesuit;", + characters: "\u{2660}", + }); + } + + if first_char == 's' && try_read("ubseteqq;") { + return Some(CharRef { + name: "ubseteqq;", + characters: "\u{2ac5}", + }); + } + + if first_char == 's' && try_read("ubsetneq;") { + return Some(CharRef { + name: "ubsetneq;", + characters: "\u{228a}", + }); + } + + if first_char == 's' && try_read("upseteqq;") { + return Some(CharRef { + name: "upseteqq;", + characters: "\u{2ac6}", + }); + } + + if first_char == 's' && try_read("upsetneq;") { + return Some(CharRef { + name: "upsetneq;", + characters: "\u{228b}", + }); + } + + if first_char == 't' && try_read("herefore;") { + return Some(CharRef { + name: "herefore;", + characters: "\u{2234}", + }); + } + + if first_char == 't' && try_read("riangleq;") { + return Some(CharRef { + name: "riangleq;", + characters: "\u{225c}", + }); + } + + if first_char == 'v' && try_read("arpropto;") { + return Some(CharRef { + name: "arpropto;", + characters: "\u{221d}", + }); + } + + if first_char == 'D' && try_read("Dotrahd;") { + return Some(CharRef { + name: "Dotrahd;", + characters: "\u{2911}", + }); + } + + if first_char == 'D' && try_read("otEqual;") { + return Some(CharRef { + name: "otEqual;", + characters: "\u{2250}", + }); + } + + if first_char == 'I' && try_read("ntegral;") { + return Some(CharRef { + name: "ntegral;", + characters: "\u{222b}", + }); + } + + if first_char == 'L' && try_read("essLess;") { + return Some(CharRef { + name: "essLess;", + characters: "\u{2aa1}", + }); + } + + if first_char == 'N' && try_read("otEqual;") { + return Some(CharRef { + name: "otEqual;", + characters: "\u{2260}", + }); + } + + if first_char == 'N' && try_read("otTilde;") { + return Some(CharRef { + name: "otTilde;", + characters: "\u{2241}", + }); + } + + if first_char == 'P' && try_read("artialD;") { + return Some(CharRef { + name: "artialD;", + characters: "\u{2202}", + }); + } + + if first_char == 'P' && try_read("recedes;") { + return Some(CharRef { + name: "recedes;", + characters: "\u{227a}", + }); + } + + if first_char == 'R' && try_read("ightTee;") { + return Some(CharRef { + name: "ightTee;", + characters: "\u{22a2}", + }); + } + + if first_char == 'S' && try_read("ucceeds;") { + return Some(CharRef { + name: "ucceeds;", + characters: "\u{227b}", + }); + } + + if first_char == 'S' && try_read("uchThat;") { + return Some(CharRef { + name: "uchThat;", + characters: "\u{220b}", + }); + } + + if first_char == 'S' && try_read("uperset;") { + return Some(CharRef { + name: "uperset;", + characters: "\u{2283}", + }); + } + + if first_char == 'U' && try_read("arrocir;") { + return Some(CharRef { + name: "arrocir;", + characters: "\u{2949}", + }); + } + + if first_char == 'U' && try_read("nderBar;") { + return Some(CharRef { + name: "nderBar;", + characters: "\u{5f}", + }); + } + + if first_char == 'a' && try_read("ndslope;") { + return Some(CharRef { + name: "ndslope;", + characters: "\u{2a58}", + }); + } + + if first_char == 'a' && try_read("ngmsdaa;") { + return Some(CharRef { + name: "ngmsdaa;", + characters: "\u{29a8}", + }); + } + + if first_char == 'a' && try_read("ngmsdab;") { + return Some(CharRef { + name: "ngmsdab;", + characters: "\u{29a9}", + }); + } + + if first_char == 'a' && try_read("ngmsdac;") { + return Some(CharRef { + name: "ngmsdac;", + characters: "\u{29aa}", + }); + } + + if first_char == 'a' && try_read("ngmsdad;") { + return Some(CharRef { + name: "ngmsdad;", + characters: "\u{29ab}", + }); + } + + if first_char == 'a' && try_read("ngmsdae;") { + return Some(CharRef { + name: "ngmsdae;", + characters: "\u{29ac}", + }); + } + + if first_char == 'a' && try_read("ngmsdaf;") { + return Some(CharRef { + name: "ngmsdaf;", + characters: "\u{29ad}", + }); + } + + if first_char == 'a' && try_read("ngmsdag;") { + return Some(CharRef { + name: "ngmsdag;", + characters: "\u{29ae}", + }); + } + + if first_char == 'a' && try_read("ngmsdah;") { + return Some(CharRef { + name: "ngmsdah;", + characters: "\u{29af}", + }); + } + + if first_char == 'a' && try_read("ngrtvbd;") { + return Some(CharRef { + name: "ngrtvbd;", + characters: "\u{299d}", + }); + } + + if first_char == 'a' && try_read("pproxeq;") { + return Some(CharRef { + name: "pproxeq;", + characters: "\u{224a}", + }); + } + + if first_char == 'a' && try_read("wconint;") { + return Some(CharRef { + name: "wconint;", + characters: "\u{2233}", + }); + } + + if first_char == 'b' && try_read("ackcong;") { + return Some(CharRef { + name: "ackcong;", + characters: "\u{224c}", + }); + } + + if first_char == 'b' && try_read("arwedge;") { + return Some(CharRef { + name: "arwedge;", + characters: "\u{2305}", + }); + } + + if first_char == 'b' && try_read("brktbrk;") { + return Some(CharRef { + name: "brktbrk;", + characters: "\u{23b6}", + }); + } + + if first_char == 'b' && try_read("igoplus;") { + return Some(CharRef { + name: "igoplus;", + characters: "\u{2a01}", + }); + } + + if first_char == 'b' && try_read("igsqcup;") { + return Some(CharRef { + name: "igsqcup;", + characters: "\u{2a06}", + }); + } + + if first_char == 'b' && try_read("iguplus;") { + return Some(CharRef { + name: "iguplus;", + characters: "\u{2a04}", + }); + } + + if first_char == 'b' && try_read("igwedge;") { + return Some(CharRef { + name: "igwedge;", + characters: "\u{22c0}", + }); + } + + if first_char == 'b' && try_read("oxminus;") { + return Some(CharRef { + name: "oxminus;", + characters: "\u{229f}", + }); + } + + if first_char == 'b' && try_read("oxtimes;") { + return Some(CharRef { + name: "oxtimes;", + characters: "\u{22a0}", + }); + } + + if first_char == 'b' && try_read("solhsub;") { + return Some(CharRef { + name: "solhsub;", + characters: "\u{27c8}", + }); + } + + if first_char == 'c' && try_read("apbrcup;") { + return Some(CharRef { + name: "apbrcup;", + characters: "\u{2a49}", + }); + } + + if first_char == 'c' && try_read("ircledR;") { + return Some(CharRef { + name: "ircledR;", + characters: "\u{ae}", + }); + } + + if first_char == 'c' && try_read("ircledS;") { + return Some(CharRef { + name: "ircledS;", + characters: "\u{24c8}", + }); + } + + if first_char == 'c' && try_read("irfnint;") { + return Some(CharRef { + name: "irfnint;", + characters: "\u{2a10}", + }); + } + + if first_char == 'c' && try_read("lubsuit;") { + return Some(CharRef { + name: "lubsuit;", + characters: "\u{2663}", + }); + } + + if first_char == 'c' && try_read("upbrcap;") { + return Some(CharRef { + name: "upbrcap;", + characters: "\u{2a48}", + }); + } + + if first_char == 'c' && try_read("urlyvee;") { + return Some(CharRef { + name: "urlyvee;", + characters: "\u{22ce}", + }); + } + + if first_char == 'c' && try_read("wconint;") { + return Some(CharRef { + name: "wconint;", + characters: "\u{2232}", + }); + } + + if first_char == 'd' && try_read("oteqdot;") { + return Some(CharRef { + name: "oteqdot;", + characters: "\u{2251}", + }); + } + + if first_char == 'd' && try_read("otminus;") { + return Some(CharRef { + name: "otminus;", + characters: "\u{2238}", + }); + } + + if first_char == 'd' && try_read("rbkarow;") { + return Some(CharRef { + name: "rbkarow;", + characters: "\u{2910}", + }); + } + + if first_char == 'd' && try_read("zigrarr;") { + return Some(CharRef { + name: "zigrarr;", + characters: "\u{27ff}", + }); + } + + if first_char == 'e' && try_read("linters;") { + return Some(CharRef { + name: "linters;", + characters: "\u{23e7}", + }); + } + + if first_char == 'e' && try_read("mptyset;") { + return Some(CharRef { + name: "mptyset;", + characters: "\u{2205}", + }); + } + + if first_char == 'e' && try_read("qvparsl;") { + return Some(CharRef { + name: "qvparsl;", + characters: "\u{29e5}", + }); + } + + if first_char == 'f' && try_read("partint;") { + return Some(CharRef { + name: "partint;", + characters: "\u{2a0d}", + }); + } + + if first_char == 'g' && try_read("eqslant;") { + return Some(CharRef { + name: "eqslant;", + characters: "\u{2a7e}", + }); + } + + if first_char == 'g' && try_read("esdotol;") { + return Some(CharRef { + name: "esdotol;", + characters: "\u{2a84}", + }); + } + + if first_char == 'g' && try_read("napprox;") { + return Some(CharRef { + name: "napprox;", + characters: "\u{2a8a}", + }); + } + + if first_char == 'h' && try_read("ksearow;") { + return Some(CharRef { + name: "ksearow;", + characters: "\u{2925}", + }); + } + + if first_char == 'h' && try_read("kswarow;") { + return Some(CharRef { + name: "kswarow;", + characters: "\u{2926}", + }); + } + + if first_char == 'i' && try_read("magline;") { + return Some(CharRef { + name: "magline;", + characters: "\u{2110}", + }); + } + + if first_char == 'i' && try_read("magpart;") { + return Some(CharRef { + name: "magpart;", + characters: "\u{2111}", + }); + } + + if first_char == 'i' && try_read("nfintie;") { + return Some(CharRef { + name: "nfintie;", + characters: "\u{29dd}", + }); + } + + if first_char == 'i' && try_read("ntegers;") { + return Some(CharRef { + name: "ntegers;", + characters: "\u{2124}", + }); + } + + if first_char == 'i' && try_read("ntercal;") { + return Some(CharRef { + name: "ntercal;", + characters: "\u{22ba}", + }); + } + + if first_char == 'i' && try_read("ntlarhk;") { + return Some(CharRef { + name: "ntlarhk;", + characters: "\u{2a17}", + }); + } + + if first_char == 'l' && try_read("aemptyv;") { + return Some(CharRef { + name: "aemptyv;", + characters: "\u{29b4}", + }); + } + + if first_char == 'l' && try_read("drushar;") { + return Some(CharRef { + name: "drushar;", + characters: "\u{294b}", + }); + } + + if first_char == 'l' && try_read("eqslant;") { + return Some(CharRef { + name: "eqslant;", + characters: "\u{2a7d}", + }); + } + + if first_char == 'l' && try_read("esdotor;") { + return Some(CharRef { + name: "esdotor;", + characters: "\u{2a83}", + }); + } + + if first_char == 'l' && try_read("lcorner;") { + return Some(CharRef { + name: "lcorner;", + characters: "\u{231e}", + }); + } + + if first_char == 'l' && try_read("napprox;") { + return Some(CharRef { + name: "napprox;", + characters: "\u{2a89}", + }); + } + + if first_char == 'l' && try_read("rcorner;") { + return Some(CharRef { + name: "rcorner;", + characters: "\u{231f}", + }); + } + + if first_char == 'l' && try_read("urdshar;") { + return Some(CharRef { + name: "urdshar;", + characters: "\u{294a}", + }); + } + + if first_char == 'm' && try_read("apstoup;") { + return Some(CharRef { + name: "apstoup;", + characters: "\u{21a5}", + }); + } + + if first_char == 'm' && try_read("ultimap;") { + return Some(CharRef { + name: "ultimap;", + characters: "\u{22b8}", + }); + } + + if first_char == 'n' && try_read("aturals;") { + return Some(CharRef { + name: "aturals;", + characters: "\u{2115}", + }); + } + + if first_char == 'n' && try_read("congdot;") { + return Some(CharRef { + name: "congdot;", + characters: "\u{2a6d}\u{338}", + }); + } + + if first_char == 'n' && try_read("otindot;") { + return Some(CharRef { + name: "otindot;", + characters: "\u{22f5}\u{338}", + }); + } + + if first_char == 'o' && try_read("timesas;") { + return Some(CharRef { + name: "timesas;", + characters: "\u{2a36}", + }); + } + + if first_char == 'p' && try_read("arallel;") { + return Some(CharRef { + name: "arallel;", + characters: "\u{2225}", + }); + } + + if first_char == 'p' && try_read("lusacir;") { + return Some(CharRef { + name: "lusacir;", + characters: "\u{2a23}", + }); + } + + if first_char == 'p' && try_read("ointint;") { + return Some(CharRef { + name: "ointint;", + characters: "\u{2a15}", + }); + } + + if first_char == 'p' && try_read("recneqq;") { + return Some(CharRef { + name: "recneqq;", + characters: "\u{2ab5}", + }); + } + + if first_char == 'p' && try_read("recnsim;") { + return Some(CharRef { + name: "recnsim;", + characters: "\u{22e8}", + }); + } + + if first_char == 'p' && try_read("rofalar;") { + return Some(CharRef { + name: "rofalar;", + characters: "\u{232e}", + }); + } + + if first_char == 'p' && try_read("rofline;") { + return Some(CharRef { + name: "rofline;", + characters: "\u{2312}", + }); + } + + if first_char == 'p' && try_read("rofsurf;") { + return Some(CharRef { + name: "rofsurf;", + characters: "\u{2313}", + }); + } + + if first_char == 'r' && try_read("aemptyv;") { + return Some(CharRef { + name: "aemptyv;", + characters: "\u{29b3}", + }); + } + + if first_char == 'r' && try_read("ealpart;") { + return Some(CharRef { + name: "ealpart;", + characters: "\u{211c}", + }); + } + + if first_char == 'r' && try_read("ppolint;") { + return Some(CharRef { + name: "ppolint;", + characters: "\u{2a12}", + }); + } + + if first_char == 'r' && try_read("triltri;") { + return Some(CharRef { + name: "triltri;", + characters: "\u{29ce}", + }); + } + + if first_char == 's' && try_read("cpolint;") { + return Some(CharRef { + name: "cpolint;", + characters: "\u{2a13}", + }); + } + + if first_char == 's' && try_read("etminus;") { + return Some(CharRef { + name: "etminus;", + characters: "\u{2216}", + }); + } + + if first_char == 's' && try_read("hortmid;") { + return Some(CharRef { + name: "hortmid;", + characters: "\u{2223}", + }); + } + + if first_char == 's' && try_read("meparsl;") { + return Some(CharRef { + name: "meparsl;", + characters: "\u{29e4}", + }); + } + + if first_char == 's' && try_read("qsubset;") { + return Some(CharRef { + name: "qsubset;", + characters: "\u{228f}", + }); + } + + if first_char == 's' && try_read("qsupset;") { + return Some(CharRef { + name: "qsupset;", + characters: "\u{2290}", + }); + } + + if first_char == 's' && try_read("ubseteq;") { + return Some(CharRef { + name: "ubseteq;", + characters: "\u{2286}", + }); + } + + if first_char == 's' && try_read("uccneqq;") { + return Some(CharRef { + name: "uccneqq;", + characters: "\u{2ab6}", + }); + } + + if first_char == 's' && try_read("uccnsim;") { + return Some(CharRef { + name: "uccnsim;", + characters: "\u{22e9}", + }); + } + + if first_char == 's' && try_read("upseteq;") { + return Some(CharRef { + name: "upseteq;", + characters: "\u{2287}", + }); + } + + if first_char == 't' && try_read("hetasym;") { + return Some(CharRef { + name: "hetasym;", + characters: "\u{3d1}", + }); + } + + if first_char == 't' && try_read("hicksim;") { + return Some(CharRef { + name: "hicksim;", + characters: "\u{223c}", + }); + } + + if first_char == 't' && try_read("imesbar;") { + return Some(CharRef { + name: "imesbar;", + characters: "\u{2a31}", + }); + } + + if first_char == 't' && try_read("riangle;") { + return Some(CharRef { + name: "riangle;", + characters: "\u{25b5}", + }); + } + + if first_char == 't' && try_read("riminus;") { + return Some(CharRef { + name: "riminus;", + characters: "\u{2a3a}", + }); + } + + if first_char == 't' && try_read("rpezium;") { + return Some(CharRef { + name: "rpezium;", + characters: "\u{23e2}", + }); + } + + if first_char == 'u' && try_read("lcorner;") { + return Some(CharRef { + name: "lcorner;", + characters: "\u{231c}", + }); + } + + if first_char == 'u' && try_read("rcorner;") { + return Some(CharRef { + name: "rcorner;", + characters: "\u{231d}", + }); + } + + if first_char == 'v' && try_read("arkappa;") { + return Some(CharRef { + name: "arkappa;", + characters: "\u{3f0}", + }); + } + + if first_char == 'v' && try_read("arsigma;") { + return Some(CharRef { + name: "arsigma;", + characters: "\u{3c2}", + }); + } + + if first_char == 'v' && try_read("artheta;") { + return Some(CharRef { + name: "artheta;", + characters: "\u{3d1}", + }); + } + + if first_char == 'B' && try_read("ecause;") { + return Some(CharRef { + name: "ecause;", + characters: "\u{2235}", + }); + } + + if first_char == 'C' && try_read("ayleys;") { + return Some(CharRef { + name: "ayleys;", + characters: "\u{212d}", + }); + } + + if first_char == 'C' && try_read("conint;") { + return Some(CharRef { + name: "conint;", + characters: "\u{2230}", + }); + } + + if first_char == 'C' && try_read("edilla;") { + return Some(CharRef { + name: "edilla;", + characters: "\u{b8}", + }); + } + + if first_char == 'D' && try_read("iamond;") { + return Some(CharRef { + name: "iamond;", + characters: "\u{22c4}", + }); + } + + if first_char == 'D' && try_read("ownTee;") { + return Some(CharRef { + name: "ownTee;", + characters: "\u{22a4}", + }); + } + + if first_char == 'E' && try_read("lement;") { + return Some(CharRef { + name: "lement;", + characters: "\u{2208}", + }); + } + + if first_char == 'E' && try_read("psilon;") { + return Some(CharRef { + name: "psilon;", + characters: "\u{395}", + }); + } + + if first_char == 'I' && try_read("mplies;") { + return Some(CharRef { + name: "mplies;", + characters: "\u{21d2}", + }); + } + + if first_char == 'L' && try_read("eftTee;") { + return Some(CharRef { + name: "eftTee;", + characters: "\u{22a3}", + }); + } + + if first_char == 'N' && try_read("ewLine;") { + return Some(CharRef { + name: "ewLine;", + characters: "\u{a}", + }); + } + + if first_char == 'N' && try_read("oBreak;") { + return Some(CharRef { + name: "oBreak;", + characters: "\u{2060}", + }); + } + + if first_char == 'N' && try_read("otLess;") { + return Some(CharRef { + name: "otLess;", + characters: "\u{226e}", + }); + } + + if first_char == 'O' && try_read("micron;") { + return Some(CharRef { + name: "micron;", + characters: "\u{39f}", + }); + } + + if first_char == 'O' && try_read("verBar;") { + return Some(CharRef { + name: "verBar;", + characters: "\u{203e}", + }); + } + + if first_char == 'P' && try_read("roduct;") { + return Some(CharRef { + name: "roduct;", + characters: "\u{220f}", + }); + } + + if first_char == 'U' && try_read("pArrow;") { + return Some(CharRef { + name: "pArrow;", + characters: "\u{2191}", + }); + } + + if first_char == 'U' && try_read("parrow;") { + return Some(CharRef { + name: "parrow;", + characters: "\u{21d1}", + }); + } + + if first_char == 'U' && try_read("psilon;") { + return Some(CharRef { + name: "psilon;", + characters: "\u{3a5}", + }); + } + + if first_char == 'a' && try_read("lefsym;") { + return Some(CharRef { + name: "lefsym;", + characters: "\u{2135}", + }); + } + + if first_char == 'a' && try_read("ngrtvb;") { + return Some(CharRef { + name: "ngrtvb;", + characters: "\u{22be}", + }); + } + + if first_char == 'a' && try_read("ngzarr;") { + return Some(CharRef { + name: "ngzarr;", + characters: "\u{237c}", + }); + } + + if first_char == 'a' && try_read("sympeq;") { + return Some(CharRef { + name: "sympeq;", + characters: "\u{224d}", + }); + } + + if first_char == 'b' && try_read("acksim;") { + return Some(CharRef { + name: "acksim;", + characters: "\u{223d}", + }); + } + + if first_char == 'b' && try_read("ecause;") { + return Some(CharRef { + name: "ecause;", + characters: "\u{2235}", + }); + } + + if first_char == 'b' && try_read("emptyv;") { + return Some(CharRef { + name: "emptyv;", + characters: "\u{29b0}", + }); + } + + if first_char == 'b' && try_read("etween;") { + return Some(CharRef { + name: "etween;", + characters: "\u{226c}", + }); + } + + if first_char == 'b' && try_read("igcirc;") { + return Some(CharRef { + name: "igcirc;", + characters: "\u{25ef}", + }); + } + + if first_char == 'b' && try_read("igodot;") { + return Some(CharRef { + name: "igodot;", + characters: "\u{2a00}", + }); + } + + if first_char == 'b' && try_read("igstar;") { + return Some(CharRef { + name: "igstar;", + characters: "\u{2605}", + }); + } + + if first_char == 'b' && try_read("nequiv;") { + return Some(CharRef { + name: "nequiv;", + characters: "\u{2261}\u{20e5}", + }); + } + + if first_char == 'b' && try_read("oxplus;") { + return Some(CharRef { + name: "oxplus;", + characters: "\u{229e}", + }); + } + + if first_char == 'c' && try_read("cupssm;") { + return Some(CharRef { + name: "cupssm;", + characters: "\u{2a50}", + }); + } + + if first_char == 'c' && try_read("emptyv;") { + return Some(CharRef { + name: "emptyv;", + characters: "\u{29b2}", + }); + } + + if first_char == 'c' && try_read("irscir;") { + return Some(CharRef { + name: "irscir;", + characters: "\u{29c2}", + }); + } + + if first_char == 'c' && try_read("oloneq;") { + return Some(CharRef { + name: "oloneq;", + characters: "\u{2254}", + }); + } + + if first_char == 'c' && try_read("ongdot;") { + return Some(CharRef { + name: "ongdot;", + characters: "\u{2a6d}", + }); + } + + if first_char == 'c' && try_read("udarrl;") { + return Some(CharRef { + name: "udarrl;", + characters: "\u{2938}", + }); + } + + if first_char == 'c' && try_read("udarrr;") { + return Some(CharRef { + name: "udarrr;", + characters: "\u{2935}", + }); + } + + if first_char == 'c' && try_read("ularrp;") { + return Some(CharRef { + name: "ularrp;", + characters: "\u{293d}", + }); + } + + if first_char == 'c' && try_read("urarrm;") { + return Some(CharRef { + name: "urarrm;", + characters: "\u{293c}", + }); + } + + if first_char == 'd' && try_read("bkarow;") { + return Some(CharRef { + name: "bkarow;", + characters: "\u{290f}", + }); + } + + if first_char == 'd' && try_read("dagger;") { + return Some(CharRef { + name: "dagger;", + characters: "\u{2021}", + }); + } + + if first_char == 'd' && try_read("dotseq;") { + return Some(CharRef { + name: "dotseq;", + characters: "\u{2a77}", + }); + } + + if first_char == 'd' && try_read("emptyv;") { + return Some(CharRef { + name: "emptyv;", + characters: "\u{29b1}", + }); + } + + if first_char == 'd' && try_read("iamond;") { + return Some(CharRef { + name: "iamond;", + characters: "\u{22c4}", + }); + } + + if first_char == 'd' && try_read("igamma;") { + return Some(CharRef { + name: "igamma;", + characters: "\u{3dd}", + }); + } + + if first_char == 'd' && try_read("otplus;") { + return Some(CharRef { + name: "otplus;", + characters: "\u{2214}", + }); + } + + if first_char == 'd' && try_read("wangle;") { + return Some(CharRef { + name: "wangle;", + characters: "\u{29a6}", + }); + } + + if first_char == 'e' && try_read("psilon;") { + return Some(CharRef { + name: "psilon;", + characters: "\u{3b5}", + }); + } + + if first_char == 'e' && try_read("qcolon;") { + return Some(CharRef { + name: "qcolon;", + characters: "\u{2255}", + }); + } + + if first_char == 'e' && try_read("quivDD;") { + return Some(CharRef { + name: "quivDD;", + characters: "\u{2a78}", + }); + } + + if first_char == 'g' && try_read("esdoto;") { + return Some(CharRef { + name: "esdoto;", + characters: "\u{2a82}", + }); + } + + if first_char == 'g' && try_read("tquest;") { + return Some(CharRef { + name: "tquest;", + characters: "\u{2a7c}", + }); + } + + if first_char == 'g' && try_read("trless;") { + return Some(CharRef { + name: "trless;", + characters: "\u{2277}", + }); + } + + if first_char == 'h' && try_read("arrcir;") { + return Some(CharRef { + name: "arrcir;", + characters: "\u{2948}", + }); + } + + if first_char == 'i' && try_read("ntprod;") { + return Some(CharRef { + name: "ntprod;", + characters: "\u{2a3c}", + }); + } + + if first_char == 'i' && try_read("sindot;") { + return Some(CharRef { + name: "sindot;", + characters: "\u{22f5}", + }); + } + + if first_char == 'l' && try_read("arrbfs;") { + return Some(CharRef { + name: "arrbfs;", + characters: "\u{291f}", + }); + } + + if first_char == 'l' && try_read("arrsim;") { + return Some(CharRef { + name: "arrsim;", + characters: "\u{2973}", + }); + } + + if first_char == 'l' && try_read("brksld;") { + return Some(CharRef { + name: "brksld;", + characters: "\u{298f}", + }); + } + + if first_char == 'l' && try_read("brkslu;") { + return Some(CharRef { + name: "brkslu;", + characters: "\u{298d}", + }); + } + + if first_char == 'l' && try_read("drdhar;") { + return Some(CharRef { + name: "drdhar;", + characters: "\u{2967}", + }); + } + + if first_char == 'l' && try_read("esdoto;") { + return Some(CharRef { + name: "esdoto;", + characters: "\u{2a81}", + }); + } + + if first_char == 'l' && try_read("essdot;") { + return Some(CharRef { + name: "essdot;", + characters: "\u{22d6}", + }); + } + + if first_char == 'l' && try_read("essgtr;") { + return Some(CharRef { + name: "essgtr;", + characters: "\u{2276}", + }); + } + + if first_char == 'l' && try_read("esssim;") { + return Some(CharRef { + name: "esssim;", + characters: "\u{2272}", + }); + } + + if first_char == 'l' && try_read("otimes;") { + return Some(CharRef { + name: "otimes;", + characters: "\u{2a34}", + }); + } + + if first_char == 'l' && try_read("ozenge;") { + return Some(CharRef { + name: "ozenge;", + characters: "\u{25ca}", + }); + } + + if first_char == 'l' && try_read("tquest;") { + return Some(CharRef { + name: "tquest;", + characters: "\u{2a7b}", + }); + } + + if first_char == 'l' && try_read("uruhar;") { + return Some(CharRef { + name: "uruhar;", + characters: "\u{2966}", + }); + } + + if first_char == 'm' && try_read("altese;") { + return Some(CharRef { + name: "altese;", + characters: "\u{2720}", + }); + } + + if first_char == 'm' && try_read("inusdu;") { + return Some(CharRef { + name: "inusdu;", + characters: "\u{2a2a}", + }); + } + + if first_char == 'n' && try_read("approx;") { + return Some(CharRef { + name: "approx;", + characters: "\u{2249}", + }); + } + + if first_char == 'n' && try_read("atural;") { + return Some(CharRef { + name: "atural;", + characters: "\u{266e}", + }); + } + + if first_char == 'n' && try_read("earrow;") { + return Some(CharRef { + name: "earrow;", + characters: "\u{2197}", + }); + } + + if first_char == 'n' && try_read("exists;") { + return Some(CharRef { + name: "exists;", + characters: "\u{2204}", + }); + } + + if first_char == 'n' && try_read("otinva;") { + return Some(CharRef { + name: "otinva;", + characters: "\u{2209}", + }); + } + + if first_char == 'n' && try_read("otinvb;") { + return Some(CharRef { + name: "otinvb;", + characters: "\u{22f7}", + }); + } + + if first_char == 'n' && try_read("otinvc;") { + return Some(CharRef { + name: "otinvc;", + characters: "\u{22f6}", + }); + } + + if first_char == 'n' && try_read("otniva;") { + return Some(CharRef { + name: "otniva;", + characters: "\u{220c}", + }); + } + + if first_char == 'n' && try_read("otnivb;") { + return Some(CharRef { + name: "otnivb;", + characters: "\u{22fe}", + }); + } + + if first_char == 'n' && try_read("otnivc;") { + return Some(CharRef { + name: "otnivc;", + characters: "\u{22fd}", + }); + } + + if first_char == 'n' && try_read("polint;") { + return Some(CharRef { + name: "polint;", + characters: "\u{2a14}", + }); + } + + if first_char == 'n' && try_read("preceq;") { + return Some(CharRef { + name: "preceq;", + characters: "\u{2aaf}\u{338}", + }); + } + + if first_char == 'n' && try_read("sqsube;") { + return Some(CharRef { + name: "sqsube;", + characters: "\u{22e2}", + }); + } + + if first_char == 'n' && try_read("sqsupe;") { + return Some(CharRef { + name: "sqsupe;", + characters: "\u{22e3}", + }); + } + + if first_char == 'n' && try_read("subset;") { + return Some(CharRef { + name: "subset;", + characters: "\u{2282}\u{20d2}", + }); + } + + if first_char == 'n' && try_read("succeq;") { + return Some(CharRef { + name: "succeq;", + characters: "\u{2ab0}\u{338}", + }); + } + + if first_char == 'n' && try_read("supset;") { + return Some(CharRef { + name: "supset;", + characters: "\u{2283}\u{20d2}", + }); + } + + if first_char == 'n' && try_read("vinfin;") { + return Some(CharRef { + name: "vinfin;", + characters: "\u{29de}", + }); + } + + if first_char == 'n' && try_read("vltrie;") { + return Some(CharRef { + name: "vltrie;", + characters: "\u{22b4}\u{20d2}", + }); + } + + if first_char == 'n' && try_read("vrtrie;") { + return Some(CharRef { + name: "vrtrie;", + characters: "\u{22b5}\u{20d2}", + }); + } + + if first_char == 'n' && try_read("warrow;") { + return Some(CharRef { + name: "warrow;", + characters: "\u{2196}", + }); + } + + if first_char == 'o' && try_read("lcross;") { + return Some(CharRef { + name: "lcross;", + characters: "\u{29bb}", + }); + } + + if first_char == 'o' && try_read("micron;") { + return Some(CharRef { + name: "micron;", + characters: "\u{3bf}", + }); + } + + if first_char == 'o' && try_read("rderof;") { + return Some(CharRef { + name: "rderof;", + characters: "\u{2134}", + }); + } + + if first_char == 'o' && try_read("rslope;") { + return Some(CharRef { + name: "rslope;", + characters: "\u{2a57}", + }); + } + + if first_char == 'p' && try_read("ertenk;") { + return Some(CharRef { + name: "ertenk;", + characters: "\u{2031}", + }); + } + + if first_char == 'p' && try_read("lanckh;") { + return Some(CharRef { + name: "lanckh;", + characters: "\u{210e}", + }); + } + + if first_char == 'p' && try_read("luscir;") { + return Some(CharRef { + name: "luscir;", + characters: "\u{2a22}", + }); + } + + if first_char == 'p' && try_read("lussim;") { + return Some(CharRef { + name: "lussim;", + characters: "\u{2a26}", + }); + } + + if first_char == 'p' && try_read("lustwo;") { + return Some(CharRef { + name: "lustwo;", + characters: "\u{2a27}", + }); + } + + if first_char == 'p' && try_read("recsim;") { + return Some(CharRef { + name: "recsim;", + characters: "\u{227e}", + }); + } + + if first_char == 'q' && try_read("uatint;") { + return Some(CharRef { + name: "uatint;", + characters: "\u{2a16}", + }); + } + + if first_char == 'q' && try_read("uesteq;") { + return Some(CharRef { + name: "uesteq;", + characters: "\u{225f}", + }); + } + + if first_char == 'r' && try_read("arrbfs;") { + return Some(CharRef { + name: "arrbfs;", + characters: "\u{2920}", + }); + } + + if first_char == 'r' && try_read("arrsim;") { + return Some(CharRef { + name: "arrsim;", + characters: "\u{2974}", + }); + } + + if first_char == 'r' && try_read("brksld;") { + return Some(CharRef { + name: "brksld;", + characters: "\u{298e}", + }); + } + + if first_char == 'r' && try_read("brkslu;") { + return Some(CharRef { + name: "brkslu;", + characters: "\u{2990}", + }); + } + + if first_char == 'r' && try_read("dldhar;") { + return Some(CharRef { + name: "dldhar;", + characters: "\u{2969}", + }); + } + + if first_char == 'r' && try_read("ealine;") { + return Some(CharRef { + name: "ealine;", + characters: "\u{211b}", + }); + } + + if first_char == 'r' && try_read("otimes;") { + return Some(CharRef { + name: "otimes;", + characters: "\u{2a35}", + }); + } + + if first_char == 'r' && try_read("uluhar;") { + return Some(CharRef { + name: "uluhar;", + characters: "\u{2968}", + }); + } + + if first_char == 's' && try_read("earrow;") { + return Some(CharRef { + name: "earrow;", + characters: "\u{2198}", + }); + } + + if first_char == 's' && try_read("implus;") { + return Some(CharRef { + name: "implus;", + characters: "\u{2a24}", + }); + } + + if first_char == 's' && try_read("imrarr;") { + return Some(CharRef { + name: "imrarr;", + characters: "\u{2972}", + }); + } + + if first_char == 's' && try_read("ubedot;") { + return Some(CharRef { + name: "ubedot;", + characters: "\u{2ac3}", + }); + } + + if first_char == 's' && try_read("ubmult;") { + return Some(CharRef { + name: "ubmult;", + characters: "\u{2ac1}", + }); + } + + if first_char == 's' && try_read("ubplus;") { + return Some(CharRef { + name: "ubplus;", + characters: "\u{2abf}", + }); + } + + if first_char == 's' && try_read("ubrarr;") { + return Some(CharRef { + name: "ubrarr;", + characters: "\u{2979}", + }); + } + + if first_char == 's' && try_read("uccsim;") { + return Some(CharRef { + name: "uccsim;", + characters: "\u{227f}", + }); + } + + if first_char == 's' && try_read("updsub;") { + return Some(CharRef { + name: "updsub;", + characters: "\u{2ad8}", + }); + } + + if first_char == 's' && try_read("upedot;") { + return Some(CharRef { + name: "upedot;", + characters: "\u{2ac4}", + }); + } + + if first_char == 's' && try_read("uphsol;") { + return Some(CharRef { + name: "uphsol;", + characters: "\u{27c9}", + }); + } + + if first_char == 's' && try_read("uphsub;") { + return Some(CharRef { + name: "uphsub;", + characters: "\u{2ad7}", + }); + } + + if first_char == 's' && try_read("uplarr;") { + return Some(CharRef { + name: "uplarr;", + characters: "\u{297b}", + }); + } + + if first_char == 's' && try_read("upmult;") { + return Some(CharRef { + name: "upmult;", + characters: "\u{2ac2}", + }); + } + + if first_char == 's' && try_read("upplus;") { + return Some(CharRef { + name: "upplus;", + characters: "\u{2ac0}", + }); + } + + if first_char == 's' && try_read("warrow;") { + return Some(CharRef { + name: "warrow;", + characters: "\u{2199}", + }); + } + + if first_char == 't' && try_read("opfork;") { + return Some(CharRef { + name: "opfork;", + characters: "\u{2ada}", + }); + } + + if first_char == 't' && try_read("riplus;") { + return Some(CharRef { + name: "riplus;", + characters: "\u{2a39}", + }); + } + + if first_char == 't' && try_read("ritime;") { + return Some(CharRef { + name: "ritime;", + characters: "\u{2a3b}", + }); + } + + if first_char == 'u' && try_read("parrow;") { + return Some(CharRef { + name: "parrow;", + characters: "\u{2191}", + }); + } + + if first_char == 'u' && try_read("psilon;") { + return Some(CharRef { + name: "psilon;", + characters: "\u{3c5}", + }); + } + + if first_char == 'u' && try_read("wangle;") { + return Some(CharRef { + name: "wangle;", + characters: "\u{29a7}", + }); + } + + if first_char == 'v' && try_read("zigzag;") { + return Some(CharRef { + name: "zigzag;", + characters: "\u{299a}", + }); + } + + if first_char == 'z' && try_read("igrarr;") { + return Some(CharRef { + name: "igrarr;", + characters: "\u{21dd}", + }); + } + + if first_char == 'A' && try_read("acute;") { + return Some(CharRef { + name: "acute;", + characters: "\u{c1}", + }); + } + + if first_char == 'A' && try_read("breve;") { + return Some(CharRef { + name: "breve;", + characters: "\u{102}", + }); + } + + if first_char == 'A' && try_read("grave;") { + return Some(CharRef { + name: "grave;", + characters: "\u{c0}", + }); + } + + if first_char == 'A' && try_read("ssign;") { + return Some(CharRef { + name: "ssign;", + characters: "\u{2254}", + }); + } + + if first_char == 'A' && try_read("tilde;") { + return Some(CharRef { + name: "tilde;", + characters: "\u{c3}", + }); + } + + if first_char == 'B' && try_read("arwed;") { + return Some(CharRef { + name: "arwed;", + characters: "\u{2306}", + }); + } + + if first_char == 'B' && try_read("umpeq;") { + return Some(CharRef { + name: "umpeq;", + characters: "\u{224e}", + }); + } + + if first_char == 'C' && try_read("acute;") { + return Some(CharRef { + name: "acute;", + characters: "\u{106}", + }); + } + + if first_char == 'C' && try_read("caron;") { + return Some(CharRef { + name: "caron;", + characters: "\u{10c}", + }); + } + + if first_char == 'C' && try_read("cedil;") { + return Some(CharRef { + name: "cedil;", + characters: "\u{c7}", + }); + } + + if first_char == 'C' && try_read("olone;") { + return Some(CharRef { + name: "olone;", + characters: "\u{2a74}", + }); + } + + if first_char == 'C' && try_read("onint;") { + return Some(CharRef { + name: "onint;", + characters: "\u{222f}", + }); + } + + if first_char == 'C' && try_read("upCap;") { + return Some(CharRef { + name: "upCap;", + characters: "\u{224d}", + }); + } + + if first_char == 'D' && try_read("agger;") { + return Some(CharRef { + name: "agger;", + characters: "\u{2021}", + }); + } + + if first_char == 'D' && try_read("caron;") { + return Some(CharRef { + name: "caron;", + characters: "\u{10e}", + }); + } + + if first_char == 'D' && try_read("otDot;") { + return Some(CharRef { + name: "otDot;", + characters: "\u{20dc}", + }); + } + + if first_char == 'D' && try_read("strok;") { + return Some(CharRef { + name: "strok;", + characters: "\u{110}", + }); + } + + if first_char == 'E' && try_read("acute;") { + return Some(CharRef { + name: "acute;", + characters: "\u{c9}", + }); + } + + if first_char == 'E' && try_read("caron;") { + return Some(CharRef { + name: "caron;", + characters: "\u{11a}", + }); + } + + if first_char == 'E' && try_read("grave;") { + return Some(CharRef { + name: "grave;", + characters: "\u{c8}", + }); + } + + if first_char == 'E' && try_read("xists;") { + return Some(CharRef { + name: "xists;", + characters: "\u{2203}", + }); + } + + if first_char == 'F' && try_read("orAll;") { + return Some(CharRef { + name: "orAll;", + characters: "\u{2200}", + }); + } + + if first_char == 'G' && try_read("ammad;") { + return Some(CharRef { + name: "ammad;", + characters: "\u{3dc}", + }); + } + + if first_char == 'G' && try_read("breve;") { + return Some(CharRef { + name: "breve;", + characters: "\u{11e}", + }); + } + + if first_char == 'G' && try_read("cedil;") { + return Some(CharRef { + name: "cedil;", + characters: "\u{122}", + }); + } + + if first_char == 'H' && try_read("ARDcy;") { + return Some(CharRef { + name: "ARDcy;", + characters: "\u{42a}", + }); + } + + if first_char == 'H' && try_read("strok;") { + return Some(CharRef { + name: "strok;", + characters: "\u{126}", + }); + } + + if first_char == 'I' && try_read("acute;") { + return Some(CharRef { + name: "acute;", + characters: "\u{cd}", + }); + } + + if first_char == 'I' && try_read("grave;") { + return Some(CharRef { + name: "grave;", + characters: "\u{cc}", + }); + } + + if first_char == 'I' && try_read("tilde;") { + return Some(CharRef { + name: "tilde;", + characters: "\u{128}", + }); + } + + if first_char == 'J' && try_read("sercy;") { + return Some(CharRef { + name: "sercy;", + characters: "\u{408}", + }); + } + + if first_char == 'K' && try_read("cedil;") { + return Some(CharRef { + name: "cedil;", + characters: "\u{136}", + }); + } + + if first_char == 'L' && try_read("acute;") { + return Some(CharRef { + name: "acute;", + characters: "\u{139}", + }); + } + + if first_char == 'L' && try_read("ambda;") { + return Some(CharRef { + name: "ambda;", + characters: "\u{39b}", + }); + } + + if first_char == 'L' && try_read("caron;") { + return Some(CharRef { + name: "caron;", + characters: "\u{13d}", + }); + } + + if first_char == 'L' && try_read("cedil;") { + return Some(CharRef { + name: "cedil;", + characters: "\u{13b}", + }); + } + + if first_char == 'L' && try_read("midot;") { + return Some(CharRef { + name: "midot;", + characters: "\u{13f}", + }); + } + + if first_char == 'L' && try_read("strok;") { + return Some(CharRef { + name: "strok;", + characters: "\u{141}", + }); + } + + if first_char == 'N' && try_read("acute;") { + return Some(CharRef { + name: "acute;", + characters: "\u{143}", + }); + } + + if first_char == 'N' && try_read("caron;") { + return Some(CharRef { + name: "caron;", + characters: "\u{147}", + }); + } + + if first_char == 'N' && try_read("cedil;") { + return Some(CharRef { + name: "cedil;", + characters: "\u{145}", + }); + } + + if first_char == 'N' && try_read("tilde;") { + return Some(CharRef { + name: "tilde;", + characters: "\u{d1}", + }); + } + + if first_char == 'O' && try_read("acute;") { + return Some(CharRef { + name: "acute;", + characters: "\u{d3}", + }); + } + + if first_char == 'O' && try_read("dblac;") { + return Some(CharRef { + name: "dblac;", + characters: "\u{150}", + }); + } + + if first_char == 'O' && try_read("grave;") { + return Some(CharRef { + name: "grave;", + characters: "\u{d2}", + }); + } + + if first_char == 'O' && try_read("slash;") { + return Some(CharRef { + name: "slash;", + characters: "\u{d8}", + }); + } + + if first_char == 'O' && try_read("tilde;") { + return Some(CharRef { + name: "tilde;", + characters: "\u{d5}", + }); + } + + if first_char == 'O' && try_read("times;") { + return Some(CharRef { + name: "times;", + characters: "\u{2a37}", + }); + } + + if first_char == 'R' && try_read("acute;") { + return Some(CharRef { + name: "acute;", + characters: "\u{154}", + }); + } + + if first_char == 'R' && try_read("arrtl;") { + return Some(CharRef { + name: "arrtl;", + characters: "\u{2916}", + }); + } + + if first_char == 'R' && try_read("caron;") { + return Some(CharRef { + name: "caron;", + characters: "\u{158}", + }); + } + + if first_char == 'R' && try_read("cedil;") { + return Some(CharRef { + name: "cedil;", + characters: "\u{156}", + }); + } + + if first_char == 'S' && try_read("HCHcy;") { + return Some(CharRef { + name: "HCHcy;", + characters: "\u{429}", + }); + } + + if first_char == 'S' && try_read("OFTcy;") { + return Some(CharRef { + name: "OFTcy;", + characters: "\u{42c}", + }); + } + + if first_char == 'S' && try_read("acute;") { + return Some(CharRef { + name: "acute;", + characters: "\u{15a}", + }); + } + + if first_char == 'S' && try_read("caron;") { + return Some(CharRef { + name: "caron;", + characters: "\u{160}", + }); + } + + if first_char == 'S' && try_read("cedil;") { + return Some(CharRef { + name: "cedil;", + characters: "\u{15e}", + }); + } + + if first_char == 'S' && try_read("quare;") { + return Some(CharRef { + name: "quare;", + characters: "\u{25a1}", + }); + } + + if first_char == 'S' && try_read("ubset;") { + return Some(CharRef { + name: "ubset;", + characters: "\u{22d0}", + }); + } + + if first_char == 'S' && try_read("upset;") { + return Some(CharRef { + name: "upset;", + characters: "\u{22d1}", + }); + } + + if first_char == 'T' && try_read("caron;") { + return Some(CharRef { + name: "caron;", + characters: "\u{164}", + }); + } + + if first_char == 'T' && try_read("cedil;") { + return Some(CharRef { + name: "cedil;", + characters: "\u{162}", + }); + } + + if first_char == 'T' && try_read("strok;") { + return Some(CharRef { + name: "strok;", + characters: "\u{166}", + }); + } + + if first_char == 'U' && try_read("acute;") { + return Some(CharRef { + name: "acute;", + characters: "\u{da}", + }); + } + + if first_char == 'U' && try_read("breve;") { + return Some(CharRef { + name: "breve;", + characters: "\u{16c}", + }); + } + + if first_char == 'U' && try_read("dblac;") { + return Some(CharRef { + name: "dblac;", + characters: "\u{170}", + }); + } + + if first_char == 'U' && try_read("grave;") { + return Some(CharRef { + name: "grave;", + characters: "\u{d9}", + }); + } + + if first_char == 'U' && try_read("tilde;") { + return Some(CharRef { + name: "tilde;", + characters: "\u{168}", + }); + } + + if first_char == 'V' && try_read("dashl;") { + return Some(CharRef { + name: "dashl;", + characters: "\u{2ae6}", + }); + } + + if first_char == 'V' && try_read("erbar;") { + return Some(CharRef { + name: "erbar;", + characters: "\u{2016}", + }); + } + + if first_char == 'V' && try_read("vdash;") { + return Some(CharRef { + name: "vdash;", + characters: "\u{22aa}", + }); + } + + if first_char == 'Y' && try_read("acute;") { + return Some(CharRef { + name: "acute;", + characters: "\u{dd}", + }); + } + + if first_char == 'Z' && try_read("acute;") { + return Some(CharRef { + name: "acute;", + characters: "\u{179}", + }); + } + + if first_char == 'Z' && try_read("caron;") { + return Some(CharRef { + name: "caron;", + characters: "\u{17d}", + }); + } + + if first_char == 'a' && try_read("acute;") { + return Some(CharRef { + name: "acute;", + characters: "\u{e1}", + }); + } + + if first_char == 'a' && try_read("breve;") { + return Some(CharRef { + name: "breve;", + characters: "\u{103}", + }); + } + + if first_char == 'a' && try_read("grave;") { + return Some(CharRef { + name: "grave;", + characters: "\u{e0}", + }); + } + + if first_char == 'a' && try_read("ndand;") { + return Some(CharRef { + name: "ndand;", + characters: "\u{2a55}", + }); + } + + if first_char == 'a' && try_read("ngmsd;") { + return Some(CharRef { + name: "ngmsd;", + characters: "\u{2221}", + }); + } + + if first_char == 'a' && try_read("ngsph;") { + return Some(CharRef { + name: "ngsph;", + characters: "\u{2222}", + }); + } + + if first_char == 'a' && try_read("pacir;") { + return Some(CharRef { + name: "pacir;", + characters: "\u{2a6f}", + }); + } + + if first_char == 'a' && try_read("pprox;") { + return Some(CharRef { + name: "pprox;", + characters: "\u{2248}", + }); + } + + if first_char == 'a' && try_read("tilde;") { + return Some(CharRef { + name: "tilde;", + characters: "\u{e3}", + }); + } + + if first_char == 'b' && try_read("arvee;") { + return Some(CharRef { + name: "arvee;", + characters: "\u{22bd}", + }); + } + + if first_char == 'b' && try_read("arwed;") { + return Some(CharRef { + name: "arwed;", + characters: "\u{2305}", + }); + } + + if first_char == 'b' && try_read("ecaus;") { + return Some(CharRef { + name: "ecaus;", + characters: "\u{2235}", + }); + } + + if first_char == 'b' && try_read("ernou;") { + return Some(CharRef { + name: "ernou;", + characters: "\u{212c}", + }); + } + + if first_char == 'b' && try_read("igcap;") { + return Some(CharRef { + name: "igcap;", + characters: "\u{22c2}", + }); + } + + if first_char == 'b' && try_read("igcup;") { + return Some(CharRef { + name: "igcup;", + characters: "\u{22c3}", + }); + } + + if first_char == 'b' && try_read("igvee;") { + return Some(CharRef { + name: "igvee;", + characters: "\u{22c1}", + }); + } + + if first_char == 'b' && try_read("karow;") { + return Some(CharRef { + name: "karow;", + characters: "\u{290d}", + }); + } + + if first_char == 'b' && try_read("ottom;") { + return Some(CharRef { + name: "ottom;", + characters: "\u{22a5}", + }); + } + + if first_char == 'b' && try_read("owtie;") { + return Some(CharRef { + name: "owtie;", + characters: "\u{22c8}", + }); + } + + if first_char == 'b' && try_read("oxbox;") { + return Some(CharRef { + name: "oxbox;", + characters: "\u{29c9}", + }); + } + + if first_char == 'b' && try_read("prime;") { + return Some(CharRef { + name: "prime;", + characters: "\u{2035}", + }); + } + + if first_char == 'b' && try_read("rvbar;") { + return Some(CharRef { + name: "rvbar;", + characters: "\u{a6}", + }); + } + + if first_char == 'b' && try_read("ullet;") { + return Some(CharRef { + name: "ullet;", + characters: "\u{2022}", + }); + } + + if first_char == 'b' && try_read("umpeq;") { + return Some(CharRef { + name: "umpeq;", + characters: "\u{224f}", + }); + } + + if first_char == 'c' && try_read("acute;") { + return Some(CharRef { + name: "acute;", + characters: "\u{107}", + }); + } + + if first_char == 'c' && try_read("apand;") { + return Some(CharRef { + name: "apand;", + characters: "\u{2a44}", + }); + } + + if first_char == 'c' && try_read("apcap;") { + return Some(CharRef { + name: "apcap;", + characters: "\u{2a4b}", + }); + } + + if first_char == 'c' && try_read("apcup;") { + return Some(CharRef { + name: "apcup;", + characters: "\u{2a47}", + }); + } + + if first_char == 'c' && try_read("apdot;") { + return Some(CharRef { + name: "apdot;", + characters: "\u{2a40}", + }); + } + + if first_char == 'c' && try_read("caron;") { + return Some(CharRef { + name: "caron;", + characters: "\u{10d}", + }); + } + + if first_char == 'c' && try_read("cedil;") { + return Some(CharRef { + name: "cedil;", + characters: "\u{e7}", + }); + } + + if first_char == 'c' && try_read("irceq;") { + return Some(CharRef { + name: "irceq;", + characters: "\u{2257}", + }); + } + + if first_char == 'c' && try_read("irmid;") { + return Some(CharRef { + name: "irmid;", + characters: "\u{2aef}", + }); + } + + if first_char == 'c' && try_read("olone;") { + return Some(CharRef { + name: "olone;", + characters: "\u{2254}", + }); + } + + if first_char == 'c' && try_read("ommat;") { + return Some(CharRef { + name: "ommat;", + characters: "\u{40}", + }); + } + + if first_char == 'c' && try_read("ompfn;") { + return Some(CharRef { + name: "ompfn;", + characters: "\u{2218}", + }); + } + + if first_char == 'c' && try_read("onint;") { + return Some(CharRef { + name: "onint;", + characters: "\u{222e}", + }); + } + + if first_char == 'c' && try_read("oprod;") { + return Some(CharRef { + name: "oprod;", + characters: "\u{2210}", + }); + } + + if first_char == 'c' && try_read("opysr;") { + return Some(CharRef { + name: "opysr;", + characters: "\u{2117}", + }); + } + + if first_char == 'c' && try_read("ularr;") { + return Some(CharRef { + name: "ularr;", + characters: "\u{21b6}", + }); + } + + if first_char == 'c' && try_read("upcap;") { + return Some(CharRef { + name: "upcap;", + characters: "\u{2a46}", + }); + } + + if first_char == 'c' && try_read("upcup;") { + return Some(CharRef { + name: "upcup;", + characters: "\u{2a4a}", + }); + } + + if first_char == 'c' && try_read("updot;") { + return Some(CharRef { + name: "updot;", + characters: "\u{228d}", + }); + } + + if first_char == 'c' && try_read("urarr;") { + return Some(CharRef { + name: "urarr;", + characters: "\u{21b7}", + }); + } + + if first_char == 'c' && try_read("urren;") { + return Some(CharRef { + name: "urren;", + characters: "\u{a4}", + }); + } + + if first_char == 'c' && try_read("ylcty;") { + return Some(CharRef { + name: "ylcty;", + characters: "\u{232d}", + }); + } + + if first_char == 'd' && try_read("agger;") { + return Some(CharRef { + name: "agger;", + characters: "\u{2020}", + }); + } + + if first_char == 'd' && try_read("aleth;") { + return Some(CharRef { + name: "aleth;", + characters: "\u{2138}", + }); + } + + if first_char == 'd' && try_read("caron;") { + return Some(CharRef { + name: "caron;", + characters: "\u{10f}", + }); + } + + if first_char == 'd' && try_read("fisht;") { + return Some(CharRef { + name: "fisht;", + characters: "\u{297f}", + }); + } + + if first_char == 'd' && try_read("ivide;") { + return Some(CharRef { + name: "ivide;", + characters: "\u{f7}", + }); + } + + if first_char == 'd' && try_read("ivonx;") { + return Some(CharRef { + name: "ivonx;", + characters: "\u{22c7}", + }); + } + + if first_char == 'd' && try_read("lcorn;") { + return Some(CharRef { + name: "lcorn;", + characters: "\u{231e}", + }); + } + + if first_char == 'd' && try_read("lcrop;") { + return Some(CharRef { + name: "lcrop;", + characters: "\u{230d}", + }); + } + + if first_char == 'd' && try_read("ollar;") { + return Some(CharRef { + name: "ollar;", + characters: "\u{24}", + }); + } + + if first_char == 'd' && try_read("rcorn;") { + return Some(CharRef { + name: "rcorn;", + characters: "\u{231f}", + }); + } + + if first_char == 'd' && try_read("rcrop;") { + return Some(CharRef { + name: "rcrop;", + characters: "\u{230c}", + }); + } + + if first_char == 'd' && try_read("strok;") { + return Some(CharRef { + name: "strok;", + characters: "\u{111}", + }); + } + + if first_char == 'e' && try_read("acute;") { + return Some(CharRef { + name: "acute;", + characters: "\u{e9}", + }); + } + + if first_char == 'e' && try_read("aster;") { + return Some(CharRef { + name: "aster;", + characters: "\u{2a6e}", + }); + } + + if first_char == 'e' && try_read("caron;") { + return Some(CharRef { + name: "caron;", + characters: "\u{11b}", + }); + } + + if first_char == 'e' && try_read("colon;") { + return Some(CharRef { + name: "colon;", + characters: "\u{2255}", + }); + } + + if first_char == 'e' && try_read("grave;") { + return Some(CharRef { + name: "grave;", + characters: "\u{e8}", + }); + } + + if first_char == 'e' && try_read("gsdot;") { + return Some(CharRef { + name: "gsdot;", + characters: "\u{2a98}", + }); + } + + if first_char == 'e' && try_read("lsdot;") { + return Some(CharRef { + name: "lsdot;", + characters: "\u{2a97}", + }); + } + + if first_char == 'e' && try_read("mptyv;") { + return Some(CharRef { + name: "mptyv;", + characters: "\u{2205}", + }); + } + + if first_char == 'e' && try_read("msp13;") { + return Some(CharRef { + name: "msp13;", + characters: "\u{2004}", + }); + } + + if first_char == 'e' && try_read("msp14;") { + return Some(CharRef { + name: "msp14;", + characters: "\u{2005}", + }); + } + + if first_char == 'e' && try_read("parsl;") { + return Some(CharRef { + name: "parsl;", + characters: "\u{29e3}", + }); + } + + if first_char == 'e' && try_read("qcirc;") { + return Some(CharRef { + name: "qcirc;", + characters: "\u{2256}", + }); + } + + if first_char == 'e' && try_read("quals;") { + return Some(CharRef { + name: "quals;", + characters: "\u{3d}", + }); + } + + if first_char == 'e' && try_read("quest;") { + return Some(CharRef { + name: "quest;", + characters: "\u{225f}", + }); + } + + if first_char == 'f' && try_read("emale;") { + return Some(CharRef { + name: "emale;", + characters: "\u{2640}", + }); + } + + if first_char == 'f' && try_read("filig;") { + return Some(CharRef { + name: "filig;", + characters: "\u{fb03}", + }); + } + + if first_char == 'f' && try_read("fllig;") { + return Some(CharRef { + name: "fllig;", + characters: "\u{fb04}", + }); + } + + if first_char == 'f' && try_read("orall;") { + return Some(CharRef { + name: "orall;", + characters: "\u{2200}", + }); + } + + if first_char == 'f' && try_read("rac12;") { + return Some(CharRef { + name: "rac12;", + characters: "\u{bd}", + }); + } + + if first_char == 'f' && try_read("rac13;") { + return Some(CharRef { + name: "rac13;", + characters: "\u{2153}", + }); + } + + if first_char == 'f' && try_read("rac14;") { + return Some(CharRef { + name: "rac14;", + characters: "\u{bc}", + }); + } + + if first_char == 'f' && try_read("rac15;") { + return Some(CharRef { + name: "rac15;", + characters: "\u{2155}", + }); + } + + if first_char == 'f' && try_read("rac16;") { + return Some(CharRef { + name: "rac16;", + characters: "\u{2159}", + }); + } + + if first_char == 'f' && try_read("rac18;") { + return Some(CharRef { + name: "rac18;", + characters: "\u{215b}", + }); + } + + if first_char == 'f' && try_read("rac23;") { + return Some(CharRef { + name: "rac23;", + characters: "\u{2154}", + }); + } + + if first_char == 'f' && try_read("rac25;") { + return Some(CharRef { + name: "rac25;", + characters: "\u{2156}", + }); + } + + if first_char == 'f' && try_read("rac34;") { + return Some(CharRef { + name: "rac34;", + characters: "\u{be}", + }); + } + + if first_char == 'f' && try_read("rac35;") { + return Some(CharRef { + name: "rac35;", + characters: "\u{2157}", + }); + } + + if first_char == 'f' && try_read("rac38;") { + return Some(CharRef { + name: "rac38;", + characters: "\u{215c}", + }); + } + + if first_char == 'f' && try_read("rac45;") { + return Some(CharRef { + name: "rac45;", + characters: "\u{2158}", + }); + } + + if first_char == 'f' && try_read("rac56;") { + return Some(CharRef { + name: "rac56;", + characters: "\u{215a}", + }); + } + + if first_char == 'f' && try_read("rac58;") { + return Some(CharRef { + name: "rac58;", + characters: "\u{215d}", + }); + } + + if first_char == 'f' && try_read("rac78;") { + return Some(CharRef { + name: "rac78;", + characters: "\u{215e}", + }); + } + + if first_char == 'g' && try_read("acute;") { + return Some(CharRef { + name: "acute;", + characters: "\u{1f5}", + }); + } + + if first_char == 'g' && try_read("ammad;") { + return Some(CharRef { + name: "ammad;", + characters: "\u{3dd}", + }); + } + + if first_char == 'g' && try_read("breve;") { + return Some(CharRef { + name: "breve;", + characters: "\u{11f}", + }); + } + + if first_char == 'g' && try_read("esdot;") { + return Some(CharRef { + name: "esdot;", + characters: "\u{2a80}", + }); + } + + if first_char == 'g' && try_read("esles;") { + return Some(CharRef { + name: "esles;", + characters: "\u{2a94}", + }); + } + + if first_char == 'g' && try_read("tlPar;") { + return Some(CharRef { + name: "tlPar;", + characters: "\u{2995}", + }); + } + + if first_char == 'g' && try_read("trarr;") { + return Some(CharRef { + name: "trarr;", + characters: "\u{2978}", + }); + } + + if first_char == 'g' && try_read("trdot;") { + return Some(CharRef { + name: "trdot;", + characters: "\u{22d7}", + }); + } + + if first_char == 'g' && try_read("trsim;") { + return Some(CharRef { + name: "trsim;", + characters: "\u{2273}", + }); + } + + if first_char == 'h' && try_read("airsp;") { + return Some(CharRef { + name: "airsp;", + characters: "\u{200a}", + }); + } + + if first_char == 'h' && try_read("amilt;") { + return Some(CharRef { + name: "amilt;", + characters: "\u{210b}", + }); + } + + if first_char == 'h' && try_read("ardcy;") { + return Some(CharRef { + name: "ardcy;", + characters: "\u{44a}", + }); + } + + if first_char == 'h' && try_read("earts;") { + return Some(CharRef { + name: "earts;", + characters: "\u{2665}", + }); + } + + if first_char == 'h' && try_read("ellip;") { + return Some(CharRef { + name: "ellip;", + characters: "\u{2026}", + }); + } + + if first_char == 'h' && try_read("ercon;") { + return Some(CharRef { + name: "ercon;", + characters: "\u{22b9}", + }); + } + + if first_char == 'h' && try_read("omtht;") { + return Some(CharRef { + name: "omtht;", + characters: "\u{223b}", + }); + } + + if first_char == 'h' && try_read("orbar;") { + return Some(CharRef { + name: "orbar;", + characters: "\u{2015}", + }); + } + + if first_char == 'h' && try_read("slash;") { + return Some(CharRef { + name: "slash;", + characters: "\u{210f}", + }); + } + + if first_char == 'h' && try_read("strok;") { + return Some(CharRef { + name: "strok;", + characters: "\u{127}", + }); + } + + if first_char == 'h' && try_read("ybull;") { + return Some(CharRef { + name: "ybull;", + characters: "\u{2043}", + }); + } + + if first_char == 'h' && try_read("yphen;") { + return Some(CharRef { + name: "yphen;", + characters: "\u{2010}", + }); + } + + if first_char == 'i' && try_read("acute;") { + return Some(CharRef { + name: "acute;", + characters: "\u{ed}", + }); + } + + if first_char == 'i' && try_read("grave;") { + return Some(CharRef { + name: "grave;", + characters: "\u{ec}", + }); + } + + if first_char == 'i' && try_read("iiint;") { + return Some(CharRef { + name: "iiint;", + characters: "\u{2a0c}", + }); + } + + if first_char == 'i' && try_read("infin;") { + return Some(CharRef { + name: "infin;", + characters: "\u{29dc}", + }); + } + + if first_char == 'i' && try_read("ncare;") { + return Some(CharRef { + name: "ncare;", + characters: "\u{2105}", + }); + } + + if first_char == 'i' && try_read("nodot;") { + return Some(CharRef { + name: "nodot;", + characters: "\u{131}", + }); + } + + if first_char == 'i' && try_read("ntcal;") { + return Some(CharRef { + name: "ntcal;", + characters: "\u{22ba}", + }); + } + + if first_char == 'i' && try_read("quest;") { + return Some(CharRef { + name: "quest;", + characters: "\u{bf}", + }); + } + + if first_char == 'i' && try_read("sinsv;") { + return Some(CharRef { + name: "sinsv;", + characters: "\u{22f3}", + }); + } + + if first_char == 'i' && try_read("tilde;") { + return Some(CharRef { + name: "tilde;", + characters: "\u{129}", + }); + } + + if first_char == 'j' && try_read("sercy;") { + return Some(CharRef { + name: "sercy;", + characters: "\u{458}", + }); + } + + if first_char == 'k' && try_read("appav;") { + return Some(CharRef { + name: "appav;", + characters: "\u{3f0}", + }); + } + + if first_char == 'k' && try_read("cedil;") { + return Some(CharRef { + name: "cedil;", + characters: "\u{137}", + }); + } + + if first_char == 'k' && try_read("green;") { + return Some(CharRef { + name: "green;", + characters: "\u{138}", + }); + } + + if first_char == 'l' && try_read("Atail;") { + return Some(CharRef { + name: "Atail;", + characters: "\u{291b}", + }); + } + + if first_char == 'l' && try_read("acute;") { + return Some(CharRef { + name: "acute;", + characters: "\u{13a}", + }); + } + + if first_char == 'l' && try_read("agran;") { + return Some(CharRef { + name: "agran;", + characters: "\u{2112}", + }); + } + + if first_char == 'l' && try_read("ambda;") { + return Some(CharRef { + name: "ambda;", + characters: "\u{3bb}", + }); + } + + if first_char == 'l' && try_read("angle;") { + return Some(CharRef { + name: "angle;", + characters: "\u{27e8}", + }); + } + + if first_char == 'l' && try_read("arrfs;") { + return Some(CharRef { + name: "arrfs;", + characters: "\u{291d}", + }); + } + + if first_char == 'l' && try_read("arrhk;") { + return Some(CharRef { + name: "arrhk;", + characters: "\u{21a9}", + }); + } + + if first_char == 'l' && try_read("arrlp;") { + return Some(CharRef { + name: "arrlp;", + characters: "\u{21ab}", + }); + } + + if first_char == 'l' && try_read("arrpl;") { + return Some(CharRef { + name: "arrpl;", + characters: "\u{2939}", + }); + } + + if first_char == 'l' && try_read("arrtl;") { + return Some(CharRef { + name: "arrtl;", + characters: "\u{21a2}", + }); + } + + if first_char == 'l' && try_read("atail;") { + return Some(CharRef { + name: "atail;", + characters: "\u{2919}", + }); + } + + if first_char == 'l' && try_read("brace;") { + return Some(CharRef { + name: "brace;", + characters: "\u{7b}", + }); + } + + if first_char == 'l' && try_read("brack;") { + return Some(CharRef { + name: "brack;", + characters: "\u{5b}", + }); + } + + if first_char == 'l' && try_read("caron;") { + return Some(CharRef { + name: "caron;", + characters: "\u{13e}", + }); + } + + if first_char == 'l' && try_read("cedil;") { + return Some(CharRef { + name: "cedil;", + characters: "\u{13c}", + }); + } + + if first_char == 'l' && try_read("dquor;") { + return Some(CharRef { + name: "dquor;", + characters: "\u{201e}", + }); + } + + if first_char == 'l' && try_read("esdot;") { + return Some(CharRef { + name: "esdot;", + characters: "\u{2a7f}", + }); + } + + if first_char == 'l' && try_read("esges;") { + return Some(CharRef { + name: "esges;", + characters: "\u{2a93}", + }); + } + + if first_char == 'l' && try_read("fisht;") { + return Some(CharRef { + name: "fisht;", + characters: "\u{297c}", + }); + } + + if first_char == 'l' && try_read("floor;") { + return Some(CharRef { + name: "floor;", + characters: "\u{230a}", + }); + } + + if first_char == 'l' && try_read("harul;") { + return Some(CharRef { + name: "harul;", + characters: "\u{296a}", + }); + } + + if first_char == 'l' && try_read("lhard;") { + return Some(CharRef { + name: "lhard;", + characters: "\u{296b}", + }); + } + + if first_char == 'l' && try_read("midot;") { + return Some(CharRef { + name: "midot;", + characters: "\u{140}", + }); + } + + if first_char == 'l' && try_read("moust;") { + return Some(CharRef { + name: "moust;", + characters: "\u{23b0}", + }); + } + + if first_char == 'l' && try_read("oplus;") { + return Some(CharRef { + name: "oplus;", + characters: "\u{2a2d}", + }); + } + + if first_char == 'l' && try_read("owast;") { + return Some(CharRef { + name: "owast;", + characters: "\u{2217}", + }); + } + + if first_char == 'l' && try_read("owbar;") { + return Some(CharRef { + name: "owbar;", + characters: "\u{5f}", + }); + } + + if first_char == 'l' && try_read("parlt;") { + return Some(CharRef { + name: "parlt;", + characters: "\u{2993}", + }); + } + + if first_char == 'l' && try_read("rhard;") { + return Some(CharRef { + name: "rhard;", + characters: "\u{296d}", + }); + } + + if first_char == 'l' && try_read("saquo;") { + return Some(CharRef { + name: "saquo;", + characters: "\u{2039}", + }); + } + + if first_char == 'l' && try_read("squor;") { + return Some(CharRef { + name: "squor;", + characters: "\u{201a}", + }); + } + + if first_char == 'l' && try_read("strok;") { + return Some(CharRef { + name: "strok;", + characters: "\u{142}", + }); + } + + if first_char == 'l' && try_read("three;") { + return Some(CharRef { + name: "three;", + characters: "\u{22cb}", + }); + } + + if first_char == 'l' && try_read("times;") { + return Some(CharRef { + name: "times;", + characters: "\u{22c9}", + }); + } + + if first_char == 'l' && try_read("tlarr;") { + return Some(CharRef { + name: "tlarr;", + characters: "\u{2976}", + }); + } + + if first_char == 'l' && try_read("trPar;") { + return Some(CharRef { + name: "trPar;", + characters: "\u{2996}", + }); + } + + if first_char == 'm' && try_read("apsto;") { + return Some(CharRef { + name: "apsto;", + characters: "\u{21a6}", + }); + } + + if first_char == 'm' && try_read("arker;") { + return Some(CharRef { + name: "arker;", + characters: "\u{25ae}", + }); + } + + if first_char == 'm' && try_read("comma;") { + return Some(CharRef { + name: "comma;", + characters: "\u{2a29}", + }); + } + + if first_char == 'm' && try_read("idast;") { + return Some(CharRef { + name: "idast;", + characters: "\u{2a}", + }); + } + + if first_char == 'm' && try_read("idcir;") { + return Some(CharRef { + name: "idcir;", + characters: "\u{2af0}", + }); + } + + if first_char == 'm' && try_read("iddot;") { + return Some(CharRef { + name: "iddot;", + characters: "\u{b7}", + }); + } + + if first_char == 'm' && try_read("inusb;") { + return Some(CharRef { + name: "inusb;", + characters: "\u{229f}", + }); + } + + if first_char == 'm' && try_read("inusd;") { + return Some(CharRef { + name: "inusd;", + characters: "\u{2238}", + }); + } + + if first_char == 'm' && try_read("nplus;") { + return Some(CharRef { + name: "nplus;", + characters: "\u{2213}", + }); + } + + if first_char == 'm' && try_read("odels;") { + return Some(CharRef { + name: "odels;", + characters: "\u{22a7}", + }); + } + + if first_char == 'm' && try_read("stpos;") { + return Some(CharRef { + name: "stpos;", + characters: "\u{223e}", + }); + } + + if first_char == 'n' && try_read("VDash;") { + return Some(CharRef { + name: "VDash;", + characters: "\u{22af}", + }); + } + + if first_char == 'n' && try_read("Vdash;") { + return Some(CharRef { + name: "Vdash;", + characters: "\u{22ae}", + }); + } + + if first_char == 'n' && try_read("acute;") { + return Some(CharRef { + name: "acute;", + characters: "\u{144}", + }); + } + + if first_char == 'n' && try_read("bumpe;") { + return Some(CharRef { + name: "bumpe;", + characters: "\u{224f}\u{338}", + }); + } + + if first_char == 'n' && try_read("caron;") { + return Some(CharRef { + name: "caron;", + characters: "\u{148}", + }); + } + + if first_char == 'n' && try_read("cedil;") { + return Some(CharRef { + name: "cedil;", + characters: "\u{146}", + }); + } + + if first_char == 'n' && try_read("earhk;") { + return Some(CharRef { + name: "earhk;", + characters: "\u{2924}", + }); + } + + if first_char == 'n' && try_read("equiv;") { + return Some(CharRef { + name: "equiv;", + characters: "\u{2262}", + }); + } + + if first_char == 'n' && try_read("esear;") { + return Some(CharRef { + name: "esear;", + characters: "\u{2928}", + }); + } + + if first_char == 'n' && try_read("exist;") { + return Some(CharRef { + name: "exist;", + characters: "\u{2204}", + }); + } + + if first_char == 'n' && try_read("ltrie;") { + return Some(CharRef { + name: "ltrie;", + characters: "\u{22ec}", + }); + } + + if first_char == 'n' && try_read("otinE;") { + return Some(CharRef { + name: "otinE;", + characters: "\u{22f9}\u{338}", + }); + } + + if first_char == 'n' && try_read("parsl;") { + return Some(CharRef { + name: "parsl;", + characters: "\u{2afd}\u{20e5}", + }); + } + + if first_char == 'n' && try_read("prcue;") { + return Some(CharRef { + name: "prcue;", + characters: "\u{22e0}", + }); + } + + if first_char == 'n' && try_read("rarrc;") { + return Some(CharRef { + name: "rarrc;", + characters: "\u{2933}\u{338}", + }); + } + + if first_char == 'n' && try_read("rarrw;") { + return Some(CharRef { + name: "rarrw;", + characters: "\u{219d}\u{338}", + }); + } + + if first_char == 'n' && try_read("rtrie;") { + return Some(CharRef { + name: "rtrie;", + characters: "\u{22ed}", + }); + } + + if first_char == 'n' && try_read("sccue;") { + return Some(CharRef { + name: "sccue;", + characters: "\u{22e1}", + }); + } + + if first_char == 'n' && try_read("simeq;") { + return Some(CharRef { + name: "simeq;", + characters: "\u{2244}", + }); + } + + if first_char == 'n' && try_read("tilde;") { + return Some(CharRef { + name: "tilde;", + characters: "\u{f1}", + }); + } + + if first_char == 'n' && try_read("umero;") { + return Some(CharRef { + name: "umero;", + characters: "\u{2116}", + }); + } + + if first_char == 'n' && try_read("vDash;") { + return Some(CharRef { + name: "vDash;", + characters: "\u{22ad}", + }); + } + + if first_char == 'n' && try_read("vHarr;") { + return Some(CharRef { + name: "vHarr;", + characters: "\u{2904}", + }); + } + + if first_char == 'n' && try_read("vdash;") { + return Some(CharRef { + name: "vdash;", + characters: "\u{22ac}", + }); + } + + if first_char == 'n' && try_read("vlArr;") { + return Some(CharRef { + name: "vlArr;", + characters: "\u{2902}", + }); + } + + if first_char == 'n' && try_read("vrArr;") { + return Some(CharRef { + name: "vrArr;", + characters: "\u{2903}", + }); + } + + if first_char == 'n' && try_read("warhk;") { + return Some(CharRef { + name: "warhk;", + characters: "\u{2923}", + }); + } + + if first_char == 'n' && try_read("wnear;") { + return Some(CharRef { + name: "wnear;", + characters: "\u{2927}", + }); + } + + if first_char == 'o' && try_read("acute;") { + return Some(CharRef { + name: "acute;", + characters: "\u{f3}", + }); + } + + if first_char == 'o' && try_read("dblac;") { + return Some(CharRef { + name: "dblac;", + characters: "\u{151}", + }); + } + + if first_char == 'o' && try_read("dsold;") { + return Some(CharRef { + name: "dsold;", + characters: "\u{29bc}", + }); + } + + if first_char == 'o' && try_read("grave;") { + return Some(CharRef { + name: "grave;", + characters: "\u{f2}", + }); + } + + if first_char == 'o' && try_read("minus;") { + return Some(CharRef { + name: "minus;", + characters: "\u{2296}", + }); + } + + if first_char == 'o' && try_read("rigof;") { + return Some(CharRef { + name: "rigof;", + characters: "\u{22b6}", + }); + } + + if first_char == 'o' && try_read("slash;") { + return Some(CharRef { + name: "slash;", + characters: "\u{f8}", + }); + } + + if first_char == 'o' && try_read("tilde;") { + return Some(CharRef { + name: "tilde;", + characters: "\u{f5}", + }); + } + + if first_char == 'o' && try_read("times;") { + return Some(CharRef { + name: "times;", + characters: "\u{2297}", + }); + } + + if first_char == 'p' && try_read("arsim;") { + return Some(CharRef { + name: "arsim;", + characters: "\u{2af3}", + }); + } + + if first_char == 'p' && try_read("ercnt;") { + return Some(CharRef { + name: "ercnt;", + characters: "\u{25}", + }); + } + + if first_char == 'p' && try_read("eriod;") { + return Some(CharRef { + name: "eriod;", + characters: "\u{2e}", + }); + } + + if first_char == 'p' && try_read("ermil;") { + return Some(CharRef { + name: "ermil;", + characters: "\u{2030}", + }); + } + + if first_char == 'p' && try_read("hmmat;") { + return Some(CharRef { + name: "hmmat;", + characters: "\u{2133}", + }); + } + + if first_char == 'p' && try_read("lanck;") { + return Some(CharRef { + name: "lanck;", + characters: "\u{210f}", + }); + } + + if first_char == 'p' && try_read("lankv;") { + return Some(CharRef { + name: "lankv;", + characters: "\u{210f}", + }); + } + + if first_char == 'p' && try_read("lusdo;") { + return Some(CharRef { + name: "lusdo;", + characters: "\u{2214}", + }); + } + + if first_char == 'p' && try_read("lusdu;") { + return Some(CharRef { + name: "lusdu;", + characters: "\u{2a25}", + }); + } + + if first_char == 'p' && try_read("lusmn;") { + return Some(CharRef { + name: "lusmn;", + characters: "\u{b1}", + }); + } + + if first_char == 'p' && try_read("receq;") { + return Some(CharRef { + name: "receq;", + characters: "\u{2aaf}", + }); + } + + if first_char == 'p' && try_read("rimes;") { + return Some(CharRef { + name: "rimes;", + characters: "\u{2119}", + }); + } + + if first_char == 'p' && try_read("rnsim;") { + return Some(CharRef { + name: "rnsim;", + characters: "\u{22e8}", + }); + } + + if first_char == 'p' && try_read("ropto;") { + return Some(CharRef { + name: "ropto;", + characters: "\u{221d}", + }); + } + + if first_char == 'p' && try_read("rurel;") { + return Some(CharRef { + name: "rurel;", + characters: "\u{22b0}", + }); + } + + if first_char == 'p' && try_read("uncsp;") { + return Some(CharRef { + name: "uncsp;", + characters: "\u{2008}", + }); + } + + if first_char == 'q' && try_read("prime;") { + return Some(CharRef { + name: "prime;", + characters: "\u{2057}", + }); + } + + if first_char == 'r' && try_read("Atail;") { + return Some(CharRef { + name: "Atail;", + characters: "\u{291c}", + }); + } + + if first_char == 'r' && try_read("acute;") { + return Some(CharRef { + name: "acute;", + characters: "\u{155}", + }); + } + + if first_char == 'r' && try_read("angle;") { + return Some(CharRef { + name: "angle;", + characters: "\u{27e9}", + }); + } + + if first_char == 'r' && try_read("arrap;") { + return Some(CharRef { + name: "arrap;", + characters: "\u{2975}", + }); + } + + if first_char == 'r' && try_read("arrfs;") { + return Some(CharRef { + name: "arrfs;", + characters: "\u{291e}", + }); + } + + if first_char == 'r' && try_read("arrhk;") { + return Some(CharRef { + name: "arrhk;", + characters: "\u{21aa}", + }); + } + + if first_char == 'r' && try_read("arrlp;") { + return Some(CharRef { + name: "arrlp;", + characters: "\u{21ac}", + }); + } + + if first_char == 'r' && try_read("arrpl;") { + return Some(CharRef { + name: "arrpl;", + characters: "\u{2945}", + }); + } + + if first_char == 'r' && try_read("arrtl;") { + return Some(CharRef { + name: "arrtl;", + characters: "\u{21a3}", + }); + } + + if first_char == 'r' && try_read("atail;") { + return Some(CharRef { + name: "atail;", + characters: "\u{291a}", + }); + } + + if first_char == 'r' && try_read("brace;") { + return Some(CharRef { + name: "brace;", + characters: "\u{7d}", + }); + } + + if first_char == 'r' && try_read("brack;") { + return Some(CharRef { + name: "brack;", + characters: "\u{5d}", + }); + } + + if first_char == 'r' && try_read("caron;") { + return Some(CharRef { + name: "caron;", + characters: "\u{159}", + }); + } + + if first_char == 'r' && try_read("cedil;") { + return Some(CharRef { + name: "cedil;", + characters: "\u{157}", + }); + } + + if first_char == 'r' && try_read("dquor;") { + return Some(CharRef { + name: "dquor;", + characters: "\u{201d}", + }); + } + + if first_char == 'r' && try_read("fisht;") { + return Some(CharRef { + name: "fisht;", + characters: "\u{297d}", + }); + } + + if first_char == 'r' && try_read("floor;") { + return Some(CharRef { + name: "floor;", + characters: "\u{230b}", + }); + } + + if first_char == 'r' && try_read("harul;") { + return Some(CharRef { + name: "harul;", + characters: "\u{296c}", + }); + } + + if first_char == 'r' && try_read("moust;") { + return Some(CharRef { + name: "moust;", + characters: "\u{23b1}", + }); + } + + if first_char == 'r' && try_read("oplus;") { + return Some(CharRef { + name: "oplus;", + characters: "\u{2a2e}", + }); + } + + if first_char == 'r' && try_read("pargt;") { + return Some(CharRef { + name: "pargt;", + characters: "\u{2994}", + }); + } + + if first_char == 'r' && try_read("saquo;") { + return Some(CharRef { + name: "saquo;", + characters: "\u{203a}", + }); + } + + if first_char == 'r' && try_read("squor;") { + return Some(CharRef { + name: "squor;", + characters: "\u{2019}", + }); + } + + if first_char == 'r' && try_read("three;") { + return Some(CharRef { + name: "three;", + characters: "\u{22cc}", + }); + } + + if first_char == 'r' && try_read("times;") { + return Some(CharRef { + name: "times;", + characters: "\u{22ca}", + }); + } + + if first_char == 's' && try_read("acute;") { + return Some(CharRef { + name: "acute;", + characters: "\u{15b}", + }); + } + + if first_char == 's' && try_read("caron;") { + return Some(CharRef { + name: "caron;", + characters: "\u{161}", + }); + } + + if first_char == 's' && try_read("cedil;") { + return Some(CharRef { + name: "cedil;", + characters: "\u{15f}", + }); + } + + if first_char == 's' && try_read("cnsim;") { + return Some(CharRef { + name: "cnsim;", + characters: "\u{22e9}", + }); + } + + if first_char == 's' && try_read("earhk;") { + return Some(CharRef { + name: "earhk;", + characters: "\u{2925}", + }); + } + + if first_char == 's' && try_read("eswar;") { + return Some(CharRef { + name: "eswar;", + characters: "\u{2929}", + }); + } + + if first_char == 's' && try_read("frown;") { + return Some(CharRef { + name: "frown;", + characters: "\u{2322}", + }); + } + + if first_char == 's' && try_read("hchcy;") { + return Some(CharRef { + name: "hchcy;", + characters: "\u{449}", + }); + } + + if first_char == 's' && try_read("igmaf;") { + return Some(CharRef { + name: "igmaf;", + characters: "\u{3c2}", + }); + } + + if first_char == 's' && try_read("igmav;") { + return Some(CharRef { + name: "igmav;", + characters: "\u{3c2}", + }); + } + + if first_char == 's' && try_read("imdot;") { + return Some(CharRef { + name: "imdot;", + characters: "\u{2a6a}", + }); + } + + if first_char == 's' && try_read("mashp;") { + return Some(CharRef { + name: "mashp;", + characters: "\u{2a33}", + }); + } + + if first_char == 's' && try_read("oftcy;") { + return Some(CharRef { + name: "oftcy;", + characters: "\u{44c}", + }); + } + + if first_char == 's' && try_read("olbar;") { + return Some(CharRef { + name: "olbar;", + characters: "\u{233f}", + }); + } + + if first_char == 's' && try_read("pades;") { + return Some(CharRef { + name: "pades;", + characters: "\u{2660}", + }); + } + + if first_char == 's' && try_read("qcaps;") { + return Some(CharRef { + name: "qcaps;", + characters: "\u{2293}\u{fe00}", + }); + } + + if first_char == 's' && try_read("qcups;") { + return Some(CharRef { + name: "qcups;", + characters: "\u{2294}\u{fe00}", + }); + } + + if first_char == 's' && try_read("qsube;") { + return Some(CharRef { + name: "qsube;", + characters: "\u{2291}", + }); + } + + if first_char == 's' && try_read("qsupe;") { + return Some(CharRef { + name: "qsupe;", + characters: "\u{2292}", + }); + } + + if first_char == 's' && try_read("quare;") { + return Some(CharRef { + name: "quare;", + characters: "\u{25a1}", + }); + } + + if first_char == 's' && try_read("quarf;") { + return Some(CharRef { + name: "quarf;", + characters: "\u{25aa}", + }); + } + + if first_char == 's' && try_read("setmn;") { + return Some(CharRef { + name: "setmn;", + characters: "\u{2216}", + }); + } + + if first_char == 's' && try_read("smile;") { + return Some(CharRef { + name: "smile;", + characters: "\u{2323}", + }); + } + + if first_char == 's' && try_read("starf;") { + return Some(CharRef { + name: "starf;", + characters: "\u{22c6}", + }); + } + + if first_char == 's' && try_read("ubdot;") { + return Some(CharRef { + name: "ubdot;", + characters: "\u{2abd}", + }); + } + + if first_char == 's' && try_read("ubset;") { + return Some(CharRef { + name: "ubset;", + characters: "\u{2282}", + }); + } + + if first_char == 's' && try_read("ubsim;") { + return Some(CharRef { + name: "ubsim;", + characters: "\u{2ac7}", + }); + } + + if first_char == 's' && try_read("ubsub;") { + return Some(CharRef { + name: "ubsub;", + characters: "\u{2ad5}", + }); + } + + if first_char == 's' && try_read("ubsup;") { + return Some(CharRef { + name: "ubsup;", + characters: "\u{2ad3}", + }); + } + + if first_char == 's' && try_read("ucceq;") { + return Some(CharRef { + name: "ucceq;", + characters: "\u{2ab0}", + }); + } + + if first_char == 's' && try_read("updot;") { + return Some(CharRef { + name: "updot;", + characters: "\u{2abe}", + }); + } + + if first_char == 's' && try_read("upset;") { + return Some(CharRef { + name: "upset;", + characters: "\u{2283}", + }); + } + + if first_char == 's' && try_read("upsim;") { + return Some(CharRef { + name: "upsim;", + characters: "\u{2ac8}", + }); + } + + if first_char == 's' && try_read("upsub;") { + return Some(CharRef { + name: "upsub;", + characters: "\u{2ad4}", + }); + } + + if first_char == 's' && try_read("upsup;") { + return Some(CharRef { + name: "upsup;", + characters: "\u{2ad6}", + }); + } + + if first_char == 's' && try_read("warhk;") { + return Some(CharRef { + name: "warhk;", + characters: "\u{2926}", + }); + } + + if first_char == 's' && try_read("wnwar;") { + return Some(CharRef { + name: "wnwar;", + characters: "\u{292a}", + }); + } + + if first_char == 't' && try_read("arget;") { + return Some(CharRef { + name: "arget;", + characters: "\u{2316}", + }); + } + + if first_char == 't' && try_read("caron;") { + return Some(CharRef { + name: "caron;", + characters: "\u{165}", + }); + } + + if first_char == 't' && try_read("cedil;") { + return Some(CharRef { + name: "cedil;", + characters: "\u{163}", + }); + } + + if first_char == 't' && try_read("elrec;") { + return Some(CharRef { + name: "elrec;", + characters: "\u{2315}", + }); + } + + if first_char == 't' && try_read("here4;") { + return Some(CharRef { + name: "here4;", + characters: "\u{2234}", + }); + } + + if first_char == 't' && try_read("hetav;") { + return Some(CharRef { + name: "hetav;", + characters: "\u{3d1}", + }); + } + + if first_char == 't' && try_read("hinsp;") { + return Some(CharRef { + name: "hinsp;", + characters: "\u{2009}", + }); + } + + if first_char == 't' && try_read("hksim;") { + return Some(CharRef { + name: "hksim;", + characters: "\u{223c}", + }); + } + + if first_char == 't' && try_read("imesb;") { + return Some(CharRef { + name: "imesb;", + characters: "\u{22a0}", + }); + } + + if first_char == 't' && try_read("imesd;") { + return Some(CharRef { + name: "imesd;", + characters: "\u{2a30}", + }); + } + + if first_char == 't' && try_read("opbot;") { + return Some(CharRef { + name: "opbot;", + characters: "\u{2336}", + }); + } + + if first_char == 't' && try_read("opcir;") { + return Some(CharRef { + name: "opcir;", + characters: "\u{2af1}", + }); + } + + if first_char == 't' && try_read("prime;") { + return Some(CharRef { + name: "prime;", + characters: "\u{2034}", + }); + } + + if first_char == 't' && try_read("ridot;") { + return Some(CharRef { + name: "ridot;", + characters: "\u{25ec}", + }); + } + + if first_char == 't' && try_read("strok;") { + return Some(CharRef { + name: "strok;", + characters: "\u{167}", + }); + } + + if first_char == 'u' && try_read("acute;") { + return Some(CharRef { + name: "acute;", + characters: "\u{fa}", + }); + } + + if first_char == 'u' && try_read("breve;") { + return Some(CharRef { + name: "breve;", + characters: "\u{16d}", + }); + } + + if first_char == 'u' && try_read("dblac;") { + return Some(CharRef { + name: "dblac;", + characters: "\u{171}", + }); + } + + if first_char == 'u' && try_read("fisht;") { + return Some(CharRef { + name: "fisht;", + characters: "\u{297e}", + }); + } + + if first_char == 'u' && try_read("grave;") { + return Some(CharRef { + name: "grave;", + characters: "\u{f9}", + }); + } + + if first_char == 'u' && try_read("lcorn;") { + return Some(CharRef { + name: "lcorn;", + characters: "\u{231c}", + }); + } + + if first_char == 'u' && try_read("lcrop;") { + return Some(CharRef { + name: "lcrop;", + characters: "\u{230f}", + }); + } + + if first_char == 'u' && try_read("rcorn;") { + return Some(CharRef { + name: "rcorn;", + characters: "\u{231d}", + }); + } + + if first_char == 'u' && try_read("rcrop;") { + return Some(CharRef { + name: "rcrop;", + characters: "\u{230e}", + }); + } + + if first_char == 'u' && try_read("tilde;") { + return Some(CharRef { + name: "tilde;", + characters: "\u{169}", + }); + } + + if first_char == 'v' && try_read("angrt;") { + return Some(CharRef { + name: "angrt;", + characters: "\u{299c}", + }); + } + + if first_char == 'v' && try_read("arphi;") { + return Some(CharRef { + name: "arphi;", + characters: "\u{3d5}", + }); + } + + if first_char == 'v' && try_read("arrho;") { + return Some(CharRef { + name: "arrho;", + characters: "\u{3f1}", + }); + } + + if first_char == 'v' && try_read("eebar;") { + return Some(CharRef { + name: "eebar;", + characters: "\u{22bb}", + }); + } + + if first_char == 'v' && try_read("ellip;") { + return Some(CharRef { + name: "ellip;", + characters: "\u{22ee}", + }); + } + + if first_char == 'v' && try_read("erbar;") { + return Some(CharRef { + name: "erbar;", + characters: "\u{7c}", + }); + } + + if first_char == 'v' && try_read("subnE;") { + return Some(CharRef { + name: "subnE;", + characters: "\u{2acb}\u{fe00}", + }); + } + + if first_char == 'v' && try_read("subne;") { + return Some(CharRef { + name: "subne;", + characters: "\u{228a}\u{fe00}", + }); + } + + if first_char == 'v' && try_read("supnE;") { + return Some(CharRef { + name: "supnE;", + characters: "\u{2acc}\u{fe00}", + }); + } + + if first_char == 'v' && try_read("supne;") { + return Some(CharRef { + name: "supne;", + characters: "\u{228b}\u{fe00}", + }); + } + + if first_char == 'w' && try_read("edbar;") { + return Some(CharRef { + name: "edbar;", + characters: "\u{2a5f}", + }); + } + + if first_char == 'w' && try_read("edgeq;") { + return Some(CharRef { + name: "edgeq;", + characters: "\u{2259}", + }); + } + + if first_char == 'w' && try_read("eierp;") { + return Some(CharRef { + name: "eierp;", + characters: "\u{2118}", + }); + } + + if first_char == 'w' && try_read("reath;") { + return Some(CharRef { + name: "reath;", + characters: "\u{2240}", + }); + } + + if first_char == 'x' && try_read("oplus;") { + return Some(CharRef { + name: "oplus;", + characters: "\u{2a01}", + }); + } + + if first_char == 'x' && try_read("otime;") { + return Some(CharRef { + name: "otime;", + characters: "\u{2a02}", + }); + } + + if first_char == 'x' && try_read("sqcup;") { + return Some(CharRef { + name: "sqcup;", + characters: "\u{2a06}", + }); + } + + if first_char == 'x' && try_read("uplus;") { + return Some(CharRef { + name: "uplus;", + characters: "\u{2a04}", + }); + } + + if first_char == 'x' && try_read("wedge;") { + return Some(CharRef { + name: "wedge;", + characters: "\u{22c0}", + }); + } + + if first_char == 'y' && try_read("acute;") { + return Some(CharRef { + name: "acute;", + characters: "\u{fd}", + }); + } + + if first_char == 'z' && try_read("acute;") { + return Some(CharRef { + name: "acute;", + characters: "\u{17a}", + }); + } + + if first_char == 'z' && try_read("caron;") { + return Some(CharRef { + name: "caron;", + characters: "\u{17e}", + }); + } + + if first_char == 'z' && try_read("eetrf;") { + return Some(CharRef { + name: "eetrf;", + characters: "\u{2128}", + }); + } + + if first_char == 'A' && try_read("Elig;") { + return Some(CharRef { + name: "Elig;", + characters: "\u{c6}", + }); + } + + if first_char == 'A' && try_read("acute") { + return Some(CharRef { + name: "acute", + characters: "\u{c1}", + }); + } + + if first_char == 'A' && try_read("circ;") { + return Some(CharRef { + name: "circ;", + characters: "\u{c2}", + }); + } + + if first_char == 'A' && try_read("grave") { + return Some(CharRef { + name: "grave", + characters: "\u{c0}", + }); + } + + if first_char == 'A' && try_read("lpha;") { + return Some(CharRef { + name: "lpha;", + characters: "\u{391}", + }); + } + + if first_char == 'A' && try_read("macr;") { + return Some(CharRef { + name: "macr;", + characters: "\u{100}", + }); + } + + if first_char == 'A' && try_read("ogon;") { + return Some(CharRef { + name: "ogon;", + characters: "\u{104}", + }); + } + + if first_char == 'A' && try_read("ring;") { + return Some(CharRef { + name: "ring;", + characters: "\u{c5}", + }); + } + + if first_char == 'A' && try_read("tilde") { + return Some(CharRef { + name: "tilde", + characters: "\u{c3}", + }); + } + + if first_char == 'B' && try_read("reve;") { + return Some(CharRef { + name: "reve;", + characters: "\u{2d8}", + }); + } + + if first_char == 'C' && try_read("cedil") { + return Some(CharRef { + name: "cedil", + characters: "\u{c7}", + }); + } + + if first_char == 'C' && try_read("circ;") { + return Some(CharRef { + name: "circ;", + characters: "\u{108}", + }); + } + + if first_char == 'C' && try_read("olon;") { + return Some(CharRef { + name: "olon;", + characters: "\u{2237}", + }); + } + + if first_char == 'C' && try_read("ross;") { + return Some(CharRef { + name: "ross;", + characters: "\u{2a2f}", + }); + } + + if first_char == 'D' && try_read("ashv;") { + return Some(CharRef { + name: "ashv;", + characters: "\u{2ae4}", + }); + } + + if first_char == 'D' && try_read("elta;") { + return Some(CharRef { + name: "elta;", + characters: "\u{394}", + }); + } + + if first_char == 'E' && try_read("acute") { + return Some(CharRef { + name: "acute", + characters: "\u{c9}", + }); + } + + if first_char == 'E' && try_read("circ;") { + return Some(CharRef { + name: "circ;", + characters: "\u{ca}", + }); + } + + if first_char == 'E' && try_read("grave") { + return Some(CharRef { + name: "grave", + characters: "\u{c8}", + }); + } + + if first_char == 'E' && try_read("macr;") { + return Some(CharRef { + name: "macr;", + characters: "\u{112}", + }); + } + + if first_char == 'E' && try_read("ogon;") { + return Some(CharRef { + name: "ogon;", + characters: "\u{118}", + }); + } + + if first_char == 'E' && try_read("qual;") { + return Some(CharRef { + name: "qual;", + characters: "\u{2a75}", + }); + } + + if first_char == 'G' && try_read("amma;") { + return Some(CharRef { + name: "amma;", + characters: "\u{393}", + }); + } + + if first_char == 'G' && try_read("circ;") { + return Some(CharRef { + name: "circ;", + characters: "\u{11c}", + }); + } + + if first_char == 'H' && try_read("acek;") { + return Some(CharRef { + name: "acek;", + characters: "\u{2c7}", + }); + } + + if first_char == 'H' && try_read("circ;") { + return Some(CharRef { + name: "circ;", + characters: "\u{124}", + }); + } + + if first_char == 'I' && try_read("Jlig;") { + return Some(CharRef { + name: "Jlig;", + characters: "\u{132}", + }); + } + + if first_char == 'I' && try_read("acute") { + return Some(CharRef { + name: "acute", + characters: "\u{cd}", + }); + } + + if first_char == 'I' && try_read("circ;") { + return Some(CharRef { + name: "circ;", + characters: "\u{ce}", + }); + } + + if first_char == 'I' && try_read("grave") { + return Some(CharRef { + name: "grave", + characters: "\u{cc}", + }); + } + + if first_char == 'I' && try_read("macr;") { + return Some(CharRef { + name: "macr;", + characters: "\u{12a}", + }); + } + + if first_char == 'I' && try_read("ogon;") { + return Some(CharRef { + name: "ogon;", + characters: "\u{12e}", + }); + } + + if first_char == 'I' && try_read("ukcy;") { + return Some(CharRef { + name: "ukcy;", + characters: "\u{406}", + }); + } + + if first_char == 'J' && try_read("circ;") { + return Some(CharRef { + name: "circ;", + characters: "\u{134}", + }); + } + + if first_char == 'J' && try_read("ukcy;") { + return Some(CharRef { + name: "ukcy;", + characters: "\u{404}", + }); + } + + if first_char == 'K' && try_read("appa;") { + return Some(CharRef { + name: "appa;", + characters: "\u{39a}", + }); + } + + if first_char == 'N' && try_read("tilde") { + return Some(CharRef { + name: "tilde", + characters: "\u{d1}", + }); + } + + if first_char == 'O' && try_read("Elig;") { + return Some(CharRef { + name: "Elig;", + characters: "\u{152}", + }); + } + + if first_char == 'O' && try_read("acute") { + return Some(CharRef { + name: "acute", + characters: "\u{d3}", + }); + } + + if first_char == 'O' && try_read("circ;") { + return Some(CharRef { + name: "circ;", + characters: "\u{d4}", + }); + } + + if first_char == 'O' && try_read("grave") { + return Some(CharRef { + name: "grave", + characters: "\u{d2}", + }); + } + + if first_char == 'O' && try_read("macr;") { + return Some(CharRef { + name: "macr;", + characters: "\u{14c}", + }); + } + + if first_char == 'O' && try_read("mega;") { + return Some(CharRef { + name: "mega;", + characters: "\u{3a9}", + }); + } + + if first_char == 'O' && try_read("slash") { + return Some(CharRef { + name: "slash", + characters: "\u{d8}", + }); + } + + if first_char == 'O' && try_read("tilde") { + return Some(CharRef { + name: "tilde", + characters: "\u{d5}", + }); + } + + if first_char == 'P' && try_read("rime;") { + return Some(CharRef { + name: "rime;", + characters: "\u{2033}", + }); + } + + if first_char == 'R' && try_read("Barr;") { + return Some(CharRef { + name: "Barr;", + characters: "\u{2910}", + }); + } + + if first_char == 'S' && try_read("circ;") { + return Some(CharRef { + name: "circ;", + characters: "\u{15c}", + }); + } + + if first_char == 'S' && try_read("igma;") { + return Some(CharRef { + name: "igma;", + characters: "\u{3a3}", + }); + } + + if first_char == 'T' && try_read("HORN;") { + return Some(CharRef { + name: "HORN;", + characters: "\u{de}", + }); + } + + if first_char == 'T' && try_read("RADE;") { + return Some(CharRef { + name: "RADE;", + characters: "\u{2122}", + }); + } + + if first_char == 'T' && try_read("SHcy;") { + return Some(CharRef { + name: "SHcy;", + characters: "\u{40b}", + }); + } + + if first_char == 'T' && try_read("heta;") { + return Some(CharRef { + name: "heta;", + characters: "\u{398}", + }); + } + + if first_char == 'T' && try_read("ilde;") { + return Some(CharRef { + name: "ilde;", + characters: "\u{223c}", + }); + } + + if first_char == 'U' && try_read("acute") { + return Some(CharRef { + name: "acute", + characters: "\u{da}", + }); + } + + if first_char == 'U' && try_read("brcy;") { + return Some(CharRef { + name: "brcy;", + characters: "\u{40e}", + }); + } + + if first_char == 'U' && try_read("circ;") { + return Some(CharRef { + name: "circ;", + characters: "\u{db}", + }); + } + + if first_char == 'U' && try_read("grave") { + return Some(CharRef { + name: "grave", + characters: "\u{d9}", + }); + } + + if first_char == 'U' && try_read("macr;") { + return Some(CharRef { + name: "macr;", + characters: "\u{16a}", + }); + } + + if first_char == 'U' && try_read("nion;") { + return Some(CharRef { + name: "nion;", + characters: "\u{22c3}", + }); + } + + if first_char == 'U' && try_read("ogon;") { + return Some(CharRef { + name: "ogon;", + characters: "\u{172}", + }); + } + + if first_char == 'U' && try_read("pTee;") { + return Some(CharRef { + name: "pTee;", + characters: "\u{22a5}", + }); + } + + if first_char == 'U' && try_read("ring;") { + return Some(CharRef { + name: "ring;", + characters: "\u{16e}", + }); + } + + if first_char == 'V' && try_read("Dash;") { + return Some(CharRef { + name: "Dash;", + characters: "\u{22ab}", + }); + } + + if first_char == 'V' && try_read("dash;") { + return Some(CharRef { + name: "dash;", + characters: "\u{22a9}", + }); + } + + if first_char == 'W' && try_read("circ;") { + return Some(CharRef { + name: "circ;", + characters: "\u{174}", + }); + } + + if first_char == 'W' && try_read("edge;") { + return Some(CharRef { + name: "edge;", + characters: "\u{22c0}", + }); + } + + if first_char == 'Y' && try_read("acute") { + return Some(CharRef { + name: "acute", + characters: "\u{dd}", + }); + } + + if first_char == 'Y' && try_read("circ;") { + return Some(CharRef { + name: "circ;", + characters: "\u{176}", + }); + } + + if first_char == 'a' && try_read("acute") { + return Some(CharRef { + name: "acute", + characters: "\u{e1}", + }); + } + + if first_char == 'a' && try_read("circ;") { + return Some(CharRef { + name: "circ;", + characters: "\u{e2}", + }); + } + + if first_char == 'a' && try_read("cute;") { + return Some(CharRef { + name: "cute;", + characters: "\u{b4}", + }); + } + + if first_char == 'a' && try_read("elig;") { + return Some(CharRef { + name: "elig;", + characters: "\u{e6}", + }); + } + + if first_char == 'a' && try_read("grave") { + return Some(CharRef { + name: "grave", + characters: "\u{e0}", + }); + } + + if first_char == 'a' && try_read("leph;") { + return Some(CharRef { + name: "leph;", + characters: "\u{2135}", + }); + } + + if first_char == 'a' && try_read("lpha;") { + return Some(CharRef { + name: "lpha;", + characters: "\u{3b1}", + }); + } + + if first_char == 'a' && try_read("macr;") { + return Some(CharRef { + name: "macr;", + characters: "\u{101}", + }); + } + + if first_char == 'a' && try_read("malg;") { + return Some(CharRef { + name: "malg;", + characters: "\u{2a3f}", + }); + } + + if first_char == 'a' && try_read("ngle;") { + return Some(CharRef { + name: "ngle;", + characters: "\u{2220}", + }); + } + + if first_char == 'a' && try_read("ngrt;") { + return Some(CharRef { + name: "ngrt;", + characters: "\u{221f}", + }); + } + + if first_char == 'a' && try_read("ngst;") { + return Some(CharRef { + name: "ngst;", + characters: "\u{c5}", + }); + } + + if first_char == 'a' && try_read("ogon;") { + return Some(CharRef { + name: "ogon;", + characters: "\u{105}", + }); + } + + if first_char == 'a' && try_read("ring;") { + return Some(CharRef { + name: "ring;", + characters: "\u{e5}", + }); + } + + if first_char == 'a' && try_read("symp;") { + return Some(CharRef { + name: "symp;", + characters: "\u{2248}", + }); + } + + if first_char == 'a' && try_read("tilde") { + return Some(CharRef { + name: "tilde", + characters: "\u{e3}", + }); + } + + if first_char == 'a' && try_read("wint;") { + return Some(CharRef { + name: "wint;", + characters: "\u{2a11}", + }); + } + + if first_char == 'b' && try_read("cong;") { + return Some(CharRef { + name: "cong;", + characters: "\u{224c}", + }); + } + + if first_char == 'b' && try_read("dquo;") { + return Some(CharRef { + name: "dquo;", + characters: "\u{201e}", + }); + } + + if first_char == 'b' && try_read("epsi;") { + return Some(CharRef { + name: "epsi;", + characters: "\u{3f6}", + }); + } + + if first_char == 'b' && try_read("lank;") { + return Some(CharRef { + name: "lank;", + characters: "\u{2423}", + }); + } + + if first_char == 'b' && try_read("lk12;") { + return Some(CharRef { + name: "lk12;", + characters: "\u{2592}", + }); + } + + if first_char == 'b' && try_read("lk14;") { + return Some(CharRef { + name: "lk14;", + characters: "\u{2591}", + }); + } + + if first_char == 'b' && try_read("lk34;") { + return Some(CharRef { + name: "lk34;", + characters: "\u{2593}", + }); + } + + if first_char == 'b' && try_read("lock;") { + return Some(CharRef { + name: "lock;", + characters: "\u{2588}", + }); + } + + if first_char == 'b' && try_read("oxDL;") { + return Some(CharRef { + name: "oxDL;", + characters: "\u{2557}", + }); + } + + if first_char == 'b' && try_read("oxDR;") { + return Some(CharRef { + name: "oxDR;", + characters: "\u{2554}", + }); + } + + if first_char == 'b' && try_read("oxDl;") { + return Some(CharRef { + name: "oxDl;", + characters: "\u{2556}", + }); + } + + if first_char == 'b' && try_read("oxDr;") { + return Some(CharRef { + name: "oxDr;", + characters: "\u{2553}", + }); + } + + if first_char == 'b' && try_read("oxHD;") { + return Some(CharRef { + name: "oxHD;", + characters: "\u{2566}", + }); + } + + if first_char == 'b' && try_read("oxHU;") { + return Some(CharRef { + name: "oxHU;", + characters: "\u{2569}", + }); + } + + if first_char == 'b' && try_read("oxHd;") { + return Some(CharRef { + name: "oxHd;", + characters: "\u{2564}", + }); + } + + if first_char == 'b' && try_read("oxHu;") { + return Some(CharRef { + name: "oxHu;", + characters: "\u{2567}", + }); + } + + if first_char == 'b' && try_read("oxUL;") { + return Some(CharRef { + name: "oxUL;", + characters: "\u{255d}", + }); + } + + if first_char == 'b' && try_read("oxUR;") { + return Some(CharRef { + name: "oxUR;", + characters: "\u{255a}", + }); + } + + if first_char == 'b' && try_read("oxUl;") { + return Some(CharRef { + name: "oxUl;", + characters: "\u{255c}", + }); + } + + if first_char == 'b' && try_read("oxUr;") { + return Some(CharRef { + name: "oxUr;", + characters: "\u{2559}", + }); + } + + if first_char == 'b' && try_read("oxVH;") { + return Some(CharRef { + name: "oxVH;", + characters: "\u{256c}", + }); + } + + if first_char == 'b' && try_read("oxVL;") { + return Some(CharRef { + name: "oxVL;", + characters: "\u{2563}", + }); + } + + if first_char == 'b' && try_read("oxVR;") { + return Some(CharRef { + name: "oxVR;", + characters: "\u{2560}", + }); + } + + if first_char == 'b' && try_read("oxVh;") { + return Some(CharRef { + name: "oxVh;", + characters: "\u{256b}", + }); + } + + if first_char == 'b' && try_read("oxVl;") { + return Some(CharRef { + name: "oxVl;", + characters: "\u{2562}", + }); + } + + if first_char == 'b' && try_read("oxVr;") { + return Some(CharRef { + name: "oxVr;", + characters: "\u{255f}", + }); + } + + if first_char == 'b' && try_read("oxdL;") { + return Some(CharRef { + name: "oxdL;", + characters: "\u{2555}", + }); + } + + if first_char == 'b' && try_read("oxdR;") { + return Some(CharRef { + name: "oxdR;", + characters: "\u{2552}", + }); + } + + if first_char == 'b' && try_read("oxdl;") { + return Some(CharRef { + name: "oxdl;", + characters: "\u{2510}", + }); + } + + if first_char == 'b' && try_read("oxdr;") { + return Some(CharRef { + name: "oxdr;", + characters: "\u{250c}", + }); + } + + if first_char == 'b' && try_read("oxhD;") { + return Some(CharRef { + name: "oxhD;", + characters: "\u{2565}", + }); + } + + if first_char == 'b' && try_read("oxhU;") { + return Some(CharRef { + name: "oxhU;", + characters: "\u{2568}", + }); + } + + if first_char == 'b' && try_read("oxhd;") { + return Some(CharRef { + name: "oxhd;", + characters: "\u{252c}", + }); + } + + if first_char == 'b' && try_read("oxhu;") { + return Some(CharRef { + name: "oxhu;", + characters: "\u{2534}", + }); + } + + if first_char == 'b' && try_read("oxuL;") { + return Some(CharRef { + name: "oxuL;", + characters: "\u{255b}", + }); + } + + if first_char == 'b' && try_read("oxuR;") { + return Some(CharRef { + name: "oxuR;", + characters: "\u{2558}", + }); + } + + if first_char == 'b' && try_read("oxul;") { + return Some(CharRef { + name: "oxul;", + characters: "\u{2518}", + }); + } + + if first_char == 'b' && try_read("oxur;") { + return Some(CharRef { + name: "oxur;", + characters: "\u{2514}", + }); + } + + if first_char == 'b' && try_read("oxvH;") { + return Some(CharRef { + name: "oxvH;", + characters: "\u{256a}", + }); + } + + if first_char == 'b' && try_read("oxvL;") { + return Some(CharRef { + name: "oxvL;", + characters: "\u{2561}", + }); + } + + if first_char == 'b' && try_read("oxvR;") { + return Some(CharRef { + name: "oxvR;", + characters: "\u{255e}", + }); + } + + if first_char == 'b' && try_read("oxvh;") { + return Some(CharRef { + name: "oxvh;", + characters: "\u{253c}", + }); + } + + if first_char == 'b' && try_read("oxvl;") { + return Some(CharRef { + name: "oxvl;", + characters: "\u{2524}", + }); + } + + if first_char == 'b' && try_read("oxvr;") { + return Some(CharRef { + name: "oxvr;", + characters: "\u{251c}", + }); + } + + if first_char == 'b' && try_read("reve;") { + return Some(CharRef { + name: "reve;", + characters: "\u{2d8}", + }); + } + + if first_char == 'b' && try_read("rvbar") { + return Some(CharRef { + name: "rvbar", + characters: "\u{a6}", + }); + } + + if first_char == 'b' && try_read("semi;") { + return Some(CharRef { + name: "semi;", + characters: "\u{204f}", + }); + } + + if first_char == 'b' && try_read("sime;") { + return Some(CharRef { + name: "sime;", + characters: "\u{22cd}", + }); + } + + if first_char == 'b' && try_read("solb;") { + return Some(CharRef { + name: "solb;", + characters: "\u{29c5}", + }); + } + + if first_char == 'b' && try_read("umpE;") { + return Some(CharRef { + name: "umpE;", + characters: "\u{2aae}", + }); + } + + if first_char == 'b' && try_read("umpe;") { + return Some(CharRef { + name: "umpe;", + characters: "\u{224f}", + }); + } + + if first_char == 'c' && try_read("aret;") { + return Some(CharRef { + name: "aret;", + characters: "\u{2041}", + }); + } + + if first_char == 'c' && try_read("aron;") { + return Some(CharRef { + name: "aron;", + characters: "\u{2c7}", + }); + } + + if first_char == 'c' && try_read("caps;") { + return Some(CharRef { + name: "caps;", + characters: "\u{2a4d}", + }); + } + + if first_char == 'c' && try_read("cedil") { + return Some(CharRef { + name: "cedil", + characters: "\u{e7}", + }); + } + + if first_char == 'c' && try_read("circ;") { + return Some(CharRef { + name: "circ;", + characters: "\u{109}", + }); + } + + if first_char == 'c' && try_read("cups;") { + return Some(CharRef { + name: "cups;", + characters: "\u{2a4c}", + }); + } + + if first_char == 'c' && try_read("edil;") { + return Some(CharRef { + name: "edil;", + characters: "\u{b8}", + }); + } + + if first_char == 'c' && try_read("heck;") { + return Some(CharRef { + name: "heck;", + characters: "\u{2713}", + }); + } + + if first_char == 'c' && try_read("lubs;") { + return Some(CharRef { + name: "lubs;", + characters: "\u{2663}", + }); + } + + if first_char == 'c' && try_read("olon;") { + return Some(CharRef { + name: "olon;", + characters: "\u{3a}", + }); + } + + if first_char == 'c' && try_read("omma;") { + return Some(CharRef { + name: "omma;", + characters: "\u{2c}", + }); + } + + if first_char == 'c' && try_read("rarr;") { + return Some(CharRef { + name: "rarr;", + characters: "\u{21b5}", + }); + } + + if first_char == 'c' && try_read("ross;") { + return Some(CharRef { + name: "ross;", + characters: "\u{2717}", + }); + } + + if first_char == 'c' && try_read("sube;") { + return Some(CharRef { + name: "sube;", + characters: "\u{2ad1}", + }); + } + + if first_char == 'c' && try_read("supe;") { + return Some(CharRef { + name: "supe;", + characters: "\u{2ad2}", + }); + } + + if first_char == 'c' && try_read("tdot;") { + return Some(CharRef { + name: "tdot;", + characters: "\u{22ef}", + }); + } + + if first_char == 'c' && try_read("uepr;") { + return Some(CharRef { + name: "uepr;", + characters: "\u{22de}", + }); + } + + if first_char == 'c' && try_read("uesc;") { + return Some(CharRef { + name: "uesc;", + characters: "\u{22df}", + }); + } + + if first_char == 'c' && try_read("upor;") { + return Some(CharRef { + name: "upor;", + characters: "\u{2a45}", + }); + } + + if first_char == 'c' && try_read("urren") { + return Some(CharRef { + name: "urren", + characters: "\u{a4}", + }); + } + + if first_char == 'c' && try_read("uvee;") { + return Some(CharRef { + name: "uvee;", + characters: "\u{22ce}", + }); + } + + if first_char == 'c' && try_read("uwed;") { + return Some(CharRef { + name: "uwed;", + characters: "\u{22cf}", + }); + } + + if first_char == 'c' && try_read("wint;") { + return Some(CharRef { + name: "wint;", + characters: "\u{2231}", + }); + } + + if first_char == 'd' && try_read("ashv;") { + return Some(CharRef { + name: "ashv;", + characters: "\u{22a3}", + }); + } + + if first_char == 'd' && try_read("blac;") { + return Some(CharRef { + name: "blac;", + characters: "\u{2dd}", + }); + } + + if first_char == 'd' && try_read("darr;") { + return Some(CharRef { + name: "darr;", + characters: "\u{21ca}", + }); + } + + if first_char == 'd' && try_read("elta;") { + return Some(CharRef { + name: "elta;", + characters: "\u{3b4}", + }); + } + + if first_char == 'd' && try_read("harl;") { + return Some(CharRef { + name: "harl;", + characters: "\u{21c3}", + }); + } + + if first_char == 'd' && try_read("harr;") { + return Some(CharRef { + name: "harr;", + characters: "\u{21c2}", + }); + } + + if first_char == 'd' && try_read("iams;") { + return Some(CharRef { + name: "iams;", + characters: "\u{2666}", + }); + } + + if first_char == 'd' && try_read("isin;") { + return Some(CharRef { + name: "isin;", + characters: "\u{22f2}", + }); + } + + if first_char == 'd' && try_read("ivide") { + return Some(CharRef { + name: "ivide", + characters: "\u{f7}", + }); + } + + if first_char == 'd' && try_read("oteq;") { + return Some(CharRef { + name: "oteq;", + characters: "\u{2250}", + }); + } + + if first_char == 'd' && try_read("tdot;") { + return Some(CharRef { + name: "tdot;", + characters: "\u{22f1}", + }); + } + + if first_char == 'd' && try_read("trif;") { + return Some(CharRef { + name: "trif;", + characters: "\u{25be}", + }); + } + + if first_char == 'd' && try_read("uarr;") { + return Some(CharRef { + name: "uarr;", + characters: "\u{21f5}", + }); + } + + if first_char == 'd' && try_read("uhar;") { + return Some(CharRef { + name: "uhar;", + characters: "\u{296f}", + }); + } + + if first_char == 'e' && try_read("DDot;") { + return Some(CharRef { + name: "DDot;", + characters: "\u{2a77}", + }); + } + + if first_char == 'e' && try_read("acute") { + return Some(CharRef { + name: "acute", + characters: "\u{e9}", + }); + } + + if first_char == 'e' && try_read("circ;") { + return Some(CharRef { + name: "circ;", + characters: "\u{ea}", + }); + } + + if first_char == 'e' && try_read("fDot;") { + return Some(CharRef { + name: "fDot;", + characters: "\u{2252}", + }); + } + + if first_char == 'e' && try_read("grave") { + return Some(CharRef { + name: "grave", + characters: "\u{e8}", + }); + } + + if first_char == 'e' && try_read("macr;") { + return Some(CharRef { + name: "macr;", + characters: "\u{113}", + }); + } + + if first_char == 'e' && try_read("mpty;") { + return Some(CharRef { + name: "mpty;", + characters: "\u{2205}", + }); + } + + if first_char == 'e' && try_read("ogon;") { + return Some(CharRef { + name: "ogon;", + characters: "\u{119}", + }); + } + + if first_char == 'e' && try_read("plus;") { + return Some(CharRef { + name: "plus;", + characters: "\u{2a71}", + }); + } + + if first_char == 'e' && try_read("psiv;") { + return Some(CharRef { + name: "psiv;", + characters: "\u{3f5}", + }); + } + + if first_char == 'e' && try_read("qsim;") { + return Some(CharRef { + name: "qsim;", + characters: "\u{2242}", + }); + } + + if first_char == 'e' && try_read("quiv;") { + return Some(CharRef { + name: "quiv;", + characters: "\u{2261}", + }); + } + + if first_char == 'e' && try_read("rDot;") { + return Some(CharRef { + name: "rDot;", + characters: "\u{2253}", + }); + } + + if first_char == 'e' && try_read("rarr;") { + return Some(CharRef { + name: "rarr;", + characters: "\u{2971}", + }); + } + + if first_char == 'e' && try_read("sdot;") { + return Some(CharRef { + name: "sdot;", + characters: "\u{2250}", + }); + } + + if first_char == 'e' && try_read("xist;") { + return Some(CharRef { + name: "xist;", + characters: "\u{2203}", + }); + } + + if first_char == 'f' && try_read("flig;") { + return Some(CharRef { + name: "flig;", + characters: "\u{fb00}", + }); + } + + if first_char == 'f' && try_read("ilig;") { + return Some(CharRef { + name: "ilig;", + characters: "\u{fb01}", + }); + } + + if first_char == 'f' && try_read("jlig;") { + return Some(CharRef { + name: "jlig;", + characters: "\u{66}\u{6a}", + }); + } + + if first_char == 'f' && try_read("llig;") { + return Some(CharRef { + name: "llig;", + characters: "\u{fb02}", + }); + } + + if first_char == 'f' && try_read("ltns;") { + return Some(CharRef { + name: "ltns;", + characters: "\u{25b1}", + }); + } + + if first_char == 'f' && try_read("orkv;") { + return Some(CharRef { + name: "orkv;", + characters: "\u{2ad9}", + }); + } + + if first_char == 'f' && try_read("rac12") { + return Some(CharRef { + name: "rac12", + characters: "\u{bd}", + }); + } + + if first_char == 'f' && try_read("rac14") { + return Some(CharRef { + name: "rac14", + characters: "\u{bc}", + }); + } + + if first_char == 'f' && try_read("rac34") { + return Some(CharRef { + name: "rac34", + characters: "\u{be}", + }); + } + + if first_char == 'f' && try_read("rasl;") { + return Some(CharRef { + name: "rasl;", + characters: "\u{2044}", + }); + } + + if first_char == 'f' && try_read("rown;") { + return Some(CharRef { + name: "rown;", + characters: "\u{2322}", + }); + } + + if first_char == 'g' && try_read("amma;") { + return Some(CharRef { + name: "amma;", + characters: "\u{3b3}", + }); + } + + if first_char == 'g' && try_read("circ;") { + return Some(CharRef { + name: "circ;", + characters: "\u{11d}", + }); + } + + if first_char == 'g' && try_read("escc;") { + return Some(CharRef { + name: "escc;", + characters: "\u{2aa9}", + }); + } + + if first_char == 'g' && try_read("imel;") { + return Some(CharRef { + name: "imel;", + characters: "\u{2137}", + }); + } + + if first_char == 'g' && try_read("neqq;") { + return Some(CharRef { + name: "neqq;", + characters: "\u{2269}", + }); + } + + if first_char == 'g' && try_read("nsim;") { + return Some(CharRef { + name: "nsim;", + characters: "\u{22e7}", + }); + } + + if first_char == 'g' && try_read("rave;") { + return Some(CharRef { + name: "rave;", + characters: "\u{60}", + }); + } + + if first_char == 'g' && try_read("sime;") { + return Some(CharRef { + name: "sime;", + characters: "\u{2a8e}", + }); + } + + if first_char == 'g' && try_read("siml;") { + return Some(CharRef { + name: "siml;", + characters: "\u{2a90}", + }); + } + + if first_char == 'g' && try_read("tcir;") { + return Some(CharRef { + name: "tcir;", + characters: "\u{2a7a}", + }); + } + + if first_char == 'g' && try_read("tdot;") { + return Some(CharRef { + name: "tdot;", + characters: "\u{22d7}", + }); + } + + if first_char == 'h' && try_read("arrw;") { + return Some(CharRef { + name: "arrw;", + characters: "\u{21ad}", + }); + } + + if first_char == 'h' && try_read("circ;") { + return Some(CharRef { + name: "circ;", + characters: "\u{125}", + }); + } + + if first_char == 'h' && try_read("oarr;") { + return Some(CharRef { + name: "oarr;", + characters: "\u{21ff}", + }); + } + + if first_char == 'i' && try_read("acute") { + return Some(CharRef { + name: "acute", + characters: "\u{ed}", + }); + } + + if first_char == 'i' && try_read("circ;") { + return Some(CharRef { + name: "circ;", + characters: "\u{ee}", + }); + } + + if first_char == 'i' && try_read("excl;") { + return Some(CharRef { + name: "excl;", + characters: "\u{a1}", + }); + } + + if first_char == 'i' && try_read("grave") { + return Some(CharRef { + name: "grave", + characters: "\u{ec}", + }); + } + + if first_char == 'i' && try_read("iint;") { + return Some(CharRef { + name: "iint;", + characters: "\u{222d}", + }); + } + + if first_char == 'i' && try_read("iota;") { + return Some(CharRef { + name: "iota;", + characters: "\u{2129}", + }); + } + + if first_char == 'i' && try_read("jlig;") { + return Some(CharRef { + name: "jlig;", + characters: "\u{133}", + }); + } + + if first_char == 'i' && try_read("macr;") { + return Some(CharRef { + name: "macr;", + characters: "\u{12b}", + }); + } + + if first_char == 'i' && try_read("mage;") { + return Some(CharRef { + name: "mage;", + characters: "\u{2111}", + }); + } + + if first_char == 'i' && try_read("math;") { + return Some(CharRef { + name: "math;", + characters: "\u{131}", + }); + } + + if first_char == 'i' && try_read("mped;") { + return Some(CharRef { + name: "mped;", + characters: "\u{1b5}", + }); + } + + if first_char == 'i' && try_read("nfin;") { + return Some(CharRef { + name: "nfin;", + characters: "\u{221e}", + }); + } + + if first_char == 'i' && try_read("ogon;") { + return Some(CharRef { + name: "ogon;", + characters: "\u{12f}", + }); + } + + if first_char == 'i' && try_read("prod;") { + return Some(CharRef { + name: "prod;", + characters: "\u{2a3c}", + }); + } + + if first_char == 'i' && try_read("quest") { + return Some(CharRef { + name: "quest", + characters: "\u{bf}", + }); + } + + if first_char == 'i' && try_read("sinE;") { + return Some(CharRef { + name: "sinE;", + characters: "\u{22f9}", + }); + } + + if first_char == 'i' && try_read("sins;") { + return Some(CharRef { + name: "sins;", + characters: "\u{22f4}", + }); + } + + if first_char == 'i' && try_read("sinv;") { + return Some(CharRef { + name: "sinv;", + characters: "\u{2208}", + }); + } + + if first_char == 'i' && try_read("ukcy;") { + return Some(CharRef { + name: "ukcy;", + characters: "\u{456}", + }); + } + + if first_char == 'j' && try_read("circ;") { + return Some(CharRef { + name: "circ;", + characters: "\u{135}", + }); + } + + if first_char == 'j' && try_read("math;") { + return Some(CharRef { + name: "math;", + characters: "\u{237}", + }); + } + + if first_char == 'j' && try_read("ukcy;") { + return Some(CharRef { + name: "ukcy;", + characters: "\u{454}", + }); + } + + if first_char == 'k' && try_read("appa;") { + return Some(CharRef { + name: "appa;", + characters: "\u{3ba}", + }); + } + + if first_char == 'l' && try_read("Aarr;") { + return Some(CharRef { + name: "Aarr;", + characters: "\u{21da}", + }); + } + + if first_char == 'l' && try_read("Barr;") { + return Some(CharRef { + name: "Barr;", + characters: "\u{290e}", + }); + } + + if first_char == 'l' && try_read("angd;") { + return Some(CharRef { + name: "angd;", + characters: "\u{2991}", + }); + } + + if first_char == 'l' && try_read("aquo;") { + return Some(CharRef { + name: "aquo;", + characters: "\u{ab}", + }); + } + + if first_char == 'l' && try_read("arrb;") { + return Some(CharRef { + name: "arrb;", + characters: "\u{21e4}", + }); + } + + if first_char == 'l' && try_read("ates;") { + return Some(CharRef { + name: "ates;", + characters: "\u{2aad}\u{fe00}", + }); + } + + if first_char == 'l' && try_read("barr;") { + return Some(CharRef { + name: "barr;", + characters: "\u{290c}", + }); + } + + if first_char == 'l' && try_read("bbrk;") { + return Some(CharRef { + name: "bbrk;", + characters: "\u{2772}", + }); + } + + if first_char == 'l' && try_read("brke;") { + return Some(CharRef { + name: "brke;", + characters: "\u{298b}", + }); + } + + if first_char == 'l' && try_read("ceil;") { + return Some(CharRef { + name: "ceil;", + characters: "\u{2308}", + }); + } + + if first_char == 'l' && try_read("dquo;") { + return Some(CharRef { + name: "dquo;", + characters: "\u{201c}", + }); + } + + if first_char == 'l' && try_read("escc;") { + return Some(CharRef { + name: "escc;", + characters: "\u{2aa8}", + }); + } + + if first_char == 'l' && try_read("hard;") { + return Some(CharRef { + name: "hard;", + characters: "\u{21bd}", + }); + } + + if first_char == 'l' && try_read("haru;") { + return Some(CharRef { + name: "haru;", + characters: "\u{21bc}", + }); + } + + if first_char == 'l' && try_read("hblk;") { + return Some(CharRef { + name: "hblk;", + characters: "\u{2584}", + }); + } + + if first_char == 'l' && try_read("larr;") { + return Some(CharRef { + name: "larr;", + characters: "\u{21c7}", + }); + } + + if first_char == 'l' && try_read("ltri;") { + return Some(CharRef { + name: "ltri;", + characters: "\u{25fa}", + }); + } + + if first_char == 'l' && try_read("neqq;") { + return Some(CharRef { + name: "neqq;", + characters: "\u{2268}", + }); + } + + if first_char == 'l' && try_read("nsim;") { + return Some(CharRef { + name: "nsim;", + characters: "\u{22e6}", + }); + } + + if first_char == 'l' && try_read("oang;") { + return Some(CharRef { + name: "oang;", + characters: "\u{27ec}", + }); + } + + if first_char == 'l' && try_read("oarr;") { + return Some(CharRef { + name: "oarr;", + characters: "\u{21fd}", + }); + } + + if first_char == 'l' && try_read("obrk;") { + return Some(CharRef { + name: "obrk;", + characters: "\u{27e6}", + }); + } + + if first_char == 'l' && try_read("opar;") { + return Some(CharRef { + name: "opar;", + characters: "\u{2985}", + }); + } + + if first_char == 'l' && try_read("rarr;") { + return Some(CharRef { + name: "rarr;", + characters: "\u{21c6}", + }); + } + + if first_char == 'l' && try_read("rhar;") { + return Some(CharRef { + name: "rhar;", + characters: "\u{21cb}", + }); + } + + if first_char == 'l' && try_read("rtri;") { + return Some(CharRef { + name: "rtri;", + characters: "\u{22bf}", + }); + } + + if first_char == 'l' && try_read("sime;") { + return Some(CharRef { + name: "sime;", + characters: "\u{2a8d}", + }); + } + + if first_char == 'l' && try_read("simg;") { + return Some(CharRef { + name: "simg;", + characters: "\u{2a8f}", + }); + } + + if first_char == 'l' && try_read("squo;") { + return Some(CharRef { + name: "squo;", + characters: "\u{2018}", + }); + } + + if first_char == 'l' && try_read("tcir;") { + return Some(CharRef { + name: "tcir;", + characters: "\u{2a79}", + }); + } + + if first_char == 'l' && try_read("tdot;") { + return Some(CharRef { + name: "tdot;", + characters: "\u{22d6}", + }); + } + + if first_char == 'l' && try_read("trie;") { + return Some(CharRef { + name: "trie;", + characters: "\u{22b4}", + }); + } + + if first_char == 'l' && try_read("trif;") { + return Some(CharRef { + name: "trif;", + characters: "\u{25c2}", + }); + } + + if first_char == 'm' && try_read("DDot;") { + return Some(CharRef { + name: "DDot;", + characters: "\u{223a}", + }); + } + + if first_char == 'm' && try_read("dash;") { + return Some(CharRef { + name: "dash;", + characters: "\u{2014}", + }); + } + + if first_char == 'm' && try_read("icro;") { + return Some(CharRef { + name: "icro;", + characters: "\u{b5}", + }); + } + + if first_char == 'm' && try_read("iddot") { + return Some(CharRef { + name: "iddot", + characters: "\u{b7}", + }); + } + + if first_char == 'm' && try_read("inus;") { + return Some(CharRef { + name: "inus;", + characters: "\u{2212}", + }); + } + + if first_char == 'm' && try_read("umap;") { + return Some(CharRef { + name: "umap;", + characters: "\u{22b8}", + }); + } + + if first_char == 'n' && try_read("abla;") { + return Some(CharRef { + name: "abla;", + characters: "\u{2207}", + }); + } + + if first_char == 'n' && try_read("apid;") { + return Some(CharRef { + name: "apid;", + characters: "\u{224b}\u{338}", + }); + } + + if first_char == 'n' && try_read("apos;") { + return Some(CharRef { + name: "apos;", + characters: "\u{149}", + }); + } + + if first_char == 'n' && try_read("atur;") { + return Some(CharRef { + name: "atur;", + characters: "\u{266e}", + }); + } + + if first_char == 'n' && try_read("bump;") { + return Some(CharRef { + name: "bump;", + characters: "\u{224e}\u{338}", + }); + } + + if first_char == 'n' && try_read("cong;") { + return Some(CharRef { + name: "cong;", + characters: "\u{2247}", + }); + } + + if first_char == 'n' && try_read("dash;") { + return Some(CharRef { + name: "dash;", + characters: "\u{2013}", + }); + } + + if first_char == 'n' && try_read("eArr;") { + return Some(CharRef { + name: "eArr;", + characters: "\u{21d7}", + }); + } + + if first_char == 'n' && try_read("earr;") { + return Some(CharRef { + name: "earr;", + characters: "\u{2197}", + }); + } + + if first_char == 'n' && try_read("edot;") { + return Some(CharRef { + name: "edot;", + characters: "\u{2250}\u{338}", + }); + } + + if first_char == 'n' && try_read("esim;") { + return Some(CharRef { + name: "esim;", + characters: "\u{2242}\u{338}", + }); + } + + if first_char == 'n' && try_read("geqq;") { + return Some(CharRef { + name: "geqq;", + characters: "\u{2267}\u{338}", + }); + } + + if first_char == 'n' && try_read("gsim;") { + return Some(CharRef { + name: "gsim;", + characters: "\u{2275}", + }); + } + + if first_char == 'n' && try_read("hArr;") { + return Some(CharRef { + name: "hArr;", + characters: "\u{21ce}", + }); + } + + if first_char == 'n' && try_read("harr;") { + return Some(CharRef { + name: "harr;", + characters: "\u{21ae}", + }); + } + + if first_char == 'n' && try_read("hpar;") { + return Some(CharRef { + name: "hpar;", + characters: "\u{2af2}", + }); + } + + if first_char == 'n' && try_read("lArr;") { + return Some(CharRef { + name: "lArr;", + characters: "\u{21cd}", + }); + } + + if first_char == 'n' && try_read("larr;") { + return Some(CharRef { + name: "larr;", + characters: "\u{219a}", + }); + } + + if first_char == 'n' && try_read("leqq;") { + return Some(CharRef { + name: "leqq;", + characters: "\u{2266}\u{338}", + }); + } + + if first_char == 'n' && try_read("less;") { + return Some(CharRef { + name: "less;", + characters: "\u{226e}", + }); + } + + if first_char == 'n' && try_read("lsim;") { + return Some(CharRef { + name: "lsim;", + characters: "\u{2274}", + }); + } + + if first_char == 'n' && try_read("ltri;") { + return Some(CharRef { + name: "ltri;", + characters: "\u{22ea}", + }); + } + + if first_char == 'n' && try_read("otin;") { + return Some(CharRef { + name: "otin;", + characters: "\u{2209}", + }); + } + + if first_char == 'n' && try_read("otni;") { + return Some(CharRef { + name: "otni;", + characters: "\u{220c}", + }); + } + + if first_char == 'n' && try_read("part;") { + return Some(CharRef { + name: "part;", + characters: "\u{2202}\u{338}", + }); + } + + if first_char == 'n' && try_read("prec;") { + return Some(CharRef { + name: "prec;", + characters: "\u{2280}", + }); + } + + if first_char == 'n' && try_read("rArr;") { + return Some(CharRef { + name: "rArr;", + characters: "\u{21cf}", + }); + } + + if first_char == 'n' && try_read("rarr;") { + return Some(CharRef { + name: "rarr;", + characters: "\u{219b}", + }); + } + + if first_char == 'n' && try_read("rtri;") { + return Some(CharRef { + name: "rtri;", + characters: "\u{22eb}", + }); + } + + if first_char == 'n' && try_read("sime;") { + return Some(CharRef { + name: "sime;", + characters: "\u{2244}", + }); + } + + if first_char == 'n' && try_read("smid;") { + return Some(CharRef { + name: "smid;", + characters: "\u{2224}", + }); + } + + if first_char == 'n' && try_read("spar;") { + return Some(CharRef { + name: "spar;", + characters: "\u{2226}", + }); + } + + if first_char == 'n' && try_read("subE;") { + return Some(CharRef { + name: "subE;", + characters: "\u{2ac5}\u{338}", + }); + } + + if first_char == 'n' && try_read("sube;") { + return Some(CharRef { + name: "sube;", + characters: "\u{2288}", + }); + } + + if first_char == 'n' && try_read("succ;") { + return Some(CharRef { + name: "succ;", + characters: "\u{2281}", + }); + } + + if first_char == 'n' && try_read("supE;") { + return Some(CharRef { + name: "supE;", + characters: "\u{2ac6}\u{338}", + }); + } + + if first_char == 'n' && try_read("supe;") { + return Some(CharRef { + name: "supe;", + characters: "\u{2289}", + }); + } + + if first_char == 'n' && try_read("tilde") { + return Some(CharRef { + name: "tilde", + characters: "\u{f1}", + }); + } + + if first_char == 'n' && try_read("umsp;") { + return Some(CharRef { + name: "umsp;", + characters: "\u{2007}", + }); + } + + if first_char == 'n' && try_read("vsim;") { + return Some(CharRef { + name: "vsim;", + characters: "\u{223c}\u{20d2}", + }); + } + + if first_char == 'n' && try_read("wArr;") { + return Some(CharRef { + name: "wArr;", + characters: "\u{21d6}", + }); + } + + if first_char == 'n' && try_read("warr;") { + return Some(CharRef { + name: "warr;", + characters: "\u{2196}", + }); + } + + if first_char == 'o' && try_read("acute") { + return Some(CharRef { + name: "acute", + characters: "\u{f3}", + }); + } + + if first_char == 'o' && try_read("circ;") { + return Some(CharRef { + name: "circ;", + characters: "\u{f4}", + }); + } + + if first_char == 'o' && try_read("dash;") { + return Some(CharRef { + name: "dash;", + characters: "\u{229d}", + }); + } + + if first_char == 'o' && try_read("elig;") { + return Some(CharRef { + name: "elig;", + characters: "\u{153}", + }); + } + + if first_char == 'o' && try_read("fcir;") { + return Some(CharRef { + name: "fcir;", + characters: "\u{29bf}", + }); + } + + if first_char == 'o' && try_read("grave") { + return Some(CharRef { + name: "grave", + characters: "\u{f2}", + }); + } + + if first_char == 'o' && try_read("hbar;") { + return Some(CharRef { + name: "hbar;", + characters: "\u{29b5}", + }); + } + + if first_char == 'o' && try_read("larr;") { + return Some(CharRef { + name: "larr;", + characters: "\u{21ba}", + }); + } + + if first_char == 'o' && try_read("lcir;") { + return Some(CharRef { + name: "lcir;", + characters: "\u{29be}", + }); + } + + if first_char == 'o' && try_read("line;") { + return Some(CharRef { + name: "line;", + characters: "\u{203e}", + }); + } + + if first_char == 'o' && try_read("macr;") { + return Some(CharRef { + name: "macr;", + characters: "\u{14d}", + }); + } + + if first_char == 'o' && try_read("mega;") { + return Some(CharRef { + name: "mega;", + characters: "\u{3c9}", + }); + } + + if first_char == 'o' && try_read("perp;") { + return Some(CharRef { + name: "perp;", + characters: "\u{29b9}", + }); + } + + if first_char == 'o' && try_read("plus;") { + return Some(CharRef { + name: "plus;", + characters: "\u{2295}", + }); + } + + if first_char == 'o' && try_read("rarr;") { + return Some(CharRef { + name: "rarr;", + characters: "\u{21bb}", + }); + } + + if first_char == 'o' && try_read("rder;") { + return Some(CharRef { + name: "rder;", + characters: "\u{2134}", + }); + } + + if first_char == 'o' && try_read("slash") { + return Some(CharRef { + name: "slash", + characters: "\u{f8}", + }); + } + + if first_char == 'o' && try_read("tilde") { + return Some(CharRef { + name: "tilde", + characters: "\u{f5}", + }); + } + + if first_char == 'o' && try_read("vbar;") { + return Some(CharRef { + name: "vbar;", + characters: "\u{233d}", + }); + } + + if first_char == 'p' && try_read("arsl;") { + return Some(CharRef { + name: "arsl;", + characters: "\u{2afd}", + }); + } + + if first_char == 'p' && try_read("hone;") { + return Some(CharRef { + name: "hone;", + characters: "\u{260e}", + }); + } + + if first_char == 'p' && try_read("lusb;") { + return Some(CharRef { + name: "lusb;", + characters: "\u{229e}", + }); + } + + if first_char == 'p' && try_read("luse;") { + return Some(CharRef { + name: "luse;", + characters: "\u{2a72}", + }); + } + + if first_char == 'p' && try_read("lusmn") { + return Some(CharRef { + name: "lusmn", + characters: "\u{b1}", + }); + } + + if first_char == 'p' && try_read("ound;") { + return Some(CharRef { + name: "ound;", + characters: "\u{a3}", + }); + } + + if first_char == 'p' && try_read("rcue;") { + return Some(CharRef { + name: "rcue;", + characters: "\u{227c}", + }); + } + + if first_char == 'p' && try_read("rime;") { + return Some(CharRef { + name: "rime;", + characters: "\u{2032}", + }); + } + + if first_char == 'p' && try_read("rnap;") { + return Some(CharRef { + name: "rnap;", + characters: "\u{2ab9}", + }); + } + + if first_char == 'p' && try_read("rsim;") { + return Some(CharRef { + name: "rsim;", + characters: "\u{227e}", + }); + } + + if first_char == 'q' && try_read("uest;") { + return Some(CharRef { + name: "uest;", + characters: "\u{3f}", + }); + } + + if first_char == 'r' && try_read("Aarr;") { + return Some(CharRef { + name: "Aarr;", + characters: "\u{21db}", + }); + } + + if first_char == 'r' && try_read("Barr;") { + return Some(CharRef { + name: "Barr;", + characters: "\u{290f}", + }); + } + + if first_char == 'r' && try_read("adic;") { + return Some(CharRef { + name: "adic;", + characters: "\u{221a}", + }); + } + + if first_char == 'r' && try_read("angd;") { + return Some(CharRef { + name: "angd;", + characters: "\u{2992}", + }); + } + + if first_char == 'r' && try_read("ange;") { + return Some(CharRef { + name: "ange;", + characters: "\u{29a5}", + }); + } + + if first_char == 'r' && try_read("aquo;") { + return Some(CharRef { + name: "aquo;", + characters: "\u{bb}", + }); + } + + if first_char == 'r' && try_read("arrb;") { + return Some(CharRef { + name: "arrb;", + characters: "\u{21e5}", + }); + } + + if first_char == 'r' && try_read("arrc;") { + return Some(CharRef { + name: "arrc;", + characters: "\u{2933}", + }); + } + + if first_char == 'r' && try_read("arrw;") { + return Some(CharRef { + name: "arrw;", + characters: "\u{219d}", + }); + } + + if first_char == 'r' && try_read("atio;") { + return Some(CharRef { + name: "atio;", + characters: "\u{2236}", + }); + } + + if first_char == 'r' && try_read("barr;") { + return Some(CharRef { + name: "barr;", + characters: "\u{290d}", + }); + } + + if first_char == 'r' && try_read("bbrk;") { + return Some(CharRef { + name: "bbrk;", + characters: "\u{2773}", + }); + } + + if first_char == 'r' && try_read("brke;") { + return Some(CharRef { + name: "brke;", + characters: "\u{298c}", + }); + } + + if first_char == 'r' && try_read("ceil;") { + return Some(CharRef { + name: "ceil;", + characters: "\u{2309}", + }); + } + + if first_char == 'r' && try_read("dquo;") { + return Some(CharRef { + name: "dquo;", + characters: "\u{201d}", + }); + } + + if first_char == 'r' && try_read("eals;") { + return Some(CharRef { + name: "eals;", + characters: "\u{211d}", + }); + } + + if first_char == 'r' && try_read("hard;") { + return Some(CharRef { + name: "hard;", + characters: "\u{21c1}", + }); + } + + if first_char == 'r' && try_read("haru;") { + return Some(CharRef { + name: "haru;", + characters: "\u{21c0}", + }); + } + + if first_char == 'r' && try_read("larr;") { + return Some(CharRef { + name: "larr;", + characters: "\u{21c4}", + }); + } + + if first_char == 'r' && try_read("lhar;") { + return Some(CharRef { + name: "lhar;", + characters: "\u{21cc}", + }); + } + + if first_char == 'r' && try_read("nmid;") { + return Some(CharRef { + name: "nmid;", + characters: "\u{2aee}", + }); + } + + if first_char == 'r' && try_read("oang;") { + return Some(CharRef { + name: "oang;", + characters: "\u{27ed}", + }); + } + + if first_char == 'r' && try_read("oarr;") { + return Some(CharRef { + name: "oarr;", + characters: "\u{21fe}", + }); + } + + if first_char == 'r' && try_read("obrk;") { + return Some(CharRef { + name: "obrk;", + characters: "\u{27e7}", + }); + } + + if first_char == 'r' && try_read("opar;") { + return Some(CharRef { + name: "opar;", + characters: "\u{2986}", + }); + } + + if first_char == 'r' && try_read("rarr;") { + return Some(CharRef { + name: "rarr;", + characters: "\u{21c9}", + }); + } + + if first_char == 'r' && try_read("squo;") { + return Some(CharRef { + name: "squo;", + characters: "\u{2019}", + }); + } + + if first_char == 'r' && try_read("trie;") { + return Some(CharRef { + name: "trie;", + characters: "\u{22b5}", + }); + } + + if first_char == 'r' && try_read("trif;") { + return Some(CharRef { + name: "trif;", + characters: "\u{25b8}", + }); + } + + if first_char == 's' && try_read("bquo;") { + return Some(CharRef { + name: "bquo;", + characters: "\u{201a}", + }); + } + + if first_char == 's' && try_read("ccue;") { + return Some(CharRef { + name: "ccue;", + characters: "\u{227d}", + }); + } + + if first_char == 's' && try_read("circ;") { + return Some(CharRef { + name: "circ;", + characters: "\u{15d}", + }); + } + + if first_char == 's' && try_read("cnap;") { + return Some(CharRef { + name: "cnap;", + characters: "\u{2aba}", + }); + } + + if first_char == 's' && try_read("csim;") { + return Some(CharRef { + name: "csim;", + characters: "\u{227f}", + }); + } + + if first_char == 's' && try_read("dotb;") { + return Some(CharRef { + name: "dotb;", + characters: "\u{22a1}", + }); + } + + if first_char == 's' && try_read("dote;") { + return Some(CharRef { + name: "dote;", + characters: "\u{2a66}", + }); + } + + if first_char == 's' && try_read("eArr;") { + return Some(CharRef { + name: "eArr;", + characters: "\u{21d8}", + }); + } + + if first_char == 's' && try_read("earr;") { + return Some(CharRef { + name: "earr;", + characters: "\u{2198}", + }); + } + + if first_char == 's' && try_read("etmn;") { + return Some(CharRef { + name: "etmn;", + characters: "\u{2216}", + }); + } + + if first_char == 's' && try_read("harp;") { + return Some(CharRef { + name: "harp;", + characters: "\u{266f}", + }); + } + + if first_char == 's' && try_read("igma;") { + return Some(CharRef { + name: "igma;", + characters: "\u{3c3}", + }); + } + + if first_char == 's' && try_read("imeq;") { + return Some(CharRef { + name: "imeq;", + characters: "\u{2243}", + }); + } + + if first_char == 's' && try_read("imgE;") { + return Some(CharRef { + name: "imgE;", + characters: "\u{2aa0}", + }); + } + + if first_char == 's' && try_read("imlE;") { + return Some(CharRef { + name: "imlE;", + characters: "\u{2a9f}", + }); + } + + if first_char == 's' && try_read("imne;") { + return Some(CharRef { + name: "imne;", + characters: "\u{2246}", + }); + } + + if first_char == 's' && try_read("larr;") { + return Some(CharRef { + name: "larr;", + characters: "\u{2190}", + }); + } + + if first_char == 's' && try_read("mile;") { + return Some(CharRef { + name: "mile;", + characters: "\u{2323}", + }); + } + + if first_char == 's' && try_read("mtes;") { + return Some(CharRef { + name: "mtes;", + characters: "\u{2aac}\u{fe00}", + }); + } + + if first_char == 's' && try_read("qcap;") { + return Some(CharRef { + name: "qcap;", + characters: "\u{2293}", + }); + } + + if first_char == 's' && try_read("qcup;") { + return Some(CharRef { + name: "qcup;", + characters: "\u{2294}", + }); + } + + if first_char == 's' && try_read("qsub;") { + return Some(CharRef { + name: "qsub;", + characters: "\u{228f}", + }); + } + + if first_char == 's' && try_read("qsup;") { + return Some(CharRef { + name: "qsup;", + characters: "\u{2290}", + }); + } + + if first_char == 's' && try_read("rarr;") { + return Some(CharRef { + name: "rarr;", + characters: "\u{2192}", + }); + } + + if first_char == 's' && try_read("tarf;") { + return Some(CharRef { + name: "tarf;", + characters: "\u{2605}", + }); + } + + if first_char == 's' && try_read("trns;") { + return Some(CharRef { + name: "trns;", + characters: "\u{af}", + }); + } + + if first_char == 's' && try_read("ubnE;") { + return Some(CharRef { + name: "ubnE;", + characters: "\u{2acb}", + }); + } + + if first_char == 's' && try_read("ubne;") { + return Some(CharRef { + name: "ubne;", + characters: "\u{228a}", + }); + } + + if first_char == 's' && try_read("upnE;") { + return Some(CharRef { + name: "upnE;", + characters: "\u{2acc}", + }); + } + + if first_char == 's' && try_read("upne;") { + return Some(CharRef { + name: "upne;", + characters: "\u{228b}", + }); + } + + if first_char == 's' && try_read("wArr;") { + return Some(CharRef { + name: "wArr;", + characters: "\u{21d9}", + }); + } + + if first_char == 's' && try_read("warr;") { + return Some(CharRef { + name: "warr;", + characters: "\u{2199}", + }); + } + + if first_char == 's' && try_read("zlig;") { + return Some(CharRef { + name: "zlig;", + characters: "\u{df}", + }); + } + + if first_char == 't' && try_read("heta;") { + return Some(CharRef { + name: "heta;", + characters: "\u{3b8}", + }); + } + + if first_char == 't' && try_read("hkap;") { + return Some(CharRef { + name: "hkap;", + characters: "\u{2248}", + }); + } + + if first_char == 't' && try_read("horn;") { + return Some(CharRef { + name: "horn;", + characters: "\u{fe}", + }); + } + + if first_char == 't' && try_read("ilde;") { + return Some(CharRef { + name: "ilde;", + characters: "\u{2dc}", + }); + } + + if first_char == 't' && try_read("imes;") { + return Some(CharRef { + name: "imes;", + characters: "\u{d7}", + }); + } + + if first_char == 't' && try_read("rade;") { + return Some(CharRef { + name: "rade;", + characters: "\u{2122}", + }); + } + + if first_char == 't' && try_read("risb;") { + return Some(CharRef { + name: "risb;", + characters: "\u{29cd}", + }); + } + + if first_char == 't' && try_read("shcy;") { + return Some(CharRef { + name: "shcy;", + characters: "\u{45b}", + }); + } + + if first_char == 't' && try_read("wixt;") { + return Some(CharRef { + name: "wixt;", + characters: "\u{226c}", + }); + } + + if first_char == 'u' && try_read("acute") { + return Some(CharRef { + name: "acute", + characters: "\u{fa}", + }); + } + + if first_char == 'u' && try_read("brcy;") { + return Some(CharRef { + name: "brcy;", + characters: "\u{45e}", + }); + } + + if first_char == 'u' && try_read("circ;") { + return Some(CharRef { + name: "circ;", + characters: "\u{fb}", + }); + } + + if first_char == 'u' && try_read("darr;") { + return Some(CharRef { + name: "darr;", + characters: "\u{21c5}", + }); + } + + if first_char == 'u' && try_read("dhar;") { + return Some(CharRef { + name: "dhar;", + characters: "\u{296e}", + }); + } + + if first_char == 'u' && try_read("grave") { + return Some(CharRef { + name: "grave", + characters: "\u{f9}", + }); + } + + if first_char == 'u' && try_read("harl;") { + return Some(CharRef { + name: "harl;", + characters: "\u{21bf}", + }); + } + + if first_char == 'u' && try_read("harr;") { + return Some(CharRef { + name: "harr;", + characters: "\u{21be}", + }); + } + + if first_char == 'u' && try_read("hblk;") { + return Some(CharRef { + name: "hblk;", + characters: "\u{2580}", + }); + } + + if first_char == 'u' && try_read("ltri;") { + return Some(CharRef { + name: "ltri;", + characters: "\u{25f8}", + }); + } + + if first_char == 'u' && try_read("macr;") { + return Some(CharRef { + name: "macr;", + characters: "\u{16b}", + }); + } + + if first_char == 'u' && try_read("ogon;") { + return Some(CharRef { + name: "ogon;", + characters: "\u{173}", + }); + } + + if first_char == 'u' && try_read("plus;") { + return Some(CharRef { + name: "plus;", + characters: "\u{228e}", + }); + } + + if first_char == 'u' && try_read("psih;") { + return Some(CharRef { + name: "psih;", + characters: "\u{3d2}", + }); + } + + if first_char == 'u' && try_read("ring;") { + return Some(CharRef { + name: "ring;", + characters: "\u{16f}", + }); + } + + if first_char == 'u' && try_read("rtri;") { + return Some(CharRef { + name: "rtri;", + characters: "\u{25f9}", + }); + } + + if first_char == 'u' && try_read("tdot;") { + return Some(CharRef { + name: "tdot;", + characters: "\u{22f0}", + }); + } + + if first_char == 'u' && try_read("trif;") { + return Some(CharRef { + name: "trif;", + characters: "\u{25b4}", + }); + } + + if first_char == 'u' && try_read("uarr;") { + return Some(CharRef { + name: "uarr;", + characters: "\u{21c8}", + }); + } + + if first_char == 'v' && try_read("Barv;") { + return Some(CharRef { + name: "Barv;", + characters: "\u{2ae9}", + }); + } + + if first_char == 'v' && try_read("Dash;") { + return Some(CharRef { + name: "Dash;", + characters: "\u{22a8}", + }); + } + + if first_char == 'v' && try_read("arpi;") { + return Some(CharRef { + name: "arpi;", + characters: "\u{3d6}", + }); + } + + if first_char == 'v' && try_read("dash;") { + return Some(CharRef { + name: "dash;", + characters: "\u{22a2}", + }); + } + + if first_char == 'v' && try_read("eeeq;") { + return Some(CharRef { + name: "eeeq;", + characters: "\u{225a}", + }); + } + + if first_char == 'v' && try_read("ltri;") { + return Some(CharRef { + name: "ltri;", + characters: "\u{22b2}", + }); + } + + if first_char == 'v' && try_read("nsub;") { + return Some(CharRef { + name: "nsub;", + characters: "\u{2282}\u{20d2}", + }); + } + + if first_char == 'v' && try_read("nsup;") { + return Some(CharRef { + name: "nsup;", + characters: "\u{2283}\u{20d2}", + }); + } + + if first_char == 'v' && try_read("prop;") { + return Some(CharRef { + name: "prop;", + characters: "\u{221d}", + }); + } + + if first_char == 'v' && try_read("rtri;") { + return Some(CharRef { + name: "rtri;", + characters: "\u{22b3}", + }); + } + + if first_char == 'w' && try_read("circ;") { + return Some(CharRef { + name: "circ;", + characters: "\u{175}", + }); + } + + if first_char == 'w' && try_read("edge;") { + return Some(CharRef { + name: "edge;", + characters: "\u{2227}", + }); + } + + if first_char == 'x' && try_read("circ;") { + return Some(CharRef { + name: "circ;", + characters: "\u{25ef}", + }); + } + + if first_char == 'x' && try_read("dtri;") { + return Some(CharRef { + name: "dtri;", + characters: "\u{25bd}", + }); + } + + if first_char == 'x' && try_read("hArr;") { + return Some(CharRef { + name: "hArr;", + characters: "\u{27fa}", + }); + } + + if first_char == 'x' && try_read("harr;") { + return Some(CharRef { + name: "harr;", + characters: "\u{27f7}", + }); + } + + if first_char == 'x' && try_read("lArr;") { + return Some(CharRef { + name: "lArr;", + characters: "\u{27f8}", + }); + } + + if first_char == 'x' && try_read("larr;") { + return Some(CharRef { + name: "larr;", + characters: "\u{27f5}", + }); + } + + if first_char == 'x' && try_read("odot;") { + return Some(CharRef { + name: "odot;", + characters: "\u{2a00}", + }); + } + + if first_char == 'x' && try_read("rArr;") { + return Some(CharRef { + name: "rArr;", + characters: "\u{27f9}", + }); + } + + if first_char == 'x' && try_read("rarr;") { + return Some(CharRef { + name: "rarr;", + characters: "\u{27f6}", + }); + } + + if first_char == 'x' && try_read("utri;") { + return Some(CharRef { + name: "utri;", + characters: "\u{25b3}", + }); + } + + if first_char == 'y' && try_read("acute") { + return Some(CharRef { + name: "acute", + characters: "\u{fd}", + }); + } + + if first_char == 'y' && try_read("circ;") { + return Some(CharRef { + name: "circ;", + characters: "\u{177}", + }); + } + + if first_char == 'A' && try_read("Elig") { + return Some(CharRef { + name: "Elig", + characters: "\u{c6}", + }); + } + + if first_char == 'A' && try_read("circ") { + return Some(CharRef { + name: "circ", + characters: "\u{c2}", + }); + } + + if first_char == 'A' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{1d538}", + }); + } + + if first_char == 'A' && try_read("ring") { + return Some(CharRef { + name: "ring", + characters: "\u{c5}", + }); + } + + if first_char == 'A' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{1d49c}", + }); + } + + if first_char == 'A' && try_read("uml;") { + return Some(CharRef { + name: "uml;", + characters: "\u{c4}", + }); + } + + if first_char == 'B' && try_read("arv;") { + return Some(CharRef { + name: "arv;", + characters: "\u{2ae7}", + }); + } + + if first_char == 'B' && try_read("eta;") { + return Some(CharRef { + name: "eta;", + characters: "\u{392}", + }); + } + + if first_char == 'B' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{1d539}", + }); + } + + if first_char == 'B' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{212c}", + }); + } + + if first_char == 'C' && try_read("Hcy;") { + return Some(CharRef { + name: "Hcy;", + characters: "\u{427}", + }); + } + + if first_char == 'C' && try_read("OPY;") { + return Some(CharRef { + name: "OPY;", + characters: "\u{a9}", + }); + } + + if first_char == 'C' && try_read("dot;") { + return Some(CharRef { + name: "dot;", + characters: "\u{10a}", + }); + } + + if first_char == 'C' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{2102}", + }); + } + + if first_char == 'C' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{1d49e}", + }); + } + + if first_char == 'D' && try_read("Jcy;") { + return Some(CharRef { + name: "Jcy;", + characters: "\u{402}", + }); + } + + if first_char == 'D' && try_read("Scy;") { + return Some(CharRef { + name: "Scy;", + characters: "\u{405}", + }); + } + + if first_char == 'D' && try_read("Zcy;") { + return Some(CharRef { + name: "Zcy;", + characters: "\u{40f}", + }); + } + + if first_char == 'D' && try_read("arr;") { + return Some(CharRef { + name: "arr;", + characters: "\u{21a1}", + }); + } + + if first_char == 'D' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{1d53b}", + }); + } + + if first_char == 'D' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{1d49f}", + }); + } + + if first_char == 'E' && try_read("circ") { + return Some(CharRef { + name: "circ", + characters: "\u{ca}", + }); + } + + if first_char == 'E' && try_read("dot;") { + return Some(CharRef { + name: "dot;", + characters: "\u{116}", + }); + } + + if first_char == 'E' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{1d53c}", + }); + } + + if first_char == 'E' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{2130}", + }); + } + + if first_char == 'E' && try_read("sim;") { + return Some(CharRef { + name: "sim;", + characters: "\u{2a73}", + }); + } + + if first_char == 'E' && try_read("uml;") { + return Some(CharRef { + name: "uml;", + characters: "\u{cb}", + }); + } + + if first_char == 'F' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{1d53d}", + }); + } + + if first_char == 'F' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{2131}", + }); + } + + if first_char == 'G' && try_read("Jcy;") { + return Some(CharRef { + name: "Jcy;", + characters: "\u{403}", + }); + } + + if first_char == 'G' && try_read("dot;") { + return Some(CharRef { + name: "dot;", + characters: "\u{120}", + }); + } + + if first_char == 'G' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{1d53e}", + }); + } + + if first_char == 'G' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{1d4a2}", + }); + } + + if first_char == 'H' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{210d}", + }); + } + + if first_char == 'H' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{210b}", + }); + } + + if first_char == 'I' && try_read("Ecy;") { + return Some(CharRef { + name: "Ecy;", + characters: "\u{415}", + }); + } + + if first_char == 'I' && try_read("Ocy;") { + return Some(CharRef { + name: "Ocy;", + characters: "\u{401}", + }); + } + + if first_char == 'I' && try_read("circ") { + return Some(CharRef { + name: "circ", + characters: "\u{ce}", + }); + } + + if first_char == 'I' && try_read("dot;") { + return Some(CharRef { + name: "dot;", + characters: "\u{130}", + }); + } + + if first_char == 'I' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{1d540}", + }); + } + + if first_char == 'I' && try_read("ota;") { + return Some(CharRef { + name: "ota;", + characters: "\u{399}", + }); + } + + if first_char == 'I' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{2110}", + }); + } + + if first_char == 'I' && try_read("uml;") { + return Some(CharRef { + name: "uml;", + characters: "\u{cf}", + }); + } + + if first_char == 'J' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{1d541}", + }); + } + + if first_char == 'J' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{1d4a5}", + }); + } + + if first_char == 'K' && try_read("Hcy;") { + return Some(CharRef { + name: "Hcy;", + characters: "\u{425}", + }); + } + + if first_char == 'K' && try_read("Jcy;") { + return Some(CharRef { + name: "Jcy;", + characters: "\u{40c}", + }); + } + + if first_char == 'K' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{1d542}", + }); + } + + if first_char == 'K' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{1d4a6}", + }); + } + + if first_char == 'L' && try_read("Jcy;") { + return Some(CharRef { + name: "Jcy;", + characters: "\u{409}", + }); + } + + if first_char == 'L' && try_read("ang;") { + return Some(CharRef { + name: "ang;", + characters: "\u{27ea}", + }); + } + + if first_char == 'L' && try_read("arr;") { + return Some(CharRef { + name: "arr;", + characters: "\u{219e}", + }); + } + + if first_char == 'L' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{1d543}", + }); + } + + if first_char == 'L' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{2112}", + }); + } + + if first_char == 'M' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{1d544}", + }); + } + + if first_char == 'M' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{2133}", + }); + } + + if first_char == 'N' && try_read("Jcy;") { + return Some(CharRef { + name: "Jcy;", + characters: "\u{40a}", + }); + } + + if first_char == 'N' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{2115}", + }); + } + + if first_char == 'N' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{1d4a9}", + }); + } + + if first_char == 'O' && try_read("circ") { + return Some(CharRef { + name: "circ", + characters: "\u{d4}", + }); + } + + if first_char == 'O' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{1d546}", + }); + } + + if first_char == 'O' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{1d4aa}", + }); + } + + if first_char == 'O' && try_read("uml;") { + return Some(CharRef { + name: "uml;", + characters: "\u{d6}", + }); + } + + if first_char == 'P' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{2119}", + }); + } + + if first_char == 'P' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{1d4ab}", + }); + } + + if first_char == 'Q' && try_read("UOT;") { + return Some(CharRef { + name: "UOT;", + characters: "\u{22}", + }); + } + + if first_char == 'Q' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{211a}", + }); + } + + if first_char == 'Q' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{1d4ac}", + }); + } + + if first_char == 'R' && try_read("ang;") { + return Some(CharRef { + name: "ang;", + characters: "\u{27eb}", + }); + } + + if first_char == 'R' && try_read("arr;") { + return Some(CharRef { + name: "arr;", + characters: "\u{21a0}", + }); + } + + if first_char == 'R' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{211d}", + }); + } + + if first_char == 'R' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{211b}", + }); + } + + if first_char == 'S' && try_read("Hcy;") { + return Some(CharRef { + name: "Hcy;", + characters: "\u{428}", + }); + } + + if first_char == 'S' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{1d54a}", + }); + } + + if first_char == 'S' && try_read("qrt;") { + return Some(CharRef { + name: "qrt;", + characters: "\u{221a}", + }); + } + + if first_char == 'S' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{1d4ae}", + }); + } + + if first_char == 'S' && try_read("tar;") { + return Some(CharRef { + name: "tar;", + characters: "\u{22c6}", + }); + } + + if first_char == 'T' && try_read("HORN") { + return Some(CharRef { + name: "HORN", + characters: "\u{de}", + }); + } + + if first_char == 'T' && try_read("Scy;") { + return Some(CharRef { + name: "Scy;", + characters: "\u{426}", + }); + } + + if first_char == 'T' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{1d54b}", + }); + } + + if first_char == 'T' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{1d4af}", + }); + } + + if first_char == 'U' && try_read("arr;") { + return Some(CharRef { + name: "arr;", + characters: "\u{219f}", + }); + } + + if first_char == 'U' && try_read("circ") { + return Some(CharRef { + name: "circ", + characters: "\u{db}", + }); + } + + if first_char == 'U' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{1d54c}", + }); + } + + if first_char == 'U' && try_read("psi;") { + return Some(CharRef { + name: "psi;", + characters: "\u{3d2}", + }); + } + + if first_char == 'U' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{1d4b0}", + }); + } + + if first_char == 'U' && try_read("uml;") { + return Some(CharRef { + name: "uml;", + characters: "\u{dc}", + }); + } + + if first_char == 'V' && try_read("bar;") { + return Some(CharRef { + name: "bar;", + characters: "\u{2aeb}", + }); + } + + if first_char == 'V' && try_read("ert;") { + return Some(CharRef { + name: "ert;", + characters: "\u{2016}", + }); + } + + if first_char == 'V' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{1d54d}", + }); + } + + if first_char == 'V' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{1d4b1}", + }); + } + + if first_char == 'W' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{1d54e}", + }); + } + + if first_char == 'W' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{1d4b2}", + }); + } + + if first_char == 'X' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{1d54f}", + }); + } + + if first_char == 'X' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{1d4b3}", + }); + } + + if first_char == 'Y' && try_read("Acy;") { + return Some(CharRef { + name: "Acy;", + characters: "\u{42f}", + }); + } + + if first_char == 'Y' && try_read("Icy;") { + return Some(CharRef { + name: "Icy;", + characters: "\u{407}", + }); + } + + if first_char == 'Y' && try_read("Ucy;") { + return Some(CharRef { + name: "Ucy;", + characters: "\u{42e}", + }); + } + + if first_char == 'Y' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{1d550}", + }); + } + + if first_char == 'Y' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{1d4b4}", + }); + } + + if first_char == 'Y' && try_read("uml;") { + return Some(CharRef { + name: "uml;", + characters: "\u{178}", + }); + } + + if first_char == 'Z' && try_read("Hcy;") { + return Some(CharRef { + name: "Hcy;", + characters: "\u{416}", + }); + } + + if first_char == 'Z' && try_read("dot;") { + return Some(CharRef { + name: "dot;", + characters: "\u{17b}", + }); + } + + if first_char == 'Z' && try_read("eta;") { + return Some(CharRef { + name: "eta;", + characters: "\u{396}", + }); + } + + if first_char == 'Z' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{2124}", + }); + } + + if first_char == 'Z' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{1d4b5}", + }); + } + + if first_char == 'a' && try_read("circ") { + return Some(CharRef { + name: "circ", + characters: "\u{e2}", + }); + } + + if first_char == 'a' && try_read("cute") { + return Some(CharRef { + name: "cute", + characters: "\u{b4}", + }); + } + + if first_char == 'a' && try_read("elig") { + return Some(CharRef { + name: "elig", + characters: "\u{e6}", + }); + } + + if first_char == 'a' && try_read("ndd;") { + return Some(CharRef { + name: "ndd;", + characters: "\u{2a5c}", + }); + } + + if first_char == 'a' && try_read("ndv;") { + return Some(CharRef { + name: "ndv;", + characters: "\u{2a5a}", + }); + } + + if first_char == 'a' && try_read("nge;") { + return Some(CharRef { + name: "nge;", + characters: "\u{29a4}", + }); + } + + if first_char == 'a' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{1d552}", + }); + } + + if first_char == 'a' && try_read("pid;") { + return Some(CharRef { + name: "pid;", + characters: "\u{224b}", + }); + } + + if first_char == 'a' && try_read("pos;") { + return Some(CharRef { + name: "pos;", + characters: "\u{27}", + }); + } + + if first_char == 'a' && try_read("ring") { + return Some(CharRef { + name: "ring", + characters: "\u{e5}", + }); + } + + if first_char == 'a' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{1d4b6}", + }); + } + + if first_char == 'a' && try_read("uml;") { + return Some(CharRef { + name: "uml;", + characters: "\u{e4}", + }); + } + + if first_char == 'b' && try_read("Not;") { + return Some(CharRef { + name: "Not;", + characters: "\u{2aed}", + }); + } + + if first_char == 'b' && try_read("brk;") { + return Some(CharRef { + name: "brk;", + characters: "\u{23b5}", + }); + } + + if first_char == 'b' && try_read("eta;") { + return Some(CharRef { + name: "eta;", + characters: "\u{3b2}", + }); + } + + if first_char == 'b' && try_read("eth;") { + return Some(CharRef { + name: "eth;", + characters: "\u{2136}", + }); + } + + if first_char == 'b' && try_read("not;") { + return Some(CharRef { + name: "not;", + characters: "\u{2310}", + }); + } + + if first_char == 'b' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{1d553}", + }); + } + + if first_char == 'b' && try_read("oxH;") { + return Some(CharRef { + name: "oxH;", + characters: "\u{2550}", + }); + } + + if first_char == 'b' && try_read("oxV;") { + return Some(CharRef { + name: "oxV;", + characters: "\u{2551}", + }); + } + + if first_char == 'b' && try_read("oxh;") { + return Some(CharRef { + name: "oxh;", + characters: "\u{2500}", + }); + } + + if first_char == 'b' && try_read("oxv;") { + return Some(CharRef { + name: "oxv;", + characters: "\u{2502}", + }); + } + + if first_char == 'b' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{1d4b7}", + }); + } + + if first_char == 'b' && try_read("sim;") { + return Some(CharRef { + name: "sim;", + characters: "\u{223d}", + }); + } + + if first_char == 'b' && try_read("sol;") { + return Some(CharRef { + name: "sol;", + characters: "\u{5c}", + }); + } + + if first_char == 'b' && try_read("ull;") { + return Some(CharRef { + name: "ull;", + characters: "\u{2022}", + }); + } + + if first_char == 'b' && try_read("ump;") { + return Some(CharRef { + name: "ump;", + characters: "\u{224e}", + }); + } + + if first_char == 'c' && try_read("aps;") { + return Some(CharRef { + name: "aps;", + characters: "\u{2229}\u{fe00}", + }); + } + + if first_char == 'c' && try_read("dot;") { + return Some(CharRef { + name: "dot;", + characters: "\u{10b}", + }); + } + + if first_char == 'c' && try_read("edil") { + return Some(CharRef { + name: "edil", + characters: "\u{b8}", + }); + } + + if first_char == 'c' && try_read("ent;") { + return Some(CharRef { + name: "ent;", + characters: "\u{a2}", + }); + } + + if first_char == 'c' && try_read("hcy;") { + return Some(CharRef { + name: "hcy;", + characters: "\u{447}", + }); + } + + if first_char == 'c' && try_read("irE;") { + return Some(CharRef { + name: "irE;", + characters: "\u{29c3}", + }); + } + + if first_char == 'c' && try_read("irc;") { + return Some(CharRef { + name: "irc;", + characters: "\u{2c6}", + }); + } + + if first_char == 'c' && try_read("ire;") { + return Some(CharRef { + name: "ire;", + characters: "\u{2257}", + }); + } + + if first_char == 'c' && try_read("omp;") { + return Some(CharRef { + name: "omp;", + characters: "\u{2201}", + }); + } + + if first_char == 'c' && try_read("ong;") { + return Some(CharRef { + name: "ong;", + characters: "\u{2245}", + }); + } + + if first_char == 'c' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{1d554}", + }); + } + + if first_char == 'c' && try_read("opy;") { + return Some(CharRef { + name: "opy;", + characters: "\u{a9}", + }); + } + + if first_char == 'c' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{1d4b8}", + }); + } + + if first_char == 'c' && try_read("sub;") { + return Some(CharRef { + name: "sub;", + characters: "\u{2acf}", + }); + } + + if first_char == 'c' && try_read("sup;") { + return Some(CharRef { + name: "sup;", + characters: "\u{2ad0}", + }); + } + + if first_char == 'c' && try_read("ups;") { + return Some(CharRef { + name: "ups;", + characters: "\u{222a}\u{fe00}", + }); + } + + if first_char == 'd' && try_read("Arr;") { + return Some(CharRef { + name: "Arr;", + characters: "\u{21d3}", + }); + } + + if first_char == 'd' && try_read("Har;") { + return Some(CharRef { + name: "Har;", + characters: "\u{2965}", + }); + } + + if first_char == 'd' && try_read("arr;") { + return Some(CharRef { + name: "arr;", + characters: "\u{2193}", + }); + } + + if first_char == 'd' && try_read("ash;") { + return Some(CharRef { + name: "ash;", + characters: "\u{2010}", + }); + } + + if first_char == 'd' && try_read("iam;") { + return Some(CharRef { + name: "iam;", + characters: "\u{22c4}", + }); + } + + if first_char == 'd' && try_read("jcy;") { + return Some(CharRef { + name: "jcy;", + characters: "\u{452}", + }); + } + + if first_char == 'd' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{1d555}", + }); + } + + if first_char == 'd' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{1d4b9}", + }); + } + + if first_char == 'd' && try_read("scy;") { + return Some(CharRef { + name: "scy;", + characters: "\u{455}", + }); + } + + if first_char == 'd' && try_read("sol;") { + return Some(CharRef { + name: "sol;", + characters: "\u{29f6}", + }); + } + + if first_char == 'd' && try_read("tri;") { + return Some(CharRef { + name: "tri;", + characters: "\u{25bf}", + }); + } + + if first_char == 'd' && try_read("zcy;") { + return Some(CharRef { + name: "zcy;", + characters: "\u{45f}", + }); + } + + if first_char == 'e' && try_read("Dot;") { + return Some(CharRef { + name: "Dot;", + characters: "\u{2251}", + }); + } + + if first_char == 'e' && try_read("cir;") { + return Some(CharRef { + name: "cir;", + characters: "\u{2256}", + }); + } + + if first_char == 'e' && try_read("circ") { + return Some(CharRef { + name: "circ", + characters: "\u{ea}", + }); + } + + if first_char == 'e' && try_read("dot;") { + return Some(CharRef { + name: "dot;", + characters: "\u{117}", + }); + } + + if first_char == 'e' && try_read("msp;") { + return Some(CharRef { + name: "msp;", + characters: "\u{2003}", + }); + } + + if first_char == 'e' && try_read("nsp;") { + return Some(CharRef { + name: "nsp;", + characters: "\u{2002}", + }); + } + + if first_char == 'e' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{1d556}", + }); + } + + if first_char == 'e' && try_read("par;") { + return Some(CharRef { + name: "par;", + characters: "\u{22d5}", + }); + } + + if first_char == 'e' && try_read("psi;") { + return Some(CharRef { + name: "psi;", + characters: "\u{3b5}", + }); + } + + if first_char == 'e' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{212f}", + }); + } + + if first_char == 'e' && try_read("sim;") { + return Some(CharRef { + name: "sim;", + characters: "\u{2242}", + }); + } + + if first_char == 'e' && try_read("uml;") { + return Some(CharRef { + name: "uml;", + characters: "\u{eb}", + }); + } + + if first_char == 'e' && try_read("uro;") { + return Some(CharRef { + name: "uro;", + characters: "\u{20ac}", + }); + } + + if first_char == 'e' && try_read("xcl;") { + return Some(CharRef { + name: "xcl;", + characters: "\u{21}", + }); + } + + if first_char == 'f' && try_read("lat;") { + return Some(CharRef { + name: "lat;", + characters: "\u{266d}", + }); + } + + if first_char == 'f' && try_read("nof;") { + return Some(CharRef { + name: "nof;", + characters: "\u{192}", + }); + } + + if first_char == 'f' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{1d557}", + }); + } + + if first_char == 'f' && try_read("ork;") { + return Some(CharRef { + name: "ork;", + characters: "\u{22d4}", + }); + } + + if first_char == 'f' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{1d4bb}", + }); + } + + if first_char == 'g' && try_read("dot;") { + return Some(CharRef { + name: "dot;", + characters: "\u{121}", + }); + } + + if first_char == 'g' && try_read("eqq;") { + return Some(CharRef { + name: "eqq;", + characters: "\u{2267}", + }); + } + + if first_char == 'g' && try_read("esl;") { + return Some(CharRef { + name: "esl;", + characters: "\u{22db}\u{fe00}", + }); + } + + if first_char == 'g' && try_read("jcy;") { + return Some(CharRef { + name: "jcy;", + characters: "\u{453}", + }); + } + + if first_char == 'g' && try_read("nap;") { + return Some(CharRef { + name: "nap;", + characters: "\u{2a8a}", + }); + } + + if first_char == 'g' && try_read("neq;") { + return Some(CharRef { + name: "neq;", + characters: "\u{2a88}", + }); + } + + if first_char == 'g' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{1d558}", + }); + } + + if first_char == 'g' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{210a}", + }); + } + + if first_char == 'g' && try_read("sim;") { + return Some(CharRef { + name: "sim;", + characters: "\u{2273}", + }); + } + + if first_char == 'g' && try_read("tcc;") { + return Some(CharRef { + name: "tcc;", + characters: "\u{2aa7}", + }); + } + + if first_char == 'g' && try_read("vnE;") { + return Some(CharRef { + name: "vnE;", + characters: "\u{2269}\u{fe00}", + }); + } + + if first_char == 'h' && try_read("Arr;") { + return Some(CharRef { + name: "Arr;", + characters: "\u{21d4}", + }); + } + + if first_char == 'h' && try_read("alf;") { + return Some(CharRef { + name: "alf;", + characters: "\u{bd}", + }); + } + + if first_char == 'h' && try_read("arr;") { + return Some(CharRef { + name: "arr;", + characters: "\u{2194}", + }); + } + + if first_char == 'h' && try_read("bar;") { + return Some(CharRef { + name: "bar;", + characters: "\u{210f}", + }); + } + + if first_char == 'h' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{1d559}", + }); + } + + if first_char == 'h' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{1d4bd}", + }); + } + + if first_char == 'i' && try_read("circ") { + return Some(CharRef { + name: "circ", + characters: "\u{ee}", + }); + } + + if first_char == 'i' && try_read("ecy;") { + return Some(CharRef { + name: "ecy;", + characters: "\u{435}", + }); + } + + if first_char == 'i' && try_read("excl") { + return Some(CharRef { + name: "excl", + characters: "\u{a1}", + }); + } + + if first_char == 'i' && try_read("mof;") { + return Some(CharRef { + name: "mof;", + characters: "\u{22b7}", + }); + } + + if first_char == 'i' && try_read("ocy;") { + return Some(CharRef { + name: "ocy;", + characters: "\u{451}", + }); + } + + if first_char == 'i' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{1d55a}", + }); + } + + if first_char == 'i' && try_read("ota;") { + return Some(CharRef { + name: "ota;", + characters: "\u{3b9}", + }); + } + + if first_char == 'i' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{1d4be}", + }); + } + + if first_char == 'i' && try_read("sin;") { + return Some(CharRef { + name: "sin;", + characters: "\u{2208}", + }); + } + + if first_char == 'i' && try_read("uml;") { + return Some(CharRef { + name: "uml;", + characters: "\u{ef}", + }); + } + + if first_char == 'j' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{1d55b}", + }); + } + + if first_char == 'j' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{1d4bf}", + }); + } + + if first_char == 'k' && try_read("hcy;") { + return Some(CharRef { + name: "hcy;", + characters: "\u{445}", + }); + } + + if first_char == 'k' && try_read("jcy;") { + return Some(CharRef { + name: "jcy;", + characters: "\u{45c}", + }); + } + + if first_char == 'k' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{1d55c}", + }); + } + + if first_char == 'k' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{1d4c0}", + }); + } + + if first_char == 'l' && try_read("Arr;") { + return Some(CharRef { + name: "Arr;", + characters: "\u{21d0}", + }); + } + + if first_char == 'l' && try_read("Har;") { + return Some(CharRef { + name: "Har;", + characters: "\u{2962}", + }); + } + + if first_char == 'l' && try_read("ang;") { + return Some(CharRef { + name: "ang;", + characters: "\u{27e8}", + }); + } + + if first_char == 'l' && try_read("aquo") { + return Some(CharRef { + name: "aquo", + characters: "\u{ab}", + }); + } + + if first_char == 'l' && try_read("arr;") { + return Some(CharRef { + name: "arr;", + characters: "\u{2190}", + }); + } + + if first_char == 'l' && try_read("ate;") { + return Some(CharRef { + name: "ate;", + characters: "\u{2aad}", + }); + } + + if first_char == 'l' && try_read("cub;") { + return Some(CharRef { + name: "cub;", + characters: "\u{7b}", + }); + } + + if first_char == 'l' && try_read("dca;") { + return Some(CharRef { + name: "dca;", + characters: "\u{2936}", + }); + } + + if first_char == 'l' && try_read("dsh;") { + return Some(CharRef { + name: "dsh;", + characters: "\u{21b2}", + }); + } + + if first_char == 'l' && try_read("eqq;") { + return Some(CharRef { + name: "eqq;", + characters: "\u{2266}", + }); + } + + if first_char == 'l' && try_read("esg;") { + return Some(CharRef { + name: "esg;", + characters: "\u{22da}\u{fe00}", + }); + } + + if first_char == 'l' && try_read("jcy;") { + return Some(CharRef { + name: "jcy;", + characters: "\u{459}", + }); + } + + if first_char == 'l' && try_read("nap;") { + return Some(CharRef { + name: "nap;", + characters: "\u{2a89}", + }); + } + + if first_char == 'l' && try_read("neq;") { + return Some(CharRef { + name: "neq;", + characters: "\u{2a87}", + }); + } + + if first_char == 'l' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{1d55d}", + }); + } + + if first_char == 'l' && try_read("ozf;") { + return Some(CharRef { + name: "ozf;", + characters: "\u{29eb}", + }); + } + + if first_char == 'l' && try_read("par;") { + return Some(CharRef { + name: "par;", + characters: "\u{28}", + }); + } + + if first_char == 'l' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{1d4c1}", + }); + } + + if first_char == 'l' && try_read("sim;") { + return Some(CharRef { + name: "sim;", + characters: "\u{2272}", + }); + } + + if first_char == 'l' && try_read("sqb;") { + return Some(CharRef { + name: "sqb;", + characters: "\u{5b}", + }); + } + + if first_char == 'l' && try_read("tcc;") { + return Some(CharRef { + name: "tcc;", + characters: "\u{2aa6}", + }); + } + + if first_char == 'l' && try_read("tri;") { + return Some(CharRef { + name: "tri;", + characters: "\u{25c3}", + }); + } + + if first_char == 'l' && try_read("vnE;") { + return Some(CharRef { + name: "vnE;", + characters: "\u{2268}\u{fe00}", + }); + } + + if first_char == 'm' && try_read("acr;") { + return Some(CharRef { + name: "acr;", + characters: "\u{af}", + }); + } + + if first_char == 'm' && try_read("ale;") { + return Some(CharRef { + name: "ale;", + characters: "\u{2642}", + }); + } + + if first_char == 'm' && try_read("alt;") { + return Some(CharRef { + name: "alt;", + characters: "\u{2720}", + }); + } + + if first_char == 'm' && try_read("icro") { + return Some(CharRef { + name: "icro", + characters: "\u{b5}", + }); + } + + if first_char == 'm' && try_read("lcp;") { + return Some(CharRef { + name: "lcp;", + characters: "\u{2adb}", + }); + } + + if first_char == 'm' && try_read("ldr;") { + return Some(CharRef { + name: "ldr;", + characters: "\u{2026}", + }); + } + + if first_char == 'm' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{1d55e}", + }); + } + + if first_char == 'm' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{1d4c2}", + }); + } + + if first_char == 'n' && try_read("Gtv;") { + return Some(CharRef { + name: "Gtv;", + characters: "\u{226b}\u{338}", + }); + } + + if first_char == 'n' && try_read("Ltv;") { + return Some(CharRef { + name: "Ltv;", + characters: "\u{226a}\u{338}", + }); + } + + if first_char == 'n' && try_read("ang;") { + return Some(CharRef { + name: "ang;", + characters: "\u{2220}\u{20d2}", + }); + } + + if first_char == 'n' && try_read("apE;") { + return Some(CharRef { + name: "apE;", + characters: "\u{2a70}\u{338}", + }); + } + + if first_char == 'n' && try_read("bsp;") { + return Some(CharRef { + name: "bsp;", + characters: "\u{a0}", + }); + } + + if first_char == 'n' && try_read("cap;") { + return Some(CharRef { + name: "cap;", + characters: "\u{2a43}", + }); + } + + if first_char == 'n' && try_read("cup;") { + return Some(CharRef { + name: "cup;", + characters: "\u{2a42}", + }); + } + + if first_char == 'n' && try_read("geq;") { + return Some(CharRef { + name: "geq;", + characters: "\u{2271}", + }); + } + + if first_char == 'n' && try_read("ges;") { + return Some(CharRef { + name: "ges;", + characters: "\u{2a7e}\u{338}", + }); + } + + if first_char == 'n' && try_read("gtr;") { + return Some(CharRef { + name: "gtr;", + characters: "\u{226f}", + }); + } + + if first_char == 'n' && try_read("isd;") { + return Some(CharRef { + name: "isd;", + characters: "\u{22fa}", + }); + } + + if first_char == 'n' && try_read("jcy;") { + return Some(CharRef { + name: "jcy;", + characters: "\u{45a}", + }); + } + + if first_char == 'n' && try_read("ldr;") { + return Some(CharRef { + name: "ldr;", + characters: "\u{2025}", + }); + } + + if first_char == 'n' && try_read("leq;") { + return Some(CharRef { + name: "leq;", + characters: "\u{2270}", + }); + } + + if first_char == 'n' && try_read("les;") { + return Some(CharRef { + name: "les;", + characters: "\u{2a7d}\u{338}", + }); + } + + if first_char == 'n' && try_read("mid;") { + return Some(CharRef { + name: "mid;", + characters: "\u{2224}", + }); + } + + if first_char == 'n' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{1d55f}", + }); + } + + if first_char == 'n' && try_read("par;") { + return Some(CharRef { + name: "par;", + characters: "\u{2226}", + }); + } + + if first_char == 'n' && try_read("pre;") { + return Some(CharRef { + name: "pre;", + characters: "\u{2aaf}\u{338}", + }); + } + + if first_char == 'n' && try_read("sce;") { + return Some(CharRef { + name: "sce;", + characters: "\u{2ab0}\u{338}", + }); + } + + if first_char == 'n' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{1d4c3}", + }); + } + + if first_char == 'n' && try_read("sim;") { + return Some(CharRef { + name: "sim;", + characters: "\u{2241}", + }); + } + + if first_char == 'n' && try_read("sub;") { + return Some(CharRef { + name: "sub;", + characters: "\u{2284}", + }); + } + + if first_char == 'n' && try_read("sup;") { + return Some(CharRef { + name: "sup;", + characters: "\u{2285}", + }); + } + + if first_char == 'n' && try_read("tgl;") { + return Some(CharRef { + name: "tgl;", + characters: "\u{2279}", + }); + } + + if first_char == 'n' && try_read("tlg;") { + return Some(CharRef { + name: "tlg;", + characters: "\u{2278}", + }); + } + + if first_char == 'n' && try_read("vap;") { + return Some(CharRef { + name: "vap;", + characters: "\u{224d}\u{20d2}", + }); + } + + if first_char == 'n' && try_read("vge;") { + return Some(CharRef { + name: "vge;", + characters: "\u{2265}\u{20d2}", + }); + } + + if first_char == 'n' && try_read("vgt;") { + return Some(CharRef { + name: "vgt;", + characters: "\u{3e}\u{20d2}", + }); + } + + if first_char == 'n' && try_read("vle;") { + return Some(CharRef { + name: "vle;", + characters: "\u{2264}\u{20d2}", + }); + } + + if first_char == 'n' && try_read("vlt;") { + return Some(CharRef { + name: "vlt;", + characters: "\u{3c}\u{20d2}", + }); + } + + if first_char == 'o' && try_read("ast;") { + return Some(CharRef { + name: "ast;", + characters: "\u{229b}", + }); + } + + if first_char == 'o' && try_read("cir;") { + return Some(CharRef { + name: "cir;", + characters: "\u{229a}", + }); + } + + if first_char == 'o' && try_read("circ") { + return Some(CharRef { + name: "circ", + characters: "\u{f4}", + }); + } + + if first_char == 'o' && try_read("div;") { + return Some(CharRef { + name: "div;", + characters: "\u{2a38}", + }); + } + + if first_char == 'o' && try_read("dot;") { + return Some(CharRef { + name: "dot;", + characters: "\u{2299}", + }); + } + + if first_char == 'o' && try_read("gon;") { + return Some(CharRef { + name: "gon;", + characters: "\u{2db}", + }); + } + + if first_char == 'o' && try_read("int;") { + return Some(CharRef { + name: "int;", + characters: "\u{222e}", + }); + } + + if first_char == 'o' && try_read("mid;") { + return Some(CharRef { + name: "mid;", + characters: "\u{29b6}", + }); + } + + if first_char == 'o' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{1d560}", + }); + } + + if first_char == 'o' && try_read("par;") { + return Some(CharRef { + name: "par;", + characters: "\u{29b7}", + }); + } + + if first_char == 'o' && try_read("rdf;") { + return Some(CharRef { + name: "rdf;", + characters: "\u{aa}", + }); + } + + if first_char == 'o' && try_read("rdm;") { + return Some(CharRef { + name: "rdm;", + characters: "\u{ba}", + }); + } + + if first_char == 'o' && try_read("ror;") { + return Some(CharRef { + name: "ror;", + characters: "\u{2a56}", + }); + } + + if first_char == 'o' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{2134}", + }); + } + + if first_char == 'o' && try_read("sol;") { + return Some(CharRef { + name: "sol;", + characters: "\u{2298}", + }); + } + + if first_char == 'o' && try_read("uml;") { + return Some(CharRef { + name: "uml;", + characters: "\u{f6}", + }); + } + + if first_char == 'p' && try_read("ara;") { + return Some(CharRef { + name: "ara;", + characters: "\u{b6}", + }); + } + + if first_char == 'p' && try_read("art;") { + return Some(CharRef { + name: "art;", + characters: "\u{2202}", + }); + } + + if first_char == 'p' && try_read("erp;") { + return Some(CharRef { + name: "erp;", + characters: "\u{22a5}", + }); + } + + if first_char == 'p' && try_read("hiv;") { + return Some(CharRef { + name: "hiv;", + characters: "\u{3d5}", + }); + } + + if first_char == 'p' && try_read("lus;") { + return Some(CharRef { + name: "lus;", + characters: "\u{2b}", + }); + } + + if first_char == 'p' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{1d561}", + }); + } + + if first_char == 'p' && try_read("ound") { + return Some(CharRef { + name: "ound", + characters: "\u{a3}", + }); + } + + if first_char == 'p' && try_read("rap;") { + return Some(CharRef { + name: "rap;", + characters: "\u{2ab7}", + }); + } + + if first_char == 'p' && try_read("rec;") { + return Some(CharRef { + name: "rec;", + characters: "\u{227a}", + }); + } + + if first_char == 'p' && try_read("rnE;") { + return Some(CharRef { + name: "rnE;", + characters: "\u{2ab5}", + }); + } + + if first_char == 'p' && try_read("rod;") { + return Some(CharRef { + name: "rod;", + characters: "\u{220f}", + }); + } + + if first_char == 'p' && try_read("rop;") { + return Some(CharRef { + name: "rop;", + characters: "\u{221d}", + }); + } + + if first_char == 'p' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{1d4c5}", + }); + } + + if first_char == 'q' && try_read("int;") { + return Some(CharRef { + name: "int;", + characters: "\u{2a0c}", + }); + } + + if first_char == 'q' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{1d562}", + }); + } + + if first_char == 'q' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{1d4c6}", + }); + } + + if first_char == 'q' && try_read("uot;") { + return Some(CharRef { + name: "uot;", + characters: "\u{22}", + }); + } + + if first_char == 'r' && try_read("Arr;") { + return Some(CharRef { + name: "Arr;", + characters: "\u{21d2}", + }); + } + + if first_char == 'r' && try_read("Har;") { + return Some(CharRef { + name: "Har;", + characters: "\u{2964}", + }); + } + + if first_char == 'r' && try_read("ace;") { + return Some(CharRef { + name: "ace;", + characters: "\u{223d}\u{331}", + }); + } + + if first_char == 'r' && try_read("ang;") { + return Some(CharRef { + name: "ang;", + characters: "\u{27e9}", + }); + } + + if first_char == 'r' && try_read("aquo") { + return Some(CharRef { + name: "aquo", + characters: "\u{bb}", + }); + } + + if first_char == 'r' && try_read("arr;") { + return Some(CharRef { + name: "arr;", + characters: "\u{2192}", + }); + } + + if first_char == 'r' && try_read("cub;") { + return Some(CharRef { + name: "cub;", + characters: "\u{7d}", + }); + } + + if first_char == 'r' && try_read("dca;") { + return Some(CharRef { + name: "dca;", + characters: "\u{2937}", + }); + } + + if first_char == 'r' && try_read("dsh;") { + return Some(CharRef { + name: "dsh;", + characters: "\u{21b3}", + }); + } + + if first_char == 'r' && try_read("eal;") { + return Some(CharRef { + name: "eal;", + characters: "\u{211c}", + }); + } + + if first_char == 'r' && try_read("ect;") { + return Some(CharRef { + name: "ect;", + characters: "\u{25ad}", + }); + } + + if first_char == 'r' && try_read("hov;") { + return Some(CharRef { + name: "hov;", + characters: "\u{3f1}", + }); + } + + if first_char == 'r' && try_read("ing;") { + return Some(CharRef { + name: "ing;", + characters: "\u{2da}", + }); + } + + if first_char == 'r' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{1d563}", + }); + } + + if first_char == 'r' && try_read("par;") { + return Some(CharRef { + name: "par;", + characters: "\u{29}", + }); + } + + if first_char == 'r' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{1d4c7}", + }); + } + + if first_char == 'r' && try_read("sqb;") { + return Some(CharRef { + name: "sqb;", + characters: "\u{5d}", + }); + } + + if first_char == 'r' && try_read("tri;") { + return Some(CharRef { + name: "tri;", + characters: "\u{25b9}", + }); + } + + if first_char == 's' && try_read("cap;") { + return Some(CharRef { + name: "cap;", + characters: "\u{2ab8}", + }); + } + + if first_char == 's' && try_read("cnE;") { + return Some(CharRef { + name: "cnE;", + characters: "\u{2ab6}", + }); + } + + if first_char == 's' && try_read("dot;") { + return Some(CharRef { + name: "dot;", + characters: "\u{22c5}", + }); + } + + if first_char == 's' && try_read("ect;") { + return Some(CharRef { + name: "ect;", + characters: "\u{a7}", + }); + } + + if first_char == 's' && try_read("emi;") { + return Some(CharRef { + name: "emi;", + characters: "\u{3b}", + }); + } + + if first_char == 's' && try_read("ext;") { + return Some(CharRef { + name: "ext;", + characters: "\u{2736}", + }); + } + + if first_char == 's' && try_read("hcy;") { + return Some(CharRef { + name: "hcy;", + characters: "\u{448}", + }); + } + + if first_char == 's' && try_read("ime;") { + return Some(CharRef { + name: "ime;", + characters: "\u{2243}", + }); + } + + if first_char == 's' && try_read("img;") { + return Some(CharRef { + name: "img;", + characters: "\u{2a9e}", + }); + } + + if first_char == 's' && try_read("iml;") { + return Some(CharRef { + name: "iml;", + characters: "\u{2a9d}", + }); + } + + if first_char == 's' && try_read("mid;") { + return Some(CharRef { + name: "mid;", + characters: "\u{2223}", + }); + } + + if first_char == 's' && try_read("mte;") { + return Some(CharRef { + name: "mte;", + characters: "\u{2aac}", + }); + } + + if first_char == 's' && try_read("olb;") { + return Some(CharRef { + name: "olb;", + characters: "\u{29c4}", + }); + } + + if first_char == 's' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{1d564}", + }); + } + + if first_char == 's' && try_read("par;") { + return Some(CharRef { + name: "par;", + characters: "\u{2225}", + }); + } + + if first_char == 's' && try_read("quf;") { + return Some(CharRef { + name: "quf;", + characters: "\u{25aa}", + }); + } + + if first_char == 's' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{1d4c8}", + }); + } + + if first_char == 's' && try_read("tar;") { + return Some(CharRef { + name: "tar;", + characters: "\u{2606}", + }); + } + + if first_char == 's' && try_read("ubE;") { + return Some(CharRef { + name: "ubE;", + characters: "\u{2ac5}", + }); + } + + if first_char == 's' && try_read("ube;") { + return Some(CharRef { + name: "ube;", + characters: "\u{2286}", + }); + } + + if first_char == 's' && try_read("ucc;") { + return Some(CharRef { + name: "ucc;", + characters: "\u{227b}", + }); + } + + if first_char == 's' && try_read("ung;") { + return Some(CharRef { + name: "ung;", + characters: "\u{266a}", + }); + } + + if first_char == 's' && try_read("up1;") { + return Some(CharRef { + name: "up1;", + characters: "\u{b9}", + }); + } + + if first_char == 's' && try_read("up2;") { + return Some(CharRef { + name: "up2;", + characters: "\u{b2}", + }); + } + + if first_char == 's' && try_read("up3;") { + return Some(CharRef { + name: "up3;", + characters: "\u{b3}", + }); + } + + if first_char == 's' && try_read("upE;") { + return Some(CharRef { + name: "upE;", + characters: "\u{2ac6}", + }); + } + + if first_char == 's' && try_read("upe;") { + return Some(CharRef { + name: "upe;", + characters: "\u{2287}", + }); + } + + if first_char == 's' && try_read("zlig") { + return Some(CharRef { + name: "zlig", + characters: "\u{df}", + }); + } + + if first_char == 't' && try_read("brk;") { + return Some(CharRef { + name: "brk;", + characters: "\u{23b4}", + }); + } + + if first_char == 't' && try_read("dot;") { + return Some(CharRef { + name: "dot;", + characters: "\u{20db}", + }); + } + + if first_char == 't' && try_read("horn") { + return Some(CharRef { + name: "horn", + characters: "\u{fe}", + }); + } + + if first_char == 't' && try_read("imes") { + return Some(CharRef { + name: "imes", + characters: "\u{d7}", + }); + } + + if first_char == 't' && try_read("int;") { + return Some(CharRef { + name: "int;", + characters: "\u{222d}", + }); + } + + if first_char == 't' && try_read("oea;") { + return Some(CharRef { + name: "oea;", + characters: "\u{2928}", + }); + } + + if first_char == 't' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{1d565}", + }); + } + + if first_char == 't' && try_read("osa;") { + return Some(CharRef { + name: "osa;", + characters: "\u{2929}", + }); + } + + if first_char == 't' && try_read("rie;") { + return Some(CharRef { + name: "rie;", + characters: "\u{225c}", + }); + } + + if first_char == 't' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{1d4c9}", + }); + } + + if first_char == 't' && try_read("scy;") { + return Some(CharRef { + name: "scy;", + characters: "\u{446}", + }); + } + + if first_char == 'u' && try_read("Arr;") { + return Some(CharRef { + name: "Arr;", + characters: "\u{21d1}", + }); + } + + if first_char == 'u' && try_read("Har;") { + return Some(CharRef { + name: "Har;", + characters: "\u{2963}", + }); + } + + if first_char == 'u' && try_read("arr;") { + return Some(CharRef { + name: "arr;", + characters: "\u{2191}", + }); + } + + if first_char == 'u' && try_read("circ") { + return Some(CharRef { + name: "circ", + characters: "\u{fb}", + }); + } + + if first_char == 'u' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{1d566}", + }); + } + + if first_char == 'u' && try_read("psi;") { + return Some(CharRef { + name: "psi;", + characters: "\u{3c5}", + }); + } + + if first_char == 'u' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{1d4ca}", + }); + } + + if first_char == 'u' && try_read("tri;") { + return Some(CharRef { + name: "tri;", + characters: "\u{25b5}", + }); + } + + if first_char == 'u' && try_read("uml;") { + return Some(CharRef { + name: "uml;", + characters: "\u{fc}", + }); + } + + if first_char == 'v' && try_read("Arr;") { + return Some(CharRef { + name: "Arr;", + characters: "\u{21d5}", + }); + } + + if first_char == 'v' && try_read("Bar;") { + return Some(CharRef { + name: "Bar;", + characters: "\u{2ae8}", + }); + } + + if first_char == 'v' && try_read("arr;") { + return Some(CharRef { + name: "arr;", + characters: "\u{2195}", + }); + } + + if first_char == 'v' && try_read("ert;") { + return Some(CharRef { + name: "ert;", + characters: "\u{7c}", + }); + } + + if first_char == 'v' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{1d567}", + }); + } + + if first_char == 'v' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{1d4cb}", + }); + } + + if first_char == 'w' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{1d568}", + }); + } + + if first_char == 'w' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{1d4cc}", + }); + } + + if first_char == 'x' && try_read("cap;") { + return Some(CharRef { + name: "cap;", + characters: "\u{22c2}", + }); + } + + if first_char == 'x' && try_read("cup;") { + return Some(CharRef { + name: "cup;", + characters: "\u{22c3}", + }); + } + + if first_char == 'x' && try_read("map;") { + return Some(CharRef { + name: "map;", + characters: "\u{27fc}", + }); + } + + if first_char == 'x' && try_read("nis;") { + return Some(CharRef { + name: "nis;", + characters: "\u{22fb}", + }); + } + + if first_char == 'x' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{1d569}", + }); + } + + if first_char == 'x' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{1d4cd}", + }); + } + + if first_char == 'x' && try_read("vee;") { + return Some(CharRef { + name: "vee;", + characters: "\u{22c1}", + }); + } + + if first_char == 'y' && try_read("acy;") { + return Some(CharRef { + name: "acy;", + characters: "\u{44f}", + }); + } + + if first_char == 'y' && try_read("icy;") { + return Some(CharRef { + name: "icy;", + characters: "\u{457}", + }); + } + + if first_char == 'y' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{1d56a}", + }); + } + + if first_char == 'y' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{1d4ce}", + }); + } + + if first_char == 'y' && try_read("ucy;") { + return Some(CharRef { + name: "ucy;", + characters: "\u{44e}", + }); + } + + if first_char == 'y' && try_read("uml;") { + return Some(CharRef { + name: "uml;", + characters: "\u{ff}", + }); + } + + if first_char == 'z' && try_read("dot;") { + return Some(CharRef { + name: "dot;", + characters: "\u{17c}", + }); + } + + if first_char == 'z' && try_read("eta;") { + return Some(CharRef { + name: "eta;", + characters: "\u{3b6}", + }); + } + + if first_char == 'z' && try_read("hcy;") { + return Some(CharRef { + name: "hcy;", + characters: "\u{436}", + }); + } + + if first_char == 'z' && try_read("opf;") { + return Some(CharRef { + name: "opf;", + characters: "\u{1d56b}", + }); + } + + if first_char == 'z' && try_read("scr;") { + return Some(CharRef { + name: "scr;", + characters: "\u{1d4cf}", + }); + } + + if first_char == 'z' && try_read("wnj;") { + return Some(CharRef { + name: "wnj;", + characters: "\u{200c}", + }); + } + + if first_char == 'A' && try_read("MP;") { + return Some(CharRef { + name: "MP;", + characters: "\u{26}", + }); + } + + if first_char == 'A' && try_read("cy;") { + return Some(CharRef { + name: "cy;", + characters: "\u{410}", + }); + } + + if first_char == 'A' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{1d504}", + }); + } + + if first_char == 'A' && try_read("nd;") { + return Some(CharRef { + name: "nd;", + characters: "\u{2a53}", + }); + } + + if first_char == 'A' && try_read("uml") { + return Some(CharRef { + name: "uml", + characters: "\u{c4}", + }); + } + + if first_char == 'B' && try_read("cy;") { + return Some(CharRef { + name: "cy;", + characters: "\u{411}", + }); + } + + if first_char == 'B' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{1d505}", + }); + } + + if first_char == 'C' && try_read("OPY") { + return Some(CharRef { + name: "OPY", + characters: "\u{a9}", + }); + } + + if first_char == 'C' && try_read("ap;") { + return Some(CharRef { + name: "ap;", + characters: "\u{22d2}", + }); + } + + if first_char == 'C' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{212d}", + }); + } + + if first_char == 'C' && try_read("hi;") { + return Some(CharRef { + name: "hi;", + characters: "\u{3a7}", + }); + } + + if first_char == 'C' && try_read("up;") { + return Some(CharRef { + name: "up;", + characters: "\u{22d3}", + }); + } + + if first_char == 'D' && try_read("cy;") { + return Some(CharRef { + name: "cy;", + characters: "\u{414}", + }); + } + + if first_char == 'D' && try_read("el;") { + return Some(CharRef { + name: "el;", + characters: "\u{2207}", + }); + } + + if first_char == 'D' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{1d507}", + }); + } + + if first_char == 'D' && try_read("ot;") { + return Some(CharRef { + name: "ot;", + characters: "\u{a8}", + }); + } + + if first_char == 'E' && try_read("NG;") { + return Some(CharRef { + name: "NG;", + characters: "\u{14a}", + }); + } + + if first_char == 'E' && try_read("TH;") { + return Some(CharRef { + name: "TH;", + characters: "\u{d0}", + }); + } + + if first_char == 'E' && try_read("cy;") { + return Some(CharRef { + name: "cy;", + characters: "\u{42d}", + }); + } + + if first_char == 'E' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{1d508}", + }); + } + + if first_char == 'E' && try_read("ta;") { + return Some(CharRef { + name: "ta;", + characters: "\u{397}", + }); + } + + if first_char == 'E' && try_read("uml") { + return Some(CharRef { + name: "uml", + characters: "\u{cb}", + }); + } + + if first_char == 'F' && try_read("cy;") { + return Some(CharRef { + name: "cy;", + characters: "\u{424}", + }); + } + + if first_char == 'F' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{1d509}", + }); + } + + if first_char == 'G' && try_read("cy;") { + return Some(CharRef { + name: "cy;", + characters: "\u{413}", + }); + } + + if first_char == 'G' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{1d50a}", + }); + } + + if first_char == 'H' && try_read("at;") { + return Some(CharRef { + name: "at;", + characters: "\u{5e}", + }); + } + + if first_char == 'H' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{210c}", + }); + } + + if first_char == 'I' && try_read("cy;") { + return Some(CharRef { + name: "cy;", + characters: "\u{418}", + }); + } + + if first_char == 'I' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{2111}", + }); + } + + if first_char == 'I' && try_read("nt;") { + return Some(CharRef { + name: "nt;", + characters: "\u{222c}", + }); + } + + if first_char == 'I' && try_read("uml") { + return Some(CharRef { + name: "uml", + characters: "\u{cf}", + }); + } + + if first_char == 'J' && try_read("cy;") { + return Some(CharRef { + name: "cy;", + characters: "\u{419}", + }); + } + + if first_char == 'J' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{1d50d}", + }); + } + + if first_char == 'K' && try_read("cy;") { + return Some(CharRef { + name: "cy;", + characters: "\u{41a}", + }); + } + + if first_char == 'K' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{1d50e}", + }); + } + + if first_char == 'L' && try_read("cy;") { + return Some(CharRef { + name: "cy;", + characters: "\u{41b}", + }); + } + + if first_char == 'L' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{1d50f}", + }); + } + + if first_char == 'L' && try_read("sh;") { + return Some(CharRef { + name: "sh;", + characters: "\u{21b0}", + }); + } + + if first_char == 'M' && try_read("ap;") { + return Some(CharRef { + name: "ap;", + characters: "\u{2905}", + }); + } + + if first_char == 'M' && try_read("cy;") { + return Some(CharRef { + name: "cy;", + characters: "\u{41c}", + }); + } + + if first_char == 'M' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{1d510}", + }); + } + + if first_char == 'N' && try_read("cy;") { + return Some(CharRef { + name: "cy;", + characters: "\u{41d}", + }); + } + + if first_char == 'N' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{1d511}", + }); + } + + if first_char == 'N' && try_read("ot;") { + return Some(CharRef { + name: "ot;", + characters: "\u{2aec}", + }); + } + + if first_char == 'O' && try_read("cy;") { + return Some(CharRef { + name: "cy;", + characters: "\u{41e}", + }); + } + + if first_char == 'O' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{1d512}", + }); + } + + if first_char == 'O' && try_read("uml") { + return Some(CharRef { + name: "uml", + characters: "\u{d6}", + }); + } + + if first_char == 'P' && try_read("cy;") { + return Some(CharRef { + name: "cy;", + characters: "\u{41f}", + }); + } + + if first_char == 'P' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{1d513}", + }); + } + + if first_char == 'P' && try_read("hi;") { + return Some(CharRef { + name: "hi;", + characters: "\u{3a6}", + }); + } + + if first_char == 'P' && try_read("si;") { + return Some(CharRef { + name: "si;", + characters: "\u{3a8}", + }); + } + + if first_char == 'Q' && try_read("UOT") { + return Some(CharRef { + name: "UOT", + characters: "\u{22}", + }); + } + + if first_char == 'Q' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{1d514}", + }); + } + + if first_char == 'R' && try_read("EG;") { + return Some(CharRef { + name: "EG;", + characters: "\u{ae}", + }); + } + + if first_char == 'R' && try_read("cy;") { + return Some(CharRef { + name: "cy;", + characters: "\u{420}", + }); + } + + if first_char == 'R' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{211c}", + }); + } + + if first_char == 'R' && try_read("ho;") { + return Some(CharRef { + name: "ho;", + characters: "\u{3a1}", + }); + } + + if first_char == 'R' && try_read("sh;") { + return Some(CharRef { + name: "sh;", + characters: "\u{21b1}", + }); + } + + if first_char == 'S' && try_read("cy;") { + return Some(CharRef { + name: "cy;", + characters: "\u{421}", + }); + } + + if first_char == 'S' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{1d516}", + }); + } + + if first_char == 'S' && try_read("ub;") { + return Some(CharRef { + name: "ub;", + characters: "\u{22d0}", + }); + } + + if first_char == 'S' && try_read("um;") { + return Some(CharRef { + name: "um;", + characters: "\u{2211}", + }); + } + + if first_char == 'S' && try_read("up;") { + return Some(CharRef { + name: "up;", + characters: "\u{22d1}", + }); + } + + if first_char == 'T' && try_read("ab;") { + return Some(CharRef { + name: "ab;", + characters: "\u{9}", + }); + } + + if first_char == 'T' && try_read("au;") { + return Some(CharRef { + name: "au;", + characters: "\u{3a4}", + }); + } + + if first_char == 'T' && try_read("cy;") { + return Some(CharRef { + name: "cy;", + characters: "\u{422}", + }); + } + + if first_char == 'T' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{1d517}", + }); + } + + if first_char == 'U' && try_read("cy;") { + return Some(CharRef { + name: "cy;", + characters: "\u{423}", + }); + } + + if first_char == 'U' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{1d518}", + }); + } + + if first_char == 'U' && try_read("uml") { + return Some(CharRef { + name: "uml", + characters: "\u{dc}", + }); + } + + if first_char == 'V' && try_read("cy;") { + return Some(CharRef { + name: "cy;", + characters: "\u{412}", + }); + } + + if first_char == 'V' && try_read("ee;") { + return Some(CharRef { + name: "ee;", + characters: "\u{22c1}", + }); + } + + if first_char == 'V' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{1d519}", + }); + } + + if first_char == 'W' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{1d51a}", + }); + } + + if first_char == 'X' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{1d51b}", + }); + } + + if first_char == 'Y' && try_read("cy;") { + return Some(CharRef { + name: "cy;", + characters: "\u{42b}", + }); + } + + if first_char == 'Y' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{1d51c}", + }); + } + + if first_char == 'Z' && try_read("cy;") { + return Some(CharRef { + name: "cy;", + characters: "\u{417}", + }); + } + + if first_char == 'Z' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{2128}", + }); + } + + if first_char == 'a' && try_read("cE;") { + return Some(CharRef { + name: "cE;", + characters: "\u{223e}\u{333}", + }); + } + + if first_char == 'a' && try_read("cd;") { + return Some(CharRef { + name: "cd;", + characters: "\u{223f}", + }); + } + + if first_char == 'a' && try_read("cy;") { + return Some(CharRef { + name: "cy;", + characters: "\u{430}", + }); + } + + if first_char == 'a' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{1d51e}", + }); + } + + if first_char == 'a' && try_read("mp;") { + return Some(CharRef { + name: "mp;", + characters: "\u{26}", + }); + } + + if first_char == 'a' && try_read("nd;") { + return Some(CharRef { + name: "nd;", + characters: "\u{2227}", + }); + } + + if first_char == 'a' && try_read("ng;") { + return Some(CharRef { + name: "ng;", + characters: "\u{2220}", + }); + } + + if first_char == 'a' && try_read("pE;") { + return Some(CharRef { + name: "pE;", + characters: "\u{2a70}", + }); + } + + if first_char == 'a' && try_read("pe;") { + return Some(CharRef { + name: "pe;", + characters: "\u{224a}", + }); + } + + if first_char == 'a' && try_read("st;") { + return Some(CharRef { + name: "st;", + characters: "\u{2a}", + }); + } + + if first_char == 'a' && try_read("uml") { + return Some(CharRef { + name: "uml", + characters: "\u{e4}", + }); + } + + if first_char == 'b' && try_read("cy;") { + return Some(CharRef { + name: "cy;", + characters: "\u{431}", + }); + } + + if first_char == 'b' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{1d51f}", + }); + } + + if first_char == 'b' && try_read("ne;") { + return Some(CharRef { + name: "ne;", + characters: "\u{3d}\u{20e5}", + }); + } + + if first_char == 'b' && try_read("ot;") { + return Some(CharRef { + name: "ot;", + characters: "\u{22a5}", + }); + } + + if first_char == 'c' && try_read("ap;") { + return Some(CharRef { + name: "ap;", + characters: "\u{2229}", + }); + } + + if first_char == 'c' && try_read("ent") { + return Some(CharRef { + name: "ent", + characters: "\u{a2}", + }); + } + + if first_char == 'c' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{1d520}", + }); + } + + if first_char == 'c' && try_read("hi;") { + return Some(CharRef { + name: "hi;", + characters: "\u{3c7}", + }); + } + + if first_char == 'c' && try_read("ir;") { + return Some(CharRef { + name: "ir;", + characters: "\u{25cb}", + }); + } + + if first_char == 'c' && try_read("opy") { + return Some(CharRef { + name: "opy", + characters: "\u{a9}", + }); + } + + if first_char == 'c' && try_read("up;") { + return Some(CharRef { + name: "up;", + characters: "\u{222a}", + }); + } + + if first_char == 'd' && try_read("cy;") { + return Some(CharRef { + name: "cy;", + characters: "\u{434}", + }); + } + + if first_char == 'd' && try_read("eg;") { + return Some(CharRef { + name: "eg;", + characters: "\u{b0}", + }); + } + + if first_char == 'd' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{1d521}", + }); + } + + if first_char == 'd' && try_read("ie;") { + return Some(CharRef { + name: "ie;", + characters: "\u{a8}", + }); + } + + if first_char == 'd' && try_read("iv;") { + return Some(CharRef { + name: "iv;", + characters: "\u{f7}", + }); + } + + if first_char == 'd' && try_read("ot;") { + return Some(CharRef { + name: "ot;", + characters: "\u{2d9}", + }); + } + + if first_char == 'e' && try_read("cy;") { + return Some(CharRef { + name: "cy;", + characters: "\u{44d}", + }); + } + + if first_char == 'e' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{1d522}", + }); + } + + if first_char == 'e' && try_read("gs;") { + return Some(CharRef { + name: "gs;", + characters: "\u{2a96}", + }); + } + + if first_char == 'e' && try_read("ll;") { + return Some(CharRef { + name: "ll;", + characters: "\u{2113}", + }); + } + + if first_char == 'e' && try_read("ls;") { + return Some(CharRef { + name: "ls;", + characters: "\u{2a95}", + }); + } + + if first_char == 'e' && try_read("ng;") { + return Some(CharRef { + name: "ng;", + characters: "\u{14b}", + }); + } + + if first_char == 'e' && try_read("ta;") { + return Some(CharRef { + name: "ta;", + characters: "\u{3b7}", + }); + } + + if first_char == 'e' && try_read("th;") { + return Some(CharRef { + name: "th;", + characters: "\u{f0}", + }); + } + + if first_char == 'e' && try_read("uml") { + return Some(CharRef { + name: "uml", + characters: "\u{eb}", + }); + } + + if first_char == 'f' && try_read("cy;") { + return Some(CharRef { + name: "cy;", + characters: "\u{444}", + }); + } + + if first_char == 'f' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{1d523}", + }); + } + + if first_char == 'g' && try_read("El;") { + return Some(CharRef { + name: "El;", + characters: "\u{2a8c}", + }); + } + + if first_char == 'g' && try_read("ap;") { + return Some(CharRef { + name: "ap;", + characters: "\u{2a86}", + }); + } + + if first_char == 'g' && try_read("cy;") { + return Some(CharRef { + name: "cy;", + characters: "\u{433}", + }); + } + + if first_char == 'g' && try_read("el;") { + return Some(CharRef { + name: "el;", + characters: "\u{22db}", + }); + } + + if first_char == 'g' && try_read("eq;") { + return Some(CharRef { + name: "eq;", + characters: "\u{2265}", + }); + } + + if first_char == 'g' && try_read("es;") { + return Some(CharRef { + name: "es;", + characters: "\u{2a7e}", + }); + } + + if first_char == 'g' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{1d524}", + }); + } + + if first_char == 'g' && try_read("gg;") { + return Some(CharRef { + name: "gg;", + characters: "\u{22d9}", + }); + } + + if first_char == 'g' && try_read("lE;") { + return Some(CharRef { + name: "lE;", + characters: "\u{2a92}", + }); + } + + if first_char == 'g' && try_read("la;") { + return Some(CharRef { + name: "la;", + characters: "\u{2aa5}", + }); + } + + if first_char == 'g' && try_read("lj;") { + return Some(CharRef { + name: "lj;", + characters: "\u{2aa4}", + }); + } + + if first_char == 'g' && try_read("nE;") { + return Some(CharRef { + name: "nE;", + characters: "\u{2269}", + }); + } + + if first_char == 'g' && try_read("ne;") { + return Some(CharRef { + name: "ne;", + characters: "\u{2a88}", + }); + } + + if first_char == 'h' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{1d525}", + }); + } + + if first_char == 'i' && try_read("cy;") { + return Some(CharRef { + name: "cy;", + characters: "\u{438}", + }); + } + + if first_char == 'i' && try_read("ff;") { + return Some(CharRef { + name: "ff;", + characters: "\u{21d4}", + }); + } + + if first_char == 'i' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{1d526}", + }); + } + + if first_char == 'i' && try_read("nt;") { + return Some(CharRef { + name: "nt;", + characters: "\u{222b}", + }); + } + + if first_char == 'i' && try_read("uml") { + return Some(CharRef { + name: "uml", + characters: "\u{ef}", + }); + } + + if first_char == 'j' && try_read("cy;") { + return Some(CharRef { + name: "cy;", + characters: "\u{439}", + }); + } + + if first_char == 'j' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{1d527}", + }); + } + + if first_char == 'k' && try_read("cy;") { + return Some(CharRef { + name: "cy;", + characters: "\u{43a}", + }); + } + + if first_char == 'k' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{1d528}", + }); + } + + if first_char == 'l' && try_read("Eg;") { + return Some(CharRef { + name: "Eg;", + characters: "\u{2a8b}", + }); + } + + if first_char == 'l' && try_read("ap;") { + return Some(CharRef { + name: "ap;", + characters: "\u{2a85}", + }); + } + + if first_char == 'l' && try_read("at;") { + return Some(CharRef { + name: "at;", + characters: "\u{2aab}", + }); + } + + if first_char == 'l' && try_read("cy;") { + return Some(CharRef { + name: "cy;", + characters: "\u{43b}", + }); + } + + if first_char == 'l' && try_read("eg;") { + return Some(CharRef { + name: "eg;", + characters: "\u{22da}", + }); + } + + if first_char == 'l' && try_read("eq;") { + return Some(CharRef { + name: "eq;", + characters: "\u{2264}", + }); + } + + if first_char == 'l' && try_read("es;") { + return Some(CharRef { + name: "es;", + characters: "\u{2a7d}", + }); + } + + if first_char == 'l' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{1d529}", + }); + } + + if first_char == 'l' && try_read("gE;") { + return Some(CharRef { + name: "gE;", + characters: "\u{2a91}", + }); + } + + if first_char == 'l' && try_read("nE;") { + return Some(CharRef { + name: "nE;", + characters: "\u{2268}", + }); + } + + if first_char == 'l' && try_read("ne;") { + return Some(CharRef { + name: "ne;", + characters: "\u{2a87}", + }); + } + + if first_char == 'l' && try_read("oz;") { + return Some(CharRef { + name: "oz;", + characters: "\u{25ca}", + }); + } + + if first_char == 'l' && try_read("rm;") { + return Some(CharRef { + name: "rm;", + characters: "\u{200e}", + }); + } + + if first_char == 'l' && try_read("sh;") { + return Some(CharRef { + name: "sh;", + characters: "\u{21b0}", + }); + } + + if first_char == 'm' && try_read("acr") { + return Some(CharRef { + name: "acr", + characters: "\u{af}", + }); + } + + if first_char == 'm' && try_read("ap;") { + return Some(CharRef { + name: "ap;", + characters: "\u{21a6}", + }); + } + + if first_char == 'm' && try_read("cy;") { + return Some(CharRef { + name: "cy;", + characters: "\u{43c}", + }); + } + + if first_char == 'm' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{1d52a}", + }); + } + + if first_char == 'm' && try_read("ho;") { + return Some(CharRef { + name: "ho;", + characters: "\u{2127}", + }); + } + + if first_char == 'm' && try_read("id;") { + return Some(CharRef { + name: "id;", + characters: "\u{2223}", + }); + } + + if first_char == 'n' && try_read("Gg;") { + return Some(CharRef { + name: "Gg;", + characters: "\u{22d9}\u{338}", + }); + } + + if first_char == 'n' && try_read("Gt;") { + return Some(CharRef { + name: "Gt;", + characters: "\u{226b}\u{20d2}", + }); + } + + if first_char == 'n' && try_read("Ll;") { + return Some(CharRef { + name: "Ll;", + characters: "\u{22d8}\u{338}", + }); + } + + if first_char == 'n' && try_read("Lt;") { + return Some(CharRef { + name: "Lt;", + characters: "\u{226a}\u{20d2}", + }); + } + + if first_char == 'n' && try_read("ap;") { + return Some(CharRef { + name: "ap;", + characters: "\u{2249}", + }); + } + + if first_char == 'n' && try_read("bsp") { + return Some(CharRef { + name: "bsp", + characters: "\u{a0}", + }); + } + + if first_char == 'n' && try_read("cy;") { + return Some(CharRef { + name: "cy;", + characters: "\u{43d}", + }); + } + + if first_char == 'n' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{1d52b}", + }); + } + + if first_char == 'n' && try_read("gE;") { + return Some(CharRef { + name: "gE;", + characters: "\u{2267}\u{338}", + }); + } + + if first_char == 'n' && try_read("ge;") { + return Some(CharRef { + name: "ge;", + characters: "\u{2271}", + }); + } + + if first_char == 'n' && try_read("gt;") { + return Some(CharRef { + name: "gt;", + characters: "\u{226f}", + }); + } + + if first_char == 'n' && try_read("is;") { + return Some(CharRef { + name: "is;", + characters: "\u{22fc}", + }); + } + + if first_char == 'n' && try_read("iv;") { + return Some(CharRef { + name: "iv;", + characters: "\u{220b}", + }); + } + + if first_char == 'n' && try_read("lE;") { + return Some(CharRef { + name: "lE;", + characters: "\u{2266}\u{338}", + }); + } + + if first_char == 'n' && try_read("le;") { + return Some(CharRef { + name: "le;", + characters: "\u{2270}", + }); + } + + if first_char == 'n' && try_read("lt;") { + return Some(CharRef { + name: "lt;", + characters: "\u{226e}", + }); + } + + if first_char == 'n' && try_read("ot;") { + return Some(CharRef { + name: "ot;", + characters: "\u{ac}", + }); + } + + if first_char == 'n' && try_read("pr;") { + return Some(CharRef { + name: "pr;", + characters: "\u{2280}", + }); + } + + if first_char == 'n' && try_read("sc;") { + return Some(CharRef { + name: "sc;", + characters: "\u{2281}", + }); + } + + if first_char == 'n' && try_read("um;") { + return Some(CharRef { + name: "um;", + characters: "\u{23}", + }); + } + + if first_char == 'o' && try_read("cy;") { + return Some(CharRef { + name: "cy;", + characters: "\u{43e}", + }); + } + + if first_char == 'o' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{1d52c}", + }); + } + + if first_char == 'o' && try_read("gt;") { + return Some(CharRef { + name: "gt;", + characters: "\u{29c1}", + }); + } + + if first_char == 'o' && try_read("hm;") { + return Some(CharRef { + name: "hm;", + characters: "\u{3a9}", + }); + } + + if first_char == 'o' && try_read("lt;") { + return Some(CharRef { + name: "lt;", + characters: "\u{29c0}", + }); + } + + if first_char == 'o' && try_read("rd;") { + return Some(CharRef { + name: "rd;", + characters: "\u{2a5d}", + }); + } + + if first_char == 'o' && try_read("rdf") { + return Some(CharRef { + name: "rdf", + characters: "\u{aa}", + }); + } + + if first_char == 'o' && try_read("rdm") { + return Some(CharRef { + name: "rdm", + characters: "\u{ba}", + }); + } + + if first_char == 'o' && try_read("rv;") { + return Some(CharRef { + name: "rv;", + characters: "\u{2a5b}", + }); + } + + if first_char == 'o' && try_read("uml") { + return Some(CharRef { + name: "uml", + characters: "\u{f6}", + }); + } + + if first_char == 'p' && try_read("ar;") { + return Some(CharRef { + name: "ar;", + characters: "\u{2225}", + }); + } + + if first_char == 'p' && try_read("ara") { + return Some(CharRef { + name: "ara", + characters: "\u{b6}", + }); + } + + if first_char == 'p' && try_read("cy;") { + return Some(CharRef { + name: "cy;", + characters: "\u{43f}", + }); + } + + if first_char == 'p' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{1d52d}", + }); + } + + if first_char == 'p' && try_read("hi;") { + return Some(CharRef { + name: "hi;", + characters: "\u{3c6}", + }); + } + + if first_char == 'p' && try_read("iv;") { + return Some(CharRef { + name: "iv;", + characters: "\u{3d6}", + }); + } + + if first_char == 'p' && try_read("rE;") { + return Some(CharRef { + name: "rE;", + characters: "\u{2ab3}", + }); + } + + if first_char == 'p' && try_read("re;") { + return Some(CharRef { + name: "re;", + characters: "\u{2aaf}", + }); + } + + if first_char == 'p' && try_read("si;") { + return Some(CharRef { + name: "si;", + characters: "\u{3c8}", + }); + } + + if first_char == 'q' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{1d52e}", + }); + } + + if first_char == 'q' && try_read("uot") { + return Some(CharRef { + name: "uot", + characters: "\u{22}", + }); + } + + if first_char == 'r' && try_read("cy;") { + return Some(CharRef { + name: "cy;", + characters: "\u{440}", + }); + } + + if first_char == 'r' && try_read("eg;") { + return Some(CharRef { + name: "eg;", + characters: "\u{ae}", + }); + } + + if first_char == 'r' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{1d52f}", + }); + } + + if first_char == 'r' && try_read("ho;") { + return Some(CharRef { + name: "ho;", + characters: "\u{3c1}", + }); + } + + if first_char == 'r' && try_read("lm;") { + return Some(CharRef { + name: "lm;", + characters: "\u{200f}", + }); + } + + if first_char == 'r' && try_read("sh;") { + return Some(CharRef { + name: "sh;", + characters: "\u{21b1}", + }); + } + + if first_char == 's' && try_read("cE;") { + return Some(CharRef { + name: "cE;", + characters: "\u{2ab4}", + }); + } + + if first_char == 's' && try_read("ce;") { + return Some(CharRef { + name: "ce;", + characters: "\u{2ab0}", + }); + } + + if first_char == 's' && try_read("cy;") { + return Some(CharRef { + name: "cy;", + characters: "\u{441}", + }); + } + + if first_char == 's' && try_read("ect") { + return Some(CharRef { + name: "ect", + characters: "\u{a7}", + }); + } + + if first_char == 's' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{1d530}", + }); + } + + if first_char == 's' && try_read("hy;") { + return Some(CharRef { + name: "hy;", + characters: "\u{ad}", + }); + } + + if first_char == 's' && try_read("im;") { + return Some(CharRef { + name: "im;", + characters: "\u{223c}", + }); + } + + if first_char == 's' && try_read("mt;") { + return Some(CharRef { + name: "mt;", + characters: "\u{2aaa}", + }); + } + + if first_char == 's' && try_read("ol;") { + return Some(CharRef { + name: "ol;", + characters: "\u{2f}", + }); + } + + if first_char == 's' && try_read("qu;") { + return Some(CharRef { + name: "qu;", + characters: "\u{25a1}", + }); + } + + if first_char == 's' && try_read("ub;") { + return Some(CharRef { + name: "ub;", + characters: "\u{2282}", + }); + } + + if first_char == 's' && try_read("um;") { + return Some(CharRef { + name: "um;", + characters: "\u{2211}", + }); + } + + if first_char == 's' && try_read("up1") { + return Some(CharRef { + name: "up1", + characters: "\u{b9}", + }); + } + + if first_char == 's' && try_read("up2") { + return Some(CharRef { + name: "up2", + characters: "\u{b2}", + }); + } + + if first_char == 's' && try_read("up3") { + return Some(CharRef { + name: "up3", + characters: "\u{b3}", + }); + } + + if first_char == 's' && try_read("up;") { + return Some(CharRef { + name: "up;", + characters: "\u{2283}", + }); + } + + if first_char == 't' && try_read("au;") { + return Some(CharRef { + name: "au;", + characters: "\u{3c4}", + }); + } + + if first_char == 't' && try_read("cy;") { + return Some(CharRef { + name: "cy;", + characters: "\u{442}", + }); + } + + if first_char == 't' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{1d531}", + }); + } + + if first_char == 't' && try_read("op;") { + return Some(CharRef { + name: "op;", + characters: "\u{22a4}", + }); + } + + if first_char == 'u' && try_read("cy;") { + return Some(CharRef { + name: "cy;", + characters: "\u{443}", + }); + } + + if first_char == 'u' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{1d532}", + }); + } + + if first_char == 'u' && try_read("ml;") { + return Some(CharRef { + name: "ml;", + characters: "\u{a8}", + }); + } + + if first_char == 'u' && try_read("uml") { + return Some(CharRef { + name: "uml", + characters: "\u{fc}", + }); + } + + if first_char == 'v' && try_read("cy;") { + return Some(CharRef { + name: "cy;", + characters: "\u{432}", + }); + } + + if first_char == 'v' && try_read("ee;") { + return Some(CharRef { + name: "ee;", + characters: "\u{2228}", + }); + } + + if first_char == 'v' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{1d533}", + }); + } + + if first_char == 'w' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{1d534}", + }); + } + + if first_char == 'x' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{1d535}", + }); + } + + if first_char == 'y' && try_read("cy;") { + return Some(CharRef { + name: "cy;", + characters: "\u{44b}", + }); + } + + if first_char == 'y' && try_read("en;") { + return Some(CharRef { + name: "en;", + characters: "\u{a5}", + }); + } + + if first_char == 'y' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{1d536}", + }); + } + + if first_char == 'y' && try_read("uml") { + return Some(CharRef { + name: "uml", + characters: "\u{ff}", + }); + } + + if first_char == 'z' && try_read("cy;") { + return Some(CharRef { + name: "cy;", + characters: "\u{437}", + }); + } + + if first_char == 'z' && try_read("fr;") { + return Some(CharRef { + name: "fr;", + characters: "\u{1d537}", + }); + } + + if first_char == 'z' && try_read("wj;") { + return Some(CharRef { + name: "wj;", + characters: "\u{200d}", + }); + } + + if first_char == 'A' && try_read("MP") { + return Some(CharRef { + name: "MP", + characters: "\u{26}", + }); + } + + if first_char == 'D' && try_read("D;") { + return Some(CharRef { + name: "D;", + characters: "\u{2145}", + }); + } + + if first_char == 'E' && try_read("TH") { + return Some(CharRef { + name: "TH", + characters: "\u{d0}", + }); + } + + if first_char == 'G' && try_read("T;") { + return Some(CharRef { + name: "T;", + characters: "\u{3e}", + }); + } + + if first_char == 'G' && try_read("g;") { + return Some(CharRef { + name: "g;", + characters: "\u{22d9}", + }); + } + + if first_char == 'G' && try_read("t;") { + return Some(CharRef { + name: "t;", + characters: "\u{226b}", + }); + } + + if first_char == 'I' && try_read("m;") { + return Some(CharRef { + name: "m;", + characters: "\u{2111}", + }); + } + + if first_char == 'L' && try_read("T;") { + return Some(CharRef { + name: "T;", + characters: "\u{3c}", + }); + } + + if first_char == 'L' && try_read("l;") { + return Some(CharRef { + name: "l;", + characters: "\u{22d8}", + }); + } + + if first_char == 'L' && try_read("t;") { + return Some(CharRef { + name: "t;", + characters: "\u{226a}", + }); + } + + if first_char == 'M' && try_read("u;") { + return Some(CharRef { + name: "u;", + characters: "\u{39c}", + }); + } + + if first_char == 'N' && try_read("u;") { + return Some(CharRef { + name: "u;", + characters: "\u{39d}", + }); + } + + if first_char == 'O' && try_read("r;") { + return Some(CharRef { + name: "r;", + characters: "\u{2a54}", + }); + } + + if first_char == 'P' && try_read("i;") { + return Some(CharRef { + name: "i;", + characters: "\u{3a0}", + }); + } + + if first_char == 'P' && try_read("r;") { + return Some(CharRef { + name: "r;", + characters: "\u{2abb}", + }); + } + + if first_char == 'R' && try_read("EG") { + return Some(CharRef { + name: "EG", + characters: "\u{ae}", + }); + } + + if first_char == 'R' && try_read("e;") { + return Some(CharRef { + name: "e;", + characters: "\u{211c}", + }); + } + + if first_char == 'S' && try_read("c;") { + return Some(CharRef { + name: "c;", + characters: "\u{2abc}", + }); + } + + if first_char == 'X' && try_read("i;") { + return Some(CharRef { + name: "i;", + characters: "\u{39e}", + }); + } + + if first_char == 'a' && try_read("c;") { + return Some(CharRef { + name: "c;", + characters: "\u{223e}", + }); + } + + if first_char == 'a' && try_read("f;") { + return Some(CharRef { + name: "f;", + characters: "\u{2061}", + }); + } + + if first_char == 'a' && try_read("mp") { + return Some(CharRef { + name: "mp", + characters: "\u{26}", + }); + } + + if first_char == 'a' && try_read("p;") { + return Some(CharRef { + name: "p;", + characters: "\u{2248}", + }); + } + + if first_char == 'd' && try_read("d;") { + return Some(CharRef { + name: "d;", + characters: "\u{2146}", + }); + } + + if first_char == 'd' && try_read("eg") { + return Some(CharRef { + name: "eg", + characters: "\u{b0}", + }); + } + + if first_char == 'e' && try_read("e;") { + return Some(CharRef { + name: "e;", + characters: "\u{2147}", + }); + } + + if first_char == 'e' && try_read("g;") { + return Some(CharRef { + name: "g;", + characters: "\u{2a9a}", + }); + } + + if first_char == 'e' && try_read("l;") { + return Some(CharRef { + name: "l;", + characters: "\u{2a99}", + }); + } + + if first_char == 'e' && try_read("th") { + return Some(CharRef { + name: "th", + characters: "\u{f0}", + }); + } + + if first_char == 'g' && try_read("E;") { + return Some(CharRef { + name: "E;", + characters: "\u{2267}", + }); + } + + if first_char == 'g' && try_read("e;") { + return Some(CharRef { + name: "e;", + characters: "\u{2265}", + }); + } + + if first_char == 'g' && try_read("g;") { + return Some(CharRef { + name: "g;", + characters: "\u{226b}", + }); + } + + if first_char == 'g' && try_read("l;") { + return Some(CharRef { + name: "l;", + characters: "\u{2277}", + }); + } + + if first_char == 'g' && try_read("t;") { + return Some(CharRef { + name: "t;", + characters: "\u{3e}", + }); + } + + if first_char == 'i' && try_read("c;") { + return Some(CharRef { + name: "c;", + characters: "\u{2063}", + }); + } + + if first_char == 'i' && try_read("i;") { + return Some(CharRef { + name: "i;", + characters: "\u{2148}", + }); + } + + if first_char == 'i' && try_read("n;") { + return Some(CharRef { + name: "n;", + characters: "\u{2208}", + }); + } + + if first_char == 'i' && try_read("t;") { + return Some(CharRef { + name: "t;", + characters: "\u{2062}", + }); + } + + if first_char == 'l' && try_read("E;") { + return Some(CharRef { + name: "E;", + characters: "\u{2266}", + }); + } + + if first_char == 'l' && try_read("e;") { + return Some(CharRef { + name: "e;", + characters: "\u{2264}", + }); + } + + if first_char == 'l' && try_read("g;") { + return Some(CharRef { + name: "g;", + characters: "\u{2276}", + }); + } + + if first_char == 'l' && try_read("l;") { + return Some(CharRef { + name: "l;", + characters: "\u{226a}", + }); + } + + if first_char == 'l' && try_read("t;") { + return Some(CharRef { + name: "t;", + characters: "\u{3c}", + }); + } + + if first_char == 'm' && try_read("p;") { + return Some(CharRef { + name: "p;", + characters: "\u{2213}", + }); + } + + if first_char == 'm' && try_read("u;") { + return Some(CharRef { + name: "u;", + characters: "\u{3bc}", + }); + } + + if first_char == 'n' && try_read("e;") { + return Some(CharRef { + name: "e;", + characters: "\u{2260}", + }); + } + + if first_char == 'n' && try_read("i;") { + return Some(CharRef { + name: "i;", + characters: "\u{220b}", + }); + } + + if first_char == 'n' && try_read("ot") { + return Some(CharRef { + name: "ot", + characters: "\u{ac}", + }); + } + + if first_char == 'n' && try_read("u;") { + return Some(CharRef { + name: "u;", + characters: "\u{3bd}", + }); + } + + if first_char == 'o' && try_read("S;") { + return Some(CharRef { + name: "S;", + characters: "\u{24c8}", + }); + } + + if first_char == 'o' && try_read("r;") { + return Some(CharRef { + name: "r;", + characters: "\u{2228}", + }); + } + + if first_char == 'p' && try_read("i;") { + return Some(CharRef { + name: "i;", + characters: "\u{3c0}", + }); + } + + if first_char == 'p' && try_read("m;") { + return Some(CharRef { + name: "m;", + characters: "\u{b1}", + }); + } + + if first_char == 'p' && try_read("r;") { + return Some(CharRef { + name: "r;", + characters: "\u{227a}", + }); + } + + if first_char == 'r' && try_read("eg") { + return Some(CharRef { + name: "eg", + characters: "\u{ae}", + }); + } + + if first_char == 'r' && try_read("x;") { + return Some(CharRef { + name: "x;", + characters: "\u{211e}", + }); + } + + if first_char == 's' && try_read("c;") { + return Some(CharRef { + name: "c;", + characters: "\u{227b}", + }); + } + + if first_char == 's' && try_read("hy") { + return Some(CharRef { + name: "hy", + characters: "\u{ad}", + }); + } + + if first_char == 'u' && try_read("ml") { + return Some(CharRef { + name: "ml", + characters: "\u{a8}", + }); + } + + if first_char == 'w' && try_read("p;") { + return Some(CharRef { + name: "p;", + characters: "\u{2118}", + }); + } + + if first_char == 'w' && try_read("r;") { + return Some(CharRef { + name: "r;", + characters: "\u{2240}", + }); + } + + if first_char == 'x' && try_read("i;") { + return Some(CharRef { + name: "i;", + characters: "\u{3be}", + }); + } + + if first_char == 'y' && try_read("en") { + return Some(CharRef { + name: "en", + characters: "\u{a5}", + }); + } + + if first_char == 'G' && try_read("T") { + return Some(CharRef { + name: "T", + characters: "\u{3e}", + }); + } + + if first_char == 'L' && try_read("T") { + return Some(CharRef { + name: "T", + characters: "\u{3c}", + }); + } + + if first_char == 'g' && try_read("t") { + return Some(CharRef { + name: "t", + characters: "\u{3e}", + }); + } + + if first_char == 'l' && try_read("t") { + return Some(CharRef { + name: "t", + characters: "\u{3c}", + }); + } + None +} diff --git a/src/error.rs b/src/error.rs new file mode 100644 index 0000000..6090fdf --- /dev/null +++ b/src/error.rs @@ -0,0 +1,87 @@ +macro_rules! impl_error { + ($( + $string:literal <=> $variant:ident, + )*) => { + /// All [parsing errors](https://html.spec.whatwg.org/#parse-errors) this tokenizer can emit. + #[derive(Debug, Eq, PartialEq)] + pub enum Error { + $( + #[doc = "This error corresponds to the `$literal` error found in the WHATWG spec."] + $variant + ),* + } + impl std::str::FromStr for Error { + type Err = (); + + /// Parse a `kebap-case` error code as typically written in the WHATWG spec into an + /// enum variant. + fn from_str(s: &str) -> Result<Self, Self::Err> { + match s { + $( $string => Ok(Self::$variant), )* + _ => Err(()) + } + } + } + + impl std::fmt::Display for Error { + /// Convert an enum variant back into the `kebap-case` error code as typically written + /// in the WHATWG spec. + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match *self { + $( Self::$variant => $string.fmt(f), )* + } + } + } + } +} + +impl_error! { + "abrupt-closing-of-empty-comment" <=> AbruptClosingOfEmptyComment, + "abrupt-doctype-public-identifier" <=> AbruptDoctypePublicIdentifier, + "abrupt-doctype-system-identifier" <=> AbruptDoctypeSystemIdentifier, + "absence-of-digits-in-numeric-character-reference" <=> AbsenceOfDigitsInNumericCharacterReference, + "cdata-in-html-content" <=> CdataInHtmlContent, + "character-reference-outside-unicode-range" <=> CharacterReferenceOutsideUnicodeRange, + "control-character-reference" <=> ControlCharacterReference, + "end-tag-with-attributes" <=> EndTagWithAttributes, + "end-tag-with-trailing-solidus" <=> EndTagWithTrailingSolidus, + "eof-before-tag-name" <=> EofBeforeTagName, + "eof-in-cdata" <=> EofInCdata, + "eof-in-comment" <=> EofInComment, + "eof-in-doctype" <=> EofInDoctype, + "eof-in-script-html-comment-like-text" <=> EofInScriptHtmlCommentLikeText, + "eof-in-tag" <=> EofInTag, + "incorrectly-closed-comment" <=> IncorrectlyClosedComment, + "incorrectly-opened-comment" <=> IncorrectlyOpenedComment, + "invalid-character-sequence-after-doctype-name" <=> InvalidCharacterSequenceAfterDoctypeName, + "invalid-first-character-of-tag-name" <=> InvalidFirstCharacterOfTagName, + "missing-attribute-value" <=> MissingAttributeValue, + "missing-doctype-name" <=> MissingDoctypeName, + "missing-doctype-public-identifier" <=> MissingDoctypePublicIdentifier, + "missing-doctype-system-identifier" <=> MissingDoctypeSystemIdentifier, + "missing-end-tag-name" <=> MissingEndTagName, + "missing-quote-before-doctype-public-identifier" <=> MissingQuoteBeforeDoctypePublicIdentifier, + "missing-quote-before-doctype-system-identifier" <=> MissingQuoteBeforeDoctypeSystemIdentifier, + "missing-semicolon-after-character-reference" <=> MissingSemicolonAfterCharacterReference, + "missing-whitespace-after-doctype-public-keyword" <=> MissingWhitespaceAfterDoctypePublicKeyword, + "missing-whitespace-after-doctype-system-keyword" <=> MissingWhitespaceAfterDoctypeSystemKeyword, + "missing-whitespace-before-doctype-name" <=> MissingWhitespaceBeforeDoctypeName, + "missing-whitespace-between-attributes" <=> MissingWhitespaceBetweenAttributes, + "missing-whitespace-between-doctype-public-and-system-identifiers" <=> MissingWhitespaceBetweenDoctypePublicAndSystemIdentifiers, + "nested-comment" <=> NestedComment, + "noncharacter-character-reference" <=> NoncharacterCharacterReference, + "noncharacter-in-input-stream" <=> NoncharacterInInputStream, + "null-character-reference" <=> NullCharacterReference, + "surrogate-character-reference" <=> SurrogateCharacterReference, + "surrogate-in-input-stream" <=> SurrogateInInputStream, + "unexpected-character-after-doctype-system-identifier" <=> UnexpectedCharacterAfterDoctypeSystemIdentifier, + "unexpected-character-in-attribute-name" <=> UnexpectedCharacterInAttributeName, + "unexpected-character-in-unquoted-attribute-value" <=> UnexpectedCharacterInUnquotedAttributeValue, + "unexpected-equals-sign-before-attribute-name" <=> UnexpectedEqualsSignBeforeAttributeName, + "unexpected-null-character" <=> UnexpectedNullCharacter, + "unexpected-question-mark-instead-of-tag-name" <=> UnexpectedQuestionMarkInsteadOfTagName, + "unexpected-solidus-in-tag" <=> UnexpectedSolidusInTag, + "unknown-named-character-reference" <=> UnknownNamedCharacterReference, + "duplicate-attribute" <=> DuplicateAttribute, + "control-character-in-input-stream" <=> ControlCharacterInInputStream, +} diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..ef6c9a2 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,2112 @@ +#![deny(missing_docs)] +// This is an HTML parser. HTML can be untrusted input from the internet. +#![forbid(unsafe_code)] +#![doc = include_str!("../README.md")] + +mod emitter; +mod entities; +mod error; +mod machine; +mod reader; + +#[cfg(feature = "integration-tests")] +pub use machine::State; +#[cfg(not(feature = "integration-tests"))] +use machine::State; + +use machine::{ + ascii_digit_pat, control_pat, noncharacter_pat, surrogate_pat, whitespace_pat, ControlToken, +}; + +pub use emitter::{DefaultEmitter, Doctype, Emitter, EndTag, StartTag, Token}; +pub use reader::{Readable, Reader, StringReader}; + +pub use error::Error; + +macro_rules! ctostr { + ($c:expr) => { + &*$c.encode_utf8(&mut [0; 4]) + }; +} + +/// A HTML tokenizer. See crate-level docs for basic usage. +pub struct Tokenizer<R: Reader, E: Emitter = DefaultEmitter> { + eof: bool, + state: State, + emitter: E, + temporary_buffer: String, + reader: R, + to_reconsume: Option<Option<char>>, + character_reference_code: u32, + return_state: Option<State>, +} + +impl<R: Reader> Tokenizer<R> { + /// Create a new tokenizer from some input. + /// + /// `input` can be `&String` or `&str` at the moment, as those are the types for which + /// [`crate::Readable`] is implemented, but you can implement that trait on your own types. + /// + /// Patches are welcome for providing an efficient implementation over async streams, + /// iterators, files, etc, as long as any dependencies come behind featureflags. + pub fn new<'a, S: Readable<'a, Reader = R>>(input: S) -> Self { + Tokenizer::<S::Reader>::new_with_emitter(input, DefaultEmitter::default()) + } +} + +impl<R: Reader, E: Emitter> Tokenizer<R, E> { + /// Construct a new tokenizer from some input and a custom emitter. + /// + /// Use this method over [`Tokenizer::new`] when you want to have more control over string allocation for + /// tokens. + pub fn new_with_emitter<'a, S: Readable<'a, Reader = R>>(input: S, emitter: E) -> Self { + Tokenizer { + eof: false, + state: State::Data, + emitter, + temporary_buffer: String::new(), + to_reconsume: None, + reader: input.to_reader(), + character_reference_code: 0, + return_state: None, + } + } + + #[cfg(feature = "integration-tests")] + /// Test-internal function to override internal state. + /// + /// Only available with the `integration-tests` feature which is not public API. + pub fn set_state(&mut self, state: State) { + self.state = state; + } + + /// Set the statemachine to start/continue in [plaintext + /// state](https://html.spec.whatwg.org/#plaintext-state). + /// + /// This tokenizer never gets into that state naturally. + pub fn set_plaintext_state(&mut self) { + self.state = State::PlainText; + } + + #[cfg(feature = "integration-tests")] + /// Test-internal function to override internal state. + /// + /// Only available with the `integration-tests` feature which is not public API. + pub fn set_last_start_tag(&mut self, last_start_tag: Option<&str>) { + self.emitter.set_last_start_tag(last_start_tag); + } + + #[inline] + fn unread_char(&mut self, c: Option<char>) { + self.to_reconsume = Some(c); + } + + #[inline] + fn validate_char(&mut self, c: char) { + match c as u32 { + surrogate_pat!() => { + self.emitter.emit_error(Error::SurrogateInInputStream); + } + noncharacter_pat!() => { + self.emitter.emit_error(Error::NoncharacterInInputStream); + } + // control without whitespace or nul + x @ control_pat!() + if !matches!(x, 0x0000 | 0x0009 | 0x000a | 0x000c | 0x000d | 0x0020) => + { + self.emitter + .emit_error(Error::ControlCharacterInInputStream); + } + _ => (), + } + } + + fn read_char(&mut self) -> Option<char> { + if let Some(c) = self.to_reconsume.take() { + return c; + } + + let c = self.reader.read_char()?; + self.validate_char(c); + Some(c) + } + + #[inline] + fn try_read_string(&mut self, s: &str, case_sensitive: bool) -> bool { + debug_assert!(!s.is_empty()); + debug_assert!(self.to_reconsume.is_none()); + self.reader.try_read_string(s, case_sensitive) + } + + fn is_consumed_as_part_of_an_attribute(&self) -> bool { + matches!( + self.return_state, + Some( + State::AttributeValueDoubleQuoted + | State::AttributeValueSingleQuoted + | State::AttributeValueUnquoted + ) + ) + } + + fn flush_code_points_consumed_as_character_reference(&mut self) { + if self.is_consumed_as_part_of_an_attribute() { + self.emitter.push_attribute_value(&self.temporary_buffer); + self.temporary_buffer.clear(); + } else { + self.flush_buffer_characters(); + } + } + + fn next_input_character(&mut self) -> Option<char> { + let rv = self.read_char(); + self.unread_char(rv); + rv + } + + fn flush_buffer_characters(&mut self) { + self.emitter.emit_string(&self.temporary_buffer); + self.temporary_buffer.clear(); + } + + fn consume(&mut self) -> ControlToken { + macro_rules! mutate_character_reference { + (* $mul:literal + $x:ident - $sub:literal) => { + match self + .character_reference_code + .checked_mul($mul) + .and_then(|cr| cr.checked_add($x as u32 - $sub)) + { + Some(cr) => self.character_reference_code = cr, + None => { + // provoke err + self.character_reference_code = 0x110000; + } + }; + }; + } + + match self.state { + State::Data => match self.read_char() { + Some('&') => { + self.return_state = Some(self.state); + self.state = State::CharacterReference; + ControlToken::Continue + } + Some('<') => { + self.state = State::TagOpen; + ControlToken::Continue + } + Some('\0') => { + self.emitter.emit_error(Error::UnexpectedNullCharacter); + self.emitter.emit_string("\0"); + ControlToken::Continue + } + Some(x) => { + self.emitter.emit_string(ctostr!(x)); + ControlToken::Continue + } + None => ControlToken::Eof, + }, + State::RcData => match self.read_char() { + Some('&') => { + self.return_state = Some(State::RcData); + self.state = State::CharacterReference; + ControlToken::Continue + } + Some('<') => { + self.state = State::RcDataLessThanSign; + ControlToken::Continue + } + Some('\0') => { + self.emitter.emit_error(Error::UnexpectedNullCharacter); + self.emitter.emit_string("\u{fffd}"); + ControlToken::Continue + } + Some(x) => { + self.emitter.emit_string(ctostr!(x)); + ControlToken::Continue + } + None => ControlToken::Eof, + }, + State::RawText => match self.read_char() { + Some('<') => { + self.state = State::RawTextLessThanSign; + ControlToken::Continue + } + Some('\0') => { + self.emitter.emit_error(Error::UnexpectedNullCharacter); + self.emitter.emit_string("\u{fffd}"); + ControlToken::Continue + } + Some(x) => { + self.emitter.emit_string(ctostr!(x)); + ControlToken::Continue + } + None => ControlToken::Eof, + }, + State::ScriptData => match self.read_char() { + Some('<') => { + self.state = State::ScriptDataLessThanSign; + ControlToken::Continue + } + Some('\0') => { + self.emitter.emit_error(Error::UnexpectedNullCharacter); + self.emitter.emit_string("\u{fffd}"); + ControlToken::Continue + } + Some(x) => { + self.emitter.emit_string(ctostr!(x)); + ControlToken::Continue + } + None => ControlToken::Eof, + }, + State::PlainText => match self.read_char() { + Some('\0') => { + self.emitter.emit_error(Error::UnexpectedNullCharacter); + self.emitter.emit_string("\u{fffd}"); + ControlToken::Continue + } + Some(x) => { + self.emitter.emit_string(ctostr!(x)); + ControlToken::Continue + } + None => ControlToken::Eof, + }, + State::TagOpen => match self.read_char() { + Some('!') => { + self.state = State::MarkupDeclarationOpen; + ControlToken::Continue + } + Some('/') => { + self.state = State::EndTagOpen; + ControlToken::Continue + } + Some(x) if x.is_ascii_alphabetic() => { + self.emitter.init_start_tag(); + self.state = State::TagName; + self.unread_char(Some(x)); + ControlToken::Continue + } + c @ Some('?') => { + self.emitter + .emit_error(Error::UnexpectedQuestionMarkInsteadOfTagName); + self.emitter.init_comment(); + self.state = State::BogusComment; + self.unread_char(c); + ControlToken::Continue + } + None => { + self.emitter.emit_error(Error::EofBeforeTagName); + self.emitter.emit_string("<"); + ControlToken::Eof + } + c @ Some(_) => { + self.emitter + .emit_error(Error::InvalidFirstCharacterOfTagName); + self.state = State::Data; + self.emitter.emit_string("<"); + self.unread_char(c); + ControlToken::Continue + } + }, + State::EndTagOpen => match self.read_char() { + Some(x) if x.is_ascii_alphabetic() => { + self.emitter.init_end_tag(); + self.state = State::TagName; + self.unread_char(Some(x)); + ControlToken::Continue + } + Some('>') => { + self.emitter.emit_error(Error::MissingEndTagName); + self.state = State::Data; + ControlToken::Continue + } + None => { + self.emitter.emit_error(Error::EofBeforeTagName); + self.emitter.emit_string("</"); + ControlToken::Eof + } + Some(x) => { + self.emitter + .emit_error(Error::InvalidFirstCharacterOfTagName); + self.emitter.init_comment(); + self.state = State::BogusComment; + self.unread_char(Some(x)); + ControlToken::Continue + } + }, + State::TagName => match self.read_char() { + Some(whitespace_pat!()) => { + self.state = State::BeforeAttributeName; + ControlToken::Continue + } + Some('/') => { + self.state = State::SelfClosingStartTag; + ControlToken::Continue + } + Some('>') => { + self.state = State::Data; + self.emitter.emit_current_tag(); + ControlToken::Continue + } + Some('\0') => { + self.emitter.emit_error(Error::UnexpectedNullCharacter); + self.emitter.push_tag_name("\u{fffd}"); + ControlToken::Continue + } + Some(x) => { + self.emitter.push_tag_name(ctostr!(x.to_ascii_lowercase())); + ControlToken::Continue + } + None => { + self.emitter.emit_error(Error::EofInTag); + ControlToken::Eof + } + }, + State::RcDataLessThanSign => match self.read_char() { + Some('/') => { + self.temporary_buffer.clear(); + self.state = State::RcDataEndTagOpen; + ControlToken::Continue + } + c => { + self.emitter.emit_string("<"); + self.state = State::RcData; + self.unread_char(c); + ControlToken::Continue + } + }, + State::RcDataEndTagOpen => match self.read_char() { + Some(x) if x.is_ascii_alphabetic() => { + self.emitter.init_end_tag(); + self.state = State::RcDataEndTagName; + self.unread_char(Some(x)); + ControlToken::Continue + } + c => { + self.emitter.emit_string("</"); + self.state = State::RcData; + self.unread_char(c); + ControlToken::Continue + } + }, + State::RcDataEndTagName => match self.read_char() { + Some(whitespace_pat!()) if self.emitter.current_is_appropriate_end_tag_token() => { + self.state = State::BeforeAttributeName; + ControlToken::Continue + } + Some('/') if self.emitter.current_is_appropriate_end_tag_token() => { + self.state = State::SelfClosingStartTag; + ControlToken::Continue + } + Some('>') if self.emitter.current_is_appropriate_end_tag_token() => { + self.state = State::Data; + self.emitter.emit_current_tag(); + ControlToken::Continue + } + Some(x) if x.is_ascii_alphabetic() => { + self.emitter.push_tag_name(ctostr!(x.to_ascii_lowercase())); + self.temporary_buffer.push(x); + ControlToken::Continue + } + c => { + self.emitter.emit_string("</"); + self.flush_buffer_characters(); + + self.state = State::RcData; + self.unread_char(c); + ControlToken::Continue + } + }, + State::RawTextLessThanSign => match self.read_char() { + Some('/') => { + self.temporary_buffer.clear(); + self.state = State::RawTextEndTagOpen; + ControlToken::Continue + } + c => { + self.emitter.emit_string("<"); + self.state = State::RawText; + self.unread_char(c); + ControlToken::Continue + } + }, + State::RawTextEndTagOpen => match self.read_char() { + Some(x) if x.is_ascii_alphabetic() => { + self.emitter.init_end_tag(); + self.state = State::RawTextEndTagName; + self.unread_char(Some(x)); + ControlToken::Continue + } + c => { + self.emitter.emit_string("</"); + self.state = State::RawText; + self.unread_char(c); + ControlToken::Continue + } + }, + State::RawTextEndTagName => match self.read_char() { + Some(whitespace_pat!()) if self.emitter.current_is_appropriate_end_tag_token() => { + self.state = State::BeforeAttributeName; + ControlToken::Continue + } + Some('/') if self.emitter.current_is_appropriate_end_tag_token() => { + self.state = State::SelfClosingStartTag; + ControlToken::Continue + } + Some('>') if self.emitter.current_is_appropriate_end_tag_token() => { + self.state = State::Data; + self.emitter.emit_current_tag(); + ControlToken::Continue + } + Some(x) if x.is_ascii_alphabetic() => { + self.emitter.push_tag_name(ctostr!(x.to_ascii_lowercase())); + self.temporary_buffer.push(x); + ControlToken::Continue + } + c => { + self.emitter.emit_string("</"); + self.flush_buffer_characters(); + + self.state = State::RawText; + self.unread_char(c); + ControlToken::Continue + } + }, + State::ScriptDataLessThanSign => match self.read_char() { + Some('/') => { + self.temporary_buffer.clear(); + self.state = State::ScriptDataEndTagOpen; + ControlToken::Continue + } + Some('!') => { + self.state = State::ScriptDataEscapeStart; + self.emitter.emit_string("<!"); + ControlToken::Continue + } + c => { + self.emitter.emit_string("<"); + self.state = State::Data; + self.unread_char(c); + ControlToken::Continue + } + }, + State::ScriptDataEndTagOpen => match self.read_char() { + Some(x) if x.is_ascii_alphabetic() => { + self.emitter.init_end_tag(); + self.state = State::ScriptDataEndTagName; + self.unread_char(Some(x)); + ControlToken::Continue + } + c => { + self.emitter.emit_string("</"); + self.state = State::ScriptData; + self.unread_char(c); + ControlToken::Continue + } + }, + State::ScriptDataEndTagName => match self.read_char() { + Some(whitespace_pat!()) if self.emitter.current_is_appropriate_end_tag_token() => { + self.state = State::BeforeAttributeName; + ControlToken::Continue + } + Some('/') if self.emitter.current_is_appropriate_end_tag_token() => { + self.state = State::SelfClosingStartTag; + ControlToken::Continue + } + Some('>') if self.emitter.current_is_appropriate_end_tag_token() => { + self.state = State::Data; + self.emitter.emit_current_tag(); + ControlToken::Continue + } + Some(x) if x.is_ascii_alphabetic() => { + self.emitter.push_tag_name(ctostr!(x.to_ascii_lowercase())); + self.temporary_buffer.push(x.to_ascii_lowercase()); + ControlToken::Continue + } + c => { + self.emitter.emit_string("</"); + self.flush_buffer_characters(); + self.state = State::Data; + self.unread_char(c); + ControlToken::Continue + } + }, + State::ScriptDataEscapeStart => match self.read_char() { + Some('-') => { + self.state = State::ScriptDataEscapeStartDash; + self.emitter.emit_string("-"); + ControlToken::Continue + } + c => { + self.state = State::ScriptData; + self.unread_char(c); + ControlToken::Continue + } + }, + State::ScriptDataEscapeStartDash => match self.read_char() { + Some('-') => { + self.state = State::ScriptDataEscapedDashDash; + self.emitter.emit_string("-"); + ControlToken::Continue + } + c => { + self.state = State::ScriptData; + self.unread_char(c); + ControlToken::Continue + } + }, + State::ScriptDataEscaped => match self.read_char() { + Some('-') => { + self.state = State::ScriptDataEscapedDash; + self.emitter.emit_string("-"); + ControlToken::Continue + } + Some('<') => { + self.state = State::ScriptDataEscapedLessThanSign; + ControlToken::Continue + } + Some('\0') => { + self.emitter.emit_error(Error::UnexpectedNullCharacter); + self.emitter.emit_string("\u{fffd}"); + ControlToken::Continue + } + None => { + self.emitter + .emit_error(Error::EofInScriptHtmlCommentLikeText); + ControlToken::Eof + } + Some(x) => { + self.emitter.emit_string(ctostr!(x)); + ControlToken::Continue + } + }, + State::ScriptDataEscapedDash => match self.read_char() { + Some('-') => { + self.state = State::ScriptDataEscapedDashDash; + self.emitter.emit_string("-"); + ControlToken::Continue + } + Some('<') => { + self.state = State::ScriptDataEscapedLessThanSign; + ControlToken::Continue + } + Some('\0') => { + self.emitter.emit_error(Error::UnexpectedNullCharacter); + self.state = State::ScriptDataEscaped; + self.emitter.emit_string("\u{fffd}"); + ControlToken::Continue + } + None => { + self.emitter + .emit_error(Error::EofInScriptHtmlCommentLikeText); + ControlToken::Eof + } + Some(x) => { + self.state = State::ScriptDataEscaped; + self.emitter.emit_string(ctostr!(x)); + ControlToken::Continue + } + }, + State::ScriptDataEscapedDashDash => match self.read_char() { + Some('-') => { + self.emitter.emit_string("-"); + ControlToken::Continue + } + Some('<') => { + self.state = State::ScriptDataEscapedLessThanSign; + ControlToken::Continue + } + Some('>') => { + self.state = State::ScriptData; + self.emitter.emit_string(">"); + ControlToken::Continue + } + Some('\0') => { + self.emitter.emit_error(Error::UnexpectedNullCharacter); + self.state = State::ScriptDataEscaped; + self.emitter.emit_string("\u{fffd}"); + ControlToken::Continue + } + None => { + self.emitter + .emit_error(Error::EofInScriptHtmlCommentLikeText); + ControlToken::Eof + } + Some(x) => { + self.state = State::ScriptDataEscaped; + self.emitter.emit_string(ctostr!(x)); + ControlToken::Continue + } + }, + State::ScriptDataEscapedLessThanSign => match self.read_char() { + Some('/') => { + self.temporary_buffer.clear(); + self.state = State::ScriptDataEscapedEndTagOpen; + ControlToken::Continue + } + Some(x) if x.is_ascii_alphabetic() => { + self.temporary_buffer.clear(); + self.emitter.emit_string("<"); + self.state = State::ScriptDataDoubleEscapeStart; + self.unread_char(Some(x)); + ControlToken::Continue + } + c => { + self.emitter.emit_string("<"); + self.state = State::ScriptDataEscaped; + self.unread_char(c); + ControlToken::Continue + } + }, + State::ScriptDataEscapedEndTagOpen => match self.read_char() { + Some(x) if x.is_ascii_alphabetic() => { + self.emitter.init_end_tag(); + self.state = State::ScriptDataEscapedEndTagName; + self.unread_char(Some(x)); + ControlToken::Continue + } + c => { + self.emitter.emit_string("</"); + self.unread_char(c); + self.state = State::ScriptDataEscaped; + ControlToken::Continue + } + }, + State::ScriptDataEscapedEndTagName => match self.read_char() { + Some(whitespace_pat!()) if self.emitter.current_is_appropriate_end_tag_token() => { + self.state = State::BeforeAttributeName; + ControlToken::Continue + } + Some('/') if self.emitter.current_is_appropriate_end_tag_token() => { + self.state = State::SelfClosingStartTag; + ControlToken::Continue + } + Some('>') if self.emitter.current_is_appropriate_end_tag_token() => { + self.state = State::Data; + self.emitter.emit_current_tag(); + ControlToken::Continue + } + Some(x) if x.is_ascii_alphabetic() => { + self.emitter.push_tag_name(ctostr!(x.to_ascii_lowercase())); + self.temporary_buffer.push(x); + ControlToken::Continue + } + c => { + self.emitter.emit_string("</"); + self.flush_buffer_characters(); + self.state = State::ScriptDataEscaped; + self.unread_char(c); + ControlToken::Continue + } + }, + State::ScriptDataDoubleEscapeStart => match self.read_char() { + Some(x @ whitespace_pat!() | x @ '/' | x @ '>') => { + if self.temporary_buffer == "script" { + self.state = State::ScriptDataDoubleEscaped; + } else { + self.state = State::ScriptDataEscaped; + } + self.emitter.emit_string(ctostr!(x)); + ControlToken::Continue + } + Some(x) if x.is_ascii_alphabetic() => { + self.temporary_buffer.push(x.to_ascii_lowercase()); + self.emitter.emit_string(ctostr!(x)); + ControlToken::Continue + } + c => { + self.state = State::ScriptDataEscaped; + self.unread_char(c); + ControlToken::Continue + } + }, + State::ScriptDataDoubleEscaped => match self.read_char() { + Some('-') => { + self.state = State::ScriptDataDoubleEscapedDash; + self.emitter.emit_string("-"); + ControlToken::Continue + } + Some('<') => { + self.state = State::ScriptDataDoubleEscapedLessThanSign; + self.emitter.emit_string("<"); + ControlToken::Continue + } + Some('\0') => { + self.emitter.emit_error(Error::UnexpectedNullCharacter); + self.emitter.emit_string("\u{fffd}"); + ControlToken::Continue + } + None => { + self.emitter + .emit_error(Error::EofInScriptHtmlCommentLikeText); + ControlToken::Eof + } + Some(x) => { + self.emitter.emit_string(ctostr!(x)); + ControlToken::Continue + } + }, + State::ScriptDataDoubleEscapedDash => match self.read_char() { + Some('-') => { + self.state = State::ScriptDataDoubleEscapedDashDash; + self.emitter.emit_string("-"); + ControlToken::Continue + } + Some('<') => { + self.state = State::ScriptDataDoubleEscapedLessThanSign; + self.emitter.emit_string("<"); + ControlToken::Continue + } + Some('\0') => { + self.emitter.emit_error(Error::UnexpectedNullCharacter); + self.state = State::ScriptDataDoubleEscaped; + self.emitter.emit_string("\u{fffd}"); + ControlToken::Continue + } + None => { + self.emitter + .emit_error(Error::EofInScriptHtmlCommentLikeText); + ControlToken::Eof + } + Some(x) => { + self.state = State::ScriptDataDoubleEscaped; + self.emitter.emit_string(ctostr!(x)); + ControlToken::Continue + } + }, + State::ScriptDataDoubleEscapedDashDash => match self.read_char() { + Some('-') => { + self.emitter.emit_string("-"); + ControlToken::Continue + } + Some('<') => { + self.emitter.emit_string("<"); + self.state = State::ScriptDataDoubleEscapedLessThanSign; + ControlToken::Continue + } + Some('>') => { + self.emitter.emit_string(">"); + self.state = State::ScriptData; + ControlToken::Continue + } + Some('\0') => { + self.emitter.emit_error(Error::UnexpectedNullCharacter); + self.state = State::ScriptDataDoubleEscaped; + self.emitter.emit_string("\u{fffd}"); + ControlToken::Continue + } + None => { + self.emitter + .emit_error(Error::EofInScriptHtmlCommentLikeText); + ControlToken::Eof + } + Some(x) => { + self.state = State::ScriptDataDoubleEscaped; + self.emitter.emit_string(ctostr!(x)); + ControlToken::Continue + } + }, + State::ScriptDataDoubleEscapedLessThanSign => match self.read_char() { + Some('/') => { + self.temporary_buffer.clear(); + self.state = State::ScriptDataDoubleEscapeEnd; + self.emitter.emit_string("/"); + ControlToken::Continue + } + c => { + self.state = State::ScriptDataDoubleEscaped; + self.unread_char(c); + ControlToken::Continue + } + }, + State::ScriptDataDoubleEscapeEnd => match self.read_char() { + Some(x @ whitespace_pat!() | x @ '/' | x @ '>') => { + if self.temporary_buffer == "script" { + self.state = State::ScriptDataEscaped; + } else { + self.state = State::ScriptDataDoubleEscaped; + } + + self.emitter.emit_string(ctostr!(x)); + ControlToken::Continue + } + Some(x) if x.is_ascii_alphabetic() => { + self.temporary_buffer.push(x.to_ascii_lowercase()); + self.emitter.emit_string(ctostr!(x)); + ControlToken::Continue + } + c => { + self.state = State::ScriptDataDoubleEscaped; + self.unread_char(c); + ControlToken::Continue + } + }, + State::BeforeAttributeName => match self.read_char() { + Some(whitespace_pat!()) => ControlToken::Continue, + c @ Some('/' | '>') | c @ None => { + self.state = State::AfterAttributeName; + self.unread_char(c); + ControlToken::Continue + } + Some('=') => { + self.emitter + .emit_error(Error::UnexpectedEqualsSignBeforeAttributeName); + self.emitter.init_attribute(); + self.emitter.push_attribute_name("="); + self.state = State::AttributeName; + ControlToken::Continue + } + Some(x) => { + self.emitter.init_attribute(); + self.state = State::AttributeName; + self.unread_char(Some(x)); + ControlToken::Continue + } + }, + State::AttributeName => match self.read_char() { + c @ Some(whitespace_pat!() | '/' | '>') | c @ None => { + self.state = State::AfterAttributeName; + self.unread_char(c); + ControlToken::Continue + } + Some('=') => { + self.state = State::BeforeAttributeValue; + ControlToken::Continue + } + Some('\0') => { + self.emitter.emit_error(Error::UnexpectedNullCharacter); + self.emitter.push_attribute_name("\u{fffd}"); + ControlToken::Continue + } + Some(x @ '"' | x @ '\'' | x @ '<') => { + self.emitter + .emit_error(Error::UnexpectedCharacterInAttributeName); + self.emitter + .push_attribute_name(ctostr!(x.to_ascii_lowercase())); + ControlToken::Continue + } + Some(x) => { + self.emitter + .push_attribute_name(ctostr!(x.to_ascii_lowercase())); + ControlToken::Continue + } + }, + State::AfterAttributeName => match self.read_char() { + Some(whitespace_pat!()) => ControlToken::Continue, + Some('/') => { + self.state = State::SelfClosingStartTag; + ControlToken::Continue + } + Some('=') => { + self.state = State::BeforeAttributeValue; + ControlToken::Continue + } + Some('>') => { + self.state = State::Data; + self.emitter.emit_current_tag(); + ControlToken::Continue + } + None => { + self.emitter.emit_error(Error::EofInTag); + ControlToken::Eof + } + Some(x) => { + self.emitter.init_attribute(); + self.state = State::AttributeName; + self.unread_char(Some(x)); + ControlToken::Continue + } + }, + State::BeforeAttributeValue => match self.read_char() { + Some(whitespace_pat!()) => ControlToken::Continue, + Some('"') => { + self.state = State::AttributeValueDoubleQuoted; + ControlToken::Continue + } + Some('\'') => { + self.state = State::AttributeValueSingleQuoted; + ControlToken::Continue + } + Some('>') => { + self.emitter.emit_error(Error::MissingAttributeValue); + self.state = State::Data; + self.emitter.emit_current_tag(); + ControlToken::Continue + } + c => { + self.state = State::AttributeValueUnquoted; + self.unread_char(c); + ControlToken::Continue + } + }, + State::AttributeValueDoubleQuoted => match self.read_char() { + Some('"') => { + self.state = State::AfterAttributeValueQuoted; + ControlToken::Continue + } + Some('&') => { + self.return_state = Some(State::AttributeValueDoubleQuoted); + self.state = State::CharacterReference; + ControlToken::Continue + } + Some('\0') => { + self.emitter.emit_error(Error::UnexpectedNullCharacter); + self.emitter.push_attribute_value("\u{fffd}"); + ControlToken::Continue + } + None => { + self.emitter.emit_error(Error::EofInTag); + ControlToken::Eof + } + Some(x) => { + self.emitter.push_attribute_value(ctostr!(x)); + ControlToken::Continue + } + }, + State::AttributeValueSingleQuoted => match self.read_char() { + Some('\'') => { + self.state = State::AfterAttributeValueQuoted; + ControlToken::Continue + } + Some('&') => { + self.return_state = Some(State::AttributeValueSingleQuoted); + self.state = State::CharacterReference; + ControlToken::Continue + } + Some('\0') => { + self.emitter.emit_error(Error::UnexpectedNullCharacter); + self.emitter.push_attribute_value("\u{fffd}"); + ControlToken::Continue + } + None => { + self.emitter.emit_error(Error::EofInTag); + ControlToken::Eof + } + Some(x) => { + self.emitter.push_attribute_value(ctostr!(x)); + ControlToken::Continue + } + }, + State::AttributeValueUnquoted => match self.read_char() { + Some(whitespace_pat!()) => { + self.state = State::BeforeAttributeName; + ControlToken::Continue + } + Some('&') => { + self.return_state = Some(State::AttributeValueUnquoted); + self.state = State::CharacterReference; + ControlToken::Continue + } + Some('>') => { + self.state = State::Data; + self.emitter.emit_current_tag(); + ControlToken::Continue + } + Some('\0') => { + self.emitter.emit_error(Error::UnexpectedNullCharacter); + self.emitter.push_attribute_value("\u{fffd}"); + ControlToken::Continue + } + Some(x @ '"' | x @ '\'' | x @ '<' | x @ '=' | x @ '\u{60}') => { + self.emitter + .emit_error(Error::UnexpectedCharacterInUnquotedAttributeValue); + self.emitter.push_attribute_value(ctostr!(x)); + ControlToken::Continue + } + None => { + self.emitter.emit_error(Error::EofInTag); + ControlToken::Eof + } + Some(x) => { + self.emitter.push_attribute_value(ctostr!(x)); + ControlToken::Continue + } + }, + State::AfterAttributeValueQuoted => match self.read_char() { + Some(whitespace_pat!()) => { + self.state = State::BeforeAttributeName; + ControlToken::Continue + } + Some('/') => { + self.state = State::SelfClosingStartTag; + ControlToken::Continue + } + Some('>') => { + self.state = State::Data; + self.emitter.emit_current_tag(); + ControlToken::Continue + } + None => { + self.emitter.emit_error(Error::EofInTag); + ControlToken::Eof + } + Some(x) => { + self.emitter + .emit_error(Error::MissingWhitespaceBetweenAttributes); + self.state = State::BeforeAttributeName; + self.unread_char(Some(x)); + ControlToken::Continue + } + }, + State::SelfClosingStartTag => match self.read_char() { + Some('>') => { + self.emitter.set_self_closing(); + self.state = State::Data; + self.emitter.emit_current_tag(); + ControlToken::Continue + } + None => { + self.emitter.emit_error(Error::EofInTag); + ControlToken::Eof + } + Some(x) => { + self.emitter.emit_error(Error::UnexpectedSolidusInTag); + self.state = State::BeforeAttributeName; + self.unread_char(Some(x)); + ControlToken::Continue + } + }, + State::BogusComment => match self.read_char() { + Some('>') => { + self.state = State::Data; + self.emitter.emit_current_comment(); + ControlToken::Continue + } + None => { + self.emitter.emit_current_comment(); + ControlToken::Eof + } + Some('\0') => { + self.emitter.emit_error(Error::UnexpectedNullCharacter); + self.emitter.push_comment("\u{fffd}"); + ControlToken::Continue + } + Some(x) => { + self.emitter.push_comment(ctostr!(x)); + ControlToken::Continue + } + }, + State::MarkupDeclarationOpen => match self.read_char() { + Some('-') if self.try_read_string("-", true) => { + self.emitter.init_comment(); + self.state = State::CommentStart; + ControlToken::Continue + } + Some('d' | 'D') if self.try_read_string("octype", false) => { + self.state = State::Doctype; + ControlToken::Continue + } + Some('[') if self.try_read_string("CDATA[", true) => { + // missing: check for adjusted current element: we don't have an element stack + // at all + // + // missing: cdata transition + // + // let's hope that bogus comment can just sort of skip over cdata + self.emitter.emit_error(Error::CdataInHtmlContent); + + self.emitter.init_comment(); + self.emitter.push_comment("[CDATA["); + self.state = State::BogusComment; + ControlToken::Continue + } + c => { + self.emitter.emit_error(Error::IncorrectlyOpenedComment); + self.emitter.init_comment(); + self.state = State::BogusComment; + self.unread_char(c); + ControlToken::Continue + } + }, + State::CommentStart => match self.read_char() { + Some('-') => { + self.state = State::CommentStartDash; + ControlToken::Continue + } + Some('>') => { + self.emitter.emit_error(Error::AbruptClosingOfEmptyComment); + self.state = State::Data; + self.emitter.emit_current_comment(); + ControlToken::Continue + } + c => { + self.unread_char(c); + self.state = State::Comment; + ControlToken::Continue + } + }, + State::CommentStartDash => match self.read_char() { + Some('-') => { + self.state = State::CommentEnd; + ControlToken::Continue + } + Some('>') => { + self.emitter.emit_error(Error::AbruptClosingOfEmptyComment); + self.state = State::Data; + self.emitter.emit_current_comment(); + ControlToken::Continue + } + None => { + self.emitter.emit_error(Error::EofInComment); + self.emitter.emit_current_comment(); + ControlToken::Eof + } + c @ Some(_) => { + self.emitter.push_comment("-"); + self.unread_char(c); + self.state = State::Comment; + ControlToken::Continue + } + }, + State::Comment => match self.read_char() { + Some('<') => { + self.emitter.push_comment("<"); + self.state = State::CommentLessThanSign; + ControlToken::Continue + } + Some('-') => { + self.state = State::CommentEndDash; + ControlToken::Continue + } + Some('\0') => { + self.emitter.emit_error(Error::UnexpectedNullCharacter); + self.emitter.push_comment("\u{fffd}"); + ControlToken::Continue + } + None => { + self.emitter.emit_error(Error::EofInComment); + self.emitter.emit_current_comment(); + ControlToken::Eof + } + Some(x) => { + self.emitter.push_comment(ctostr!(x)); + ControlToken::Continue + } + }, + State::CommentLessThanSign => match self.read_char() { + Some('!') => { + self.emitter.push_comment("!"); + self.state = State::CommentLessThanSignBang; + ControlToken::Continue + } + Some('<') => { + self.emitter.push_comment("<"); + ControlToken::Continue + } + c => { + self.unread_char(c); + self.state = State::Comment; + ControlToken::Continue + } + }, + State::CommentLessThanSignBang => match self.read_char() { + Some('-') => { + self.state = State::CommentLessThanSignBangDash; + ControlToken::Continue + } + c => { + self.unread_char(c); + self.state = State::Comment; + ControlToken::Continue + } + }, + State::CommentLessThanSignBangDash => match self.read_char() { + Some('-') => { + self.state = State::CommentLessThanSignBangDashDash; + ControlToken::Continue + } + c => { + self.unread_char(c); + self.state = State::CommentEndDash; + ControlToken::Continue + } + }, + State::CommentLessThanSignBangDashDash => match self.read_char() { + c @ Some('>') | c @ None => { + self.unread_char(c); + self.state = State::CommentEnd; + ControlToken::Continue + } + c => { + self.emitter.emit_error(Error::NestedComment); + self.unread_char(c); + self.state = State::CommentEnd; + ControlToken::Continue + } + }, + State::CommentEndDash => match self.read_char() { + Some('-') => { + self.state = State::CommentEnd; + ControlToken::Continue + } + None => { + self.emitter.emit_error(Error::EofInComment); + self.emitter.emit_current_comment(); + ControlToken::Eof + } + c => { + self.emitter.push_comment("-"); + self.unread_char(c); + self.state = State::Comment; + ControlToken::Continue + } + }, + State::CommentEnd => match self.read_char() { + Some('>') => { + self.state = State::Data; + self.emitter.emit_current_comment(); + ControlToken::Continue + } + Some('!') => { + self.state = State::CommentEndBang; + ControlToken::Continue + } + Some('-') => { + self.emitter.push_comment("-"); + ControlToken::Continue + } + None => { + self.emitter.emit_error(Error::EofInComment); + self.emitter.emit_current_comment(); + ControlToken::Eof + } + c @ Some(_) => { + self.emitter.push_comment("-"); + self.emitter.push_comment("-"); + self.unread_char(c); + self.state = State::Comment; + ControlToken::Continue + } + }, + State::CommentEndBang => match self.read_char() { + Some('-') => { + self.emitter.push_comment("-"); + self.emitter.push_comment("-"); + self.emitter.push_comment("!"); + self.state = State::CommentEndDash; + ControlToken::Continue + } + Some('>') => { + self.emitter.emit_error(Error::IncorrectlyClosedComment); + self.state = State::Data; + self.emitter.emit_current_comment(); + ControlToken::Continue + } + None => { + self.emitter.emit_error(Error::EofInComment); + self.emitter.emit_current_comment(); + ControlToken::Eof + } + c @ Some(_) => { + self.emitter.push_comment("-"); + self.emitter.push_comment("-"); + self.emitter.push_comment("!"); + self.state = State::Comment; + self.unread_char(c); + ControlToken::Continue + } + }, + State::Doctype => match self.read_char() { + Some(whitespace_pat!()) => { + self.state = State::BeforeDoctypeName; + ControlToken::Continue + } + c @ Some('>') => { + self.unread_char(c); + self.state = State::BeforeDoctypeName; + ControlToken::Continue + } + None => { + self.emitter.emit_error(Error::EofInDoctype); + self.emitter.init_doctype(); + self.emitter.set_force_quirks(); + self.emitter.emit_current_doctype(); + ControlToken::Eof + } + c @ Some(_) => { + self.emitter + .emit_error(Error::MissingWhitespaceBeforeDoctypeName); + self.unread_char(c); + self.state = State::BeforeDoctypeName; + ControlToken::Continue + } + }, + State::BeforeDoctypeName => match self.read_char() { + Some(whitespace_pat!()) => ControlToken::Continue, + Some('\0') => { + self.emitter.emit_error(Error::UnexpectedNullCharacter); + self.emitter.init_doctype(); + self.emitter.push_doctype_name("\u{fffd}"); + self.state = State::DoctypeName; + ControlToken::Continue + } + Some('>') => { + self.emitter.emit_error(Error::MissingDoctypeName); + self.emitter.init_doctype(); + self.emitter.set_force_quirks(); + self.state = State::Data; + self.emitter.emit_current_doctype(); + ControlToken::Continue + } + None => { + self.emitter.emit_error(Error::EofInDoctype); + self.emitter.init_doctype(); + self.emitter.set_force_quirks(); + self.emitter.emit_current_doctype(); + ControlToken::Eof + } + Some(x) => { + self.emitter.init_doctype(); + self.emitter + .push_doctype_name(ctostr!(x.to_ascii_lowercase())); + self.state = State::DoctypeName; + ControlToken::Continue + } + }, + State::DoctypeName => match self.read_char() { + Some(whitespace_pat!()) => { + self.state = State::AfterDoctypeName; + ControlToken::Continue + } + Some('>') => { + self.state = State::Data; + self.emitter.emit_current_doctype(); + ControlToken::Continue + } + Some('\0') => { + self.emitter.emit_error(Error::UnexpectedNullCharacter); + self.emitter.push_doctype_name("\u{fffd}"); + ControlToken::Continue + } + None => { + self.emitter.emit_error(Error::EofInDoctype); + self.emitter.set_force_quirks(); + self.emitter.emit_current_doctype(); + ControlToken::Eof + } + Some(x) => { + self.emitter + .push_doctype_name(ctostr!(x.to_ascii_lowercase())); + ControlToken::Continue + } + }, + State::AfterDoctypeName => match self.read_char() { + Some(whitespace_pat!()) => ControlToken::Continue, + Some('>') => { + self.state = State::Data; + self.emitter.emit_current_doctype(); + ControlToken::Continue + } + None => { + self.emitter.emit_error(Error::EofInDoctype); + self.emitter.set_force_quirks(); + self.emitter.emit_current_doctype(); + ControlToken::Eof + } + Some('p' | 'P') if self.try_read_string("ublic", false) => { + self.state = State::AfterDoctypePublicKeyword; + ControlToken::Continue + } + Some('s' | 'S') if self.try_read_string("ystem", false) => { + self.state = State::AfterDoctypeSystemKeyword; + ControlToken::Continue + } + c @ Some(_) => { + self.emitter + .emit_error(Error::InvalidCharacterSequenceAfterDoctypeName); + self.emitter.set_force_quirks(); + self.unread_char(c); + self.state = State::BogusDoctype; + ControlToken::Continue + } + }, + State::AfterDoctypePublicKeyword => match self.read_char() { + Some(whitespace_pat!()) => { + self.state = State::BeforeDoctypePublicIdentifier; + ControlToken::Continue + } + Some('"') => { + self.emitter + .emit_error(Error::MissingWhitespaceAfterDoctypePublicKeyword); + self.emitter.set_doctype_public_identifier(""); + self.state = State::DoctypePublicIdentifierDoubleQuoted; + ControlToken::Continue + } + Some('\'') => { + self.emitter + .emit_error(Error::MissingWhitespaceAfterDoctypePublicKeyword); + self.emitter.set_doctype_public_identifier(""); + self.state = State::DoctypePublicIdentifierSingleQuoted; + ControlToken::Continue + } + Some('>') => { + self.emitter + .emit_error(Error::MissingDoctypePublicIdentifier); + self.emitter.set_force_quirks(); + self.state = State::Data; + self.emitter.emit_current_doctype(); + ControlToken::Continue + } + None => { + self.emitter.emit_error(Error::EofInDoctype); + self.emitter.set_force_quirks(); + self.emitter.emit_current_doctype(); + ControlToken::Eof + } + c @ Some(_) => { + self.emitter + .emit_error(Error::MissingQuoteBeforeDoctypePublicIdentifier); + self.emitter.set_force_quirks(); + self.unread_char(c); + self.state = State::BogusDoctype; + ControlToken::Continue + } + }, + State::BeforeDoctypePublicIdentifier => match self.read_char() { + Some(whitespace_pat!()) => ControlToken::Continue, + Some('"') => { + self.emitter.set_doctype_public_identifier(""); + self.state = State::DoctypePublicIdentifierDoubleQuoted; + ControlToken::Continue + } + Some('\'') => { + self.emitter.set_doctype_public_identifier(""); + self.state = State::DoctypePublicIdentifierSingleQuoted; + ControlToken::Continue + } + Some('>') => { + self.emitter + .emit_error(Error::MissingDoctypePublicIdentifier); + self.emitter.set_force_quirks(); + self.state = State::Data; + self.emitter.emit_current_doctype(); + ControlToken::Continue + } + None => { + self.emitter.emit_error(Error::EofInDoctype); + self.emitter.set_force_quirks(); + self.emitter.emit_current_doctype(); + ControlToken::Eof + } + c @ Some(_) => { + self.emitter + .emit_error(Error::MissingQuoteBeforeDoctypePublicIdentifier); + self.emitter.set_force_quirks(); + self.unread_char(c); + self.state = State::BogusDoctype; + ControlToken::Continue + } + }, + State::DoctypePublicIdentifierDoubleQuoted => match self.read_char() { + Some('"') => { + self.state = State::AfterDoctypePublicIdentifier; + ControlToken::Continue + } + Some('\0') => { + self.emitter.emit_error(Error::UnexpectedNullCharacter); + self.emitter.push_doctype_public_identifier("\u{fffd}"); + ControlToken::Continue + } + Some('>') => { + self.emitter + .emit_error(Error::AbruptDoctypePublicIdentifier); + self.emitter.set_force_quirks(); + self.state = State::Data; + self.emitter.emit_current_doctype(); + ControlToken::Continue + } + None => { + self.emitter.emit_error(Error::EofInDoctype); + self.emitter.set_force_quirks(); + self.emitter.emit_current_doctype(); + ControlToken::Eof + } + Some(x) => { + self.emitter.push_doctype_public_identifier(ctostr!(x)); + ControlToken::Continue + } + }, + State::DoctypePublicIdentifierSingleQuoted => match self.read_char() { + Some('\'') => { + self.state = State::AfterDoctypePublicIdentifier; + ControlToken::Continue + } + Some('\0') => { + self.emitter.emit_error(Error::UnexpectedNullCharacter); + self.emitter.push_doctype_public_identifier("\u{fffd}"); + ControlToken::Continue + } + Some('>') => { + self.emitter + .emit_error(Error::AbruptDoctypePublicIdentifier); + self.emitter.set_force_quirks(); + self.state = State::Data; + self.emitter.emit_current_doctype(); + ControlToken::Continue + } + None => { + self.emitter.emit_error(Error::EofInDoctype); + self.emitter.set_force_quirks(); + self.emitter.emit_current_doctype(); + ControlToken::Eof + } + Some(x) => { + self.emitter.push_doctype_public_identifier(ctostr!(x)); + ControlToken::Continue + } + }, + State::AfterDoctypePublicIdentifier => match self.read_char() { + Some(whitespace_pat!()) => { + self.state = State::BetweenDoctypePublicAndSystemIdentifiers; + ControlToken::Continue + } + Some('>') => { + self.state = State::Data; + self.emitter.emit_current_doctype(); + ControlToken::Continue + } + Some('"') => { + self.emitter.emit_error( + Error::MissingWhitespaceBetweenDoctypePublicAndSystemIdentifiers, + ); + self.emitter.set_doctype_system_identifier(""); + self.state = State::DoctypeSystemIdentifierDoubleQuoted; + ControlToken::Continue + } + Some('\'') => { + self.emitter.emit_error( + Error::MissingWhitespaceBetweenDoctypePublicAndSystemIdentifiers, + ); + self.emitter.set_doctype_system_identifier(""); + self.state = State::DoctypeSystemIdentifierSingleQuoted; + ControlToken::Continue + } + None => { + self.emitter.emit_error(Error::EofInDoctype); + self.emitter.set_force_quirks(); + self.emitter.emit_current_doctype(); + ControlToken::Eof + } + c @ Some(_) => { + self.emitter + .emit_error(Error::MissingQuoteBeforeDoctypeSystemIdentifier); + self.emitter.set_force_quirks(); + self.unread_char(c); + self.state = State::BogusDoctype; + ControlToken::Continue + } + }, + State::BetweenDoctypePublicAndSystemIdentifiers => match self.read_char() { + Some(whitespace_pat!()) => ControlToken::Continue, + Some('>') => { + self.state = State::Data; + self.emitter.emit_current_doctype(); + ControlToken::Continue + } + Some('"') => { + self.emitter.set_doctype_system_identifier(""); + self.state = State::DoctypeSystemIdentifierDoubleQuoted; + ControlToken::Continue + } + Some('\'') => { + self.emitter.set_doctype_system_identifier(""); + self.state = State::DoctypeSystemIdentifierSingleQuoted; + ControlToken::Continue + } + None => { + self.emitter.emit_error(Error::EofInDoctype); + self.emitter.set_force_quirks(); + self.emitter.emit_current_doctype(); + ControlToken::Eof + } + c @ Some(_) => { + self.emitter + .emit_error(Error::MissingQuoteBeforeDoctypeSystemIdentifier); + self.emitter.set_force_quirks(); + self.state = State::BogusDoctype; + self.unread_char(c); + ControlToken::Continue + } + }, + State::AfterDoctypeSystemKeyword => match self.read_char() { + Some(whitespace_pat!()) => { + self.state = State::BeforeDoctypeSystemIdentifier; + ControlToken::Continue + } + Some('"') => { + self.emitter + .emit_error(Error::MissingWhitespaceAfterDoctypeSystemKeyword); + self.emitter.set_doctype_system_identifier(""); + self.state = State::DoctypeSystemIdentifierDoubleQuoted; + ControlToken::Continue + } + Some('\'') => { + self.emitter + .emit_error(Error::MissingWhitespaceAfterDoctypeSystemKeyword); + self.emitter.set_doctype_system_identifier(""); + self.state = State::DoctypeSystemIdentifierSingleQuoted; + ControlToken::Continue + } + Some('>') => { + self.emitter + .emit_error(Error::MissingDoctypeSystemIdentifier); + self.emitter.set_force_quirks(); + self.state = State::Data; + self.emitter.emit_current_doctype(); + ControlToken::Continue + } + None => { + self.emitter.emit_error(Error::EofInDoctype); + self.emitter.set_force_quirks(); + self.emitter.emit_current_doctype(); + ControlToken::Eof + } + c @ Some(_) => { + self.emitter + .emit_error(Error::MissingQuoteBeforeDoctypeSystemIdentifier); + self.emitter.set_force_quirks(); + self.state = State::BogusDoctype; + self.unread_char(c); + ControlToken::Continue + } + }, + State::BeforeDoctypeSystemIdentifier => match self.read_char() { + Some(whitespace_pat!()) => ControlToken::Continue, + Some('"') => { + self.emitter.set_doctype_system_identifier(""); + self.state = State::DoctypeSystemIdentifierDoubleQuoted; + ControlToken::Continue + } + Some('\'') => { + self.emitter.set_doctype_system_identifier(""); + self.state = State::DoctypeSystemIdentifierSingleQuoted; + ControlToken::Continue + } + Some('>') => { + self.emitter + .emit_error(Error::MissingDoctypeSystemIdentifier); + self.emitter.set_force_quirks(); + self.state = State::Data; + self.emitter.emit_current_doctype(); + ControlToken::Continue + } + None => { + self.emitter.emit_error(Error::EofInDoctype); + self.emitter.set_force_quirks(); + self.emitter.emit_current_doctype(); + ControlToken::Eof + } + c @ Some(_) => { + self.emitter + .emit_error(Error::MissingQuoteBeforeDoctypeSystemIdentifier); + self.emitter.set_force_quirks(); + self.state = State::BogusDoctype; + self.unread_char(c); + ControlToken::Continue + } + }, + State::DoctypeSystemIdentifierDoubleQuoted => match self.read_char() { + Some('"') => { + self.state = State::AfterDoctypeSystemIdentifier; + ControlToken::Continue + } + Some('\0') => { + self.emitter.emit_error(Error::UnexpectedNullCharacter); + self.emitter.push_doctype_system_identifier("\u{fffd}"); + ControlToken::Continue + } + Some('>') => { + self.emitter + .emit_error(Error::AbruptDoctypeSystemIdentifier); + self.emitter.set_force_quirks(); + self.state = State::Data; + self.emitter.emit_current_doctype(); + ControlToken::Continue + } + None => { + self.emitter.emit_error(Error::EofInDoctype); + self.emitter.set_force_quirks(); + self.emitter.emit_current_doctype(); + ControlToken::Eof + } + Some(x) => { + self.emitter.push_doctype_system_identifier(ctostr!(x)); + ControlToken::Continue + } + }, + State::DoctypeSystemIdentifierSingleQuoted => match self.read_char() { + Some('\'') => { + self.state = State::AfterDoctypeSystemIdentifier; + ControlToken::Continue + } + Some('\0') => { + self.emitter.emit_error(Error::UnexpectedNullCharacter); + self.emitter.push_doctype_system_identifier("\u{fffd}"); + ControlToken::Continue + } + Some('>') => { + self.emitter + .emit_error(Error::AbruptDoctypeSystemIdentifier); + self.emitter.set_force_quirks(); + self.state = State::Data; + self.emitter.emit_current_doctype(); + ControlToken::Continue + } + None => { + self.emitter.emit_error(Error::EofInDoctype); + self.emitter.set_force_quirks(); + self.emitter.emit_current_doctype(); + ControlToken::Eof + } + Some(x) => { + self.emitter.push_doctype_system_identifier(ctostr!(x)); + ControlToken::Continue + } + }, + State::AfterDoctypeSystemIdentifier => match self.read_char() { + Some(whitespace_pat!()) => ControlToken::Continue, + Some('>') => { + self.state = State::Data; + self.emitter.emit_current_doctype(); + ControlToken::Continue + } + None => { + self.emitter.emit_error(Error::EofInDoctype); + self.emitter.set_force_quirks(); + self.emitter.emit_current_doctype(); + ControlToken::Eof + } + c @ Some(_) => { + self.emitter + .emit_error(Error::UnexpectedCharacterAfterDoctypeSystemIdentifier); + self.unread_char(c); + self.state = State::BogusDoctype; + ControlToken::Continue + } + }, + State::BogusDoctype => match self.read_char() { + Some('>') => { + self.state = State::Data; + self.emitter.emit_current_doctype(); + ControlToken::Continue + } + Some('\0') => { + self.emitter.emit_error(Error::UnexpectedNullCharacter); + ControlToken::Continue + } + None => { + self.emitter.emit_current_doctype(); + ControlToken::Eof + } + Some(_) => ControlToken::Continue, + }, + State::CdataSection => match self.read_char() { + Some(']') => { + self.state = State::CdataSectionBracket; + ControlToken::Continue + } + None => { + self.emitter.emit_error(Error::EofInCdata); + ControlToken::Eof + } + Some(x) => { + self.emitter.emit_string(ctostr!(x)); + ControlToken::Continue + } + }, + State::CdataSectionBracket => match self.read_char() { + Some(']') => { + self.state = State::CdataSectionEnd; + ControlToken::Continue + } + c => { + self.emitter.emit_string("]"); + self.state = State::CdataSection; + self.unread_char(c); + ControlToken::Continue + } + }, + State::CdataSectionEnd => match self.read_char() { + Some(']') => { + self.emitter.emit_string("]"); + ControlToken::Continue + } + Some('>') => { + self.state = State::Data; + ControlToken::Continue + } + c => { + self.emitter.emit_string("]]"); + self.unread_char(c); + self.state = State::CdataSection; + ControlToken::Continue + } + }, + State::CharacterReference => { + self.temporary_buffer.clear(); + self.temporary_buffer.push('&'); + match self.read_char() { + Some(x) if x.is_ascii_alphanumeric() => { + self.unread_char(Some(x)); + self.state = State::NamedCharacterReference; + ControlToken::Continue + } + Some('#') => { + self.temporary_buffer.push('#'); + self.state = State::NumericCharacterReference; + ControlToken::Continue + } + c => { + self.flush_code_points_consumed_as_character_reference(); + self.state = self.return_state.take().unwrap(); + self.unread_char(c); + ControlToken::Continue + } + } + } + State::NamedCharacterReference => { + let c = self.read_char(); + + let char_ref = c.and_then(|x| { + Some(( + x, + entities::try_read_character_reference(x, |x| { + self.try_read_string(x, true) + })?, + )) + }); + + if let Some((x, char_ref)) = char_ref { + self.temporary_buffer.push(x); + self.temporary_buffer.push_str(char_ref.name); + let char_ref_name_last_character = char_ref.name.chars().last(); + let next_character = self.next_input_character(); + if self.is_consumed_as_part_of_an_attribute() + && char_ref_name_last_character != Some(';') + && matches!(next_character, Some(x) if x == '=' || x.is_ascii_alphanumeric()) + { + self.flush_code_points_consumed_as_character_reference(); + self.state = self.return_state.take().unwrap(); + ControlToken::Continue + } else { + if char_ref_name_last_character != Some(';') { + self.emitter + .emit_error(Error::MissingSemicolonAfterCharacterReference); + } + + self.temporary_buffer.clear(); + self.temporary_buffer.push_str(char_ref.characters); + self.flush_code_points_consumed_as_character_reference(); + self.state = self.return_state.take().unwrap(); + ControlToken::Continue + } + } else { + self.unread_char(c); + self.flush_code_points_consumed_as_character_reference(); + self.state = State::AmbiguousAmpersand; + ControlToken::Continue + } + } + State::AmbiguousAmpersand => match self.read_char() { + Some(x) if x.is_ascii_alphanumeric() => { + if self.is_consumed_as_part_of_an_attribute() { + self.emitter.push_attribute_value(ctostr!(x)); + } else { + self.emitter.emit_string(ctostr!(x)); + } + + ControlToken::Continue + } + c @ Some(';') => { + self.emitter + .emit_error(Error::UnknownNamedCharacterReference); + self.unread_char(c); + self.state = self.return_state.take().unwrap(); + ControlToken::Continue + } + c => { + self.unread_char(c); + self.state = self.return_state.take().unwrap(); + ControlToken::Continue + } + }, + State::NumericCharacterReference => { + self.character_reference_code = 0; + match self.read_char() { + Some(x @ 'x' | x @ 'X') => { + self.temporary_buffer.push(x); + self.state = State::HexadecimalCharacterReferenceStart; + ControlToken::Continue + } + c => { + self.unread_char(c); + self.state = State::DecimalCharacterReferenceStart; + ControlToken::Continue + } + } + } + State::HexadecimalCharacterReferenceStart => match self.read_char() { + c @ Some('0'..='9' | 'A'..='F' | 'a'..='f') => { + self.unread_char(c); + self.state = State::HexadecimalCharacterReference; + ControlToken::Continue + } + c => { + self.emitter + .emit_error(Error::AbsenceOfDigitsInNumericCharacterReference); + self.flush_code_points_consumed_as_character_reference(); + self.unread_char(c); + self.state = self.return_state.take().unwrap(); + ControlToken::Continue + } + }, + State::DecimalCharacterReferenceStart => match self.read_char() { + Some(x @ ascii_digit_pat!()) => { + self.unread_char(Some(x)); + self.state = State::DecimalCharacterReference; + ControlToken::Continue + } + c => { + self.emitter + .emit_error(Error::AbsenceOfDigitsInNumericCharacterReference); + self.flush_code_points_consumed_as_character_reference(); + self.unread_char(c); + self.state = self.return_state.take().unwrap(); + ControlToken::Continue + } + }, + State::HexadecimalCharacterReference => match self.read_char() { + Some(x @ ascii_digit_pat!()) => { + mutate_character_reference!(*16 + x - 0x0030); + ControlToken::Continue + } + Some(x @ 'A'..='F') => { + mutate_character_reference!(*16 + x - 0x0037); + ControlToken::Continue + } + Some(x @ 'a'..='f') => { + mutate_character_reference!(*16 + x - 0x0057); + ControlToken::Continue + } + Some(';') => { + self.state = State::NumericCharacterReferenceEnd; + ControlToken::Continue + } + c => { + self.emitter + .emit_error(Error::MissingSemicolonAfterCharacterReference); + self.unread_char(c); + self.state = State::NumericCharacterReferenceEnd; + ControlToken::Continue + } + }, + State::DecimalCharacterReference => match self.read_char() { + Some(x @ ascii_digit_pat!()) => { + mutate_character_reference!(*10 + x - 0x0030); + ControlToken::Continue + } + Some(';') => { + self.state = State::NumericCharacterReferenceEnd; + ControlToken::Continue + } + c => { + self.emitter + .emit_error(Error::MissingSemicolonAfterCharacterReference); + self.unread_char(c); + self.state = State::NumericCharacterReferenceEnd; + ControlToken::Continue + } + }, + State::NumericCharacterReferenceEnd => { + match self.character_reference_code { + 0x00 => { + self.emitter.emit_error(Error::NullCharacterReference); + self.character_reference_code = 0xfffd; + } + 0x110000.. => { + self.emitter + .emit_error(Error::CharacterReferenceOutsideUnicodeRange); + self.character_reference_code = 0xfffd; + } + surrogate_pat!() => { + self.emitter.emit_error(Error::SurrogateCharacterReference); + self.character_reference_code = 0xfffd; + } + // noncharacter + noncharacter_pat!() => { + self.emitter + .emit_error(Error::NoncharacterCharacterReference); + } + // 0x000d, or a control that is not whitespace + x @ 0x000d | x @ control_pat!() + if !matches!(x, 0x0009 | 0x000a | 0x000c | 0x0020) => + { + self.emitter.emit_error(Error::ControlCharacterReference); + self.character_reference_code = match x { + 0x80 => 0x20AC, // EURO SIGN (€) + 0x82 => 0x201A, // SINGLE LOW-9 QUOTATION MARK (‚) + 0x83 => 0x0192, // LATIN SMALL LETTER F WITH HOOK (ƒ) + 0x84 => 0x201E, // DOUBLE LOW-9 QUOTATION MARK („) + 0x85 => 0x2026, // HORIZONTAL ELLIPSIS (…) + 0x86 => 0x2020, // DAGGER (†) + 0x87 => 0x2021, // DOUBLE DAGGER (‡) + 0x88 => 0x02C6, // MODIFIER LETTER CIRCUMFLEX ACCENT (ˆ) + 0x89 => 0x2030, // PER MILLE SIGN (‰) + 0x8A => 0x0160, // LATIN CAPITAL LETTER S WITH CARON (Š) + 0x8B => 0x2039, // SINGLE LEFT-POINTING ANGLE QUOTATION MARK (‹) + 0x8C => 0x0152, // LATIN CAPITAL LIGATURE OE (Œ) + 0x8E => 0x017D, // LATIN CAPITAL LETTER Z WITH CARON (Ž) + 0x91 => 0x2018, // LEFT SINGLE QUOTATION MARK (‘) + 0x92 => 0x2019, // RIGHT SINGLE QUOTATION MARK (’) + 0x93 => 0x201C, // LEFT DOUBLE QUOTATION MARK (“) + 0x94 => 0x201D, // RIGHT DOUBLE QUOTATION MARK (”) + 0x95 => 0x2022, // BULLET (•) + 0x96 => 0x2013, // EN DASH (–) + 0x97 => 0x2014, // EM DASH (—) + 0x98 => 0x02DC, // SMALL TILDE (˜) + 0x99 => 0x2122, // TRADE MARK SIGN (™) + 0x9A => 0x0161, // LATIN SMALL LETTER S WITH CARON (š) + 0x9B => 0x203A, // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (›) + 0x9C => 0x0153, // LATIN SMALL LIGATURE OE (œ) + 0x9E => 0x017E, // LATIN SMALL LETTER Z WITH CARON (ž) + 0x9F => 0x0178, // LATIN CAPITAL LETTER Y WITH DIAERESIS (Ÿ) + _ => self.character_reference_code, + }; + } + _ => (), + } + + self.temporary_buffer.clear(); + self.temporary_buffer + .push(std::char::from_u32(self.character_reference_code).unwrap()); + self.flush_code_points_consumed_as_character_reference(); + self.state = self.return_state.take().unwrap(); + ControlToken::Continue + } + } + } +} + +impl<R: Reader, E: Emitter> Iterator for Tokenizer<R, E> { + type Item = E::Token; + + fn next(&mut self) -> Option<Self::Item> { + loop { + if let Some(token) = self.emitter.pop_token() { + break Some(token); + } else if !self.eof { + match self.consume() { + ControlToken::Continue => (), + ControlToken::Eof => { + self.eof = true; + self.emitter.emit_eof(); + } + } + } else { + break None; + } + } + } +} diff --git a/src/machine.rs b/src/machine.rs new file mode 100644 index 0000000..67db1b9 --- /dev/null +++ b/src/machine.rs @@ -0,0 +1,164 @@ +macro_rules! surrogate_pat { + () => { + 0xd800..=0xdfff + }; +} + +pub(crate) use surrogate_pat; + +macro_rules! control_pat { + () => (0x0d | 0x0000..=0x001f | 0x007f..=0x009f) +} + +pub(crate) use control_pat; + +macro_rules! ascii_digit_pat { + () => { + '0'..='9' + }; +} + +pub(crate) use ascii_digit_pat; + +macro_rules! whitespace_pat { + () => { + '\t' | '\u{0A}' | '\u{0C}' | ' ' + }; +} + +pub(crate) use whitespace_pat; + +macro_rules! noncharacter_pat { + () => { + 0xfdd0 + ..=0xfdef + | 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 + }; +} + +pub(crate) use noncharacter_pat; + +// When integration tests are running, this enum is public and we get warnings about missing docs. +// However, it's not actually part of public API. +#[allow(missing_docs)] +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum State { + Data, + RcData, + RawText, + ScriptData, + PlainText, + TagOpen, + EndTagOpen, + TagName, + RcDataLessThanSign, + RcDataEndTagOpen, + RcDataEndTagName, + RawTextLessThanSign, + RawTextEndTagOpen, + RawTextEndTagName, + ScriptDataLessThanSign, + ScriptDataEndTagOpen, + ScriptDataEndTagName, + ScriptDataEscapeStart, + ScriptDataEscapeStartDash, + ScriptDataEscaped, + ScriptDataEscapedDash, + ScriptDataEscapedDashDash, + ScriptDataEscapedLessThanSign, + ScriptDataEscapedEndTagOpen, + ScriptDataEscapedEndTagName, + ScriptDataDoubleEscapeStart, + ScriptDataDoubleEscaped, + ScriptDataDoubleEscapedDash, + ScriptDataDoubleEscapedDashDash, + ScriptDataDoubleEscapedLessThanSign, + ScriptDataDoubleEscapeEnd, + BeforeAttributeName, + AttributeName, + AfterAttributeName, + BeforeAttributeValue, + AttributeValueDoubleQuoted, + AttributeValueSingleQuoted, + AttributeValueUnquoted, + AfterAttributeValueQuoted, + SelfClosingStartTag, + BogusComment, + MarkupDeclarationOpen, + CommentStart, + CommentStartDash, + Comment, + CommentLessThanSign, + CommentLessThanSignBang, + CommentLessThanSignBangDash, + CommentLessThanSignBangDashDash, + CommentEndDash, + CommentEnd, + CommentEndBang, + Doctype, + BeforeDoctypeName, + DoctypeName, + AfterDoctypeName, + AfterDoctypePublicKeyword, + BeforeDoctypePublicIdentifier, + DoctypePublicIdentifierDoubleQuoted, + DoctypePublicIdentifierSingleQuoted, + AfterDoctypePublicIdentifier, + BetweenDoctypePublicAndSystemIdentifiers, + AfterDoctypeSystemKeyword, + BeforeDoctypeSystemIdentifier, + DoctypeSystemIdentifierDoubleQuoted, + DoctypeSystemIdentifierSingleQuoted, + AfterDoctypeSystemIdentifier, + BogusDoctype, + CdataSection, + CdataSectionBracket, + CdataSectionEnd, + CharacterReference, + NamedCharacterReference, + AmbiguousAmpersand, + NumericCharacterReference, + HexadecimalCharacterReferenceStart, + DecimalCharacterReferenceStart, + HexadecimalCharacterReference, + DecimalCharacterReference, + NumericCharacterReferenceEnd, +} + +pub enum ControlToken { + Eof, + Continue, +} diff --git a/src/reader.rs b/src/reader.rs new file mode 100644 index 0000000..d2cae92 --- /dev/null +++ b/src/reader.rs @@ -0,0 +1,114 @@ +/// An object that provides characters to the tokenizer. +/// +/// See [`crate::Tokenizer::new`] for more information. +pub trait Reader { + /// Return a new character from the input stream. + /// + /// Newlines have to be normalized as described in [Preprocessing the input + /// stream](https://html.spec.whatwg.org/#preprocessing-the-input-stream), however error + /// emission is done within the tokenizer. + fn read_char(&mut self) -> Option<char>; + + /// Attempt to read an entire string at once, either case-insensitively or not. + /// + /// `case_sensitive=false` means that characters of the input stream should be compared while + /// ignoring ASCII-casing. + /// + /// It can be assumed that this function is never called with a string that contains `\r` or + /// `\n`. + /// + /// If the next characters equal to `s`, this function consumes the respective characters from + /// the input stream and returns `true`. If not, it does nothing and returns `false`. + fn try_read_string(&mut self, s: &str, case_sensitive: bool) -> bool; +} + +/// An object that can be converted into a [`crate::Reader`]. +/// +/// For example, any utf8-string can be converted into a `StringReader`, such that +/// `Tokenizer::new("mystring")` and `Tokenizer::new(&String::new("foo"))` work. +pub trait Readable<'a> { + /// The reader type to which this type should be converted. + type Reader: Reader + 'a; + + /// Convert self to some sort of reader. + fn to_reader(self) -> Self::Reader; +} + +impl<'a, R: 'a + Reader> Readable<'a> for R { + type Reader = Self; + + fn to_reader(self) -> Self::Reader { + self + } +} + +/// A helper struct to seek forwards and backwards in strings. Used by the tokenizer to read HTML +/// from strings. +pub struct StringReader<'a> { + input: &'a str, + pos: usize, +} + +impl<'a> StringReader<'a> { + fn new(input: &'a str) -> Self { + StringReader { input, pos: 0 } + } + + fn peek_char(&self) -> Option<char> { + self.input.get(self.pos..)?.chars().next() + } +} + +impl<'a> Reader for StringReader<'a> { + fn read_char(&mut self) -> Option<char> { + let mut r1 = match self.peek_char() { + Some(x) => x, + None => { + self.pos += 1; + return None; + } + }; + + self.pos += r1.len_utf8(); + + if r1 == '\r' { + r1 = '\n'; + let r2 = self.peek_char(); + if r2 == Some('\n') { + self.pos += r2.map(char::len_utf8).unwrap_or(0); + } + } + + Some(r1) + } + + fn try_read_string(&mut self, s1: &str, case_sensitive: bool) -> bool { + // we do not need to call validate_char here because `s` hopefully does not contain invalid + // characters + + if let Some(s2) = self.input.get(self.pos..self.pos + s1.len()) { + if s1 == s2 || (!case_sensitive && s1.eq_ignore_ascii_case(s2)) { + self.pos += s1.len(); + return true; + } + } + + false + } +} + +impl<'a> Readable<'a> for &'a str { + type Reader = StringReader<'a>; + + fn to_reader(self) -> Self::Reader { + StringReader::new(self) + } +} + +impl<'a> Readable<'a> for &'a String { + type Reader = StringReader<'a>; + + fn to_reader(self) -> Self::Reader { + StringReader::new(self.as_str()) + } +} |