在Liquid中过滤或分组集合

时间:2012-11-26 15:35:19

标签: jekyll liquid

对于一个简单的个人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> &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. 这个循环走了两次,这让我感到非常有用。
  3. 有没有办法在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 %}
    

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

2 个答案:

答案 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 %}

nameitems属性由group_by生成,其余属性照常营业。

相关问题