nyc-bookstores/node_modules/cheerio/lib/api/traversing.js
2013-05-27 13:45:59 -07:00

117 lines
2.8 KiB
JavaScript

var _ = require('underscore'),
select = require('cheerio-select'),
utils = require('../utils'),
isTag = utils.isTag;
var find = exports.find = function(selector) {
if (!selector) return this;
try {
var elem = select(selector, [].slice.call(this.children()));
return this.make(elem);
} catch(e) {
return this.make([]);
}
};
var parent = exports.parent = function(elem) {
if (this[0] && this[0].parent)
return this.make(this[0].parent);
else
return this;
};
var next = exports.next = function(elem) {
if (!this[0]) return this;
var nextSibling = this[0].next;
while (nextSibling) {
if (isTag(nextSibling)) return this.make(nextSibling);
nextSibling = nextSibling.next;
}
return this;
};
var prev = exports.prev = function(elem) {
if (!this[0]) return this;
var prevSibling = this[0].prev;
while (prevSibling) {
if (isTag(prevSibling)) return this.make(prevSibling);
prevSibling = prevSibling.prev;
}
return this;
};
var siblings = exports.siblings = function(elem) {
if (!this[0]) return this;
var self = this,
siblings = (this.parent()) ? this.parent().children()
: this.siblingsAndMe();
siblings = _.filter(siblings, function(elem) {
return (elem !== self[0] && isTag(elem));
});
return this.make(siblings);
};
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 each = exports.each = function(fn) {
var length = this.length,
el, i;
for (i = 0; i < length; ++i) {
el = this[i];
if (fn.call(this.make(el), i, el) === false) {
break;
}
}
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);
return make(_.filter(this, _.isString(match) ?
function(el) { return select(match, el)[0] === el; }
: function(el, i) { return match.call(make(el), i, el); }
));
};
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));
};