从液体阵列中获取下一个和前一个元素

时间:2013-04-22 10:38:56

标签: jekyll liquid

简短版本:

我想在液体模板中将数字加1,并将结果用作数组索引。

{% capture plus_one %}{{ 0 | plus: 1 }}{% endcapture %}
<div>-Value of plus_one: {{plus_one}}</div>
<div>-This works: {{site.posts[1].title}}</div>
<div>-This doesn't: {{site.posts[plus_one].title}}</div>

结果:

-Value of plus_one: 1
-This works: The Zone
-This doesn't:

长版:

我正在使用Jekyll,没有插件。我想给当前帖子一个链接到同一类别的下一篇文章。 (该代码中的类别被硬编码为“journal”。)

我的代码遍历类别数组中的所有帖子,查找当前帖子。找到它后,我尝试抓住类别数组中的下一篇文章。

{% for num in (0..site.categories.journal.size) %}
    {% assign page2 = site.categories.journal[num] %}
        {% if page2.title == page.title and page2.date == page.date %}
            {% capture plus_one %}{{ num | plus: 1 }}{% endcapture %}
        {% endif %}
{% endfor %}

<div>value of plus_one: {{plus_one}}</div>
<div>This doesn't work: {{site.categories.journal[plus_one].title}}</div>
<div>This does: {{site.categories.journal[1].title}}</div>

结果:

<div>value of plus_one: 1</div>
<div>This doesn't work: </div>
<div>This does: A Blog Post Title</div>

我猜我的变量'plus_one'的值被视为字符串而不是数字。

有没有办法将其转换为数字?

还是有另一种方法来实现我想要做的事情吗?

5 个答案:

答案 0 :(得分:9)

{% for category in site.categories %}
    {% assign catg_name = category.first %}
    {% if catg_name == page.category %}
        {% assign catg_posts = category.last %}
    {% endif %}
{% endfor %}
{% for post in catg_posts %}
    {% if post.title == page.title %}
        {% unless forloop.last %}
            {% assign next = catg_posts[forloop.index] %}
            <li class="previous">
            <a href="{{ site.baseurl }}{{ next.url }}">&larr;{{ next.title }}</a>
            </li>
        {% endunless %}
        {% unless forloop.first %}
            <li class="next">
            <a href="{{ site.baseurl }}{{ prev.url }}">{{ prev.title }}&rarr;</a>
            </li>
        {% endunless %}
    {% endif %}
    {% assign prev = post %}
{% endfor %}

如前所述,您可以保存并使用上一个帖子链接的前一个迭代值(在我的情况下,我将其用作下一个帖子链接,因为我不想要默认的最新 - 第一个订单)。对于下一个数组元素,您可以使用forloop.index。这是for循环的从1开始的索引,它将为您提供从零开始的数组的下一项。

答案 1 :(得分:6)

assign保留了数字:

{% for item in items %}
    {% assign next_i = forloop.index0 | plus: 1 %}
    {% assign prev_i = forloop.index0 | minus: 1 %}
    {{ items[next_i] }}
    {{ items[prev_i] }}
{% endfor %}

答案 2 :(得分:2)

您可以通过page.nextpage.previous as described in the jekyll wiki访问下一个/上一个帖子。

如果希望它属于同一类别,则必须将其分配给临时变量迭代,直到找到匹配的帖子(同一类别中的帖子)。

由于液体的工作方式,你不能使用你的plus_one变量 - 它只是一个字符串。在液体中使用数学是非常复杂的,当我在液体中实现加权标签云时,我几乎感到头痛。

答案 3 :(得分:2)

我不知道jekyll自接受的答案以来是否有变化,但我必须做一些改变才能让它发挥作用。根据jekyll变量文档,没有page.category,只有page.categories列表。在我的网站中,我每个帖子只使用一个类别,所以第一个类别适合我。如果您为每个帖子使用多个类别,则必须对此进行调整。此外,我遇到了问题,因为我的类别已大写,因此我添加了小写字母。最后,在我的config.yml中,我使用的是url而不是baseurl。希望这有助于其他人,因为这是我发现按类别向所有帖子添加上一个/下一个链接的最简单方法。

{% for category in site.categories %}
    {% assign catg_name = category.first %}
    {% if catg_name == page.categories.first | downcase %}
        {% assign catg_posts = category.last %}
    {% endif %}
{% endfor %}
{% for post in catg_posts %}
    {% if post.title == page.title %}
        {% unless forloop.last %}
            {% assign next = catg_posts[forloop.index] %}
            <a href="{{ site.url }}{{ next.url }}">&larr;{{ next.title }}</a> |
        {% endunless %}
        {% unless forloop.first %}
            | <a href="{{ site.url }}{{ prev.url }}">{{ prev.title }}&rarr;</a>
        {% endunless %}
    {% endif %}
    {% assign prev = post %}
{% endfor %}

答案 4 :(得分:0)

我遇到了类似的问题,使用上面的答案,我在我的网站上进行了以下工作。可能对别人有帮助。

{% for num in (0..site.categories.work.size) %}
    {% assign page2 = site.categories.work[num] %}
    {% if page2.title == page.title and page2.date == page.date %}
        {% assign next_i = forloop.index0 | plus: 1 %}
        {% assign prev_i = forloop.index0 | minus: 2 %}

        {% if next_i == site.categories.work.size %}
            {% assign next_i = 1 %}
        {% endif %}
    {% endif %}
{% endfor %}

<nav class="pagination">
    <div class="next">
        <a href="work/{{site.categories.work[next_i].slug}}/">Next</a>
    </div>
    <div class="previous">
        <a href="work/{{site.categories.work[prev_i].slug}}/">Previous</a>
    </div>
</nav>