Jekyll 内容合集(集合、收藏) Collections

合集 Collections 是将相关内容(例如团队成员、产品列表、专题内容等同一类型的内容)组织在一起的一种很好的方式。

设置

要使用合集,首先需要在 _config.yml 中定义它。示例(员工成员的合集):

collections:
  - staff_members

在这个例子中,collections 被定义为一个没有额外元数据的序列(即数组)。你可以选择为合集指定元数据,方法是将 collections 定义为映射(即哈希表)而不是序列,并在其中定义额外的字段:

collections:
  staff_members:
    people: true

当合集定义为序列时,默认情况下不会渲染其中的页面。要启用此功能,必须在合集上指定 output: true,这就需要将合集定义为映射。有关更多信息,请参见“输出”部分。

整理你的合集3.7.0

可以指定一个目录,将所有合集的文件存放在同一个文件夹,通过设置 collections_dir: my_collections

Jekyll 会在 my_collections/_books 查找 books 合集,在 my_collections/_recipes 查找 recipes 合集。

确保将草稿和文章移动到自定义合集目录

如果指定了一个目录来存放所有合集(例如 collections_dir: my_collections),那么你需要将你的 _drafts_posts 目录移动到 my_collections/_draftsmy_collections/_posts 中。注意,合集目录的名称不能以下划线(`_`)开头。

添加内容

创建一个对应的文件夹(例如 <source>/_staff_members),并在其中添加文档。如果文档中存在 Font matter(页面头部参数),Jekyll 会对其进行处理,文档中的其余部分将被推送到文档的 content 属性。如果没有提供 Font matter(页面头部参数),Jekyll 会将其视为静态文件,并且内容不会进一步处理。如果提供了 Font matter(页面头部参数),Jekyll 会根据预期的输出处理文件内容。

无论是否存在 Font matter(页面头部参数),Jekyll 只有在合集元数据中设置了 output: true 时,才会将内容写入目标目录(例如 _site)。

例如,将一个员工添加到上述合集中的示例。文件名是 ./_staff_members/jane.md,内容如下:

---
name: Jane Doe
position: Developer
---
Jane has worked on Jekyll for the past *five years*.

请注意,尽管在内部被视为一个合集,上述内容不适用于文章。即使没有Font matter(页面头部参数),符合有效文件名格式的文章也会被标记为进行处理。

确保正确命名文件夹

文件夹的命名必须与在_config.yml文件中定义的合集名称一致,并且前面需要加上_字符。

输出

下面实现了通过数据文件批量生成页面。

在页面上遍历site.staff_members并输出每个员工的内容。与文章类似,文档的主体内容可以通过content变量访问:

{% for staff_member in site.staff_members %}
  <h2>{{ staff_member.name }} - {{ staff_member.position }}</h2>
  <p>{{ staff_member.content | markdownify }}</p>
{% endfor %}

如果希望Jekyll为每个文档生成一个渲染页面,可以在_config.yml中的合集元数据中将output键设置为true

collections:
  staff_members:
    output: true

然后,可以使用url属性链接到生成的页面:

{% for staff_member in site.staff_members %}
  <h2>
    <a href="{{ staff_member.url }}">
      {{ staff_member.name }} - {{ staff_member.position }}
    </a>
  </h2>
  <p>{{ staff_member.content | markdownify }}</p>
{% endfor %}

合集有特定的固定链接变量,可以帮助你控制整个合集的输出 URL。

自定义文档排序4.0

默认情况下,当合集中的两个文档都在其 Font matter(页面头部参数)中包含date键时,它们会按照date属性进行排序。如果其中一个或两个文档的 Font matter(页面头部参数)中没有date键,则会按照它们各自的路径排序。

你可以通过合集的元数据来自定义这种排序方式。

按 Font matter(页面头部参数)键排序

通过设置sort_by元数据为 Font matter(页面头部参数)键的字符串,可以根据指定键对文档进行排序。例如,要根据lesson键对教程合集进行排序,配置如下:

collections:
  tutorials:
    sort_by: lesson

文档会按照该键值的递增顺序排列。如果某个文档未定义该 Font matter(页面头部参数)键,则该文档会被放置在已排序文档的后面。当多个文档未定义该键时,这些文档会按照其日期或路径排序,然后统一放置在已排序文档之后。

手动排序文档

你也可以通过设置order元数据手动排序文档,order中列出按顺序排列的文件名。例如,一个教程合集的配置如下:

collections:
  tutorials:
    order:
      - hello-world.md
      - introduction.md
      - basic-concepts.md
      - advanced-concepts.md

任何文件名与列表条目不匹配的文档会被放置在已重新排列的文档之后。如果某个文档位于子目录中,也需要在条目中包含子目录:

collections:
  tutorials:
    order:
      - hello-world.md
      - introduction.md
      - concepts/basics.md
      - concepts/advanced.md

如果这两个元数据键都已正确定义,则order列表的排序优先级更高。

Liquid 属性

集合

集合也可以通过site.collections访问,并包含你在_config.yml中指定的元数据(如果有的话)以及以下信息:

变量 描述

label

你的集合名称,例如 my_collection

docs

一个包含 文档 的数组。

files

集合中的静态文件数组。

relative_directory

集合源目录的路径,相对于站点源目录。

directory

集合源目录的完整路径。

output

集合的文档是否会作为独立文件输出。

内置集合

除了你自己创建的集合,Jekyll 还内置了 posts 集合。即使你没有 _posts 目录,它也会存在。在通过 site.collections 遍历时,需要注意可能需要过滤掉它。

你可以使用过滤器查找集合:{{ site.collections | where: "label", "myCollection" | first }}

集合与时间

除了硬编码的默认集合 posts 中的文档外,你创建的集合中的所有文档都可以通过 Liquid 访问,不管它们是否有日期,并且都可以渲染。

只有当相关集合的元数据中有 output: true 时,文档才会尝试写入磁盘。此外,只有当 site.future 也为 true 时,未来日期的文档才会被写入。

你还可以通过在文档的 front matter 中设置 published: false(默认为 true)来对文档的写入进行更精细的控制。

文档

除了文档相应文件中提供的任何 front matter, 每个文档还具有以下属性:

变量 描述

content

文档的(未渲染)内容。如果没有提供 front matter,Jekyll 将不会在集合中生成该文件。如果使用了 front matter,那么这里包含的是文件中 front matter 结束后部分的所有内容。

output

文档的渲染输出,基于 content

path

文档源文件的完整路径。

relative_path

文档源文件相对于站点源目录的路径。

url

渲染后的集合的 URL。只有当所属集合的配置中 output: true 时,文件才会写入目标目录。

collection

文档所在集合的名称。

date

文档的集合日期。