unidok-parser 0.2.0

Parser for the Unidok document format
Documentation
use unidok_repr::ast::html::DoctypeAst;

use crate::utils::{AsciiCI, ClosingQuoteMark, ParseOneWS, ParseSpaces, QuoteMark};
use crate::Parse;

pub(crate) struct ParseDoctype;

impl Parse for ParseDoctype {
    type Output = DoctypeAst;

    fn parse(&mut self, input: &mut crate::input::Input) -> Option<Self::Output> {
        let mut input = input.start();

        input.parse("<!")?;
        input.parse(AsciiCI("doctype"))?;
        input.parse(ParseOneWS)?;
        input.parse_i(ParseSpaces);
        input.parse(AsciiCI("html"))?;
        input.try_parse(ParseLegacyString);
        input.parse_i(ParseSpaces);
        input.parse('>')?;

        Some(DoctypeAst { text: input.apply() })
    }
}

struct ParseLegacyString;

impl Parse for ParseLegacyString {
    type Output = ();

    fn parse(&mut self, input: &mut crate::input::Input) -> Option<Self::Output> {
        let mut input = input.start();

        input.parse(ParseOneWS)?;
        input.parse_i(ParseSpaces);
        input.parse(AsciiCI("system"))?;
        input.parse(ParseOneWS)?;
        input.parse_i(ParseSpaces);
        let q = input.parse(QuoteMark)?;
        input.parse("about:legacy-compat")?;
        input.parse(ClosingQuoteMark(q))?;

        input.apply();
        Some(())
    }
}