除了 Jekyll 的内建变量之外,你还可以指定用于 Liquid 模板系统 的自定义数据。

Jekyll 支持从 _data 目录下的 YAMLJSONCSV 载入数据,注意 CSV 文件必须包含表头行。

这个强大的特性可以帮你避免模板中的重复,并能在不修改 _config.yml 的情况下设置网站特定的选项。

插件和主题也可以通过数据文件来配置变量。

数据目录

正如在目录结构中所描述的,_data 目录用于存储供 Jekyll 生成网站的附加数据。这些文件可以使用 .yml.yaml.jsoncsv 扩展名,并可通过 site.data 访问。

示例:成员列表

这是一个数据文件的简单示例,用以避免在模板中复制粘贴大段代码。

_data/members.yml:

  1. - name: Tom Preston-Werner
  2. github: mojombo
  3. - name: Parker Moore
  4. github: parkr
  5. - name: Liu Fengyun
  6. github: liufengyun

_data/members.csv:

  1. name,github
  2. Tom Preston-Werner,mojombo
  3. Parker Moore,parkr
  4. Liu Fengyun,liufengyun

这些数据可以通过 site.data.members 访问(注意文件名决定了变量名)。

你现在可以在模板中使用该成员列表了:

  1. {% raw %}
  2. <ul>
  3. {% for member in site.data.members %}
  4. <li>
  5. <a href="https://github.com/{{ member.github }}">
  6. {{ member.name }}
  7. </a>
  8. </li>
  9. {% endfor %}
  10. </ul>
  11. {% endraw %}

示例:组织结构

数据文件也可以被放在 _data 的子目录下,每层目录都将添加进变量的命名空间。下面的示例展示了如何在 orgs 目录下分别定义 GitHub 的组织结构:

_data/orgs/jekyll.yml:

  1. username: jekyll
  2. name: Jekyll
  3. members:
  4. - name: Tom Preston-Werner
  5. github: mojombo
  6. - name: Parker Moore
  7. github: parkr

_data/orgs/doeorg.yml:

  1. username: doeorg
  2. name: Doe Org
  3. members:
  4. - name: John Doe
  5. github: jdoe

该组织结构能够通过 site.data.orgs 加上各自的文件名访问:

  1. {% raw %}
  2. <ul>
  3. {% for org_hash in site.data.orgs %}
  4. {% assign org = org_hash[1] %}
  5. <li>
  6. <a href="https://github.com/{{ org.username }}">
  7. {{ org.name }}
  8. </a>
  9. ({{ org.members | size }} members)
  10. </li>
  11. {% endfor %}
  12. </ul>
  13. {% endraw %}

示例:访问特定的作者

页面和文章也可以访问特定的数据项目,下面的例子展示了如何实现:

_data/people.yml:

  1. dave:
  2. name: David Smith
  3. twitter: DavidSilvaSmith

然后可在文章的头信息中指定作者:

  1. {% raw %}
  2. ---
  3. title: sample post
  4. author: dave
  5. ---
  6. {% assign author = site.data.people[page.author] %}
  7. <a rel="author"
  8. href="{{ author.twitter }}"
  9. title="{{ author.name }}">
  10. {{ author.name }}
  11. </a>
  12. {% endraw %}