Jekyll:我可以合并集合和数据文件吗?

Jekyll: Can I combine collections and data files?

简短版本:如何在 Liquid 中通过变量引用集合?

我正在 Jekyll 上构建一个站点,它是包含多个不同部分的文档。它由文章集合组成,没有博客文章。现在我有一个用数据文件定义的三级菜单结构,其中第三级是实际的文章。数据文件如下所示。

menu.yml

- title: Book
  url: book
  subpages: 
  - title: Volume 1
    url: book/vol1
  - title: Volume 2
    url: book/vol2
- title: The Library
  url: library
  subpages: 
  - title: Getting started
    url: library/getting-started
  - title: Components
    url: library/components
- title: Theme
  url: theme
  subpages: 
  - title: Tutorials
    url: theme/tutorials
  - title: Reference
    url: theme/reference

此外,我定义了与顶级项目匹配的集合 url。

_config.yml

...
collections:
  book:
    output: true
  library:
    output: true
  theme:
    output: true

现在我用菜单YML给自己构造了一个漂亮的两层结构,把文章放进去形成第三层。问题是我在构建菜单时不知道如何动态调用集合。例如,当我创建 'Book' 菜单项时,我想用这样的方式循环 site.book 数据收集:

{% assign collection = 'book' %}
{% for p in site.{{collection}} %}
  <p>{{p.title}}</p>
{% endfor %}

site.{{collection}} 在那里不起作用,但例如直接调用 site.book 可以。我不知道如何在 Liquid 中传递变量。

我为解决这个问题所做的是,对于我创建的每个菜单项,我循环遍历整个 {{site.pages}},其中包含整个站点中的所有文章,并匹配它们的 url针对菜单项 url。这些感觉在很多层面上都是糟糕的编程,并且在多次循环所有内容时我正在承受巨大的性能损失。生成文件的时间增加了四倍,从现在的 5 秒增加到 20 秒,当我把菜单做得更大时,它会变得更糟。

所以我愿意听听如何动态循环浏览这些集合,或者听听其他选项来创建这样的菜单。因为我手头有亲戚 url,例如 /book/vol1,最佳方法是找到一种方法来获取对该文件夹中所有文章的引用(不包括子文件夹中的文章,但这不是必须的-有)。

在 liquid 标签内使用 liquid 变量的语法看起来与 {% for p in site.{{collection}} %} 有点不同。您可以试试:

{% assign collection = 'book' %}
{% for p in site.[collection] %}

或者您只需使用:

{% assign books = site.book %}
{% for p in books %}