对于一个简单的个人 Jekyll 博客,我想按, lang (语言)site.posts
上的属性对我进行分组。post
这是“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 版本中,在 Github 上运行的版本(我的 Liquid 在这里编译)具有 2.2.2,无法增加计数器。Toms 解决方案本身也不起作用,因为 Liquid 将变量counter
转换为字符串,无法与<
.
我通过附加一个字符串并计算字符来创建一个 hack。
{% 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 %}
如前所述,丑陋,所以如果有更清洁的解决方案,请添加解决方案!