数据文件和数据文件夹 Data Files (Jekyll 的数据库)

除了 Jekyll 提供的 内置变量, 还可以指定自己的自定义数据,并通过 Liquid 模板引擎 访问这些数据。有点像 PHP 的 MySQL 数据库。

Jekyll 支持从位于 _data 目录中的 YAMLJSONCSVTSV 文件加载数据。 请注意,CSV 和 TSV 文件 必须 包含表头行。

这一强大功能可以帮助你避免在模板中重复代码,并能够在不修改 _config.yml 的情况下设置特定于站点的选项。

Jekyll 插件和 Jekyll 主题也可以利用数据文件来设置配置变量。

数据文件夹

_data 文件夹可以用来存储数据文件,供 Jekyll 在生成网站时使用。数据文件支持以下格式: YAML、JSON、TSV 或 CSV 文件(使用 .yml.yaml.json.tsv.csv 扩展名),然后可以通过 site.data 访问。

示例:成员列表

以下是一个使用数据文件的基本示例,通过使用数据问题,可以避免在 Jekyll 模板中复制粘贴大量的重复代码:

_data/members.yml 中:

- name: Eric Mill
  github: konklone

- name: Parker Moore
  github: parkr

- name: Liu Fengyun
  github: liufengyun

- name: Note43
  github: note43

或者在 _data/members.csv 中:

name,github
Eric Mill,konklone
Parker Moore,parkr
Liu Fengyun,liufengyun
Note43,note43

这些数据可以通过 site.data.members 进行访问(注意,文件的 基础名称 决定了变量名,因此应避免在同一目录下使用相同基础名称但不同扩展名的数据文件)。

你现在可以在模板中渲染成员列表:

<ul>
{% for member in site.data.members %}
  <li>
    <a href="https://github.com/{{ member.github }}">
      {{ member.name }}
    </a>
  </li>
{% endfor %}
</ul>

数据子文件夹

数据文件也可以放在 _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 网站,需要组织很多页面时),请参考 导航教程.

CSV/TSV 解析选项

Ruby 解析 CSV 和 TSV 文件的方式可以通过 csv_readertsv_reader 配置选项进行自定义。每个配置项都有相同的选项:

  • converters:在解析文件时使用哪些 CSV 转换器。可用的选项有 integer(整数)、float(浮点数)、numeric(数字)、date(日期)、date_time(日期时间)和 all(所有)。默认情况下,此列表为空。
  • encoding:文件的编码方式。默认使用站点的 encoding 配置选项。
  • headers:一个布尔值,表示是否将文件的第一行作为表头进行解析。如果设置为 false,则将第一行当作数据处理。默认值是 true

示例:

csv_reader:
    converters:
      - numeric
      - datetime
    headers: true
    encoding: utf-8
tsv_reader:
    converters:
      - all
    headers: false