| // Generated by CoffeeScript 1.3.3 |
| (function() { |
| var XMLFragment, |
| __hasProp = {}.hasOwnProperty; |
| |
| XMLFragment = (function() { |
| |
| function XMLFragment(parent, name, attributes, text) { |
| this.isRoot = false; |
| this.documentObject = null; |
| this.parent = parent; |
| this.name = name; |
| this.attributes = attributes; |
| this.value = text; |
| this.children = []; |
| } |
| |
| XMLFragment.prototype.element = function(name, attributes, text) { |
| var child, key, val, _ref, _ref1; |
| if (!(name != null)) { |
| throw new Error("Missing element name"); |
| } |
| name = '' + name || ''; |
| this.assertLegalChar(name); |
| if (attributes == null) { |
| attributes = {}; |
| } |
| if (this.is(attributes, 'String') && this.is(text, 'Object')) { |
| _ref = [text, attributes], attributes = _ref[0], text = _ref[1]; |
| } else if (this.is(attributes, 'String')) { |
| _ref1 = [{}, attributes], attributes = _ref1[0], text = _ref1[1]; |
| } |
| for (key in attributes) { |
| if (!__hasProp.call(attributes, key)) continue; |
| val = attributes[key]; |
| val = '' + val || ''; |
| attributes[key] = this.escape(val); |
| } |
| child = new XMLFragment(this, name, attributes); |
| if (text != null) { |
| text = '' + text || ''; |
| text = this.escape(text); |
| this.assertLegalChar(text); |
| child.raw(text); |
| } |
| this.children.push(child); |
| return child; |
| }; |
| |
| XMLFragment.prototype.insertBefore = function(name, attributes, text) { |
| var child, i, key, val, _ref, _ref1; |
| if (this.isRoot) { |
| throw new Error("Cannot insert elements at root level"); |
| } |
| if (!(name != null)) { |
| throw new Error("Missing element name"); |
| } |
| name = '' + name || ''; |
| this.assertLegalChar(name); |
| if (attributes == null) { |
| attributes = {}; |
| } |
| if (this.is(attributes, 'String') && this.is(text, 'Object')) { |
| _ref = [text, attributes], attributes = _ref[0], text = _ref[1]; |
| } else if (this.is(attributes, 'String')) { |
| _ref1 = [{}, attributes], attributes = _ref1[0], text = _ref1[1]; |
| } |
| for (key in attributes) { |
| if (!__hasProp.call(attributes, key)) continue; |
| val = attributes[key]; |
| val = '' + val || ''; |
| attributes[key] = this.escape(val); |
| } |
| child = new XMLFragment(this.parent, name, attributes); |
| if (text != null) { |
| text = '' + text || ''; |
| text = this.escape(text); |
| this.assertLegalChar(text); |
| child.raw(text); |
| } |
| i = this.parent.children.indexOf(this); |
| this.parent.children.splice(i, 0, child); |
| return child; |
| }; |
| |
| XMLFragment.prototype.insertAfter = function(name, attributes, text) { |
| var child, i, key, val, _ref, _ref1; |
| if (this.isRoot) { |
| throw new Error("Cannot insert elements at root level"); |
| } |
| if (!(name != null)) { |
| throw new Error("Missing element name"); |
| } |
| name = '' + name || ''; |
| this.assertLegalChar(name); |
| if (attributes == null) { |
| attributes = {}; |
| } |
| if (this.is(attributes, 'String') && this.is(text, 'Object')) { |
| _ref = [text, attributes], attributes = _ref[0], text = _ref[1]; |
| } else if (this.is(attributes, 'String')) { |
| _ref1 = [{}, attributes], attributes = _ref1[0], text = _ref1[1]; |
| } |
| for (key in attributes) { |
| if (!__hasProp.call(attributes, key)) continue; |
| val = attributes[key]; |
| val = '' + val || ''; |
| attributes[key] = this.escape(val); |
| } |
| child = new XMLFragment(this.parent, name, attributes); |
| if (text != null) { |
| text = '' + text || ''; |
| text = this.escape(text); |
| this.assertLegalChar(text); |
| child.raw(text); |
| } |
| i = this.parent.children.indexOf(this); |
| this.parent.children.splice(i + 1, 0, child); |
| return child; |
| }; |
| |
| XMLFragment.prototype.remove = function() { |
| var i, _ref; |
| if (this.isRoot) { |
| throw new Error("Cannot remove the root element"); |
| } |
| i = this.parent.children.indexOf(this); |
| [].splice.apply(this.parent.children, [i, i - i + 1].concat(_ref = [])), _ref; |
| return this.parent; |
| }; |
| |
| XMLFragment.prototype.text = function(value) { |
| var child; |
| if (!(value != null)) { |
| throw new Error("Missing element text"); |
| } |
| value = '' + value || ''; |
| value = this.escape(value); |
| this.assertLegalChar(value); |
| child = new XMLFragment(this, '', {}, value); |
| this.children.push(child); |
| return this; |
| }; |
| |
| XMLFragment.prototype.cdata = function(value) { |
| var child; |
| if (!(value != null)) { |
| throw new Error("Missing CDATA text"); |
| } |
| value = '' + value || ''; |
| this.assertLegalChar(value); |
| if (value.match(/]]>/)) { |
| throw new Error("Invalid CDATA text: " + value); |
| } |
| child = new XMLFragment(this, '', {}, '<![CDATA[' + value + ']]>'); |
| this.children.push(child); |
| return this; |
| }; |
| |
| XMLFragment.prototype.comment = function(value) { |
| var child; |
| if (!(value != null)) { |
| throw new Error("Missing comment text"); |
| } |
| value = '' + value || ''; |
| value = this.escape(value); |
| this.assertLegalChar(value); |
| if (value.match(/--/)) { |
| throw new Error("Comment text cannot contain double-hypen: " + value); |
| } |
| child = new XMLFragment(this, '', {}, '<!-- ' + value + ' -->'); |
| this.children.push(child); |
| return this; |
| }; |
| |
| XMLFragment.prototype.raw = function(value) { |
| var child; |
| if (!(value != null)) { |
| throw new Error("Missing raw text"); |
| } |
| value = '' + value || ''; |
| child = new XMLFragment(this, '', {}, value); |
| this.children.push(child); |
| return this; |
| }; |
| |
| XMLFragment.prototype.up = function() { |
| if (this.isRoot) { |
| throw new Error("This node has no parent. Use doc() if you need to get the document object."); |
| } |
| return this.parent; |
| }; |
| |
| XMLFragment.prototype.root = function() { |
| var child; |
| if (this.isRoot) { |
| return this; |
| } |
| child = this.parent; |
| while (!child.isRoot) { |
| child = child.parent; |
| } |
| return child; |
| }; |
| |
| XMLFragment.prototype.document = function() { |
| return this.root().documentObject; |
| }; |
| |
| XMLFragment.prototype.end = function(options) { |
| return this.document().toString(options); |
| }; |
| |
| XMLFragment.prototype.prev = function() { |
| var i; |
| if (this.isRoot) { |
| throw new Error("Root node has no siblings"); |
| } |
| i = this.parent.children.indexOf(this); |
| if (i < 1) { |
| throw new Error("Already at the first node"); |
| } |
| return this.parent.children[i - 1]; |
| }; |
| |
| XMLFragment.prototype.next = function() { |
| var i; |
| if (this.isRoot) { |
| throw new Error("Root node has no siblings"); |
| } |
| i = this.parent.children.indexOf(this); |
| if (i === -1 || i === this.parent.children.length - 1) { |
| throw new Error("Already at the last node"); |
| } |
| return this.parent.children[i + 1]; |
| }; |
| |
| XMLFragment.prototype.clone = function(deep) { |
| var clonedSelf; |
| clonedSelf = new XMLFragment(this.parent, this.name, this.attributes, this.value); |
| if (deep) { |
| this.children.forEach(function(child) { |
| var clonedChild; |
| clonedChild = child.clone(deep); |
| clonedChild.parent = clonedSelf; |
| return clonedSelf.children.push(clonedChild); |
| }); |
| } |
| return clonedSelf; |
| }; |
| |
| XMLFragment.prototype.importXMLBuilder = function(xmlbuilder) { |
| var clonedRoot; |
| clonedRoot = xmlbuilder.root().clone(true); |
| clonedRoot.parent = this; |
| this.children.push(clonedRoot); |
| clonedRoot.isRoot = false; |
| return this; |
| }; |
| |
| XMLFragment.prototype.attribute = function(name, value) { |
| var _ref; |
| if (!(name != null)) { |
| throw new Error("Missing attribute name"); |
| } |
| if (!(value != null)) { |
| throw new Error("Missing attribute value"); |
| } |
| name = '' + name || ''; |
| value = '' + value || ''; |
| if ((_ref = this.attributes) == null) { |
| this.attributes = {}; |
| } |
| this.attributes[name] = this.escape(value); |
| return this; |
| }; |
| |
| XMLFragment.prototype.removeAttribute = function(name) { |
| if (!(name != null)) { |
| throw new Error("Missing attribute name"); |
| } |
| name = '' + name || ''; |
| delete this.attributes[name]; |
| return this; |
| }; |
| |
| XMLFragment.prototype.toString = function(options, level) { |
| var attName, attValue, child, indent, newline, pretty, r, space, _i, _len, _ref, _ref1; |
| pretty = (options != null) && options.pretty || false; |
| indent = (options != null) && options.indent || ' '; |
| newline = (options != null) && options.newline || '\n'; |
| level || (level = 0); |
| space = new Array(level + 1).join(indent); |
| r = ''; |
| if (pretty) { |
| r += space; |
| } |
| if (!(this.value != null)) { |
| r += '<' + this.name; |
| } else { |
| r += '' + this.value; |
| } |
| _ref = this.attributes; |
| for (attName in _ref) { |
| attValue = _ref[attName]; |
| if (this.name === '!DOCTYPE') { |
| r += ' ' + attValue; |
| } else { |
| r += ' ' + attName + '="' + attValue + '"'; |
| } |
| } |
| if (this.children.length === 0) { |
| if (!(this.value != null)) { |
| r += this.name === '?xml' ? '?>' : this.name === '!DOCTYPE' ? '>' : '/>'; |
| } |
| if (pretty) { |
| r += newline; |
| } |
| } else if (pretty && this.children.length === 1 && this.children[0].value) { |
| r += '>'; |
| r += this.children[0].value; |
| r += '</' + this.name + '>'; |
| r += newline; |
| } else { |
| r += '>'; |
| if (pretty) { |
| r += newline; |
| } |
| _ref1 = this.children; |
| for (_i = 0, _len = _ref1.length; _i < _len; _i++) { |
| child = _ref1[_i]; |
| r += child.toString(options, level + 1); |
| } |
| if (pretty) { |
| r += space; |
| } |
| r += '</' + this.name + '>'; |
| if (pretty) { |
| r += newline; |
| } |
| } |
| return r; |
| }; |
| |
| XMLFragment.prototype.escape = function(str) { |
| return str.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/'/g, ''').replace(/"/g, '"'); |
| }; |
| |
| XMLFragment.prototype.assertLegalChar = function(str) { |
| var chars, chr; |
| 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); |
| } |
| }; |
| |
| XMLFragment.prototype.is = function(obj, type) { |
| var clas; |
| clas = Object.prototype.toString.call(obj).slice(8, -1); |
| return (obj != null) && clas === type; |
| }; |
| |
| XMLFragment.prototype.ele = function(name, attributes, text) { |
| return this.element(name, attributes, text); |
| }; |
| |
| XMLFragment.prototype.txt = function(value) { |
| return this.text(value); |
| }; |
| |
| XMLFragment.prototype.dat = function(value) { |
| return this.cdata(value); |
| }; |
| |
| XMLFragment.prototype.att = function(name, value) { |
| return this.attribute(name, value); |
| }; |
| |
| XMLFragment.prototype.com = function(value) { |
| return this.comment(value); |
| }; |
| |
| XMLFragment.prototype.doc = function() { |
| return this.document(); |
| }; |
| |
| XMLFragment.prototype.e = function(name, attributes, text) { |
| return this.element(name, attributes, text); |
| }; |
| |
| XMLFragment.prototype.t = function(value) { |
| return this.text(value); |
| }; |
| |
| XMLFragment.prototype.d = function(value) { |
| return this.cdata(value); |
| }; |
| |
| XMLFragment.prototype.a = function(name, value) { |
| return this.attribute(name, value); |
| }; |
| |
| XMLFragment.prototype.c = function(value) { |
| return this.comment(value); |
| }; |
| |
| XMLFragment.prototype.r = function(value) { |
| return this.raw(value); |
| }; |
| |
| XMLFragment.prototype.u = function() { |
| return this.up(); |
| }; |
| |
| return XMLFragment; |
| |
| })(); |
| |
| module.exports = XMLFragment; |
| |
| }).call(this); |