"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.findAll = exports.existsOne = exports.findOne = exports.findOneChild = exports.find = exports.filter = void 0; var domhandler_1 = require("domhandler"); /** * Search a node and its children for nodes passing a test function. * * @param test Function to test nodes on. * @param node Node to search. Will be included in the result set if it matches. * @param recurse Also consider child nodes. * @param limit Maximum number of nodes to return. * @returns All nodes passing `test`. */ function filter(test, node, recurse, limit) { if (recurse === void 0) { recurse = true; } if (limit === void 0) { limit = Infinity; } if (!Array.isArray(node)) node = [node]; return find(test, node, recurse, limit); } exports.filter = filter; /** * Search an array of node and its children for nodes passing a test function. * * @param test Function to test nodes on. * @param nodes Array of nodes to search. * @param recurse Also consider child nodes. * @param limit Maximum number of nodes to return. * @returns All nodes passing `test`. */ function find(test, nodes, recurse, limit) { var result = []; for (var _i = 0, nodes_1 = nodes; _i < nodes_1.length; _i++) { var elem = nodes_1[_i]; if (test(elem)) { result.push(elem); if (--limit <= 0) break; } if (recurse && domhandler_1.hasChildren(elem) && elem.children.length > 0) { var children = find(test, elem.children, recurse, limit); result.push.apply(result, children); limit -= children.length; if (limit <= 0) break; } } return result; } exports.find = find; /** * Finds the first element inside of an array that matches a test function. * * @param test Function to test nodes on. * @param nodes Array of nodes to search. * @returns The first node in the array that passes `test`. */ function findOneChild(test, nodes) { return nodes.find(test); } exports.findOneChild = findOneChild; /** * Finds one element in a tree that passes a test. * * @param test Function to test nodes on. * @param nodes Array of nodes to search. * @param recurse Also consider child nodes. * @returns The first child node that passes `test`. */ function findOne(test, nodes, recurse) { if (recurse === void 0) { recurse = true; } var elem = null; for (var i = 0; i < nodes.length && !elem; i++) { var checked = nodes[i]; if (!domhandler_1.isTag(checked)) { continue; } else if (test(checked)) { elem = checked; } else if (recurse && checked.children.length > 0) { elem = findOne(test, checked.children); } } return elem; } exports.findOne = findOne; /** * @param test Function to test nodes on. * @param nodes Array of nodes to search. * @returns Whether a tree of nodes contains at least one node passing a test. */ function existsOne(test, nodes) { return nodes.some(function (checked) { return domhandler_1.isTag(checked) && (test(checked) || (checked.children.length > 0 && existsOne(test, checked.children))); }); } exports.existsOne = existsOne; /** * Search and array of nodes and its children for nodes passing a test function. * * Same as `find`, only with less options, leading to reduced complexity. * * @param test Function to test nodes on. * @param nodes Array of nodes to search. * @returns All nodes passing `test`. */ function findAll(test, nodes) { var _a; var result = []; var stack = nodes.filter(domhandler_1.isTag); var elem; while ((elem = stack.shift())) { var children = (_a = elem.children) === null || _a === void 0 ? void 0 : _a.filter(domhandler_1.isTag); if (children && children.length > 0) { stack.unshift.apply(stack, children); } if (test(elem)) result.push(elem); } return result; } exports.findAll = findAll;