sevenmark_parser/parser/markdown/
markdown_bold.rs1use 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}