Skip to main content

sevenmark_parser/parser/markdown/
markdown_bold.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_bold_parser(parser_input: &mut ParserInput) -> Result<Element> {
12    if parser_input.state.inside_bold {
13        return Err(winnow::error::ContextError::new());
14    }
15    let start = parser_input.current_token_start();
16
17    let parsed_content = delimited(
18        literal("**"),
19        |input: &mut ParserInput| {
20            input.state.set_bold_context();
21            let result = with_depth(input, element_parser);
22            input.state.unset_bold_context();
23            result
24        },
25        literal("**"),
26    )
27    .parse_next(parser_input)?;
28    let end = parser_input.previous_token_end();
29
30    Ok(Element::Bold(TextStyleElement {
31        span: Span { start, end },
32        children: parsed_content,
33    }))
34}