diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/basic_emitter.rs | 126 | ||||
-rw-r--r-- | src/lib.rs | 2 | ||||
-rw-r--r-- | src/naive_parser.rs | 13 |
3 files changed, 134 insertions, 7 deletions
diff --git a/src/basic_emitter.rs b/src/basic_emitter.rs new file mode 100644 index 0000000..046b645 --- /dev/null +++ b/src/basic_emitter.rs @@ -0,0 +1,126 @@ +use std::collections::VecDeque; +use std::ops::Range; + +use crate::offset::Offset; +use crate::Emitter; +use crate::Error; +use crate::Token; + +/// An [`Emitter`] implementation that yields [`Token`]. +pub struct BasicEmitter<O> { + errors: VecDeque<(Error, Range<O>)>, +} + +impl<O: Default> Default for BasicEmitter<O> { + fn default() -> Self { + BasicEmitter { + errors: VecDeque::new(), + } + } +} + +impl<O> BasicEmitter<O> { + /// Removes all encountered tokenizer errors and returns them as an iterator. + pub fn drain_errors(&mut self) -> impl Iterator<Item = (Error, Range<O>)> + '_ { + self.errors.drain(0..) + } +} + +impl<O> Iterator for BasicEmitter<O> { + type Item = Token<O>; + + fn next(&mut self) -> Option<Self::Item> { + todo!() + } +} + +#[allow(unused_variables)] +impl<O: Offset> Emitter<O> for BasicEmitter<O> { + fn report_error(&mut self, error: Error, span: Range<O>) { + todo!() + } + + fn emit_char(&mut self, c: char) { + todo!() + } + + fn emit_eof(&mut self) { + todo!() + } + + fn init_start_tag(&mut self, tag_offset: O, name_offset: O) { + todo!() + } + + fn init_end_tag(&mut self, tag_offset: O, name_offset: O) { + todo!() + } + + fn push_tag_name(&mut self, s: &str) { + todo!() + } + + fn init_attribute_name(&mut self, offset: O) { + todo!() + } + + fn push_attribute_name(&mut self, s: &str) { + todo!() + } + + fn push_attribute_value(&mut self, s: &str) { + todo!() + } + + fn set_self_closing(&mut self, slash_span: Range<O>) { + todo!() + } + + fn emit_current_tag(&mut self, offset: O) { + todo!() + } + + fn init_comment(&mut self, data_start_offset: O) { + todo!() + } + + fn push_comment(&mut self, s: &str) { + todo!() + } + + fn emit_current_comment(&mut self, data_end_offset: O) { + todo!() + } + + fn init_doctype(&mut self, offset: O) { + todo!() + } + + fn push_doctype_name(&mut self, s: &str) { + todo!() + } + + fn init_doctype_public_id(&mut self, offset: O) { + todo!() + } + + fn push_doctype_public_id(&mut self, s: &str) { + todo!() + } + + fn init_doctype_system_id(&mut self, offset: O) { + todo!() + } + + fn push_doctype_system_id(&mut self, s: &str) { + todo!() + } + + fn set_force_quirks(&mut self) { + todo!() + } + + fn emit_current_doctype(&mut self, offset: O) { + todo!() + } +} @@ -7,6 +7,7 @@ #![doc = concat!("[the LICENSE file]: ", file_url!("LICENSE"))] #![doc = include_str!("../README.md")] +mod basic_emitter; mod emitter; mod entities; mod error; @@ -25,6 +26,7 @@ pub mod offset; pub mod reader; pub mod token; +pub use basic_emitter::BasicEmitter; pub use emitter::Emitter; pub use error::Error; pub use naive_parser::NaiveParser; diff --git a/src/naive_parser.rs b/src/naive_parser.rs index 91edbc0..4f8dc0d 100644 --- a/src/naive_parser.rs +++ b/src/naive_parser.rs @@ -1,8 +1,7 @@ use crate::offset::{Offset, Position}; use crate::reader::{IntoReader, Reader}; use crate::tokenizer::CdataAction; -use crate::tracing_emitter::TracingEmitter; -use crate::{Emitter, Event, State, Tokenizer}; +use crate::{BasicEmitter, Emitter, Event, State, Tokenizer}; /// A naive HTML parser (**not** spec-compliant since it doesn't do tree construction). /// @@ -13,7 +12,7 @@ use crate::{Emitter, Event, State, Tokenizer}; /// /// * it naively emits any CDATA sections as bogus comments, for example: /// -/// ``` +/// ```no_run TODO: run again once BasicEmitter has been implemented /// # use html5tokenizer::{NaiveParser, Token}; /// let html = "<svg><![CDATA[I love SVG]]>"; /// let mut tokens = NaiveParser::new(html).flatten(); @@ -30,18 +29,18 @@ pub struct NaiveParser<R: Reader, O: Offset, E: Emitter<O>> { tokenizer: Tokenizer<R, O, E>, } -impl<R, O> NaiveParser<R, O, TracingEmitter<O>> +impl<R, O> NaiveParser<R, O, BasicEmitter<O>> where R: Reader + Position<O>, O: Offset, { - /// Constructs a new naive parser. + /// Constructs a new naive parser using the [`BasicEmitter`]. // TODO: add example for NaiveParser::new - pub fn new<'a, IR>(reader: IR) -> NaiveParser<R, O, TracingEmitter<O>> + pub fn new<'a, IR>(reader: IR) -> NaiveParser<R, O, BasicEmitter<O>> where IR: IntoReader<'a, Reader = R>, { - NaiveParser::new_with_emitter(reader, TracingEmitter::default()) + NaiveParser::new_with_emitter(reader, BasicEmitter::default()) } } |