#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum QuoteStyle {
Double,
Single,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DoctypeSubState {
Normal,
AfterLt,
AfterLtBang,
AfterLtBangDash,
Comment { dash_count: u8 },
PI { saw_qmark: bool },
DoubleQuoted,
SingleQuoted,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ParserState {
Content,
AfterLt,
StartTagName { name_start: usize },
StartTagPostName,
AttrName { name_start: usize },
AfterAttrName,
BeforeAttrValue,
AttrValue { quote: QuoteStyle },
AttrEntityRef { name_start: usize, quote: QuoteStyle },
AttrCharRef { value_start: usize, quote: QuoteStyle },
EndTagName { name_start: usize },
EndTagPostName,
StartTagGotSlash,
AfterLtBang,
AfterLtBangDash,
CommentContent { dash_count: u8 },
AfterLtBangBracket { matched: u8 },
CdataContent { bracket_count: u8 },
AfterLtBangD { matched: u8 },
DoctypeName { name_start: usize },
DoctypeContent { depth: u32, sub: DoctypeSubState },
PITarget { name_start: usize },
PIContent { saw_qmark: bool },
EntityRef { name_start: usize },
CharRef { value_start: usize },
}
impl ParserState {
pub fn adjust_positions(&mut self, consumed: usize) {
match self {
ParserState::StartTagName { name_start } => *name_start -= consumed,
ParserState::AttrName { name_start } => *name_start -= consumed,
ParserState::AttrEntityRef { name_start, .. } => *name_start -= consumed,
ParserState::AttrCharRef { value_start, .. } => *value_start -= consumed,
ParserState::EndTagName { name_start } => *name_start -= consumed,
ParserState::DoctypeName { name_start } if *name_start < usize::MAX - 1 => *name_start -= consumed,
ParserState::PITarget { name_start } => *name_start -= consumed,
ParserState::EntityRef { name_start } => *name_start -= consumed,
ParserState::CharRef { value_start } => *value_start -= consumed,
ParserState::Content
| ParserState::AfterLt
| ParserState::StartTagPostName
| ParserState::StartTagGotSlash
| ParserState::AfterAttrName
| ParserState::BeforeAttrValue
| ParserState::AttrValue { .. }
| ParserState::EndTagPostName
| ParserState::AfterLtBang
| ParserState::AfterLtBangDash
| ParserState::CommentContent { .. }
| ParserState::AfterLtBangBracket { .. }
| ParserState::CdataContent { .. }
| ParserState::AfterLtBangD { .. }
| ParserState::DoctypeName { .. }
| ParserState::DoctypeContent { .. }
| ParserState::PIContent { .. } => {}
}
}
}