djc / askama

Type-safe, compiled Jinja-like templates for Rust
Apache License 2.0
3.25k stars 213 forks source link

rendering nested block broken by if-else-endif in outer block #1075

Open clonejo opened 2 weeks ago

clonejo commented 2 weeks ago

Description

When rendering a nested block as a fragment, an if-else-endif clause in the outer block causes this error message:

error: dedent() called while indentation == 0
  --> testing/tests/block_fragments.rs:35:10
   |
35 | #[derive(Template)]
   |          ^^^^^^^^
   |
   = note: this error originates in the derive macro `Template` (in Nightly builds, run with -Z macro-backtrace for more info)

error: could not compile `askama_testing` (test "block_fragments") due to 1 previous error

It does not occur when the same template is rendered as a whole. It does not occur if only a if-endif clause is used.

Environment

askama main from Git (382b5f6a4e3e50676283957ed38d8f719ad6b5df)

How to reproduce

I created a small patch to the test suite: https://github.com/clonejo/askama/commit/96e0fb0e622dfc7be87965b3952677a797032010

testing/templates/fragment-nested-block.html:

{% extends "fragment-base.html" %}

{% block body %}
<p>Don't render me!</p>
{% if true %}
true
{% else %}
false
{% endif %}
{% block nested %}
<p>I should be here.</p>
{% endblock %}
{% endblock %}

{% block other_body %}
<p>Don't render me!</p>
{% endblock %}
djc commented 1 week ago

Can you check if #1054 fixes this problem for you?

clonejo commented 1 week ago

@djc i tried my test suite patch on top of e44b0ca78d773e2c50cb2e5e7807a212f2633752 (from #1054), and i still get the exact same error message.

clonejo commented 6 days ago

Looks like this also triggers the same bug with just if-endif twice in the same row:

{% extends "fragment-base.html" %}

{% block body %}
<p>Don't render me!</p>
{%- if true -%}
true
{%- endif -%}{%- if false -%}
false
{%- endif -%}
{% block nested %}
<p>I should be here.</p>
{% endblock %}
{% endblock %}

{% block other_body %}
<p>Don't render me!</p>
{% endblock %}