unist-util-visit-parents

unist utility to walk the tree with a stack of parents.
Contents
What is this?
This is a very important utility for working with unist as it lets you walk the tree.
When should I use this?
You can use this utility when you want to walk the tree and want to know about every parent of each node. You can use unist-util-visit if you don’t care about the entire stack of parents.
Install
This package is ESM only. In Node.js (version 16+), install with npm:
npm install unist-util-visit-parents
In Deno with esm.sh:
import {visitParents} from 'https://esm.sh/unist-util-visit-parents@6'
In browsers with esm.sh:
<script type="module">
import {visitParents} from 'https://esm.sh/unist-util-visit-parents@6?bundle'
</script>
Use
import {visitParents} from 'unist-util-visit-parents'
import {fromMarkdown} from 'mdast-util-from-markdown'
const tree = fromMarkdown('Some *emphasis*, **strong**, and `code`.')
visitParents(tree, 'strong', function (node, ancestors) {
console.log(node.type, ancestors.map(ancestor => ancestor.type))
})
Yields:
strong ['root', 'paragraph']
API
This package exports the identifiers CONTINUE, EXIT, SKIP, and visitParents. There is no default export.
visitParents(tree[, test], enter|visitors[, reverse])
Visit nodes, with ancestral information.
This algorithm performs depth-first tree traversal in preorder (NLR) or if reverse is given, in reverse preorder (NRL). An exit visitor is called in postorder (LRN) or if reverse is given, in reverse postorder (RLN).
You can choose which nodes are visited by passing a test. For complex tests, you should test yourself in a visitor, as it will be faster and will have improved type information.
Walking the tree is an intensive task. Make use of the return values of the visitor when possible. Instead of walking a tree multiple times, walk it once, use unist-util-is to check if a node matches, and then perform different operations.
You can change the tree. Changes inside a node made when entering it are walked, changes made when exiting it are not. See Visitor and VisitorExit for more info.
Signatures
visitParents(tree[, test], enter[, reverse])visitParents(tree[, test], visitors[, reverse])
Parameters
tree (Node) — tree to traversetest (Test, optional) — unist-util-is-compatible testenter (Visitor) — handle each node when entering itvisitors (Visitors) — handle each node when exiting it, and optionally when entering itreverse (boolean, default: false) — walk children from last to first; for enter, reverse preorder (NRL) instead of preorder (NLR); for exit, reverse postorder (RLN) instead of postorder (LRN)
Returns
Nothing (undefined).
CONTINUE
Continue traversing as normal (true).
EXIT
Stop traversing immediately (false).
SKIP
Do not traverse this node’s children ('skip'). Only works when entering a node.
Action
Union of the action types (TypeScript type).
Type
type Action = typeof CONTINUE | typeof EXIT | typeof SKIP
ActionTuple
List with one or two values, the first an action, the second an index (TypeScript type).
Type
type ActionTuple = [
(Action | null | undefined | void)?,
(Index | null | undefined)?
]
BuildVisitor
Build a typed Visitor function from a tree and a test (TypeScript type).
It will infer which values are passed as node and which as parents.
Type parameters
Tree (Node, default: Node) — tree typeCheck (Test, default: Test) — test type
Returns
Visitor.
BuildVisitors
Build typed Visitors from a tree and a test (TypeScript type).
It will infer which values are passed as node and which as parents.
Type parameters
Tree (Node, default: Node) — tree typeCheck (Test, default: Test) — test type
Returns
Visitors.
Index
Move to the sibling at index next (after node itself is completely traversed) (TypeScript type).
Useful if mutating the tree, such as removing the node the visitor is currently on, or any of its previous siblings. Results less than 0 or greater than or equal to children.length stop traversing the parent.
Type
type Index = number
Test
unist-util-is compatible test (TypeScript type).
Visitor
Handle a node (matching test, if given) before its children (TypeScript type).
Changes inside node are walked next. Replacing or removing it is easier in exit. When replacing or removing it here, return SKIP (as otherwise its old children are walked), or [SKIP, index] to continue with the node now at index. Changing next siblings (in walk order) is fine; changing previous siblings needs a new Index. Removing an ancestor or changing its previous siblings is not supported.
Parameters
node (Node) — found nodeparents (Array<Node>) — ancestors of nodeindex (number or undefined) — index of node in its parent (the last of parents), or undefined for the tree itself
Returns
What to do next (VisitorResult).
Passing a tuple back (ActionTuple) only makes sense as [SKIP, Index].
VisitorExit
Handle a node (matching test, if given) after its children (TypeScript type).
Changes inside node are not walked, which makes this a good place to change node based on its children, or to replace or remove it. When removing node or changing previous siblings (in walk order), return a new Index. Removing an ancestor or changing its previous siblings is not supported.
Parameters
node (Node) — found nodeparents (Array<Node>) — ancestors of nodeindex (number or undefined) — index of node in its parent (the last of parents), or undefined for the tree itself
Returns
What to do next (VisitorResultExit).
CONTINUE (true, nothing) continues as normal, EXIT (false) stops traversing, and Index continues at that sibling.
VisitorResult
Any value that can be returned from an enter visitor (TypeScript type).
Like VisitorResultExit but SKIP can be returned to not walk children of the node, and ActionTuple can be used to combine an action with an index.
Type
type VisitorResult =
| Action
| ActionTuple
| Index
| null
| undefined
| void
VisitorResultExit
Any value that can be returned from an exit visitor (TypeScript type).
Type
type VisitorResultExit = Index | boolean | null | undefined | void
Visitors
Handle nodes when entering and exiting them (TypeScript type). The enter visitor is optional while exit is required.
Pass an enter visitor directly to only handle nodes when entering them.
enter is called before children (if any) are walked and exit after that. exit is still called when enter returns SKIP. Both enter and exit are only called for nodes that match an optional test.
Fields
enter (Visitor, optional) — handle a node before its childrenexit (VisitorExit) — handle a node after its children
Types
This package is fully typed with TypeScript. It exports the additional types Action, ActionTuple, BuildVisitor, BuildVisitors, Index, Test, Visitor, VisitorExit, VisitorResult, VisitorResultExit, and Visitors.
Compatibility
Projects maintained by the unified collective are compatible with maintained versions of Node.js.
When we cut a new major release, we drop support for unmaintained versions of Node. This means we try to keep the current release line, unist-util-visit-parents@^6, compatible with Node.js 16.
Contribute
See contributing.md in syntax-tree/.github for ways to get started. See support.md for ways to get help.
This project has a code of conduct. By interacting with this repository, organization, or community you agree to abide by its terms.
License
MIT © Titus Wormer