diff options
Diffstat (limited to 'src/machine.rs')
| -rw-r--r-- | src/machine.rs | 45 | 
1 files changed, 25 insertions, 20 deletions
diff --git a/src/machine.rs b/src/machine.rs index c11720d..deb3983 100644 --- a/src/machine.rs +++ b/src/machine.rs @@ -1,4 +1,5 @@  use crate::entities::try_read_character_reference; +use crate::offset::{Offset, Position};  use crate::utils::{      ascii_digit_pat, control_pat, ctostr, noncharacter_pat, surrogate_pat, whitespace_pat,      ControlToken, State, @@ -8,10 +9,11 @@ use crate::{reader::Reader, Emitter, Error, Tokenizer};  // Note: This is not implemented as a method on Tokenizer because there's fields on Tokenizer that  // should not be available in this method, such as Tokenizer.to_reconsume or the Reader instance  #[inline] -pub fn consume<R, E>(slf: &mut Tokenizer<R, E>) -> Result<ControlToken, R::Error> +pub fn consume<O, R, E>(slf: &mut Tokenizer<R, O, E>) -> Result<ControlToken, R::Error>  where -    R: Reader, -    E: Emitter<R>, +    O: Offset, +    R: Reader + Position<O>, +    E: Emitter<O>,  {      macro_rules! mutate_character_reference {          (* $mul:literal + $x:ident - $sub:literal) => { @@ -133,7 +135,7 @@ where              }              c @ Some('?') => {                  slf.emit_error(Error::UnexpectedQuestionMarkInsteadOfTagName); -                slf.emitter.init_comment(&slf.reader); +                slf.emitter.init_comment(slf.reader.position());                  slf.state = State::BogusComment;                  slf.unread_char(c);                  Ok(ControlToken::Continue) @@ -170,7 +172,7 @@ where              }              Some(x) => {                  slf.emit_error(Error::InvalidFirstCharacterOfTagName); -                slf.emitter.init_comment(&slf.reader); +                slf.emitter.init_comment(slf.reader.position());                  slf.state = State::BogusComment;                  slf.unread_char(Some(x));                  Ok(ControlToken::Continue) @@ -686,13 +688,13 @@ where              }              Some('=') => {                  slf.emit_error(Error::UnexpectedEqualsSignBeforeAttributeName); -                slf.emitter.init_attribute_name(&slf.reader); +                slf.emitter.init_attribute_name(slf.reader.position());                  slf.emitter.push_attribute_name("=");                  slf.state = State::AttributeName;                  Ok(ControlToken::Continue)              }              Some(x) => { -                slf.emitter.init_attribute_name(&slf.reader); +                slf.emitter.init_attribute_name(slf.reader.position());                  slf.state = State::AttributeName;                  slf.unread_char(Some(x));                  Ok(ControlToken::Continue) @@ -745,7 +747,7 @@ where                  Ok(ControlToken::Eof)              }              Some(x) => { -                slf.emitter.init_attribute_name(&slf.reader); +                slf.emitter.init_attribute_name(slf.reader.position());                  slf.state = State::AttributeName;                  slf.unread_char(Some(x));                  Ok(ControlToken::Continue) @@ -754,12 +756,14 @@ where          State::BeforeAttributeValue => match slf.read_char()? {              Some(whitespace_pat!()) => Ok(ControlToken::Continue),              Some('"') => { -                slf.emitter.init_attribute_value(&slf.reader, true); +                slf.emitter +                    .init_attribute_value(slf.reader.position(), true);                  slf.state = State::AttributeValueDoubleQuoted;                  Ok(ControlToken::Continue)              }              Some('\'') => { -                slf.emitter.init_attribute_value(&slf.reader, true); +                slf.emitter +                    .init_attribute_value(slf.reader.position(), true);                  slf.state = State::AttributeValueSingleQuoted;                  Ok(ControlToken::Continue)              } @@ -770,7 +774,8 @@ where                  Ok(ControlToken::Continue)              }              c => { -                slf.emitter.init_attribute_value(&slf.reader, false); +                slf.emitter +                    .init_attribute_value(slf.reader.position(), false);                  slf.state = State::AttributeValueUnquoted;                  slf.unread_char(c);                  Ok(ControlToken::Continue) @@ -885,7 +890,7 @@ where          },          State::SelfClosingStartTag => match slf.read_char()? {              Some('>') => { -                slf.emitter.set_self_closing(&slf.reader); +                slf.emitter.set_self_closing(slf.reader.position());                  slf.state = State::Data;                  slf.emit_current_tag();                  Ok(ControlToken::Continue) @@ -923,7 +928,7 @@ where          },          State::MarkupDeclarationOpen => match slf.read_char()? {              Some('-') if slf.try_read_string("-", true)? => { -                slf.emitter.init_comment(&slf.reader); +                slf.emitter.init_comment(slf.reader.position());                  slf.state = State::CommentStart;                  Ok(ControlToken::Continue)              } @@ -940,14 +945,14 @@ where                  // let's hope that bogus comment can just sort of skip over cdata                  slf.emit_error(Error::CdataInHtmlContent); -                slf.emitter.init_comment(&slf.reader); +                slf.emitter.init_comment(slf.reader.position());                  slf.emitter.push_comment("[CDATA[");                  slf.state = State::BogusComment;                  Ok(ControlToken::Continue)              }              c => {                  slf.emit_error(Error::IncorrectlyOpenedComment); -                slf.emitter.init_comment(&slf.reader); +                slf.emitter.init_comment(slf.reader.position());                  slf.state = State::BogusComment;                  slf.unread_char(c);                  Ok(ControlToken::Continue) @@ -1153,7 +1158,7 @@ where              }              None => {                  slf.emit_error(Error::EofInDoctype); -                slf.emitter.init_doctype(&slf.reader); +                slf.emitter.init_doctype(slf.reader.position());                  slf.emitter.set_force_quirks();                  slf.emitter.emit_current_doctype();                  Ok(ControlToken::Eof) @@ -1169,14 +1174,14 @@ where              Some(whitespace_pat!()) => Ok(ControlToken::Continue),              Some('\0') => {                  slf.emit_error(Error::UnexpectedNullCharacter); -                slf.emitter.init_doctype(&slf.reader); +                slf.emitter.init_doctype(slf.reader.position());                  slf.emitter.push_doctype_name("\u{fffd}");                  slf.state = State::DoctypeName;                  Ok(ControlToken::Continue)              }              Some('>') => {                  slf.emit_error(Error::MissingDoctypeName); -                slf.emitter.init_doctype(&slf.reader); +                slf.emitter.init_doctype(slf.reader.position());                  slf.emitter.set_force_quirks();                  slf.state = State::Data;                  slf.emitter.emit_current_doctype(); @@ -1184,13 +1189,13 @@ where              }              None => {                  slf.emit_error(Error::EofInDoctype); -                slf.emitter.init_doctype(&slf.reader); +                slf.emitter.init_doctype(slf.reader.position());                  slf.emitter.set_force_quirks();                  slf.emitter.emit_current_doctype();                  Ok(ControlToken::Eof)              }              Some(x) => { -                slf.emitter.init_doctype(&slf.reader); +                slf.emitter.init_doctype(slf.reader.position());                  slf.emitter                      .push_doctype_name(ctostr!(x.to_ascii_lowercase()));                  slf.state = State::DoctypeName;  | 
