You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
785 lines
24 KiB
785 lines
24 KiB
// Generated by CoffeeScript 1.12.7 |
|
(function() { |
|
var DocumentPosition, NodeType, XMLCData, XMLComment, XMLDeclaration, XMLDocType, XMLDummy, XMLElement, XMLNamedNodeMap, XMLNode, XMLNodeList, XMLProcessingInstruction, XMLRaw, XMLText, getValue, isEmpty, isFunction, isObject, ref1, |
|
hasProp = {}.hasOwnProperty; |
|
|
|
ref1 = require('./Utility'), isObject = ref1.isObject, isFunction = ref1.isFunction, isEmpty = ref1.isEmpty, getValue = ref1.getValue; |
|
|
|
XMLElement = null; |
|
|
|
XMLCData = null; |
|
|
|
XMLComment = null; |
|
|
|
XMLDeclaration = null; |
|
|
|
XMLDocType = null; |
|
|
|
XMLRaw = null; |
|
|
|
XMLText = null; |
|
|
|
XMLProcessingInstruction = null; |
|
|
|
XMLDummy = null; |
|
|
|
NodeType = null; |
|
|
|
XMLNodeList = null; |
|
|
|
XMLNamedNodeMap = null; |
|
|
|
DocumentPosition = null; |
|
|
|
module.exports = XMLNode = (function() { |
|
function XMLNode(parent1) { |
|
this.parent = parent1; |
|
if (this.parent) { |
|
this.options = this.parent.options; |
|
this.stringify = this.parent.stringify; |
|
} |
|
this.value = null; |
|
this.children = []; |
|
this.baseURI = null; |
|
if (!XMLElement) { |
|
XMLElement = require('./XMLElement'); |
|
XMLCData = require('./XMLCData'); |
|
XMLComment = require('./XMLComment'); |
|
XMLDeclaration = require('./XMLDeclaration'); |
|
XMLDocType = require('./XMLDocType'); |
|
XMLRaw = require('./XMLRaw'); |
|
XMLText = require('./XMLText'); |
|
XMLProcessingInstruction = require('./XMLProcessingInstruction'); |
|
XMLDummy = require('./XMLDummy'); |
|
NodeType = require('./NodeType'); |
|
XMLNodeList = require('./XMLNodeList'); |
|
XMLNamedNodeMap = require('./XMLNamedNodeMap'); |
|
DocumentPosition = require('./DocumentPosition'); |
|
} |
|
} |
|
|
|
Object.defineProperty(XMLNode.prototype, 'nodeName', { |
|
get: function() { |
|
return this.name; |
|
} |
|
}); |
|
|
|
Object.defineProperty(XMLNode.prototype, 'nodeType', { |
|
get: function() { |
|
return this.type; |
|
} |
|
}); |
|
|
|
Object.defineProperty(XMLNode.prototype, 'nodeValue', { |
|
get: function() { |
|
return this.value; |
|
} |
|
}); |
|
|
|
Object.defineProperty(XMLNode.prototype, 'parentNode', { |
|
get: function() { |
|
return this.parent; |
|
} |
|
}); |
|
|
|
Object.defineProperty(XMLNode.prototype, 'childNodes', { |
|
get: function() { |
|
if (!this.childNodeList || !this.childNodeList.nodes) { |
|
this.childNodeList = new XMLNodeList(this.children); |
|
} |
|
return this.childNodeList; |
|
} |
|
}); |
|
|
|
Object.defineProperty(XMLNode.prototype, 'firstChild', { |
|
get: function() { |
|
return this.children[0] || null; |
|
} |
|
}); |
|
|
|
Object.defineProperty(XMLNode.prototype, 'lastChild', { |
|
get: function() { |
|
return this.children[this.children.length - 1] || null; |
|
} |
|
}); |
|
|
|
Object.defineProperty(XMLNode.prototype, 'previousSibling', { |
|
get: function() { |
|
var i; |
|
i = this.parent.children.indexOf(this); |
|
return this.parent.children[i - 1] || null; |
|
} |
|
}); |
|
|
|
Object.defineProperty(XMLNode.prototype, 'nextSibling', { |
|
get: function() { |
|
var i; |
|
i = this.parent.children.indexOf(this); |
|
return this.parent.children[i + 1] || null; |
|
} |
|
}); |
|
|
|
Object.defineProperty(XMLNode.prototype, 'ownerDocument', { |
|
get: function() { |
|
return this.document() || null; |
|
} |
|
}); |
|
|
|
Object.defineProperty(XMLNode.prototype, 'textContent', { |
|
get: function() { |
|
var child, j, len, ref2, str; |
|
if (this.nodeType === NodeType.Element || this.nodeType === NodeType.DocumentFragment) { |
|
str = ''; |
|
ref2 = this.children; |
|
for (j = 0, len = ref2.length; j < len; j++) { |
|
child = ref2[j]; |
|
if (child.textContent) { |
|
str += child.textContent; |
|
} |
|
} |
|
return str; |
|
} else { |
|
return null; |
|
} |
|
}, |
|
set: function(value) { |
|
throw new Error("This DOM method is not implemented." + this.debugInfo()); |
|
} |
|
}); |
|
|
|
XMLNode.prototype.setParent = function(parent) { |
|
var child, j, len, ref2, results; |
|
this.parent = parent; |
|
if (parent) { |
|
this.options = parent.options; |
|
this.stringify = parent.stringify; |
|
} |
|
ref2 = this.children; |
|
results = []; |
|
for (j = 0, len = ref2.length; j < len; j++) { |
|
child = ref2[j]; |
|
results.push(child.setParent(this)); |
|
} |
|
return results; |
|
}; |
|
|
|
XMLNode.prototype.element = function(name, attributes, text) { |
|
var childNode, item, j, k, key, lastChild, len, len1, ref2, ref3, val; |
|
lastChild = null; |
|
if (attributes === null && (text == null)) { |
|
ref2 = [{}, null], attributes = ref2[0], text = ref2[1]; |
|
} |
|
if (attributes == null) { |
|
attributes = {}; |
|
} |
|
attributes = getValue(attributes); |
|
if (!isObject(attributes)) { |
|
ref3 = [attributes, text], text = ref3[0], attributes = ref3[1]; |
|
} |
|
if (name != null) { |
|
name = getValue(name); |
|
} |
|
if (Array.isArray(name)) { |
|
for (j = 0, len = name.length; j < len; j++) { |
|
item = name[j]; |
|
lastChild = this.element(item); |
|
} |
|
} else if (isFunction(name)) { |
|
lastChild = this.element(name.apply()); |
|
} else if (isObject(name)) { |
|
for (key in name) { |
|
if (!hasProp.call(name, key)) continue; |
|
val = name[key]; |
|
if (isFunction(val)) { |
|
val = val.apply(); |
|
} |
|
if (!this.options.ignoreDecorators && this.stringify.convertAttKey && key.indexOf(this.stringify.convertAttKey) === 0) { |
|
lastChild = this.attribute(key.substr(this.stringify.convertAttKey.length), val); |
|
} else if (!this.options.separateArrayItems && Array.isArray(val) && isEmpty(val)) { |
|
lastChild = this.dummy(); |
|
} else if (isObject(val) && isEmpty(val)) { |
|
lastChild = this.element(key); |
|
} else if (!this.options.keepNullNodes && (val == null)) { |
|
lastChild = this.dummy(); |
|
} else if (!this.options.separateArrayItems && Array.isArray(val)) { |
|
for (k = 0, len1 = val.length; k < len1; k++) { |
|
item = val[k]; |
|
childNode = {}; |
|
childNode[key] = item; |
|
lastChild = this.element(childNode); |
|
} |
|
} else if (isObject(val)) { |
|
if (!this.options.ignoreDecorators && this.stringify.convertTextKey && key.indexOf(this.stringify.convertTextKey) === 0) { |
|
lastChild = this.element(val); |
|
} else { |
|
lastChild = this.element(key); |
|
lastChild.element(val); |
|
} |
|
} else { |
|
lastChild = this.element(key, val); |
|
} |
|
} |
|
} else if (!this.options.keepNullNodes && text === null) { |
|
lastChild = this.dummy(); |
|
} else { |
|
if (!this.options.ignoreDecorators && this.stringify.convertTextKey && name.indexOf(this.stringify.convertTextKey) === 0) { |
|
lastChild = this.text(text); |
|
} else if (!this.options.ignoreDecorators && this.stringify.convertCDataKey && name.indexOf(this.stringify.convertCDataKey) === 0) { |
|
lastChild = this.cdata(text); |
|
} else if (!this.options.ignoreDecorators && this.stringify.convertCommentKey && name.indexOf(this.stringify.convertCommentKey) === 0) { |
|
lastChild = this.comment(text); |
|
} else if (!this.options.ignoreDecorators && this.stringify.convertRawKey && name.indexOf(this.stringify.convertRawKey) === 0) { |
|
lastChild = this.raw(text); |
|
} else if (!this.options.ignoreDecorators && this.stringify.convertPIKey && name.indexOf(this.stringify.convertPIKey) === 0) { |
|
lastChild = this.instruction(name.substr(this.stringify.convertPIKey.length), text); |
|
} else { |
|
lastChild = this.node(name, attributes, text); |
|
} |
|
} |
|
if (lastChild == null) { |
|
throw new Error("Could not create any elements with: " + name + ". " + this.debugInfo()); |
|
} |
|
return lastChild; |
|
}; |
|
|
|
XMLNode.prototype.insertBefore = function(name, attributes, text) { |
|
var child, i, newChild, refChild, removed; |
|
if (name != null ? name.type : void 0) { |
|
newChild = name; |
|
refChild = attributes; |
|
newChild.setParent(this); |
|
if (refChild) { |
|
i = children.indexOf(refChild); |
|
removed = children.splice(i); |
|
children.push(newChild); |
|
Array.prototype.push.apply(children, removed); |
|
} else { |
|
children.push(newChild); |
|
} |
|
return newChild; |
|
} else { |
|
if (this.isRoot) { |
|
throw new Error("Cannot insert elements at root level. " + this.debugInfo(name)); |
|
} |
|
i = this.parent.children.indexOf(this); |
|
removed = this.parent.children.splice(i); |
|
child = this.parent.element(name, attributes, text); |
|
Array.prototype.push.apply(this.parent.children, removed); |
|
return child; |
|
} |
|
}; |
|
|
|
XMLNode.prototype.insertAfter = function(name, attributes, text) { |
|
var child, i, removed; |
|
if (this.isRoot) { |
|
throw new Error("Cannot insert elements at root level. " + this.debugInfo(name)); |
|
} |
|
i = this.parent.children.indexOf(this); |
|
removed = this.parent.children.splice(i + 1); |
|
child = this.parent.element(name, attributes, text); |
|
Array.prototype.push.apply(this.parent.children, removed); |
|
return child; |
|
}; |
|
|
|
XMLNode.prototype.remove = function() { |
|
var i, ref2; |
|
if (this.isRoot) { |
|
throw new Error("Cannot remove the root element. " + this.debugInfo()); |
|
} |
|
i = this.parent.children.indexOf(this); |
|
[].splice.apply(this.parent.children, [i, i - i + 1].concat(ref2 = [])), ref2; |
|
return this.parent; |
|
}; |
|
|
|
XMLNode.prototype.node = function(name, attributes, text) { |
|
var child, ref2; |
|
if (name != null) { |
|
name = getValue(name); |
|
} |
|
attributes || (attributes = {}); |
|
attributes = getValue(attributes); |
|
if (!isObject(attributes)) { |
|
ref2 = [attributes, text], text = ref2[0], attributes = ref2[1]; |
|
} |
|
child = new XMLElement(this, name, attributes); |
|
if (text != null) { |
|
child.text(text); |
|
} |
|
this.children.push(child); |
|
return child; |
|
}; |
|
|
|
XMLNode.prototype.text = function(value) { |
|
var child; |
|
if (isObject(value)) { |
|
this.element(value); |
|
} |
|
child = new XMLText(this, value); |
|
this.children.push(child); |
|
return this; |
|
}; |
|
|
|
XMLNode.prototype.cdata = function(value) { |
|
var child; |
|
child = new XMLCData(this, value); |
|
this.children.push(child); |
|
return this; |
|
}; |
|
|
|
XMLNode.prototype.comment = function(value) { |
|
var child; |
|
child = new XMLComment(this, value); |
|
this.children.push(child); |
|
return this; |
|
}; |
|
|
|
XMLNode.prototype.commentBefore = function(value) { |
|
var child, i, removed; |
|
i = this.parent.children.indexOf(this); |
|
removed = this.parent.children.splice(i); |
|
child = this.parent.comment(value); |
|
Array.prototype.push.apply(this.parent.children, removed); |
|
return this; |
|
}; |
|
|
|
XMLNode.prototype.commentAfter = function(value) { |
|
var child, i, removed; |
|
i = this.parent.children.indexOf(this); |
|
removed = this.parent.children.splice(i + 1); |
|
child = this.parent.comment(value); |
|
Array.prototype.push.apply(this.parent.children, removed); |
|
return this; |
|
}; |
|
|
|
XMLNode.prototype.raw = function(value) { |
|
var child; |
|
child = new XMLRaw(this, value); |
|
this.children.push(child); |
|
return this; |
|
}; |
|
|
|
XMLNode.prototype.dummy = function() { |
|
var child; |
|
child = new XMLDummy(this); |
|
return child; |
|
}; |
|
|
|
XMLNode.prototype.instruction = function(target, value) { |
|
var insTarget, insValue, instruction, j, len; |
|
if (target != null) { |
|
target = getValue(target); |
|
} |
|
if (value != null) { |
|
value = getValue(value); |
|
} |
|
if (Array.isArray(target)) { |
|
for (j = 0, len = target.length; j < len; j++) { |
|
insTarget = target[j]; |
|
this.instruction(insTarget); |
|
} |
|
} else if (isObject(target)) { |
|
for (insTarget in target) { |
|
if (!hasProp.call(target, insTarget)) continue; |
|
insValue = target[insTarget]; |
|
this.instruction(insTarget, insValue); |
|
} |
|
} else { |
|
if (isFunction(value)) { |
|
value = value.apply(); |
|
} |
|
instruction = new XMLProcessingInstruction(this, target, value); |
|
this.children.push(instruction); |
|
} |
|
return this; |
|
}; |
|
|
|
XMLNode.prototype.instructionBefore = function(target, value) { |
|
var child, i, removed; |
|
i = this.parent.children.indexOf(this); |
|
removed = this.parent.children.splice(i); |
|
child = this.parent.instruction(target, value); |
|
Array.prototype.push.apply(this.parent.children, removed); |
|
return this; |
|
}; |
|
|
|
XMLNode.prototype.instructionAfter = function(target, value) { |
|
var child, i, removed; |
|
i = this.parent.children.indexOf(this); |
|
removed = this.parent.children.splice(i + 1); |
|
child = this.parent.instruction(target, value); |
|
Array.prototype.push.apply(this.parent.children, removed); |
|
return this; |
|
}; |
|
|
|
XMLNode.prototype.declaration = function(version, encoding, standalone) { |
|
var doc, xmldec; |
|
doc = this.document(); |
|
xmldec = new XMLDeclaration(doc, version, encoding, standalone); |
|
if (doc.children.length === 0) { |
|
doc.children.unshift(xmldec); |
|
} else if (doc.children[0].type === NodeType.Declaration) { |
|
doc.children[0] = xmldec; |
|
} else { |
|
doc.children.unshift(xmldec); |
|
} |
|
return doc.root() || doc; |
|
}; |
|
|
|
XMLNode.prototype.dtd = function(pubID, sysID) { |
|
var child, doc, doctype, i, j, k, len, len1, ref2, ref3; |
|
doc = this.document(); |
|
doctype = new XMLDocType(doc, pubID, sysID); |
|
ref2 = doc.children; |
|
for (i = j = 0, len = ref2.length; j < len; i = ++j) { |
|
child = ref2[i]; |
|
if (child.type === NodeType.DocType) { |
|
doc.children[i] = doctype; |
|
return doctype; |
|
} |
|
} |
|
ref3 = doc.children; |
|
for (i = k = 0, len1 = ref3.length; k < len1; i = ++k) { |
|
child = ref3[i]; |
|
if (child.isRoot) { |
|
doc.children.splice(i, 0, doctype); |
|
return doctype; |
|
} |
|
} |
|
doc.children.push(doctype); |
|
return doctype; |
|
}; |
|
|
|
XMLNode.prototype.up = function() { |
|
if (this.isRoot) { |
|
throw new Error("The root node has no parent. Use doc() if you need to get the document object."); |
|
} |
|
return this.parent; |
|
}; |
|
|
|
XMLNode.prototype.root = function() { |
|
var node; |
|
node = this; |
|
while (node) { |
|
if (node.type === NodeType.Document) { |
|
return node.rootObject; |
|
} else if (node.isRoot) { |
|
return node; |
|
} else { |
|
node = node.parent; |
|
} |
|
} |
|
}; |
|
|
|
XMLNode.prototype.document = function() { |
|
var node; |
|
node = this; |
|
while (node) { |
|
if (node.type === NodeType.Document) { |
|
return node; |
|
} else { |
|
node = node.parent; |
|
} |
|
} |
|
}; |
|
|
|
XMLNode.prototype.end = function(options) { |
|
return this.document().end(options); |
|
}; |
|
|
|
XMLNode.prototype.prev = function() { |
|
var i; |
|
i = this.parent.children.indexOf(this); |
|
if (i < 1) { |
|
throw new Error("Already at the first node. " + this.debugInfo()); |
|
} |
|
return this.parent.children[i - 1]; |
|
}; |
|
|
|
XMLNode.prototype.next = function() { |
|
var i; |
|
i = this.parent.children.indexOf(this); |
|
if (i === -1 || i === this.parent.children.length - 1) { |
|
throw new Error("Already at the last node. " + this.debugInfo()); |
|
} |
|
return this.parent.children[i + 1]; |
|
}; |
|
|
|
XMLNode.prototype.importDocument = function(doc) { |
|
var clonedRoot; |
|
clonedRoot = doc.root().clone(); |
|
clonedRoot.parent = this; |
|
clonedRoot.isRoot = false; |
|
this.children.push(clonedRoot); |
|
return this; |
|
}; |
|
|
|
XMLNode.prototype.debugInfo = function(name) { |
|
var ref2, ref3; |
|
name = name || this.name; |
|
if ((name == null) && !((ref2 = this.parent) != null ? ref2.name : void 0)) { |
|
return ""; |
|
} else if (name == null) { |
|
return "parent: <" + this.parent.name + ">"; |
|
} else if (!((ref3 = this.parent) != null ? ref3.name : void 0)) { |
|
return "node: <" + name + ">"; |
|
} else { |
|
return "node: <" + name + ">, parent: <" + this.parent.name + ">"; |
|
} |
|
}; |
|
|
|
XMLNode.prototype.ele = function(name, attributes, text) { |
|
return this.element(name, attributes, text); |
|
}; |
|
|
|
XMLNode.prototype.nod = function(name, attributes, text) { |
|
return this.node(name, attributes, text); |
|
}; |
|
|
|
XMLNode.prototype.txt = function(value) { |
|
return this.text(value); |
|
}; |
|
|
|
XMLNode.prototype.dat = function(value) { |
|
return this.cdata(value); |
|
}; |
|
|
|
XMLNode.prototype.com = function(value) { |
|
return this.comment(value); |
|
}; |
|
|
|
XMLNode.prototype.ins = function(target, value) { |
|
return this.instruction(target, value); |
|
}; |
|
|
|
XMLNode.prototype.doc = function() { |
|
return this.document(); |
|
}; |
|
|
|
XMLNode.prototype.dec = function(version, encoding, standalone) { |
|
return this.declaration(version, encoding, standalone); |
|
}; |
|
|
|
XMLNode.prototype.e = function(name, attributes, text) { |
|
return this.element(name, attributes, text); |
|
}; |
|
|
|
XMLNode.prototype.n = function(name, attributes, text) { |
|
return this.node(name, attributes, text); |
|
}; |
|
|
|
XMLNode.prototype.t = function(value) { |
|
return this.text(value); |
|
}; |
|
|
|
XMLNode.prototype.d = function(value) { |
|
return this.cdata(value); |
|
}; |
|
|
|
XMLNode.prototype.c = function(value) { |
|
return this.comment(value); |
|
}; |
|
|
|
XMLNode.prototype.r = function(value) { |
|
return this.raw(value); |
|
}; |
|
|
|
XMLNode.prototype.i = function(target, value) { |
|
return this.instruction(target, value); |
|
}; |
|
|
|
XMLNode.prototype.u = function() { |
|
return this.up(); |
|
}; |
|
|
|
XMLNode.prototype.importXMLBuilder = function(doc) { |
|
return this.importDocument(doc); |
|
}; |
|
|
|
XMLNode.prototype.replaceChild = function(newChild, oldChild) { |
|
throw new Error("This DOM method is not implemented." + this.debugInfo()); |
|
}; |
|
|
|
XMLNode.prototype.removeChild = function(oldChild) { |
|
throw new Error("This DOM method is not implemented." + this.debugInfo()); |
|
}; |
|
|
|
XMLNode.prototype.appendChild = function(newChild) { |
|
throw new Error("This DOM method is not implemented." + this.debugInfo()); |
|
}; |
|
|
|
XMLNode.prototype.hasChildNodes = function() { |
|
return this.children.length !== 0; |
|
}; |
|
|
|
XMLNode.prototype.cloneNode = function(deep) { |
|
throw new Error("This DOM method is not implemented." + this.debugInfo()); |
|
}; |
|
|
|
XMLNode.prototype.normalize = function() { |
|
throw new Error("This DOM method is not implemented." + this.debugInfo()); |
|
}; |
|
|
|
XMLNode.prototype.isSupported = function(feature, version) { |
|
return true; |
|
}; |
|
|
|
XMLNode.prototype.hasAttributes = function() { |
|
return this.attribs.length !== 0; |
|
}; |
|
|
|
XMLNode.prototype.compareDocumentPosition = function(other) { |
|
var ref, res; |
|
ref = this; |
|
if (ref === other) { |
|
return 0; |
|
} else if (this.document() !== other.document()) { |
|
res = DocumentPosition.Disconnected | DocumentPosition.ImplementationSpecific; |
|
if (Math.random() < 0.5) { |
|
res |= DocumentPosition.Preceding; |
|
} else { |
|
res |= DocumentPosition.Following; |
|
} |
|
return res; |
|
} else if (ref.isAncestor(other)) { |
|
return DocumentPosition.Contains | DocumentPosition.Preceding; |
|
} else if (ref.isDescendant(other)) { |
|
return DocumentPosition.Contains | DocumentPosition.Following; |
|
} else if (ref.isPreceding(other)) { |
|
return DocumentPosition.Preceding; |
|
} else { |
|
return DocumentPosition.Following; |
|
} |
|
}; |
|
|
|
XMLNode.prototype.isSameNode = function(other) { |
|
throw new Error("This DOM method is not implemented." + this.debugInfo()); |
|
}; |
|
|
|
XMLNode.prototype.lookupPrefix = function(namespaceURI) { |
|
throw new Error("This DOM method is not implemented." + this.debugInfo()); |
|
}; |
|
|
|
XMLNode.prototype.isDefaultNamespace = function(namespaceURI) { |
|
throw new Error("This DOM method is not implemented." + this.debugInfo()); |
|
}; |
|
|
|
XMLNode.prototype.lookupNamespaceURI = function(prefix) { |
|
throw new Error("This DOM method is not implemented." + this.debugInfo()); |
|
}; |
|
|
|
XMLNode.prototype.isEqualNode = function(node) { |
|
var i, j, ref2; |
|
if (node.nodeType !== this.nodeType) { |
|
return false; |
|
} |
|
if (node.children.length !== this.children.length) { |
|
return false; |
|
} |
|
for (i = j = 0, ref2 = this.children.length - 1; 0 <= ref2 ? j <= ref2 : j >= ref2; i = 0 <= ref2 ? ++j : --j) { |
|
if (!this.children[i].isEqualNode(node.children[i])) { |
|
return false; |
|
} |
|
} |
|
return true; |
|
}; |
|
|
|
XMLNode.prototype.getFeature = function(feature, version) { |
|
throw new Error("This DOM method is not implemented." + this.debugInfo()); |
|
}; |
|
|
|
XMLNode.prototype.setUserData = function(key, data, handler) { |
|
throw new Error("This DOM method is not implemented." + this.debugInfo()); |
|
}; |
|
|
|
XMLNode.prototype.getUserData = function(key) { |
|
throw new Error("This DOM method is not implemented." + this.debugInfo()); |
|
}; |
|
|
|
XMLNode.prototype.contains = function(other) { |
|
if (!other) { |
|
return false; |
|
} |
|
return other === this || this.isDescendant(other); |
|
}; |
|
|
|
XMLNode.prototype.isDescendant = function(node) { |
|
var child, isDescendantChild, j, len, ref2; |
|
ref2 = this.children; |
|
for (j = 0, len = ref2.length; j < len; j++) { |
|
child = ref2[j]; |
|
if (node === child) { |
|
return true; |
|
} |
|
isDescendantChild = child.isDescendant(node); |
|
if (isDescendantChild) { |
|
return true; |
|
} |
|
} |
|
return false; |
|
}; |
|
|
|
XMLNode.prototype.isAncestor = function(node) { |
|
return node.isDescendant(this); |
|
}; |
|
|
|
XMLNode.prototype.isPreceding = function(node) { |
|
var nodePos, thisPos; |
|
nodePos = this.treePosition(node); |
|
thisPos = this.treePosition(this); |
|
if (nodePos === -1 || thisPos === -1) { |
|
return false; |
|
} else { |
|
return nodePos < thisPos; |
|
} |
|
}; |
|
|
|
XMLNode.prototype.isFollowing = function(node) { |
|
var nodePos, thisPos; |
|
nodePos = this.treePosition(node); |
|
thisPos = this.treePosition(this); |
|
if (nodePos === -1 || thisPos === -1) { |
|
return false; |
|
} else { |
|
return nodePos > thisPos; |
|
} |
|
}; |
|
|
|
XMLNode.prototype.treePosition = function(node) { |
|
var found, pos; |
|
pos = 0; |
|
found = false; |
|
this.foreachTreeNode(this.document(), function(childNode) { |
|
pos++; |
|
if (!found && childNode === node) { |
|
return found = true; |
|
} |
|
}); |
|
if (found) { |
|
return pos; |
|
} else { |
|
return -1; |
|
} |
|
}; |
|
|
|
XMLNode.prototype.foreachTreeNode = function(node, func) { |
|
var child, j, len, ref2, res; |
|
node || (node = this.document()); |
|
ref2 = node.children; |
|
for (j = 0, len = ref2.length; j < len; j++) { |
|
child = ref2[j]; |
|
if (res = func(child)) { |
|
return res; |
|
} else { |
|
res = this.foreachTreeNode(child, func); |
|
if (res) { |
|
return res; |
|
} |
|
} |
|
} |
|
}; |
|
|
|
return XMLNode; |
|
|
|
})(); |
|
|
|
}).call(this);
|
|
|