/** * Module dependencies */ var select = require('cheerio-select'), parse = require('./parse'), render = require('./render'), decode = require('./utils').decode; /** * $.load(str) */ var load = exports.load = function(str, options) { var Cheerio = require('./cheerio'), root = parse(str, options); var initialize = function(selector, context, r) { return new Cheerio(selector, context, r || root); }; // Add in the static methods initialize.__proto__ = exports; // Add in the root initialize._root = root; return initialize; }; /** * $.html([selector | dom]) */ var html = exports.html = function(dom) { if (dom) { dom = (typeof dom === 'string') ? select(dom, this._root) : dom; return render(dom); } else if (this._root && this._root.children) { return render(this._root.children); } else { return ''; } }; /** * $.text(dom) */ var text = exports.text = function(elems) { if (!elems) return ''; var ret = '', len = elems.length, elem; for (var i = 0; i < len; i ++) { elem = elems[i]; if (elem.type === 'text') ret += decode(elem.data); else if (elem.children && elem.type !== 'comment') { ret += text(elem.children); } } return ret; }; /** * $.root() */ var root = exports.root = function() { return this(this._root); }; /** * $.contains() */ var contains = exports.contains = function(container, contained) { // According to the jQuery API, an element does not "contain" itself if (contained === container) { return false; } // Step up the descendents, stopping when the root element is reached // (signaled by `.parent` returning a reference to the same object) while (contained && contained !== contained.parent) { contained = contained.parent; if (contained === container) { return true; } } return false; };