纯JavaScript YAML库,支持转储和加载?

16

是否存在这样的东西适用于YAML(也称为YAML)?

如果曾经有这样的东西,那么它现在已经消失了,因为最新的搜索结果是零。看起来有很多实现可以从JavaScript转储为YAML输出,但很难找到同时支持转储和加载的实现。

是否有人在开发这样的东西…或者说这方面的需求太低了。


1
另请参阅: https://dev59.com/Pm855IYBdhLWcg3wcz_y#5536931 - dreftymac
6个回答

8

我刚想找同样的东西,这里有一个基本的基于Javascript的YAML解析器,是由Tj Holowaychukrefactormycode.com编写的。我在这里复制它,以确保它不会丢失,看起来yaml.org上的JsYaml链接已经破损了一段时间了。还没有测试过。

;(function(){
  YAML = {
    valueOf: function(token) {
      return eval('(' + token + ')')
    },

    tokenize: function(str) {
      return str.match(/(---|true|false|null|#(.*)|\[(.*?)\]|\{(.*?)\}|[\w\-]+:|-(.+)|\d+\.\d+|\d+|\n+)/g)
    },

    strip: function(str) {
      return str.replace(/^\s*|\s*$/, '')
    },

    parse: function(tokens) {
      var token, list = /^-(.*)/, key = /^([\w\-]+):/, stack = {}
      while (token = tokens.shift())
        if (token[0] == '#' || token == '---' || token == "\n") 
          continue
        else if (key.exec(token) && tokens[0] == "\n")
          stack[RegExp.$1] = this.parse(tokens)
        else if (key.exec(token))
          stack[RegExp.$1] = this.valueOf(tokens.shift())
        else if (list.exec(token))
          (stack.constructor == Array ?
            stack : (stack = [])).push(this.strip(RegExp.$1))
      return stack
    },

    eval: function(str) {
      return this.parse(this.tokenize(str))
    }
  }
})()

print(YAML.eval(readFile('config.yml')).toSource())




// config.yml

---
  # just a comment
  list: ['foo', 'bar']
  hash: { foo: "bar", n: 1 }
  lib:
    - lib/cart.js
    - lib/cart.foo.js
  specs:
    - spec/cart.spec.js
    - spec/cart.foo.spec.js
    # - Commented out
  environments:
    all:
      options:
        failuresOnly: true
        verbose: false

6

1
我刚试了一下,它支持 YAML 的一个子集,但是没有文档说明。作者告诉我他是为了一个特定的项目而编写的,并且这并不是一个“完整”的解析器。我尝试了一些来自 yaml.org 规范的基本 YAML 文档,但是失败了。如果你不知道它定义了什么子集,那么使用起来相当困难。 - mckoss
2
我刚刚发布了我们的js-yaml(用于node.js)- PyYAML解析器的javascript端口(发射器稍后会发布)。您可以使用“npm install js-yaml”进行安装。或者在开发方面提供帮助:https://github.com/nodeca/js-yaml - user1025604

6

1
在其他人无法解析嵌套的数组和对象时,你的库却能够正常工作。感谢你的开发努力! - Dave Snigier

4
我不确定哪些“支持转储但不支持加载”的“大量实现”可以找到 - 就我的理解,既然JSON是YAML 1.2的子集,那么可能有很多这样的实现,但这个子集并不特别友好,尤其是对于复杂的数据结构。我发现大部分链接都指向依赖于node.js且只提供解析器的JS-YAML的GitHub分支。

Jeremy Faivre在bitbucket上的yaml.js以独立的JavaScript实现了YAML的转储和加载(我从相关StackOverflow问题的答案中了解到该项目)。它虽然没有得到积极的维护,但似乎可以处理较为复杂的YAML和/或JavaScript对象。


2

2

yaml-javascript 声称自己既是转储器又是解析器。我从未尝试过。


1
很遗憾,那个项目似乎无法通过输出转储进行进一步开发。不过还是谢谢您的回复。 - dreftymac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接