Jekyll使用教程笔记 五


目录html


合集

并不是全部内容都是文章或页面。也许你想记录开源项目中的各类方法、团队成员、或会议中的会话。合集容许你定义一种相似页面或文章那样正常工做的新类型的文档,但也具备其本身的惟一属性和名称空间。git

使用合集

开始使用合集,须要一下三步:github

  • 第一步:告诉Jekyll读取你的合集
  • 第二步:添加你的内容
  • 第三步:有选择地将你的合集文档渲染为独立的文件

第一步:告诉Jekyll读取你的合集

将如下内容添加到你的网站的_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/_draftsmy_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: prettypermalink: /: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 Matterslug变量值;若是没有定义那么:title将等同于:name,也就是经过文件名生成的slug
:output_ext 输出文件的扩展名。(默认状况下有扩展名,但一般是不须要的。)

Liquid属性

合集

每一个合集均可以做为site变量中的字段来访问。例如,若是你想访问_albums中的albums合集,则可使用site.albums

每一个合集自己都是一系列文档(例如,site.albums是一组文档,与site.pagessite.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目录中的YAMLJSONCSV文件加载数据。请注意,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站点而且须要组织许多页面),请参阅导航

相关文章
相关标签/搜索