mathml-latex 0.0.3

Convert between MathML and LaTeX.
Documentation
use super::*;

impl<'i> LaTeXBlock<'i> {
    pub fn parse(input: ParseState<'i>) -> ParseResult<LaTeXBlock<'i>> {
        let (state, begin) = input.skip(whitespace).match_fn(parse_begin)?;
        let (state, children) = state.skip(whitespace).match_repeats(LaTeXNode::parse_atomic)?;
        let (state, end) = state.skip(whitespace).match_fn(parse_end)?;
        if begin != end {
            tracing::warn!("Mismatched begin/end: {} vs {}", begin, end);
        }
        state.finish(LaTeXBlock { kind: begin, children })
    }
}

fn parse_begin<'i>(input: ParseState<'i>) -> ParseResult<&'i str> {
    let (state, _) = input.match_str("\\begin", false)?;
    let (state, _) = state.skip(whitespace).match_char('{')?;
    let (state, kind) = state.skip(whitespace).match_str_if(|c| c.is_ascii_alphabetic(), "ASCII_ALPHA")?;
    let (state, _) = state.skip(whitespace).match_char('}')?;
    state.finish(kind)
}

fn parse_end<'i>(input: ParseState<'i>) -> ParseResult<&'i str> {
    let (state, _) = input.match_str("\\end", false)?;
    let (state, _) = state.skip(whitespace).match_char('{')?;
    let (state, kind) = state.skip(whitespace).match_str_if(|c| c.is_ascii_alphabetic(), "ASCII_ALPHA")?;
    let (state, _) = state.skip(whitespace).match_char('}')?;
    state.finish(kind)
}