62 lines
1.7 KiB
JavaScript
62 lines
1.7 KiB
JavaScript
/**
|
|
* @typedef {import('unist').Node} Node
|
|
* @typedef {import('unist').Parent} Parent
|
|
* @typedef {import('unist-util-is').Test} Test
|
|
* @typedef {import('unist-util-visit-parents').VisitorResult} VisitorResult
|
|
* @typedef {import('./complex-types.js').Visitor} Visitor
|
|
*/
|
|
|
|
import {visitParents} from 'unist-util-visit-parents'
|
|
|
|
/**
|
|
* Visit children of tree which pass test.
|
|
*
|
|
* @param tree
|
|
* Tree to walk
|
|
* @param [test]
|
|
* `unist-util-is`-compatible test
|
|
* @param visitor
|
|
* Function called for nodes that pass `test`.
|
|
* @param reverse
|
|
* Traverse in reverse preorder (NRL) instead of preorder (NLR) (default).
|
|
*/
|
|
export const visit =
|
|
/**
|
|
* @type {(
|
|
* (<Tree extends Node, Check extends Test>(tree: Tree, test: Check, visitor: import('./complex-types.js').BuildVisitor<Tree, Check>, reverse?: boolean) => void) &
|
|
* (<Tree extends Node>(tree: Tree, visitor: import('./complex-types.js').BuildVisitor<Tree>, reverse?: boolean) => void)
|
|
* )}
|
|
*/
|
|
(
|
|
/**
|
|
* @param {Node} tree
|
|
* @param {Test} test
|
|
* @param {import('./complex-types.js').Visitor} visitor
|
|
* @param {boolean} [reverse]
|
|
*/
|
|
function (tree, test, visitor, reverse) {
|
|
if (typeof test === 'function' && typeof visitor !== 'function') {
|
|
reverse = visitor
|
|
visitor = test
|
|
test = null
|
|
}
|
|
|
|
visitParents(tree, test, overload, reverse)
|
|
|
|
/**
|
|
* @param {Node} node
|
|
* @param {Array<Parent>} parents
|
|
*/
|
|
function overload(node, parents) {
|
|
const parent = parents[parents.length - 1]
|
|
return visitor(
|
|
node,
|
|
parent ? parent.children.indexOf(node) : null,
|
|
parent
|
|
)
|
|
}
|
|
}
|
|
)
|
|
|
|
export {CONTINUE, EXIT, SKIP} from 'unist-util-visit-parents'
|