Skip to main content

rushdown/parser/
raw_html.rs

1use crate::ast::{Arena, NodeRef, RawHtml};
2use crate::parser::{Context, InlineParser};
3use crate::scanner::{
4    scan_html_cdata_reader, scan_html_comment_reader, scan_html_declaration_reader,
5    scan_html_processing_instruction_reader, scan_html_tag_reader,
6};
7use crate::text::{self, Reader};
8
9/// [`InlineParser`] for inline raw HTML.
10#[derive(Debug, Default)]
11pub struct RawHtmlParser {}
12
13impl RawHtmlParser {
14    /// Returns a new [`RawHtmlParser`].
15    pub fn new() -> Self {
16        Self::default()
17    }
18}
19
20impl InlineParser for RawHtmlParser {
21    fn trigger(&self) -> &[u8] {
22        b"<"
23    }
24
25    fn parse(
26        &self,
27        arena: &mut Arena,
28        _parent_ref: NodeRef,
29        reader: &mut text::BlockReader,
30        _ctx: &mut Context,
31    ) -> Option<NodeRef> {
32        let (line, pos) = reader.position();
33        if scan_html_tag_reader(reader).is_some()
34            || scan_html_comment_reader(reader).is_some()
35            || scan_html_processing_instruction_reader(reader).is_some()
36            || scan_html_declaration_reader(reader).is_some()
37            || scan_html_cdata_reader(reader).is_some()
38        {
39            return Some(arena.new_node(RawHtml::new(reader.between_current(line, pos))));
40        }
41        None
42    }
43}