Skip to main content

marco_core/parser/inlines/
marco_subscript_parser.rs

1//! Subscript parser (extended syntax).
2
3use super::shared::{opt_span_range, GrammarSpan};
4use crate::grammar::inlines as grammar;
5use crate::parser::ast::{Node, NodeKind};
6use nom::IResult;
7
8/// Parse `~text~` and convert to AST node.
9pub fn parse_subscript(input: GrammarSpan) -> IResult<GrammarSpan, Node> {
10    let start = input;
11    let (rest, content) = grammar::subscript(input)?;
12
13    let span = opt_span_range(start, rest);
14
15    let children = match crate::parser::inlines::parse_inlines_from_span(content) {
16        Ok(children) => children,
17        Err(e) => {
18            log::warn!("Failed to parse subscript children: {}", e);
19            vec![]
20        }
21    };
22
23    Ok((
24        rest,
25        Node {
26            kind: NodeKind::Subscript,
27            span,
28            children,
29        },
30    ))
31}
32
33#[cfg(test)]
34mod tests {
35    use super::*;
36
37    #[test]
38    fn smoke_test_parse_subscript() {
39        let input = GrammarSpan::new("~hi~");
40        let (rest, node) = parse_subscript(input).unwrap();
41        assert_eq!(*rest.fragment(), "");
42        assert!(matches!(node.kind, NodeKind::Subscript));
43    }
44}