支持转储和加载的纯Javascript YAML库?

时间:2009-01-09 14:57:54

标签: javascript serialization markup yaml parsing

YAML(又名YAML)是否存在这样的事情?

如果这种情况一度存在,它必定已被删除,因为最新的搜索出现了虚无...看起来有很多实现转储从Javascript到YAML输出,但是找不到支持转储和加载的实现很困难。

是否有人在做这样的事情......或者对此的要求太低了。

6 个答案:

答案 0 :(得分:7)

只是寻找相同的内容,这是Javascript-based YAML parserTj Holowaychuk撰写的基本refactormycode.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

答案 1 :(得分:6)

我更新此问题以提供我自己处理的另一个解决方案:https://github.com/jeremyfa/yaml.js

它是Symfony YAML Component(YAML 1.2)的纯javascript端口,支持加载和转储。希望这会有所帮助。

答案 2 :(得分:5)

这里可能是更新版本的js-yaml:

http://github.com/visionmedia/js-yaml

答案 3 :(得分:4)

我不确定在哪里支持转储而不是加载的“大量实现” - 在JSON是YAML 1.2的正确子集的范围内,我想可能有很多这些,但是那个子集使得YAML不是特别人性化的,特别是对于复杂的数据结构。我发现的大多数链接都是JS-YAML的github分支,它依赖于node.js和/或只提供解析器。

Jeremy Faivre在bitbucket上的yaml.js在独立的javascript中实现了YAML的转储和加载(我从answer to a related stackoverflow question找到它)。它没有被主动维护,但似乎适用于中等复杂的YAML和/或javascript对象。

答案 4 :(得分:2)

yaml-javascript假装同时是转储器和解析器。没试过。

答案 5 :(得分:2)

还有javascript-yaml-parser/

请参阅此问题:JavaScript YAML Parser,Diogo Costa说:
没有一个可用的javascript YAML解析器满足了我的需求,所以我开发了自己的:它可以在这里找到: http://code.google.com/p/javascript-yaml-parser/