137 lines
3.9 KiB
JavaScript
137 lines
3.9 KiB
JavaScript
// Generated by CoffeeScript 1.3.3
|
|
(function() {
|
|
var XMLBuilder, XMLFragment,
|
|
__bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
|
|
|
|
XMLFragment = require('./XMLFragment');
|
|
|
|
XMLBuilder = (function() {
|
|
|
|
function XMLBuilder(name, xmldec, doctype, options) {
|
|
this.assertLegalChar = __bind(this.assertLegalChar, this);
|
|
|
|
var att, child, _ref;
|
|
this.children = [];
|
|
this.rootObject = null;
|
|
if (this.is(name, 'Object')) {
|
|
_ref = [name, xmldec], xmldec = _ref[0], doctype = _ref[1];
|
|
name = null;
|
|
}
|
|
if (name != null) {
|
|
name = '' + name || '';
|
|
if (xmldec == null) {
|
|
xmldec = {
|
|
'version': '1.0'
|
|
};
|
|
}
|
|
}
|
|
this.allowSurrogateChars = options != null ? options.allowSurrogateChars : void 0;
|
|
if ((xmldec != null) && !(xmldec.version != null)) {
|
|
throw new Error("Version number is required");
|
|
}
|
|
if (xmldec != null) {
|
|
xmldec.version = '' + xmldec.version || '';
|
|
if (!xmldec.version.match(/1\.[0-9]+/)) {
|
|
throw new Error("Invalid version number: " + xmldec.version);
|
|
}
|
|
att = {
|
|
version: xmldec.version
|
|
};
|
|
if (xmldec.encoding != null) {
|
|
xmldec.encoding = '' + xmldec.encoding || '';
|
|
if (!xmldec.encoding.match(/[A-Za-z](?:[A-Za-z0-9._-]|-)*/)) {
|
|
throw new Error("Invalid encoding: " + xmldec.encoding);
|
|
}
|
|
att.encoding = xmldec.encoding;
|
|
}
|
|
if (xmldec.standalone != null) {
|
|
att.standalone = xmldec.standalone ? "yes" : "no";
|
|
}
|
|
child = new XMLFragment(this, '?xml', att);
|
|
this.children.push(child);
|
|
}
|
|
if (doctype != null) {
|
|
att = {};
|
|
if (name != null) {
|
|
att.name = name;
|
|
}
|
|
if (doctype.ext != null) {
|
|
doctype.ext = '' + doctype.ext || '';
|
|
att.ext = doctype.ext;
|
|
}
|
|
child = new XMLFragment(this, '!DOCTYPE', att);
|
|
this.children.push(child);
|
|
}
|
|
if (name != null) {
|
|
this.begin(name);
|
|
}
|
|
}
|
|
|
|
XMLBuilder.prototype.begin = function(name, xmldec, doctype) {
|
|
var doc, root;
|
|
if (!(name != null)) {
|
|
throw new Error("Root element needs a name");
|
|
}
|
|
if (this.rootObject) {
|
|
this.children = [];
|
|
this.rootObject = null;
|
|
}
|
|
if (xmldec != null) {
|
|
doc = new XMLBuilder(name, xmldec, doctype);
|
|
return doc.root();
|
|
}
|
|
name = '' + name || '';
|
|
root = new XMLFragment(this, name, {});
|
|
root.isRoot = true;
|
|
root.documentObject = this;
|
|
this.children.push(root);
|
|
this.rootObject = root;
|
|
return root;
|
|
};
|
|
|
|
XMLBuilder.prototype.root = function() {
|
|
return this.rootObject;
|
|
};
|
|
|
|
XMLBuilder.prototype.end = function(options) {
|
|
return toString(options);
|
|
};
|
|
|
|
XMLBuilder.prototype.toString = function(options) {
|
|
var child, r, _i, _len, _ref;
|
|
r = '';
|
|
_ref = this.children;
|
|
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
|
child = _ref[_i];
|
|
r += child.toString(options);
|
|
}
|
|
return r;
|
|
};
|
|
|
|
XMLBuilder.prototype.is = function(obj, type) {
|
|
var clas;
|
|
clas = Object.prototype.toString.call(obj).slice(8, -1);
|
|
return (obj != null) && clas === type;
|
|
};
|
|
|
|
XMLBuilder.prototype.assertLegalChar = function(str) {
|
|
var chars, chr;
|
|
if (this.allowSurrogateChars) {
|
|
chars = /[\u0000-\u0008\u000B-\u000C\u000E-\u001F\uFFFE-\uFFFF]/;
|
|
} else {
|
|
chars = /[\u0000-\u0008\u000B-\u000C\u000E-\u001F\uD800-\uDFFF\uFFFE-\uFFFF]/;
|
|
}
|
|
chr = str.match(chars);
|
|
if (chr) {
|
|
throw new Error("Invalid character (" + chr + ") in string: " + str + " at index " + chr.index);
|
|
}
|
|
};
|
|
|
|
return XMLBuilder;
|
|
|
|
})();
|
|
|
|
module.exports = XMLBuilder;
|
|
|
|
}).call(this);
|