/*
Module dependencies
*/
var parse = require('./parse'),
isHtml = require('./utils').isHtml, _ = { extend: require('lodash.assignin'), bind: require('lodash.bind'), forEach: require('lodash.foreach'), defaults: require('lodash.defaults') };
/*
* The API */
var api = [
require('./api/attributes'), require('./api/traversing'), require('./api/manipulation'), require('./api/css'), require('./api/forms')
];
/*
* Instance of cheerio */
var Cheerio = module.exports = function(selector, context, root, options) {
if (!(this instanceof Cheerio)) return new Cheerio(selector, context, root, options); this.options = _.defaults(options || {}, this.options); // $(), $(null), $(undefined), $(false) if (!selector) return this; if (root) { if (typeof root === 'string') root = parse(root, this.options); this._root = Cheerio.call(this, root); } // $($) if (selector.cheerio) return selector; // $(dom) if (isNode(selector)) selector = [selector]; // $([dom]) if (Array.isArray(selector)) { _.forEach(selector, _.bind(function(elem, idx) { this[idx] = elem; }, this)); this.length = selector.length; return this; } // $(<html>) if (typeof selector === 'string' && isHtml(selector)) { return Cheerio.call(this, parse(selector, this.options).children); } // If we don't have a context, maybe we have a root, from loading if (!context) { context = this._root; } else if (typeof context === 'string') { if (isHtml(context)) { // $('li', '<ul>...</ul>') context = parse(context, this.options); context = Cheerio.call(this, context); } else { // $('li', 'ul') selector = [context, selector].join(' '); context = this._root; } // $('li', node), $('li', [nodes]) } else if (!context.cheerio) { context = Cheerio.call(this, context); } // If we still don't have a context, return if (!context) return this; // #id, .class, tag return context.find(selector);
};
/**
* Mix in `static` */
_.extend(Cheerio, require('./static'));
/*
* Set a signature of the object */
Cheerio.prototype.cheerio = '[cheerio object]';
/*
* Cheerio default options */
Cheerio.prototype.options = {
withDomLvl1: true, normalizeWhitespace: false, xmlMode: false, decodeEntities: true
};
/*
* Make cheerio an array-like object */
Cheerio.prototype.length = 0; Cheerio.prototype.splice = Array.prototype.splice;
/*
* Make a cheerio object * * @api private */
Cheerio.prototype._make = function(dom, context) {
var cheerio = new this.constructor(dom, context, this._root, this.options); cheerio.prevObject = this; return cheerio;
};
/**
* Turn a cheerio object into an array */
Cheerio.prototype.toArray = function() {
return this.get();
};
/**
* Plug in the API */
api.forEach(function(mod) {
_.extend(Cheerio.prototype, mod);
});
var isNode = function(obj) {
return obj.name || obj.type === 'text' || obj.type === 'comment';
};