| Index: node_modules/vulcanize/node_modules/whacko/node_modules/domutils/lib/helpers.js
|
| diff --git a/node_modules/vulcanize/node_modules/whacko/node_modules/domutils/lib/helpers.js b/node_modules/vulcanize/node_modules/whacko/node_modules/domutils/lib/helpers.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..57056f63205bd85218211527f5d62a88e485f45b
|
| --- /dev/null
|
| +++ b/node_modules/vulcanize/node_modules/whacko/node_modules/domutils/lib/helpers.js
|
| @@ -0,0 +1,141 @@
|
| +// removeSubsets
|
| +// Given an array of nodes, remove any member that is contained by another.
|
| +exports.removeSubsets = function(nodes) {
|
| + var idx = nodes.length, node, ancestor, replace;
|
| +
|
| + // Check if each node (or one of its ancestors) is already contained in the
|
| + // array.
|
| + while (--idx > -1) {
|
| + node = ancestor = nodes[idx];
|
| +
|
| + // Temporarily remove the node under consideration
|
| + nodes[idx] = null;
|
| + replace = true;
|
| +
|
| + while (ancestor) {
|
| + if (nodes.indexOf(ancestor) > -1) {
|
| + replace = false;
|
| + nodes.splice(idx, 1);
|
| + break;
|
| + }
|
| + ancestor = ancestor.parent;
|
| + }
|
| +
|
| + // If the node has been found to be unique, re-insert it.
|
| + if (replace) {
|
| + nodes[idx] = node;
|
| + }
|
| + }
|
| +
|
| + return nodes;
|
| +};
|
| +
|
| +// Source: http://dom.spec.whatwg.org/#dom-node-comparedocumentposition
|
| +var POSITION = {
|
| + DISCONNECTED: 1,
|
| + PRECEDING: 2,
|
| + FOLLOWING: 4,
|
| + CONTAINS: 8,
|
| + CONTAINED_BY: 16
|
| +};
|
| +
|
| +// Compare the position of one node against another node in any other document.
|
| +// The return value is a bitmask with the following values:
|
| +//
|
| +// document order:
|
| +// > There is an ordering, document order, defined on all the nodes in the
|
| +// > document corresponding to the order in which the first character of the
|
| +// > XML representation of each node occurs in the XML representation of the
|
| +// > document after expansion of general entities. Thus, the document element
|
| +// > node will be the first node. Element nodes occur before their children.
|
| +// > Thus, document order orders element nodes in order of the occurrence of
|
| +// > their start-tag in the XML (after expansion of entities). The attribute
|
| +// > nodes of an element occur after the element and before its children. The
|
| +// > relative order of attribute nodes is implementation-dependent./
|
| +// Source:
|
| +// http://www.w3.org/TR/DOM-Level-3-Core/glossary.html#dt-document-order
|
| +//
|
| +// @argument {Node} nodaA The first node to use in the comparison
|
| +// @argument {Node} nodeB The second node to use in the comparison
|
| +//
|
| +// @return {Number} A bitmask describing the input nodes' relative position.
|
| +// See http://dom.spec.whatwg.org/#dom-node-comparedocumentposition for
|
| +// a description of these values.
|
| +var comparePos = exports.compareDocumentPosition = function(nodeA, nodeB) {
|
| + var aParents = [];
|
| + var bParents = [];
|
| + var current, sharedParent, siblings, aSibling, bSibling, idx;
|
| +
|
| + if (nodeA === nodeB) {
|
| + return 0;
|
| + }
|
| +
|
| + current = nodeA;
|
| + while (current) {
|
| + aParents.unshift(current);
|
| + current = current.parent;
|
| + }
|
| + current = nodeB;
|
| + while (current) {
|
| + bParents.unshift(current);
|
| + current = current.parent;
|
| + }
|
| +
|
| + idx = 0;
|
| + while (aParents[idx] === bParents[idx]) {
|
| + idx++;
|
| + }
|
| +
|
| + if (idx === 0) {
|
| + return POSITION.DISCONNECTED;
|
| + }
|
| +
|
| + sharedParent = aParents[idx - 1];
|
| + siblings = sharedParent.children;
|
| + aSibling = aParents[idx];
|
| + bSibling = bParents[idx];
|
| +
|
| + if (siblings.indexOf(aSibling) > siblings.indexOf(bSibling)) {
|
| + if (sharedParent === nodeB) {
|
| + return POSITION.FOLLOWING | POSITION.CONTAINED_BY;
|
| + }
|
| + return POSITION.FOLLOWING;
|
| + } else {
|
| + if (sharedParent === nodeA) {
|
| + return POSITION.PRECEDING | POSITION.CONTAINS;
|
| + }
|
| + return POSITION.PRECEDING;
|
| + }
|
| +};
|
| +
|
| +// Sort an array of nodes based on their relative position in the document and
|
| +// remove any duplicate nodes. If the array contains nodes that do not belong
|
| +// to the same document, sort order is unspecified.
|
| +//
|
| +// @argument {Array} nodes Array of DOM nodes
|
| +//
|
| +// @returns {Array} collection of unique nodes, sorted in document order
|
| +exports.uniqueSort = function(nodes) {
|
| + var idx = nodes.length, node, position;
|
| +
|
| + nodes = nodes.slice();
|
| +
|
| + while (--idx > -1) {
|
| + node = nodes[idx];
|
| + position = nodes.indexOf(node);
|
| + if (position > -1 && position < idx) {
|
| + nodes.splice(idx, 1);
|
| + }
|
| + }
|
| + nodes.sort(function(a, b) {
|
| + var relative = comparePos(a, b);
|
| + if (relative & POSITION.PRECEDING) {
|
| + return -1;
|
| + } else if (relative & POSITION.FOLLOWING) {
|
| + return 1;
|
| + }
|
| + return 0;
|
| + });
|
| +
|
| + return nodes;
|
| +};
|
|
|