jekyll:结合限制,在哪里和反向

时间:2017-08-20 00:26:51

标签: jekyll

使用Jekyll我想:

  • 遍历所有页面
  • 其中page.path不是当前路径
  • 其中page.categories包含“featured”
  • 逆转他们(最近的第一次)
  • 限制3

将所有这些过滤器放在一起时遇到问题

{% assign posts = site.posts | reverse %}
{% for post in posts limit:3 %}
  {% if post.categories contains 'featured' and post.path != page.path %}
    {% include card.html post=post %}
  {% endif %}
{% endfor %}

现在限制无法正常工作,因为内部if会阻止渲染一些项目。

1 个答案:

答案 0 :(得分:1)

在进入循环之前将0分配给counter变量。不要在循环上设置限制,而是在counter上设置另一个条件,使其低于限制,并使用Liquid的counter过滤器增加plus你符合标准并输出卡片的时间。

{% assign posts = site.posts | reverse %}
{% assign counter = 0 %}
{% for post in posts %}
  {% if counter < 3 and post.categories contains 'featured' and post.path != page.path %}
    {% include card.html post=post %}
    {% assign counter = counter | plus: 1 %}
  {% endif %}
{% endfor %}

更复杂的例子

我将所有这些基于循环我自己使用。我的情况稍微复杂一点:我检查当前页面的任何共享标签。我将此作为下面的进一步示例。

{% assign counter = 0 %}
{% for post in site.posts %}
    {% if counter < 4 %}
        {% if post.url != page.url %}
            {% assign isValid = false %}
            {% for page_tag in page.tags %}
                {% for post_tag in post.tags %}
                    {% if post_tag == page_tag %}
                        {% assign isValid = true %}
                    {% endif %}
                {% endfor %}
            {% endfor %}
            {% if isValid %}
                {% include article_card.html %}
                {% assign counter = counter | plus: 1 %}
            {% endif %}
        {% endif %}
    {% endif %}
{% endfor %}

为什么where失败

虽然Liquid has a where filter,它只能进行精确的比较,所以你必须像这样重新发明轮子,以便在更复杂的条件下实现类似where的场景。这确实会导致很多循环遍历site.posts,但Jekyll作为预处理器意味着使用有效低效的即兴where类型循环的惩罚只是编译时的问题,而不是运行时问题。即使如此,为了尽可能地降低这个成本,我选择将counter条件作为Jekyll计算的第一个条件。