js-yaml是否可以进行行号映射?

时间:2019-02-06 23:28:03

标签: javascript yaml

说我有一个这样的YAML文档:

valid_true:
  - true
  - True
  - TRUE

valid_false:
  - false
  - False
  - FALSE

我想最后得到一个对象,该对象将解析的对象键与定义它们的YAML文档中的行号相关联。这样的输出可能会起作用:

{
  "valid_true": {
    "value": [
      {"value": true, line: 2},
      {"value": true, line: 3},
      {"value": true, line: 4}
    ],
    "line": 1
  },
  "valid_false": {
    "value": [
      {"value": false, line: 7},
      {"value": false, line: 8},
      {"value": false, line: 9}
    ],
    "line": 6
  }
}

此库可能吗?还是我需要派生/修改它?

1 个答案:

答案 0 :(得分:1)

许多YAML库在多个阶段执行加载任务:

  1. 将文档源扫描到令牌中
  2. 将令牌组成节点(标记的标量,序列,映射)
  3. 从节点构造特定于语言的对象

最后一步之后,通常不再提供您要查找的线路信息。只要您可以通过影响对象的构造或在裸露的节点结构之上进行构建来完成加载任务,那么您想要的内容就相对容易实现。

例如在PyYAML中,js-yaml最初基于的YAML 1.1加载程序/转储程序。但是自那时以来,js-yaml已被重写为支持YAML 1.2,而the API似乎没有如上段所述的“干扰”任何选项。

您可能想研究该库的旧版本(基于PyYAML),以查看它们的API是否更灵活。我没有看过实现的细节,但我的印象是,重写以灵活性为代价而放弃了速度(这本身不是一个错误的决定,但对像您这样的用例却没有帮助)。

如果您不受javascript的限制,则可能需要查看NimYaml或我自己的ruamel.yaml(对于Python)。这些是YAML 1.2加载程序/转储程序,我确定可以确定您可以按照需要进行加载过程。

ruamel.yaml在默认往返模式下使用时,已经将行/列信息分配给了由YAML映射和序列构成的对象,可以相对容易地扩展到使用的可用特殊标量类型往返(这些类型包括大多数类型,包括布尔值)。另外,如果您保证输入的键后有空格和/或仅注释行(如您的示例所示),则当然可以根据列表的开头计算项目的实际行号。