Для простого личного блога Jekyll я хочу сгруппировать site.posts
по атрибуту post
, lang (язык). Это либо "en", "nl", либо nil.
Затем я хочу отобразить два списка сообщений. В настоящее время у меня есть:
<section lang="nl">
<h2>Nederlandse Artikelen</h2>
<ul class="posts">
{% for post in site.posts limit:50 %}
{% if post.lang == "nl" %}
{% include li_for_post_with_date.yml %}
{% endif %}
{% endfor %}
</ul>
<a href="archief.html">Archief »</a>
</section>
<section lang="en">
<h2>English Articles</h2>
<ul class="posts">
{% for post in site.posts limit:50 %}
{% if post.lang == nil or post.lang == "en" %}
<li><span>{{ post.date | date_to_string }}</span> » <a href="{{ BASE_PATH }}{{ post.url }}">{{ post.title }}</a></li>
{% endif %}
{% endfor %}
</ul>
Это имеет две проблемы:
- Самый раздражающий; когда в последних 50 постах 47 lang=en и 3 lang=nl, теперь я получаю перекошенный список. Мне нужно 25 записей lang=en и 25 записей lang=nl.
- Петля проходится дважды, это кажется мне неэффективным.
Есть ли способ назначить или подготовить коллекцию в Liquid? Таким образом, я мог один раз перебрать site.posts
и подготовить вложенную коллекцию, например site.grouped_posts[en]
.
Или еще одна хитрость?
Решение
Как указывает Том Кларксон, поддержание счетчика — правильное направление. Однако увеличение счетчика появилось только в последних версиях Liquid, версия 2.2.2, работающая на Github (где компилируется моя жидкость), без возможности увеличения счетчика. Само решение Тома тоже не работает, потому что Liquid превращает переменную counter
в строку, которую нельзя сравнивать с <
.
Я создал хак, добавив строку и подсчитав символы.
{% assign counter = '.' %}
{% for post in site.posts %}
{% if counter.size <= 25 and post.lang == "nl" %}
{% capture counter %}{{ counter | append:'.' }}{% endcapture %}
{% include li_for_post_with_date.yml %}
{% endif %}
{% endfor %}
Как говорится, некрасиво, поэтому, если есть более чистые решения, добавьте решение!