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

时间:2015-03-22 10:58:43

标签: yaml jekyll liquid

简短版本:如何在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}},其中包含整个网站中的所有文章,并将其网址与菜单项网址相匹配。这些感觉就像在很多层面上糟糕的编程一样,并且在多次循环所有内容时我的性能受到了极大的打击。文件的生成量增加了四倍,从现在的5秒增加到20秒,当菜单变得更大时,文件的生成会更糟。

因此,我可以听听如何动态循环收集,或听取其他选项来创建这样的菜单。由于我手头有相对网址,例如/book/vol1,最佳方法是找到一种方法来获取对该文件夹中所有文章的引用(不包括子文件夹中的文章,但这不是必须的)。 / p>

1 个答案:

答案 0 :(得分:2)

在液体标签内使用液体变量的语法与{% for p in site.{{collection}} %}略有不同。您可以尝试:

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

或者你只是使用:

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