// Generated by CoffeeScript 2.4.1 (function() { var NodeType, XMLAttribute, XMLElement, XMLNamedNodeMap, XMLNode, getValue, isFunction, isObject, hasProp = {}.hasOwnProperty; ({isObject, isFunction, getValue} = require('./Utility')); XMLNode = require('./XMLNode'); NodeType = require('./NodeType'); XMLAttribute = require('./XMLAttribute'); XMLNamedNodeMap = require('./XMLNamedNodeMap'); // Represents an element of the XML document module.exports = XMLElement = (function() { class XMLElement extends XMLNode { // Initializes a new instance of `XMLElement` // `parent` the parent node // `name` element name // `attributes` an object containing name/value pairs of attributes constructor(parent, name, attributes) { var child, j, len, ref; super(parent); if (name == null) { throw new Error("Missing element name. " + this.debugInfo()); } this.name = this.stringify.name(name); this.type = NodeType.Element; this.attribs = {}; this.schemaTypeInfo = null; if (attributes != null) { this.attribute(attributes); } // set properties if this is the root node if (parent.type === NodeType.Document) { this.isRoot = true; this.documentObject = parent; parent.rootObject = this; // set dtd name if (parent.children) { ref = parent.children; for (j = 0, len = ref.length; j < len; j++) { child = ref[j]; if (child.type === NodeType.DocType) { child.name = this.name; break; } } } } } // Creates and returns a deep clone of `this` clone() { var att, attName, clonedSelf, ref; clonedSelf = Object.create(this); // remove document element if (clonedSelf.isRoot) { clonedSelf.documentObject = null; } // clone attributes clonedSelf.attribs = {}; ref = this.attribs; for (attName in ref) { if (!hasProp.call(ref, attName)) continue; att = ref[attName]; clonedSelf.attribs[attName] = att.clone(); } // clone child nodes clonedSelf.children = []; this.children.forEach(function(child) { var clonedChild; clonedChild = child.clone(); clonedChild.parent = clonedSelf; return clonedSelf.children.push(clonedChild); }); return clonedSelf; } // Adds or modifies an attribute // `name` attribute name // `value` attribute value attribute(name, value) { var attName, attValue; if (name != null) { name = getValue(name); } if (isObject(name)) { // expand if object for (attName in name) { if (!hasProp.call(name, attName)) continue; attValue = name[attName]; this.attribute(attName, attValue); } } else { if (isFunction(value)) { value = value.apply(); } if (this.options.keepNullAttributes && (value == null)) { this.attribs[name] = new XMLAttribute(this, name, ""); } else if (value != null) { this.attribs[name] = new XMLAttribute(this, name, value); } } return this; } // Removes an attribute // `name` attribute name removeAttribute(name) { var attName, j, len; // Also defined in DOM level 1 // removeAttribute(name) removes an attribute by name. if (name == null) { throw new Error("Missing attribute name. " + this.debugInfo()); } name = getValue(name); if (Array.isArray(name)) { // expand if array for (j = 0, len = name.length; j < len; j++) { attName = name[j]; delete this.attribs[attName]; } } else { delete this.attribs[name]; } return this; } // Converts the XML fragment to string // `options.pretty` pretty prints the result // `options.indent` indentation for pretty print // `options.offset` how many indentations to add to every line for pretty print // `options.newline` newline sequence for pretty print // `options.allowEmpty` do not self close empty element tags toString(options) { return this.options.writer.element(this, this.options.writer.filterOptions(options)); } // Aliases att(name, value) { return this.attribute(name, value); } a(name, value) { return this.attribute(name, value); } // DOM Level 1 getAttribute(name) { if (this.attribs.hasOwnProperty(name)) { return this.attribs[name].value; } else { return null; } } setAttribute(name, value) { throw new Error("This DOM method is not implemented." + this.debugInfo()); } getAttributeNode(name) { if (this.attribs.hasOwnProperty(name)) { return this.attribs[name]; } else { return null; } } setAttributeNode(newAttr) { throw new Error("This DOM method is not implemented." + this.debugInfo()); } removeAttributeNode(oldAttr) { throw new Error("This DOM method is not implemented." + this.debugInfo()); } getElementsByTagName(name) { throw new Error("This DOM method is not implemented." + this.debugInfo()); } // DOM Level 2 getAttributeNS(namespaceURI, localName) { throw new Error("This DOM method is not implemented." + this.debugInfo()); } setAttributeNS(namespaceURI, qualifiedName, value) { throw new Error("This DOM method is not implemented." + this.debugInfo()); } removeAttributeNS(namespaceURI, localName) { throw new Error("This DOM method is not implemented." + this.debugInfo()); } getAttributeNodeNS(namespaceURI, localName) { throw new Error("This DOM method is not implemented." + this.debugInfo()); } setAttributeNodeNS(newAttr) { throw new Error("This DOM method is not implemented." + this.debugInfo()); } getElementsByTagNameNS(namespaceURI, localName) { throw new Error("This DOM method is not implemented." + this.debugInfo()); } hasAttribute(name) { return this.attribs.hasOwnProperty(name); } hasAttributeNS(namespaceURI, localName) { throw new Error("This DOM method is not implemented." + this.debugInfo()); } // DOM Level 3 setIdAttribute(name, isId) { if (this.attribs.hasOwnProperty(name)) { return this.attribs[name].isId; } else { return isId; } } setIdAttributeNS(namespaceURI, localName, isId) { throw new Error("This DOM method is not implemented." + this.debugInfo()); } setIdAttributeNode(idAttr, isId) { throw new Error("This DOM method is not implemented." + this.debugInfo()); } // DOM Level 4 getElementsByTagName(tagname) { throw new Error("This DOM method is not implemented." + this.debugInfo()); } getElementsByTagNameNS(namespaceURI, localName) { throw new Error("This DOM method is not implemented." + this.debugInfo()); } getElementsByClassName(classNames) { throw new Error("This DOM method is not implemented." + this.debugInfo()); } isEqualNode(node) { var i, j, ref; if (!super.isEqualNode(node)) { return false; } if (node.namespaceURI !== this.namespaceURI) { return false; } if (node.prefix !== this.prefix) { return false; } if (node.localName !== this.localName) { return false; } if (node.attribs.length !== this.attribs.length) { return false; } for (i = j = 0, ref = this.attribs.length - 1; (0 <= ref ? j <= ref : j >= ref); i = 0 <= ref ? ++j : --j) { if (!this.attribs[i].isEqualNode(node.attribs[i])) { return false; } } return true; } }; // DOM level 1 Object.defineProperty(XMLElement.prototype, 'tagName', { get: function() { return this.name; } }); // DOM level 4 Object.defineProperty(XMLElement.prototype, 'namespaceURI', { get: function() { return ''; } }); Object.defineProperty(XMLElement.prototype, 'prefix', { get: function() { return ''; } }); Object.defineProperty(XMLElement.prototype, 'localName', { get: function() { return this.name; } }); Object.defineProperty(XMLElement.prototype, 'id', { get: function() { throw new Error("This DOM method is not implemented." + this.debugInfo()); } }); Object.defineProperty(XMLElement.prototype, 'className', { get: function() { throw new Error("This DOM method is not implemented." + this.debugInfo()); } }); Object.defineProperty(XMLElement.prototype, 'classList', { get: function() { throw new Error("This DOM method is not implemented." + this.debugInfo()); } }); Object.defineProperty(XMLElement.prototype, 'attributes', { get: function() { if (!this.attributeMap || !this.attributeMap.nodes) { this.attributeMap = new XMLNamedNodeMap(this.attribs); } return this.attributeMap; } }); return XMLElement; }).call(this); }).call(this);