3

对于一个简单的个人 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> &raquo; <a href="{{ BASE_PATH }}{{ post.url }}">{{ post.title }}</a></li>
    {% endif %}
  {% endfor %}
</ul>

这有两个问题:

  1. 最烦人的;在最后 50 个帖子中,有 47 个 lang=en 和 3 个 lang=nl,我现在得到一个倾斜的列表。我想要 25 个 lang=en 和 25 个 lang=nl 条目。
  2. 循环遍历了两次,这让我觉得无能为力。

有没有办法在 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 %}

如前所述,丑陋,所以如果有更清洁的解决方案,请添加解决方案!

4

2 回答 2

4

不幸的是,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 %}

nameitems属性由 生成group_by,其余一切照旧。

于 2015-01-26T21:57:56.420 回答
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 %}

该代码未经测试,但应该可以使用相当相似的代码。

于 2012-11-27T14:07:13.400 回答