From c5a2179b9e0e41621ff87a0b02e7b5d38b4766ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20M=C3=BCller?= Date: Thu, 5 Mar 2026 20:34:10 +0100 Subject: [PATCH] Capture whitespace around interpolations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Marcel Müller --- src/parser/mod.rs | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/src/parser/mod.rs b/src/parser/mod.rs index eff81e2..8fa35c0 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -8,10 +8,12 @@ use annotate_snippets::Snippet; use winnow::LocatingSlice; use winnow::Parser; use winnow::RecoverableParser; +use winnow::ascii::multispace0; use winnow::ascii::multispace1; use winnow::combinator::alt; use winnow::combinator::cut_err; use winnow::combinator::eof; +use winnow::combinator::opt; use winnow::combinator::peek; use winnow::combinator::repeat_till; use winnow::combinator::terminated; @@ -218,15 +220,20 @@ fn parse_tokens<'input>(input: &mut Input<'input>) -> PResult<'input, Vec(input: &mut Input<'input>) -> PResult<'input, Vec>> { - alt((take_until(1.., "{{"), rest)) - .map(TemplateToken::Content) - .map(|v| vec![v]) - .parse_next(input) + alt(( + repeat_till(1.., any, peek((multispace0, "{{"))).map(|((), _)| ()), + rest.void(), + )) + .take() + .map(TemplateToken::Content) + .map(|v| vec![v]) + .parse_next(input) } fn parse_interpolate<'input>( input: &mut Input<'input>, ) -> PResult<'input, Vec>> { + let prev_whitespace = opt(parse_whitespace).parse_next(input)?; let left_delim = "{{".map(TemplateToken::LeftDelim).parse_next(input)?; let get_tokens = repeat_till(1.., parse_interpolate_token, peek("}}")); @@ -239,10 +246,14 @@ fn parse_interpolate<'input>( .parse_next(input)?; let right_delim = "}}".map(TemplateToken::RightDelim).parse_next(input)?; + let post_whitespace = opt(parse_whitespace).parse_next(input)?; - let mut tokens = vec![left_delim]; + let mut tokens = vec![]; + tokens.extend(prev_whitespace); + tokens.push(left_delim); tokens.extend(inside_tokens); tokens.push(right_delim); + tokens.extend(post_whitespace); Ok(tokens) } @@ -390,7 +401,10 @@ mod tests { ParsedTemplate { tokens: [ Content( - "Hello ", + "Hello", + ), + Whitespace( + " ", ), LeftDelim( "{{",