mirror of https://gitee.com/bigwinds/arangodb
135 lines
2.7 KiB
JavaScript
135 lines
2.7 KiB
JavaScript
/**
|
|
* Module dependencies
|
|
*/
|
|
|
|
var select = require('CSSselect'),
|
|
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 '';
|
|
}
|
|
};
|
|
|
|
/**
|
|
* $.xml([selector | dom])
|
|
*/
|
|
|
|
var xml = exports.xml = function(dom) {
|
|
if (dom) {
|
|
dom = (typeof dom === 'string') ? select(dom, this._root) : dom;
|
|
return render(dom, { xmlMode: true });
|
|
} else if (this._root && this._root.children) {
|
|
return render(this._root.children, { xmlMode: true });
|
|
} 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;
|
|
};
|
|
|
|
/**
|
|
* $.parseHTML(data [, context ] [, keepScripts ])
|
|
* Parses a string into an array of DOM nodes. The `context` argument has no
|
|
* meaning for Cheerio, but it is maintained for API compatability with jQuery.
|
|
*/
|
|
var parseHTML = exports.parseHTML = function(data, context, keepScripts) {
|
|
var parsed;
|
|
|
|
if (!data || typeof data !== 'string') {
|
|
return null;
|
|
}
|
|
|
|
if (typeof context === 'boolean') {
|
|
keepScripts = context;
|
|
}
|
|
|
|
parsed = this.load(data);
|
|
if (!keepScripts) {
|
|
parsed('script').remove();
|
|
}
|
|
|
|
return parsed.root()[0].children;
|
|
};
|
|
|
|
/**
|
|
* $.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;
|
|
};
|