Skip to main content

sevenmark_parser/parser/token/
token_asterisk.rs

1use crate::ast::{Element, Span, TextElement};
2use crate::parser::ParserInput;
3use winnow::Result;
4use winnow::prelude::*;
5use winnow::stream::Location as StreamLocation;
6use winnow::token::literal;
7
8pub fn token_asterisk_parser(parser_input: &mut ParserInput) -> Result<Element> {
9    // Bold context에서 **을 만나면 실패 (delimiter로 사용되어야 함)
10    if parser_input.state.inside_bold && parser_input.input.starts_with("**") {
11        return Err(winnow::error::ContextError::new());
12    }
13    // Italic context에서 *을 만나면 실패 (delimiter로 사용되어야 함)
14    if parser_input.state.inside_italic && parser_input.input.starts_with("*") {
15        return Err(winnow::error::ContextError::new());
16    }
17
18    let start = parser_input.current_token_start();
19    literal("*").parse_next(parser_input)?;
20    let end = parser_input.previous_token_end();
21
22    Ok(Element::Text(TextElement {
23        span: Span { start, end },
24        value: "*".to_string(),
25    }))
26}