2017-02-08 167 views
3

我有一個兩個頁面的jekyll項目,每個頁面都由YAML映射支持,這兩個映射都可以互相引用。例如:Jekyll YAML循環參考

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

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

Vanilla YAML似乎不支持在定義之前使用別名/定位點,這會使該策略失效。有沒有辦法,也許使用液體福,讓我生成頁面,枚舉入口的父母和孩子?

回答

3

你只需要給上首次出現的值:

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

別名/錨結構已用於該用途的情況而設計的。由於解析的YAML數據不能區分對象所在的位置和引用的位置,因此這與您想要的具有相同的效果。

0

由於上述問題的措辭,@ flyx's是最合適的答案,但是由於外部約束(請參閱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