Jekyll автоматически обрабатывает строки

Я хочу отфильтровать site.pages все страницы с заданным типом YAML 'project'.

Для этого я сделал следующее:

{% sorted_for page in site.pages sort_by:title %}                       
{% if page.type == 'project' %}
do something
{% endif %}
{% endfor %}

При этом используется подключаемый модуль sorted_for. Однако сейчас я хочу расположить их в css строках по четыре.

<div class="row">
<div class="span3">{{ page1.title }}</div>
<div class="span3">{{ page2.title }}</div>
<div class="span3">{{ page3.title }}</div>
<div class="span3">{{ pagen.title }}</div>
</div>
...

И так далее, пока не закончатся ряды. Как я могу получить доступ к необходимой мне информации? К сожалению, номер итератора цикла for будет неправильным, так как он также будет отмечать страницы, не относящиеся к проекту. Есть ли чистый способ реализовать это?


person jvc26    schedule 04.01.2014    source источник


Ответы (1)


Примечание.
Мне не удалось заставить плагин sorted_for работать на моем компьютере, поэтому я протестировал свое решение с помощью обычного for.

Шаг 1

Поскольку вы не можете использовать forloop.index, потому что вы отфильтровываете на некоторых страницах вам нужно подсчитать циклы самостоятельно, записав в переменную с помощью assign .

Следующий код просто перечислит ваши страницы с правильным итератором цикла (подсчитывая только те страницы, которые действительно перечислены):

{% assign loopindex = 0 %}
{% for page in site.pages %}                       
  {% if page.type == 'project' %}
    {% assign loopindex = loopindex | plus: 1 %}
    <div class="span3">{{ loopindex }} {{ page.title }}</div>
  {% endif %}
{% endfor %}

Шаг 2

Вам нужно отображать <div class="row"> с каждой первой строкой и </div> с каждой четвертой строкой.

Чтобы найти первую и четвертую строки, вы можете использовать modulo:

{% assign loopindex = 0 %}
{% for page in site.pages %}                       
  {% if page.type == 'project' %}
    {% assign loopindex = loopindex | plus: 1 %}
    {% assign rowfinder = loopindex | modulo: 4 %}
    <div class="span3">{{ loopindex }} {{ rowfinder }} {{ page.title }}</div>
  {% endif %}
{% endfor %}

rowfinder всегда будет повторять последовательность 1, 2, 3, 0.

Шаг 3:

Таким образом, вы отображаете <div class="row">, когда rowfinder равно 1, и </div>, когда rowfinder равно 0:

{% assign loopindex = 0 %}
{% for page in site.pages %}                       
  {% if page.type == 'project' %}
    {% assign loopindex = loopindex | plus: 1 %}
    {% assign rowfinder = loopindex | modulo: 4 %}
    {% if rowfinder == 1 %}
      <div class="row">
      <div class="span3">{{ page.title }}</div>
    {% elsif rowfinder == 0 %}
      <div class="span3">{{ page.title }}</div>
      </div>
    {% else %}
      <div class="span3">{{ page.title }}</div>
    {% endif %}
  {% endif %}
{% endfor %}

Шаг 4:

Остается только одна маленькая вещь: когда количество страниц не кратно 4, в конце не хватает </div>.

Когда количество страниц равно кратному 4, последнее значение rowfinder будет 0.
Таким образом, нам просто нужно отобразить </div>, когда значение rowfinder не равно _23 _. < br> Так что просто поместите это после цикла for:

{% if rowfinder != 0 %}
      </div>
{% endif %}

...вот и все!

person Christian Specht    schedule 06.01.2014