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 %}
简短版本:如何在 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 %}