Jekyll YAML循环引用

时间:2017-02-08 00:55:54

标签: yaml jekyll

我有一个包含两个页面的jekyll项目,每个页面都由YAML地图支持,这两个页面都相互引用。例如:

a: &a
  name: "Ay"
  parents: []
  children: [*b]

b: &b 
  name: "Bee"
  parents: [*a]
  children: []

Vanilla YAML似乎不支持在定义之前使用别名/锚点,这会使此策略无效。有没有办法,也许使用Liquid-fu可以让我生成一个列出条目的父母和孩子的页面?

2 个答案:

答案 0 :(得分:3)

您只需要在第一次出现时给出值:

a: &a
  name: "Ay"
  parents: []
  children:
    - &b
      name: "Bee"
      parents: [*a]
      children: []
b: *b

别名/锚点构造是专门为此用例设计的。由于解析的YAML数据不能区分对象锚定的位置和引用对象的位置,因此这相当于您想要的对象。

答案 1 :(得分:0)

由于上述问题的措辞,@ flyx是最合适的答案,但是考虑到外部约束(参见my other question),我结束了自己的plugin,让数据文件通过液体文本互相包含

此插件的目标是让数据为:

  1. DRY - (不要重复自己)每个模型只应定义一次。
  2. 分组 - 所有类似的数据应以相同的格式定义。
  3. 分开 - 应在不同的地方定义不同的数据。
  4. @ flyx的解决方案失败了目标#2和#3,要求在同一个地方定义所有不同类型的数据,并混合食物和成分的定义。

    我建议的解决方案允许将一个数据文件文本包含到另一个数据文件中。这允许在不同的文件中定义不同的模型,但是从其他文件引用,就好像它们是以相同的位置在任意顺序中定义的一样。应用于这个问题,我的解决方案是这样的:

    <强> A.yml

    {% include_relative_once _data/B.yml %}
    
    a: &a
      name: "Ay"
      parents: []
      children: [*b]
    

    <强> B.yml

    {% include_relative_once _data/A.yml %}
    
    b: &b 
      name: "Bee"
      parents: [*a]
      children: []
    

    对于插件本身,请参阅此gist