UNPKG

node1-libxmljsmt-myh

Version:

multi-threaded libxml bindings for v8 javascript engine

178 lines (140 loc) 4.69 kB
var bindings = require('./bindings'); var Element = require('./element'); function assertRoot(doc) { if(!doc.root()) { throw new Error('Document has no root element'); } } /// Create a new document /// @param {string} version xml version, default 1.0 /// @param {string} encoding the encoding, default utf8 /// @constructor function Document(version, encoding) { version = version || '1.0'; var doc = new bindings.Document(version); doc.encoding(encoding || 'utf8'); return doc; } Document.prototype = bindings.Document.prototype; /// get or set the root element /// if called without any arguments, this will return the document root /// @param {Element} [elem] if specified, this will become the new document root Document.prototype.root = function(elem) { return this._root(elem); }; /// add a child node to the document /// this will set the document root Document.prototype.node = function(name, content) { return this.root(Element(this, name, content)); }; /// xpath search /// @return array of matching elements Document.prototype.find = function(xpath, ns_uri) { assertRoot(this); return this.root().find(xpath, ns_uri); }; /// xpath search /// @return first element matching Document.prototype.get = function(xpath, ns_uri) { assertRoot(this); return this.root().get(xpath, ns_uri); }; /// @return a given child Document.prototype.child = function(id) { if (id === undefined || typeof id !== 'number') { throw new Error('id argument required for #child'); } assertRoot(this); return this.root().child(id); }; /// @return an Array of child nodes of the document root Document.prototype.childNodes = function() { assertRoot(this); return this.root().childNodes(); }; /// @return a string representation of the document Document.prototype.toString = function(formatted) { return this._toString(formatted !== undefined ? formatted : true); }; /// @return the document version Document.prototype.version = function() { return this._version(); }; /// @return the document encoding Document.prototype.encoding = function(encoding) { return this._encoding(encoding); }; /// @return whether the XmlDocument is valid Document.prototype.validate = function(xsd) { return this._validate(xsd); }; /// @return whether the XmlDocument is valid using Relaxed NG Document.prototype.rngValidate = function(rng) { return this._rngValidate(rng); }; Document.prototype.getDtd = function() { return this._getDtd(); }; Document.prototype.setDtd = function(name, ext, sys) { if (!name) { throw new Error('Must pass in a DTD name'); } else if (typeof name !== 'string') { throw new Error('Must pass in a valid DTD name'); } var params = [name]; if (typeof ext !== 'undefined') { params.push(ext); } if (ext && typeof sys !== 'undefined') { params.push(sys); } return this._setDtd.apply(this, params); }; /// @return array of namespaces in document Document.prototype.namespaces = function() { assertRoot(this); return this.root().namespaces(); }; Document.prototype.type = function() { return 'document'; }; module.exports = Document; /// parse a string into a html document /// @param string html string to parse /// @param {encoding:string, baseUrl:string} opts html string to parse /// @return a Document module.exports.fromHtml = function(string, opts) { opts = opts || {}; // if for some reason user did not specify an object for the options if (typeof(opts) !== 'object') { throw new Error('fromHtml options must be an object'); } return bindings.fromHtml(string, opts); }; /// parse a string into a html document fragment /// @param string html string to parse /// @param {encoding:string, baseUrl:string} opts html string to parse /// @return a Document module.exports.fromHtmlFragment = function(string, opts) { opts = opts || {}; // if for some reason user did not specify an object for the options if (typeof(opts) !== 'object') { throw new Error('fromHtmlFragment options must be an object'); } opts.doctype = false; opts.implied = false; return bindings.fromHtml(string, opts); }; /// parse a string into a xml document /// @param string xml string to parse /// @return a Document module.exports.fromXml = function(string, options) { return bindings.fromXml(string, options || {}); }; module.exports.fromXmlAsync = function(buf, options, callback) { if (!callback) { callback = options; options = {}; } return bindings.fromXmlAsync(new Buffer(buf), options, callback); };