Skip to main content

sevenmark_parser/parser/token/
token_newline.rs

1use crate::ast::{Element, SoftBreakElement, Span};
2use crate::parser::ParserInput;
3use winnow::Result;
4use winnow::ascii::multispace1;
5use winnow::combinator::{alt, not, peek};
6use winnow::prelude::*;
7use winnow::stream::Location as StreamLocation;
8use winnow::token::literal;
9
10pub fn token_newline_parser(parser_input: &mut ParserInput) -> Result<Element> {
11    if parser_input.state.inside_header && parser_input.input.starts_with('\n') {
12        return Err(winnow::error::ContextError::new());
13    }
14
15    // trim 컨텍스트에서 }}} 또는 ]] 앞 whitespace면 실패 (suffix가 처리하도록)
16    if parser_input.state.is_trimming() {
17        not((multispace1, peek(alt((literal("}}}"), literal("]]")))))).parse_next(parser_input)?;
18    }
19
20    let start = parser_input.current_token_start();
21    literal("\n").parse_next(parser_input)?;
22    let end = parser_input.previous_token_end();
23
24    Ok(Element::SoftBreak(SoftBreakElement {
25        span: Span { start, end },
26    }))
27}