【问题标题】:Jekyll YAML cyclic referenceJekyll YAML 循环引用
【发布时间】:2017-02-08 00:55:53
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: yaml jekyll


    【解决方案1】:

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

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

    别名/锚点结构是专门为此用例设计的。由于解析后的YAML数据并没有区分对象锚定的地方和引用的地方,所以这相当于你想要的。

    【讨论】:

      【解决方案2】:

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

      这个插件的目标是让数据:

      1. DRY -(不要重复自己)每个模型只能定义一次。
      2. 分组 - 所有相似的数据都应该以相同的格式定义,并排在一起。
      3. 分隔 - 不同的数据应该在不同的地方定义。

      @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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-18
        • 2017-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多