runsisi's

technical notes

yaml 文档 中的 & * << 语法

2019-03-19 runsisi#fe

今天看到如下的一个 yaml 文档:

color:
  neutral:
    white: &color-white '#ffffff'

background:
  color:
    primary: *color-white

初次见到确实很难以理解,其实 &* 分别是 yaml 规范中的 anchor 和 reference 语法,另外还有一种 extend 语法其语法符号是 <<

&, * 类似于 C 语言中的宏定义,上述代码转换为基础的 yaml 语法如下:

color:
  neutral:
    white: '#ffffff'

background:
  color:
    primary: '#ffffff'

<< 通常与 &, * 一起使用,类似于 ES6 的 spread 操作符,如:

color:
  &color-neutral
  neutral:
    white: '#ffffff'
  default:
    green: '#ff0000'

background:
  color:
    <<: *color-neutral
    primary:
      black: '#000000'

转换成基础的 yaml 语法如下:

color:
  neutral:
    white: '#ffffff'
  default:
    green: '#ff0000'

background:
  color:
    neutral:
      white: '#ffffff'
    default:
      green: '#ff0000'
    primary:
      black: '#000000'

<< 还一种 Extend inline 的用法:

color:
  <<: &color-neutral
    neutral:
      white: '#ffffff'
  default:
    green: '#ff0000'

background:
  color:
    <<: *color-neutral
    primary:
      black: '#000000'

转换成基础的 yaml 语法如下:

color:
  neutral:
    white: '#ffffff'
  default:
    green: '#ff0000'

background:
  color:
    neutral:
      white: '#ffffff'
    primary:
      black: '#000000'

此外,关于 YAML 多行字符串的处理,可以参考 [3][4]。

参考资料

[1] YAML - Anchors, References, Extend

https://blog.daemonl.com/2016/02/yaml.html

[2] Online YAML Parser

http://yaml-online-parser.appspot.com/

[3] In YAML, how do I break a string over multiple lines?

https://stackoverflow.com/a/21699210

[4] YAML Multiline

https://yaml-multiline.info/