Skip to main content

sevenmark_parser/parser/markdown/
markdown_subscript.rs

1use crate::ast::{Element, Span, TextStyleElement};
2use crate::parser::ParserInput;
3use crate::parser::element::element_parser;
4use crate::parser::utils::with_depth;
5use winnow::Result;
6use winnow::combinator::delimited;
7use winnow::prelude::*;
8use winnow::stream::Location as StreamLocation;
9use winnow::token::literal;
10
11pub fn markdown_subscript_parser(parser_input: &mut ParserInput) -> Result<Element> {
12    if parser_input.state.inside_subscript {
13        return Err(winnow::error::ContextError::new());
14    }
15    let start = parser_input.current_token_start();
16    let parsed_content = delimited(
17        literal(",,"),
18        |input: &mut ParserInput| {
19            input.state.set_subscript_context();
20            let result = with_depth(input, element_parser);
21            input.state.unset_subscript_context();
22            result
23        },
24        literal(",,"),
25    )
26    .parse_next(parser_input)?;
27    let end = parser_input.previous_token_end();
28
29    Ok(Element::Subscript(TextStyleElement {
30        span: Span { start, end },
31        children: parsed_content,
32    }))
33}