mathml_latex/parser/
block.rs1use 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}