【问题标题】:Jekyll: Can I combine collections and data files?Jekyll:我可以合并集合和数据文件吗?
【发布时间】: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,因此最佳方法是找到一种方法来获取对该文件夹中所有文章的引用(不包括子文件夹中的文章,但这不是必须的)。

【问题讨论】:

    标签: yaml jekyll liquid


    【解决方案1】:

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

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

    或者您只需使用:

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

    【讨论】:

    • 太棒了,不知道 Liquid 中的硬括号语法。
    猜你喜欢
    • 2016-09-28
    • 2016-09-13
    • 1970-01-01
    • 1970-01-01
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-03
    相关资源
    最近更新 更多