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/_drafts
和 my_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 %}
Collections 永久链接 / 固定链接
合集有特定的固定链接变量,可以帮助你控制整个合集的输出 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
中指定的元数据(如果有的话)以及以下信息:
变量 | 描述 |
---|---|
|
你的集合名称,例如 |
|
一个包含 文档 的数组。 |
|
集合中的静态文件数组。 |
|
集合源目录的路径,相对于站点源目录。 |
|
集合源目录的完整路径。 |
|
集合的文档是否会作为独立文件输出。 |
内置集合
除了你自己创建的集合,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, 每个文档还具有以下属性:
变量 | 描述 |
---|---|
|
文档的(未渲染)内容。如果没有提供 front matter,Jekyll 将不会在集合中生成该文件。如果使用了 front matter,那么这里包含的是文件中 front matter 结束后部分的所有内容。 |
|
文档的渲染输出,基于 |
|
文档源文件的完整路径。 |
|
文档源文件相对于站点源目录的路径。 |
|
渲染后的集合的 URL。只有当所属集合的配置中 |
|
文档所在集合的名称。 |
|
文档的集合日期。 |