一种通过名称获取Jekyll收藏品的优雅方法?

thy*_*bzi 5 collections jekyll

在Jekyll 2.5.3中,我使用 albums 集合(因为不仅需要存储数据,还需要生成的页面)。

当Jekyll 数据文件时,您可以像以下这样简单地获取特定项目的数据:site.data.albums[foo]

但是有了收藏,情况就更糟了。我尝试过的所有这些方法无济于事:

  • site.albums[foo]
  • site.collections.albums[foo]
  • site.collections.albums.docs[foo]
  • site.collections.albums.files[foo]

所以我需要:

  1. 遍历所有收集项目
  2. 为他们每个人起一个裸名
  3. 将此名称与目标名称进行比较
  4. 如果名称匹配,最后将收集项数据分配给某个变量以使用

还有更好的建议吗?

Nat*_*hur 5

从 Jekyll 3.2 开始,您可以使用过滤器where_exp按集合的任何属性来过滤集合。因此,如果我的集合中有以下项目albums:

---
title: My Amazing Album
---
...
Run Code Online (Sandbox Code Playgroud)

我可以获取该名称的项目的第一个匹配项:

{% assign album = site.albums 
    | where_exp:"album", "album.title == 'My Amazing Album'" 
    | first %}
Run Code Online (Sandbox Code Playgroud)

请注意,我使用first过滤器是因为where_exp返回匹配项的数组。

然后以我喜欢的方式使用它:

<h1>{{ album.title }}</h1>
Run Code Online (Sandbox Code Playgroud)

我无法保证此方法的构建性能,但我必须想象它比 Liquid 循环更好。


Zan*_*der 4

我今天刚刚做了这件事,你的说法是正确的。我是这样做的:

<!-- this is in a partial with a 'name' parameter -->
{% for item in site.albums %}
    {% assign name = item.path | split:"/" | last | split:"." | first %}
    {% if name == include.name %}
        {% assign collectionItem = item %}
    {% endif %}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

用法

{{ collectionItem.title }}
{{ collectionItem.url }}
{{ collectionItem.path }}
Run Code Online (Sandbox Code Playgroud)

它甚至可以用于填充其他部分中的值,如下所示:

{% include card.html title=workItem.title bg=workItem.card.bg href=workItem.url %}
Run Code Online (Sandbox Code Playgroud)