335 lines
9.6 KiB
JavaScript
335 lines
9.6 KiB
JavaScript
// 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);
|