Index: tools/vulcanize/node_modules/vulcanize/node_modules/cheerio/lib/api/traversing.js |
diff --git a/tools/vulcanize/node_modules/vulcanize/node_modules/cheerio/lib/api/traversing.js b/tools/vulcanize/node_modules/vulcanize/node_modules/cheerio/lib/api/traversing.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e97ee58a3a389ae30bd9206c737da046f0752344 |
--- /dev/null |
+++ b/tools/vulcanize/node_modules/vulcanize/node_modules/cheerio/lib/api/traversing.js |
@@ -0,0 +1,186 @@ |
+var _ = require('underscore'), |
+ select = require('cheerio-select'), |
+ utils = require('../utils'), |
+ isTag = utils.isTag; |
+ |
+var find = exports.find = function(selector) { |
+ // TODO: Remove the call to _.uniq when the underlying bug in CSSselect has |
+ // been resolved: |
+ // https://github.com/fb55/CSSselect/issues/12 |
+ return this.make(_.uniq(select(selector, [].slice.call(this.children())))); |
+}; |
+ |
+// Get the parent of each element in the current set of matched elements, |
+// optionally filtered by a selector. |
+var parent = exports.parent = function(selector) { |
+ var set = []; |
+ var $set; |
+ |
+ this.each(function(idx, elem) { |
+ var parentElem = elem.parent; |
+ if (set.indexOf(parentElem) < 0 && parentElem.type !== 'root') { |
+ set.push(parentElem); |
+ } |
+ }); |
+ |
+ $set = this.make(set); |
+ |
+ if (arguments.length) { |
+ $set = $set.filter(selector); |
+ } |
+ |
+ return $set; |
+}; |
+ |
+var parents = exports.parents = function(selector) { |
+ if (this[0] && this[0].parent) { |
+ return traverseParents(this, this[0].parent, selector, Infinity); |
+ } |
+ return this; |
+}; |
+ |
+// For each element in the set, get the first element that matches the selector |
+// by testing the element itself and traversing up through its ancestors in the |
+// DOM tree. |
+var closest = exports.closest = function(selector) { |
+ var set = []; |
+ |
+ if (!selector) { |
+ return this.make(set); |
+ } |
+ |
+ this.each(function(idx, elem) { |
+ var closestElem = traverseParents(this, elem, selector, 1)[0]; |
+ |
+ // Do not add duplicate elements to the set |
+ if (closestElem && set.indexOf(closestElem) < 0) { |
+ set.push(closestElem); |
+ } |
+ }.bind(this)); |
+ |
+ return this.make(set); |
+}; |
+ |
+var next = exports.next = function() { |
+ if (!this[0]) { return this; } |
+ var elem = this[0]; |
+ while ((elem = elem.next)) if (isTag(elem)) return this.make(elem); |
+ return this.make([]); |
+}; |
+ |
+var nextAll = exports.nextAll = function(selector) { |
+ if (!this[0]) { return this; } |
+ var elems = [], elem = this[0]; |
+ while ((elem = elem.next)) if (isTag(elem)) elems.push(elem); |
+ return this.make(selector ? select(selector, elems) : elems); |
+}; |
+ |
+var prev = exports.prev = function() { |
+ if (!this[0]) { return this; } |
+ var elem = this[0]; |
+ while ((elem = elem.prev)) if (isTag(elem)) return this.make(elem); |
+ return this.make([]); |
+}; |
+ |
+var prevAll = exports.prevAll = function(selector) { |
+ if (!this[0]) { return this; } |
+ var elems = [], elem = this[0]; |
+ while ((elem = elem.prev)) if (isTag(elem)) elems.push(elem); |
+ return this.make(selector ? select(selector, elems) : elems); |
+}; |
+ |
+var siblings = exports.siblings = function(selector) { |
+ var elems = _.filter( |
+ this.parent() ? this.parent().children() : this.siblingsAndMe(), |
+ function(elem) { return isTag(elem) && !this.is(elem); }, |
+ this |
+ ); |
+ if (selector !== undefined) { |
+ elems = this.make(select(selector, elems)); |
+ } |
+ return this.make(elems); |
+}; |
+ |
+var children = exports.children = function(selector) { |
+ |
+ var elems = _.reduce(this, function(memo, elem) { |
+ return memo.concat(_.filter(elem.children, isTag)); |
+ }, []); |
+ |
+ if (selector === undefined) return this.make(elems); |
+ else if (_.isNumber(selector)) return this.make(elems[selector]); |
+ |
+ return this.make(elems).filter(selector); |
+}; |
+ |
+var contents = exports.contents = function() { |
+ return this.make(_.reduce(this, function(all, elem) { |
+ all.push.apply(all, elem.children); |
+ return all; |
+ }, [])); |
+}; |
+ |
+var each = exports.each = function(fn) { |
+ var i = 0, len = this.length; |
+ while (i < len && fn.call(this.make(this[i]), i, this[i]) !== false) ++i; |
+ return this; |
+}; |
+ |
+var map = exports.map = function(fn) { |
+ return _.map(this, function(el, i) { |
+ return fn.call(this.make(el), i, el); |
+ }, this); |
+}; |
+ |
+var filter = exports.filter = function(match) { |
+ var make = _.bind(this.make, this); |
+ var filterFn; |
+ |
+ if (_.isString(match)) { |
+ filterFn = function(el) { |
+ return select(match, el)[0] === el; |
+ }; |
+ } else if (_.isFunction(match)) { |
+ filterFn = function(el, i) { |
+ return match.call(make(el), i, el); |
+ }; |
+ } else if (match.cheerio) { |
+ filterFn = match.is.bind(match); |
+ } else { |
+ filterFn = function(el) { |
+ return match === el; |
+ }; |
+ } |
+ |
+ return make(_.filter(this, filterFn)); |
+}; |
+ |
+var first = exports.first = function() { |
+ return this[0] ? this.make(this[0]) : this; |
+}; |
+ |
+var last = exports.last = function() { |
+ return this[0] ? this.make(this[this.length - 1]) : this; |
+}; |
+ |
+// Reduce the set of matched elements to the one at the specified index. |
+var eq = exports.eq = function(i) { |
+ i = +i; |
+ if (i < 0) i = this.length + i; |
+ return this[i] ? this.make(this[i]) : this.make([]); |
+}; |
+ |
+var slice = exports.slice = function() { |
+ return this.make([].slice.apply(this, arguments)); |
+}; |
+ |
+function traverseParents(self, elem, selector, limit) { |
+ var elems = []; |
+ while (elems.length < limit && elem.type !== 'root') { |
+ if (!selector || self.make(elem).filter(selector).length) { |
+ elems.push(elem); |
+ } |
+ elem = elem.parent; |
+ } |
+ return self.make(elems); |
+} |