sevenmark_parser/parser/token/
token_newline.rs1use 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 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}