From ca083f59fcf151725b4f86719674a153fded4eb5 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Mon, 6 Mar 2023 21:51:49 +0100 Subject: Fix handling of trailing whitespace characters --- askama_derive/src/generator.rs | 12 ++++++++---- askama_derive/src/parser/node.rs | 11 +++++++++++ 2 files changed, 19 insertions(+), 4 deletions(-) (limited to 'askama_derive/src') diff --git a/askama_derive/src/generator.rs b/askama_derive/src/generator.rs index d8093c3..cad7909 100644 --- a/askama_derive/src/generator.rs +++ b/askama_derive/src/generator.rs @@ -686,6 +686,11 @@ impl<'a> Generator<'a> { } if AstLevel::Top == level { + // Handle any pending whitespace. + if self.next_ws.is_some() { + self.flush_ws(Ws(Some(self.skip_ws.into()), None)); + } + size_hint += self.write_buf_writable(buf)?; } Ok(size_hint) @@ -1247,9 +1252,7 @@ impl<'a> Generator<'a> { assert!(self.next_ws.is_none()); if !lws.is_empty() { match self.skip_ws { - WhitespaceHandling::Suppress => { - self.skip_ws = WhitespaceHandling::Preserve; - } + WhitespaceHandling::Suppress => {} _ if val.is_empty() => { assert!(rws.is_empty()); self.next_ws = Some(lws); @@ -1260,12 +1263,13 @@ impl<'a> Generator<'a> { .push(Writable::Lit(match lws.contains('\n') { true => "\n", false => " ", - })) + })); } } } if !val.is_empty() { + self.skip_ws = WhitespaceHandling::Preserve; self.buf_writable.push(Writable::Lit(val)); } diff --git a/askama_derive/src/parser/node.rs b/askama_derive/src/parser/node.rs index 9f8b37b..fc6860e 100644 --- a/askama_derive/src/parser/node.rs +++ b/askama_derive/src/parser/node.rs @@ -14,6 +14,7 @@ use super::{ tag_block_end, tag_block_start, tag_comment_end, tag_comment_start, tag_expr_end, tag_expr_start, take_content, ws, Expr, State, }; +use crate::config::WhitespaceHandling; #[derive(Debug, PartialEq)] pub(crate) enum Node<'a> { @@ -55,6 +56,16 @@ pub(crate) enum Whitespace { Minimize, } +impl From for Whitespace { + fn from(ws: WhitespaceHandling) -> Self { + match ws { + WhitespaceHandling::Suppress => Whitespace::Suppress, + WhitespaceHandling::Preserve => Whitespace::Preserve, + WhitespaceHandling::Minimize => Whitespace::Minimize, + } + } +} + #[derive(Debug, PartialEq)] pub(crate) struct Loop<'a> { pub(crate) ws1: Ws, -- cgit