From 8b98e660b1adf8e1b7d086a7823b11d58910b06e Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Tue, 21 May 2024 15:46:11 +0200 Subject: [PATCH 1/2] Fix block partial rendering --- askama_derive/src/generator.rs | 5 +++++ testing/tests/block_fragments.rs | 18 ++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/askama_derive/src/generator.rs b/askama_derive/src/generator.rs index decb01cb..32a81284 100644 --- a/askama_derive/src/generator.rs +++ b/askama_derive/src/generator.rs @@ -90,6 +90,7 @@ impl<'a> Generator<'a> { buf.write(CRATE); buf.writeln("::Result<()> {")?; + buf.discard = self.buf_writable.discard; // Make sure the compiler understands that the generated code depends on the template files. for path in self.contexts.keys() { // Skip the fake path of templates defined in rust source. @@ -113,6 +114,7 @@ impl<'a> Generator<'a> { } else { self.handle(ctx, ctx.nodes, buf, AstLevel::Top) }?; + buf.discard = false; self.flush_ws(Ws(None, None)); buf.write(CRATE); @@ -987,6 +989,9 @@ impl<'a> Generator<'a> { if block_fragment_write { self.buf_writable.discard = true; } + if buf.discard != prev_buf_discard { + self.write_buf_writable(buf)?; + } buf.discard = prev_buf_discard; Ok(size_hint) diff --git a/testing/tests/block_fragments.rs b/testing/tests/block_fragments.rs index ae723b6d..502367db 100644 --- a/testing/tests/block_fragments.rs +++ b/testing/tests/block_fragments.rs @@ -103,3 +103,21 @@ fn test_specific_block() { let t = RenderInPlace { s1 }; assert_eq!(t.render().unwrap(), "\nSection: [abc]\n"); } + +#[derive(Template)] +#[template( + source = r#"{% block empty %} +{% endblock %} + +{% if let Some(var) = var %} +{{ var }} +{% endif %}"#, + block = "empty", + ext = "txt" +)] +struct Empty {} + +#[test] +fn test_render_only_block() { + assert_eq!(Empty {}.render().unwrap(), "\n"); +} From e44b0ca78d773e2c50cb2e5e7807a212f2633752 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Thu, 23 May 2024 14:37:54 +0200 Subject: [PATCH 2/2] Add code comment to explain discard condition --- askama_derive/src/generator.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/askama_derive/src/generator.rs b/askama_derive/src/generator.rs index 32a81284..9a8eb94f 100644 --- a/askama_derive/src/generator.rs +++ b/askama_derive/src/generator.rs @@ -989,6 +989,10 @@ impl<'a> Generator<'a> { if block_fragment_write { self.buf_writable.discard = true; } + // If we are rendering a specific block and the discard changed, it means that we're done + // with the block we want to render and that from this point, everything will be discarded. + // + // To get this block content rendered as well, we need to write to the buffer before then. if buf.discard != prev_buf_discard { self.write_buf_writable(buf)?; }