对于一个简单的个人Jekyll博客,我想通过site.posts
,lang(语言)上的属性对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>
这有两个问题:
有没有办法在Liquid中分配或准备一个集合?这样我就可以遍历site.posts
一次并准备一个嵌套的集合,如site.grouped_posts[en]
。
还是另一招?
解决方案
正如Tom Clarkson所指出的那样,维持一个反击是正确的方向。但是,增加一个计数器只能在最近的Liquid版本中出现,在Github上运行的版本(我的液体被编译)有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 %}
如上所述,丑陋,所以如果有更清洁的解决方案,请添加解决方案!
答案 0 :(得分:1)
我不认为您可以在不制作插件或自定义过滤器的情况下创建过滤后的集合,但您可以计算已为该组收集的帖子数量,而不是使用限制。
{% for post in site.posts %}
{% if counter < 25 and post.lang == nil or post.lang == "en" %}
{% capture counter %}{{ counter | plus:1 }}{% endcapture %}
<li></li>
{% endif %}
{% endfor %}
代码未经测试,但相似的东西应该有效。
答案 1 :(得分:1)
不幸的是,Liquid的过滤器在for
循环中不起作用。但是,它们可以在变量赋值中工作。
{% assign posts_by_lang = site.posts | group_by: "lang" %}
{% for lang in posts_by_lang %}
{{ lang.name }}
{% for post in lang.items limit: 25 %}
{{ post.title }}
{% endfor %}
{% endfor %}
name
和items
属性由group_by
生成,其余属性照常营业。