unidok-parser 0.2.0

Parser for the Unidok document format
Documentation
use aho_corasick::AhoCorasick;
use unidok_repr::ast::html::HtmlNodeAst;

use crate::parsing_mode::ParsingMode;
use crate::{Indents, Input, Parse};

use super::cdata::ParseCDataSection;
use super::comment::ParseHtmlComment;
use super::doctype::ParseDoctype;
use super::elem::ParseHtmlElem;

pub(crate) struct ParseHtmlNode<'a> {
    pub ind: Indents<'a>,
    pub mode: Option<ParsingMode>,
    pub ac: &'a AhoCorasick,
}

impl Parse for ParseHtmlNode<'_> {
    type Output = HtmlNodeAst;

    fn parse(&mut self, input: &mut Input) -> Option<Self::Output> {
        Some(
            if let Some(elem) =
                input.parse(ParseHtmlElem { ind: self.ind, mode: self.mode, ac: self.ac })
            {
                HtmlNodeAst::Element(elem)
            } else if let Some(comment) = input.parse(ParseHtmlComment { ind: self.ind }) {
                HtmlNodeAst::Comment(comment)
            } else if let Some(doctype) = input.parse(ParseDoctype) {
                HtmlNodeAst::Doctype(doctype)
            } else if let Some(cdata) = input.parse(ParseCDataSection) {
                HtmlNodeAst::CData(cdata)
            } else {
                return None;
            },
        )
    }
}