UNPKG

yoastseo

Version:

Yoast client-side content analysis

66 lines (64 loc) 2.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = findAllInTree; /** * @typedef {import("../structure").Node} Node */ /** * Finds all nodes in the tree that satisfies the given condition. * * @param {Object} tree The tree. * @param {function} condition The condition that a node should satisfy to end up in the list. * @param {boolean} recurseFoundNodes=false Whether to recurse into found nodes to see if the condition also applies to * sub-nodes of the found node. * If false, as soon as a node is found that satisfies the condition, it is added to the list and no further recursion is done through its children. * If true, the node is added to the list and its children are also checked for the condition. * If they satisfy the condition, they are also added to the list. * This comes with the risk of adding the same node multiple times to the list. * * Example: * HTML: <div><div><div>foo</div></div></div> * Condition: node => node.nodeName === 'div' * If recurseFoundNodes is false, this will return: [ <div><div><div>foo</div></div></div> ] * * If recurseFoundNodes is true, this will return: [ <div><div><div>foo</div></div></div>, <div><div>foo</div></div>, <div>foo</div> ] * * In assessments where you want to count the number of occurrences of a certain type of node, you should set recurseFoundNodes to false. * For example in the list assessment with a nested list: you only want to count the outer list. * * <ul> * <li>Coffee</li> * <li>Tea * <ul> * <li>Black tea</li> * <li>Green tea</li> * </ul> * </li> * <li>Milk</li> * </ul> * * In getTextElementPositions, you want to find all descendant nodes that have position information. * In this case you want to recurse into found nodes. * * @returns {Node[]} The list of nodes that satisfy the condition. */ function findAllInTree(tree, condition, recurseFoundNodes = false) { const nodes = []; if (!tree.childNodes) { return nodes; } tree.childNodes.forEach(child => { if (condition(child)) { nodes.push(child); if (recurseFoundNodes) { nodes.push(...findAllInTree(child, condition, recurseFoundNodes)); } } else { nodes.push(...findAllInTree(child, condition, recurseFoundNodes)); } }); return nodes; } //# sourceMappingURL=findAllInTree.js.map