Search code examples
jekyllgithub-pages

Jekyll nested include with for loop


I'd like to use a {% for %} loop in an included file, to avoid repeating logic to create the loop array (it's an assign with multiple where_exps).

But I'd like to use different content depending on where I include the loop, so sometimes I will do this:

{% for i in a %}
<li>{{ i.name }}</li>
{% endfor %}

and sometimes:

{% for i in a %}
<loc>{{ i.url }}</loc>
{% endfor %}

How can I achieve this? So far I have to put each of the inner contents in their own template, so I would have files like below, but I'd like to avoid the extra template files, and just keep that content in the appropriate main file:

html_template.html:

<li>{{ i.name }}</li>

xml_template.xml:

<loc>{{ i.url }}</loc>

page_loop.html:

{% assign a = "logic I don't want to repeat" %}
{% for i in a %}
{% include {{ include.inner_template }} %}
{% endfor %}

html_main.html:

{% include page_loop.html inner_template="html_template.html" %}

xml_main.xml:

{% include page_loop.html inner_template="xml_template.xml" %}

Solution

  • It would probably be another more elegant (?) solution developing a plugin, but quickly modifying your code, in _includes/page_loop.html:

    {% assign a = "something" %}
    {% for i in a %}
    {%if include.type == "name"%}
    <li>{{ i.name }}</li>
    {%else if include.type == "url"%}
    <loc>{{ i.url }}</loc>
    {%endif %}
    {% endfor %}
    

    Then each time you include page_loop.html pass an additional parameter specifying which type of output you want:

    {% include page_loop.html type="name" %}
    

    or

    {% include page_loop.html type="url" %}