目录html
并不是全部内容都是文章或页面。也许你想记录开源项目中的各类方法、团队成员、或会议中的会话。合集容许你定义一种相似页面或文章那样正常工做的新类型的文档,但也具备其本身的惟一属性和名称空间。git
开始使用合集,须要一下三步:github
将如下内容添加到你的网站的_config.yml
文件中,将my_collection
替换为你的合集的名称:json
collections:
- my_collection
复制代码
你能够在配置中为你的合集指定元数据:数组
collections:
- my_collection:
foo: bar
复制代码
也能够为合集设置默认属性:bash
defaults:
- scope:
path: ""
type: my_collection
values:
layout: page
复制代码
重要:Gather your collections
[3.7.0]
composer你可使用
collections_dir: my_collections
选择指定一个目录来将全部合集存储在同一个位置。post而后,Jekyll将在
my_collections/_books
中查找books
合集,并在y_collections/_recipes
中查找recipes
合集。网站
警告:确保将草稿和文章移动到自定义合集目录中ui
使用
collections_dir: my_collections
选择指定一个目录来将全部合集存储在同一个位置,则须要将_drafts
和_posts
目录移至my_collections/_drafts
和my_collections/_posts
。请注意,你的合集目录的名称不能如下划线(_
)开头。
建立一个相应的文件夹(例如<source>/_my_collection
)并添加文档。若是存在Front Matter,则处理YAML Front Matter,并将Front Matter以后的全部内容都推送到文档的content
属性中。若是没有提供YAML Front Matter,Jekyll将不会在你的合集中生成该文件。
注意:确保正确命名你的文件夹
该文件夹必须与你在
_config.yml
文件中定义的合集命名相同,并在前面添加_
字符。
若是你但愿Jekyll为你的合集中的每一个文档建立一个面向公共的渲染版本,请在你的_config.yml
中的合集元数据中将output
设置为true
:
collections:
my_collection:
output: true
复制代码
这将为合集中的每一个文档生成一个文件。例如,若是你有_my_collection/some_subdir/some_doc.md
,它将使用你选择的Liquid和Markdown转换器进行渲染,并写入<dest>/my_collection/some_subdir/some_doc.html
。
若是你但愿在访问/my_collection/
时显示指定页面,只需将永久连接:/my_collection/index.html
添加到页面便可。要列出合集中的项目,在该页面或任何其余项目中,你可使用:
{% for item in site.my_collection %}
<h2>{{ item.title }}</h2>
<p>{{ item.description }}</p>
<p><a href="{{ item.url }}">{{ item.title }}</a></p>
{% endfor %}
复制代码
注意:不要忘记添加YAML进行处理
合集中的文件没有Front Matter的将被视为静态文件,只是简单地复制到其输出位置而不进行处理。
若是你但愿为合集网页所在的网址指定自定义模式,则可使用永久连接属性进行设置:
collections:
my_collection:
output: true
permalink: /:collection/:name
复制代码
对于具备如下源文件结构的合集,
_my_collection/
└── some_subdir
└── some_doc.md
复制代码
如下每一个permalink
配置中的每个都会生成下面显示的文档结构。
permalink: /:collection/:path
同样。_site/
├── my_collection
│ └── some_subdir
│ └── some_doc.html
...
复制代码
permalink: pretty
与permalink: /:collection/:path/
同样。_site/
├── my_collection
│ └── some_subdir
│ └── some_doc
│ └── index.html
...
复制代码
permalink: /doc/:path
_site/
├── doc
│ └── some_subdir
│ └── some_doc.html
...
复制代码
permalink: /doc/:name
_site/
├── doc
│ └── some_doc.html
...
复制代码
permalink: /:name
_site/
├── some_doc.html
...
复制代码
变量 | 说明 |
---|---|
:collection |
包含合集的标签。 |
:path |
文档相对于合集目录的路径。 |
:name |
文档的基本文件名,每一个空格和非字母数字字符序列都用连字符替换。 |
:title |
若是文档中存在文件,则:title 模板变量将采用Front Matter中slug 变量值;若是没有定义那么:title 将等同于:name ,也就是经过文件名生成的slug 。 |
:output_ext |
输出文件的扩展名。(默认状况下有扩展名,但一般是不须要的。) |
每一个合集均可以做为site
变量中的字段来访问。例如,若是你想访问_albums
中的albums
合集,则可使用site.albums
。
每一个合集自己都是一系列文档(例如,site.albums
是一组文档,与site.pages
和site.posts
很是类似)。请参阅下表以了解如何访问这些文档的属性。
这些合集也能够在site.collections
下找到,并含有你在_config.yml
中指定的元数据(若是存在)以及如下信息:
变量 | 说明 |
---|---|
label |
你的合集的名称,例如:my_collection 。 |
docs |
文档数组。 |
files |
合集中的静态文件数组。 |
relative_directory |
合集源目录的路径,相对于站点源。 |
directory |
合集的源目录的完整路径。 |
output |
该合集的文档是否将做为单个文件输出。 |
注意:硬编码合集
除了你本身建立的合集外,
posts
合集还被Jekyll硬编码,不论是否存在_posts
目录。在迭代site.collections
时,须要注意这点,由于你可能须要将其过滤掉。你可能但愿使用过滤器来查找in的合集:
{{ site.collections | where: "label", "myCollection" | first }}
。
注意:合集和时间
除了默认硬编码合集
posts
中的文档外,你建立的合集中的全部文档都可经过Liquid进行访问,而不考虑其指定日期(若是有),所以能够进行渲染。可是,只有在相关合集元数据
output: true
时,才会尝试将文档写入磁盘。此外,将来日期的文件只有在site.future
也是true
的状况下才会写入。经过在文档的Front Matter设置
published: false
(默认为true),能够对正在写入磁盘的文档进行更细致的控制。
除文档相应文件中提供的任何YAML Front Matter外,每一个文档还具备如下属性:
变量 | 说明 |
---|---|
content |
文件的(未说起的)内容。若是没有提供YAML Front Matter,则Jekyll将不会在你的合集中生成该文件。若是使用YAML Front Matter,则这是Front Matter的终止符--- 后面的全部内容。 |
output |
基于content 渲染文档的输出。 |
path |
文档源文件的完整路径。 |
relative_path |
文档源文件相对于网站源的路径。 |
url |
渲染的合集的URL。只有当它所属的合集在站点配置中具备output:true 时,才会将文件写入目标。 |
collection |
文档合集的名称。 |
date |
文档合集的日期。 |
来自YAML Front Matter的属性能够做为数据在网站中任何地方被访问。使用上面的示例将一个合集配置为site.albums
,你可能会在单个文件中构建以下的Front Matter(它必须使用支持的标记格式,而且不能使用.yaml
扩展名保存):
title: "Josquin: Missa De beata virgine and Missa Ave maris stella"
artist: "The Tallis Scholars"
director: "Peter Phillips"
works:
- title: "Missa De beata virgine"
composer: "Josquin des Prez"
tracks:
- title: "Kyrie"
duration: "4:25"
- title: "Gloria"
duration: "9:53"
- title: "Credo"
duration: "9:09"
- title: "Sanctus & Benedictus"
duration: "7:47"
- title: "Agnus Dei I, II & III"
duration: "6:49"
复制代码
合集中的每一个专辑均可以使用模板在单个页面上列出:
{% for album in site.albums %}
<h2>{{ album.title }}</h2>
<p>Performed by {{ album.artist }}{% if album.director %}, directed by {{ album.director }}{% endif %}</p>
{% for work in album.works %}
<h3>{{ work.title }}</h3>
<p>Composed by {{ work.composer }}</p>
<ul>
{% for track in work.tracks %}
<li>{{ track.title }} ({{ track.duration }})</li>
{% endfor %}
</ul>
{% endfor %}
{% endfor %}
复制代码
除了Jekyll提供的内置变量以外,你还能够指定本身的自定义数据,这些数据能够经过Liquid模板系统访问。
Jekyll支持从位于_data
目录中的YAML,JSON和CSV文件加载数据。请注意,CSV文件必须包含标题行。
这个强大的功能能够避免模板中的重复,而且能够在不更改_config.yml
的状况下设置特定于站点的选项。
插件/主题还能够利用数据文件来设置配置变量。
正如在目录结构页面上所解释的那样,_data
文件夹是你能够在其中存储Jekyll生成站点时使用的其余数据的位置。这些文件必须是YAML,JSON或CSV文件(使用.yml
,.yaml
,.json
或.csv
扩展名),而且能够经过site.data
访问它们。
如下是使用数据文件避免在Jekyll模板中复制大量代码的基本示例:
在_data/members.yml
中:
- name: Eric Mill
github: konklone
- name: Parker Moore
github: parkr
- name: Liu Fengyun
github: liufengyun
复制代码
或_data/members.csv
中:
name,github
Eric Mill,konklone
Parker Moore,parkr
Liu Fengyun,liufengyun
复制代码
这些数据能够经过site.data.members
进行访问(请注意,文件名决定变量名称)。
你如今能够在模板中呈现成员列表:
<ul>
{% for member in site.data.members %}
<li>
<a href="https://github.com/{{ member.github }}">
{{ member.name }}
</a>
</li>
{% endfor %}
</ul>
复制代码
注意:
若是你的Jekyll站点有不少页面,例如文档网站,请参阅详细示例以了解如何为你的站点构建强大的导航。
数据文件也能够放在_data
文件夹的子文件夹中。每一个文件夹级别将被添加到变量的命名空间中。下面的示例显示了如何在orgs
文件夹下的文件中分别定义GitHub组织:
在_data/orgs/jekyll.yml
中:
username: jekyll
name: Jekyll
members:
- name: Tom Preston-Werner
github: mojombo
- name: Parker Moore
github: parkr
复制代码
在_data/orgs/doeorg.yml
中:
username: doeorg
name: Doe Org
members:
- name: John Doe
github: jdoe
复制代码
而后能够经过site.data.orgs
访问组织,后面接是文件名:
<ul>
{% for org_hash in site.data.orgs %}
{% assign org = org_hash[1] %}
<li>
<a href="https://github.com/{{ org.username }}">
{{ org.name }}
</a>
({{ org.members | size }} members)
</li>
{% endfor %}
</ul>
复制代码
页面和文章也能够访问特定的数据项。如下示例显示了如何访问特定项目:
_data/people.yml
:
dave:
name: David Smith
twitter: DavidSilvaSmith
复制代码
而后,做者能够被指定为文章Front Matter的页面变量:
---
title: sample post
author: dave
---
{% assign author = site.data.people[page.author] %}
<a rel="author" href="https://twitter.com/{{ author.twitter }}" title="{{ author.name }}">
{{ author.name }}
</a>
复制代码
有关如何为你的站点构建强大的导航的信息(特别是若是你有文档网站或其余类型的Jekyll站点而且须要组织许多页面),请参阅导航。