123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 |
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.merge = exports.contains = exports.root = exports.parseHTML = exports.text = exports.xml = exports.html = void 0;
- var tslib_1 = require("tslib");
- var options_1 = tslib_1.__importStar(require("./options"));
- var cheerio_select_1 = require("cheerio-select");
- var htmlparser2_1 = require("htmlparser2");
- var parse5_adapter_1 = require("./parsers/parse5-adapter");
- var htmlparser2_adapter_1 = require("./parsers/htmlparser2-adapter");
- /**
- * Helper function to render a DOM.
- *
- * @param that - Cheerio instance to render.
- * @param dom - The DOM to render. Defaults to `that`'s root.
- * @param options - Options for rendering.
- * @returns The rendered document.
- */
- function render(that, dom, options) {
- var _a;
- var toRender = dom
- ? typeof dom === 'string'
- ? cheerio_select_1.select(dom, (_a = that === null || that === void 0 ? void 0 : that._root) !== null && _a !== void 0 ? _a : [], options)
- : dom
- : that === null || that === void 0 ? void 0 : that._root.children;
- if (!toRender)
- return '';
- return options.xmlMode || options._useHtmlParser2
- ? htmlparser2_adapter_1.render(toRender, options)
- : parse5_adapter_1.render(toRender);
- }
- /**
- * Checks if a passed object is an options object.
- *
- * @param dom - Object to check if it is an options object.
- * @returns Whether the object is an options object.
- */
- function isOptions(dom) {
- return (typeof dom === 'object' &&
- dom != null &&
- !('length' in dom) &&
- !('type' in dom));
- }
- function html(dom, options) {
- /*
- * Be flexible about parameters, sometimes we call html(),
- * with options as only parameter
- * check dom argument for dom element specific properties
- * assume there is no 'length' or 'type' properties in the options object
- */
- if (!options && isOptions(dom)) {
- options = dom;
- dom = undefined;
- }
- /*
- * Sometimes `$.html()` is used without preloading html,
- * so fallback non-existing options to the default ones.
- */
- var opts = tslib_1.__assign(tslib_1.__assign(tslib_1.__assign({}, options_1.default), (this ? this._options : {})), options_1.flatten(options !== null && options !== void 0 ? options : {}));
- return render(this || undefined, dom, opts);
- }
- exports.html = html;
- /**
- * Render the document as XML.
- *
- * @param dom - Element to render.
- * @returns THe rendered document.
- */
- function xml(dom) {
- var options = tslib_1.__assign(tslib_1.__assign({}, this._options), { xmlMode: true });
- return render(this, dom, options);
- }
- exports.xml = xml;
- /**
- * Render the document as text.
- *
- * @param elements - Elements to render.
- * @returns The rendered document.
- */
- function text(elements) {
- var elems = elements ? elements : this ? this.root() : [];
- var ret = '';
- for (var i = 0; i < elems.length; i++) {
- var elem = elems[i];
- if (htmlparser2_1.DomUtils.isText(elem))
- ret += elem.data;
- else if (htmlparser2_1.DomUtils.hasChildren(elem) &&
- elem.type !== htmlparser2_1.ElementType.Comment &&
- elem.type !== htmlparser2_1.ElementType.Script &&
- elem.type !== htmlparser2_1.ElementType.Style) {
- ret += text(elem.children);
- }
- }
- return ret;
- }
- exports.text = text;
- function parseHTML(data, context, keepScripts) {
- if (keepScripts === void 0) { keepScripts = typeof context === 'boolean' ? context : false; }
- if (!data || typeof data !== 'string') {
- return null;
- }
- if (typeof context === 'boolean') {
- keepScripts = context;
- }
- var parsed = this.load(data, options_1.default, false);
- if (!keepScripts) {
- parsed('script').remove();
- }
- /*
- * The `children` array is used by Cheerio internally to group elements that
- * share the same parents. When nodes created through `parseHTML` are
- * inserted into previously-existing DOM structures, they will be removed
- * from the `children` array. The results of `parseHTML` should remain
- * constant across these operations, so a shallow copy should be returned.
- */
- return parsed.root()[0].children.slice();
- }
- exports.parseHTML = parseHTML;
- /**
- * Sometimes you need to work with the top-level root element. To query it, you
- * can use `$.root()`.
- *
- * @example
- *
- * ```js
- * $.root().append('<ul id="vegetables"></ul>').html();
- * //=> <ul id="fruits">...</ul><ul id="vegetables"></ul>
- * ```
- *
- * @returns Cheerio instance wrapping the root node.
- * @alias Cheerio.root
- */
- function root() {
- return this(this._root);
- }
- exports.root = root;
- /**
- * Checks to see if the `contained` DOM element is a descendant of the
- * `container` DOM element.
- *
- * @param container - Potential parent node.
- * @param contained - Potential child node.
- * @returns Indicates if the nodes contain one another.
- * @alias Cheerio.contains
- * @see {@link https://api.jquery.com/jQuery.contains/}
- */
- function contains(container, contained) {
- // According to the jQuery API, an element does not "contain" itself
- if (contained === container) {
- return false;
- }
- /*
- * Step up the descendants, stopping when the root element is reached
- * (signaled by `.parent` returning a reference to the same object)
- */
- var next = contained;
- while (next && next !== next.parent) {
- next = next.parent;
- if (next === container) {
- return true;
- }
- }
- return false;
- }
- exports.contains = contains;
- /**
- * $.merge().
- *
- * @param arr1 - First array.
- * @param arr2 - Second array.
- * @returns `arr1`, with elements of `arr2` inserted.
- * @alias Cheerio.merge
- * @see {@link https://api.jquery.com/jQuery.merge/}
- */
- function merge(arr1, arr2) {
- if (!isArrayLike(arr1) || !isArrayLike(arr2)) {
- return;
- }
- var newLength = arr1.length;
- var len = +arr2.length;
- for (var i = 0; i < len; i++) {
- arr1[newLength++] = arr2[i];
- }
- arr1.length = newLength;
- return arr1;
- }
- exports.merge = merge;
- /**
- * @param item - Item to check.
- * @returns Indicates if the item is array-like.
- */
- function isArrayLike(item) {
- if (Array.isArray(item)) {
- return true;
- }
- if (typeof item !== 'object' ||
- !Object.prototype.hasOwnProperty.call(item, 'length') ||
- typeof item.length !== 'number' ||
- item.length < 0) {
- return false;
- }
- for (var i = 0; i < item.length; i++) {
- if (!(i in item)) {
- return false;
- }
- }
- return true;
- }
|