【发布时间】:2015-05-25 10:55:34
【问题描述】:
短版:如何在 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 为自己构建了一个很好的两级结构,并将文章放入其中以形成第三级。问题是我在构建菜单时不知道如何动态调用集合。例如,当我创建“书”菜单项时,我想使用类似这样的内容循环访问 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,因此最佳方法是找到一种方法来获取对该文件夹中所有文章的引用(不包括子文件夹中的文章,但这不是必须的)。
【问题讨论】: