Jekyll/Liquid - 使用导航项目文件生成 (ul, li) 列表并根据页面前端获取项目的属性

Jekyll/Liquid - Use a file of navigation items to generate a (ul, li) list and to get properties of the items based on page front matter

我正在使用 YAML/Jekyll/Liquid 生成页面,并且我有一个文件 taxonomy.yml,其中包含项目的“类型”(这与类别不同)和项目的属性。

这是一个例子:

fruits:
- apple:
    color: red
    size: medium
    native: true
- grape:
    color: green
    size: small
    native: false

现在我想以两种方式使用这些列表。

  1. 一种 ul/li 类型的列表,应如下所示:

Types of Fruit

  • Apple is red and medium size
  • Grape is green and small size

这是我目前所拥有的,但没有输出任何东西:

<ul>
{% for item in site.data.taxonomy.fruits %}
<li>??? is {{ item.color}} and size {{ item.size }}</li>
{% endfor %}
</ul>
  1. 我想使用给定 post 的“前言”属性 到 'look up' 导航列表中的值,例如
---
title: The Pink Lady
fruit: apple
---

# All about the Pink Lady

Blah blah blah...

然后基于水果(在本例中为苹果)我希望能够放入 post 页面,如下所示:

The Pink Lady

This article is about a medium fruit.

All about the Pink Lady

Blah blah blah...

为此,我必须前往 taxonomy.yml,并根据“水果”列表查找“苹果”(从前面的内容),然后读取“大小”属性(在这种情况下为介质)打印到 post.

(假设值是唯一的,所以文件中只有一个 'apple',并且它总是指定一个 'size')

这是我的:

<h1>{{ page.title }}</h1>

<p>This article is about a {{ site.data.taxonomy.fruits[page.fruit].size }} fruit.</p>

我想我一定是没能理解有关使用层次结构的一些细节,因为我相信这个想法基本上已经存在,但缺少一些细节......请帮忙!

我想我的误解可能在某种程度上与“列表项”和“键值对”之间的区别有关。我理解抽象的那些,但很难在这里应用它们。

您可能在此处误用了 YAML 序列。您的 YAML:

fruits:
- apple:
    color: red
    size: medium
    native: true
- grape:
    color: green
    size: small
    native: false

表示fruits是一个列表,其中每个列表项都是一个具有单个键值对的映射;键是 applegrape,值是包含它们属性的映射。您可能想要执行以下任一操作:

选项 1:不使用序列。

fruits:
  apple:
    color: red
    size: medium
    native: true
  grape:
    color: green
    size: small
    native: false

然后您可以迭代映射,其中 item 将是键和值的元组:

<ul>
{% for item in site.data.taxonomy.fruits %}
<li>{{item[0]}} is {{item[1].color}} and size {{item[1].size }}</li>
{% endfor %}
</ul>

选项 2:在属性中集成名称

也许您确实希望 fruits 成为一个序列。然后你应该像这样将名称合并到属性列表中:

fruits:
- name: apple
  color: red
  size: medium
  native: true
- name: grape
  color: green
  size: small
  native: false

现在您可以遍历序列,item 将直接包含属性列表:

<ul>
{% for item in site.data.taxonomy.fruits %}
<li>{{item.name}} is {{ item.color}} and size {{ item.size }}</li>
{% endfor %}
</ul>

是的,但是如果我真的很想保留原始的 YAML 怎么办

<ul>
{% for item in site.data.taxonomy.fruits %}
{% for kvpair in item %}
<li>{{kvpair[0]}} is {{kvpair[1].color}} and size {{kvpair[1].size }}</li>
{% endfor %}
{% endfor %}
</ul>