mathml_latex/parser/
block.rs

1use super::*;
2
3impl<'i> LaTeXBlock<'i> {
4    pub fn parse(input: ParseState<'i>) -> ParseResult<LaTeXBlock<'i>> {
5        let (state, begin) = input.skip(whitespace).match_fn(parse_begin)?;
6        let (state, children) = state.skip(whitespace).match_repeats(LaTeXNode::parse_atomic)?;
7        let (state, end) = state.skip(whitespace).match_fn(parse_end)?;
8        if begin != end {
9            tracing::warn!("Mismatched begin/end: {} vs {}", begin, end);
10        }
11        state.finish(LaTeXBlock { kind: begin, children })
12    }
13}
14
15fn parse_begin<'i>(input: ParseState<'i>) -> ParseResult<&'i str> {
16    let (state, _) = input.match_str("\\begin", false)?;
17    let (state, _) = state.skip(whitespace).match_char('{')?;
18    let (state, kind) = state.skip(whitespace).match_str_if(|c| c.is_ascii_alphabetic(), "ASCII_ALPHA")?;
19    let (state, _) = state.skip(whitespace).match_char('}')?;
20    state.finish(kind)
21}
22
23fn parse_end<'i>(input: ParseState<'i>) -> ParseResult<&'i str> {
24    let (state, _) = input.match_str("\\end", false)?;
25    let (state, _) = state.skip(whitespace).match_char('{')?;
26    let (state, kind) = state.skip(whitespace).match_str_if(|c| c.is_ascii_alphabetic(), "ASCII_ALPHA")?;
27    let (state, _) = state.skip(whitespace).match_char('}')?;
28    state.finish(kind)
29}