diff options
Diffstat (limited to 'src/Yaml.js')
-rw-r--r-- | src/Yaml.js | 222 |
1 files changed, 222 insertions, 0 deletions
diff --git a/src/Yaml.js b/src/Yaml.js new file mode 100644 index 0000000..84d27d9 --- /dev/null +++ b/src/Yaml.js @@ -0,0 +1,222 @@ +/** + * Yaml offers convenience methods to parse and dump YAML. + * + * @author Fabien Potencier <fabien@symfony.com> + * + * @api + */ + +var isNode = false; +var Yaml = function(){}; +Yaml.prototype = +{ + + /** + * Parses YAML into a JS representation. + * + * The parse method, when supplied with a YAML stream (file), + * will do its best to convert YAML in a file into a JS representation. + * + * Usage: + * <code> + * obj = yaml.parseFile('config.yml'); + * </code> + * + * @param string input Path of YAML file + * + * @return array The YAML converted to a JS representation + * + * @throws YamlParseException If the YAML is not valid + */ + parseFile: function(file /* String */, callback /* Function */) + { + if ( callback == null ) + { + var input = this.getFileContents(file); + var ret = null; + try + { + ret = this.parse(input); + } + catch ( e ) + { + if ( e instanceof YamlParseException ) { + e.setParsedFile(file); + } + throw e; + } + return ret; + } + + this.getFileContents(file, function(data) + { + callback(new Yaml().parse(data)); + }); + }, + + /** + * Parses YAML into a JS representation. + * + * The parse method, when supplied with a YAML stream (string), + * will do its best to convert YAML into a JS representation. + * + * Usage: + * <code> + * obj = yaml.parse(...); + * </code> + * + * @param string input string containing YAML + * + * @return array The YAML converted to a JS representation + * + * @throws YamlParseException If the YAML is not valid + */ + parse: function(input /* String */) + { + var yaml = new YamlParser(); + + return yaml.parse(input); + }, + + /** + * Dumps a JS representation to a YAML string. + * + * The dump method, when supplied with an array, will do its best + * to convert the array into friendly YAML. + * + * @param array array JS representation + * @param integer inline The level where you switch to inline YAML + * + * @return string A YAML string representing the original JS representation + * + * @api + */ + dump: function(array, inline) + { + if ( inline == null ) inline = 2; + + var yaml = new YamlDumper(); + + return yaml.dump(array, inline); + }, + + getXHR: function() + { + if ( window.XMLHttpRequest ) + return new XMLHttpRequest(); + + if ( window.ActiveXObject ) + { + var names = [ + "Msxml2.XMLHTTP.6.0", + "Msxml2.XMLHTTP.3.0", + "Msxml2.XMLHTTP", + "Microsoft.XMLHTTP" + ]; + + for ( var i = 0; i < 4; i++ ) + { + try{ return new ActiveXObject(names[i]); } + catch(e){} + } + } + return null; + }, + + getFileContents: function(file, callback) + { + if ( isNode ) + { + var fs = require('fs'); + if ( callback == null ) + { + var data = fs.readFileSync(file); + if (data == null) return null; + return ''+data; + } + else + { + fs.readFile(file, function(err, data) + { + if (err) + callback(null); + else + callback(data); + }); + } + } + else + { + var request = this.getXHR(); + + // Sync + if ( callback == null ) + { + request.open('GET', file, false); + request.send(null); + + if ( request.status == 200 || request.status == 0 ) + return request.responseText; + + return null; + } + + // Async + request.onreadystatechange = function() + { + if ( request.readyState == 4 ) + if ( request.status == 200 || request.status == 0 ) + callback(request.responseText); + else + callback(null); + }; + request.open('GET', file, true); + request.send(null); + } + } +}; + +var YAML = +{ + /* + * @param integer inline The level where you switch to inline YAML + */ + + stringify: function(input, inline) + { + return new Yaml().dump(input, inline); + }, + + parse: function(input) + { + return new Yaml().parse(input); + }, + + load: function(file, callback) + { + return new Yaml().parseFile(file, callback); + } +}; + +// Handle node.js case +if (typeof exports !== 'undefined') { + if (typeof module !== 'undefined' && module.exports) { + exports = module.exports = YAML; + isNode = true; + + // Add require handler + (function () { + var require_handler = function (module, filename) { + // fill in result + module.exports = YAML.load(filename); + }; + + // register require extensions only if we're on node.js + // hack for browserify + if ( undefined !== require.extensions ) { + require.extensions['.yml'] = require_handler; + require.extensions['.yaml'] = require_handler; + } + }()); + } +} |