Jinja syntax and line break

Hi

i’ve got:

var1:
    - a1
    - b1
var2:
    - a2
    - b2

in a template, i copy the content : {{ foo_content }}

i’d like to get the content of the file as:

a1 b1
a2 b2

but if

foo_content:
    blabla {% if var1 | default([]) %} {{ var1 | join(' ') }}{% endif %}
    {% if var2 | default([]) %} {{ var2 | join(' ') }}{% endif %}

i’d get :
a1 b1 a2 b2

i do not want to use:

foo_content:
    blabla {% if var1 | default([]) %} {{ var1 | join(' ') }}{% endif %}

    {% if var2 | default([]) %} {{ var2 | join(' ') }}{% endif %}

to get :

a1 b1
a2 b2

Is it possible to have something compact without space between these two lines:
foo_content:
blabla {% if var1 | default() %} {{ var1 | join(’ ‘) }}{% endif %}
{% if var2 | default() %} {{ var2 | join(’ ') }}{% endif %}

Thank in advance.

You’re going to be disappointed I’m afraid.
You can get something that looks okay at first glance by adding a + before the last %} on each endif. That preserves the new-line which would normally be deleted after a block command. So

foo_content: |
    blabla {% if var1 | default([]) %} {{ var1 | join(' ') }}{% endif +%}
    {% if var2 | default([]) %} {{ var2 | join(' ') }}{% endif +%}

produces this:

blabla  a1 b1
 a2 b2

But it isn’t handling your default([]) correctly. For example, this uses the undefined var9 and var8:

foo_content: |
    blabla
    {% if var1 | default([]) %}{{ var1 | join(' ') }}{% endif +%}
    {% if var9 | default([]) %}{{ var9 | join(' ') }}{% endif +%}
    {% if var8 | default([]) %}{{ var8 | join(' ') }}{% endif +%}
    {% if var2 | default([]) %}{{ var2 | join(' ') }}{% endif +%}
    bling

and produces unwanted blank lines:

blabla
a1 b1


a2 b2
bling

The right answer is: stop fighting your tools and work with them instead, like so:

blabla
{% if var1 | default([]) %}
{{ var1 | join(' ') }}
{% endif %}
{% if var9 | default([]) %}
{{ var9 | join(' ') }}
{% endif %}
{% if var8 | default([]) %}
{{ var81 | join(' ') }}
{% endif %}
{% if var2 | default([]) %}
{{ var2 | join(' ') }}
{% endif %}
bling

which produces the desired result

blabla
a1 b1
a2 b2
bling

Or this more general approach which produces the same result as the previous example:

foo_content: |
    blabla
    {% for v in [var1, var9, var8, var2] %}
    {%   if v | default([]) %}
    {{     v | join(' ') }}
    {%   endif %}
    {% endfor %}
    bling

This kind of answer is one that I’m particularly unhappy with.
User: I want to do X because <whatever>. How can I do X?
Help: Do Y instead!
User: But I want to do X.
Help: Yeah, me too. X won’t work. Do Y instead.
User: But…
Help: I know. (Do Y instead.)

Good luck.

1 Like