Библиотека unist-util-find предоставляет утилиту для поиска узлов в деревьях AST (Abstract Syntax Tree), которые используются в экосистеме Remark и Rehype. Она упрощает задачу нахождения конкретных элементов по типу, значению или произвольным условиям, работая поверх стандартной структуры unist.
Функция find экспортируется из пакета
unist-util-find и имеет следующую сигнатуру:
import { find } from 'unist-util-find';
const node = find(tree, test);
tree — корень дерева AST.test — функция или объект для проверки узлов.test, или undefined, если узел не найден.testtest может быть:
const node = find(tree, (node) => node.type === 'heading');
Функция вызывается для каждого узла и должна возвращать
true для нужного узла.
const node = find(tree, { type: 'paragraph' });
find проверяет, совпадают ли свойства объекта
test с соответствующими свойствами узла. Это удобно для
поиска по конкретным типам или значениям атрибутов.
Поиск первого заголовка в Markdown:
import { unified } from 'unified';
import remarkParse from 'remark-parse';
import { find } from 'unist-util-find';
const tree = unified()
.use(remarkParse)
.parse('# Заголовок\n\nТекст параграфа');
const heading = find(tree, { type: 'heading' });
console.log(heading.depth); // 1
Поиск параграфа с определенным текстом:
const paragraph = find(tree, (node) =>
node.type === 'paragraph' &&
node.children.some(child => child.value.includes('Текст'))
);
find возвращает
только первый найденный узел. Для поиска всех узлов используется
unist-util-find-all или
unist-util-filter.unist-util-find часто используется вместе с:
Пример комбинирования:
import { visit } from 'unist-util-visit';
const firstCodeBlock = find(tree, { type: 'code' });
visit(tree, 'code', node => {
node.lang = node.lang || 'text';
});
Можно искать узлы с учетом содержимого и структуры:
const node = find(tree, node =>
node.type === 'link' &&
node.url.startsWith('https://') &&
node.children.length > 0 &&
node.children[0].value.includes('example')
);
Такой подход позволяет строить гибкие фильтры для сложных документов Markdown или HTML.
unist-util-find эффективен для небольших и средних
деревьев. Для больших документов стоит учитывать:
test позволяет включить более сложную логику поиска.unist-util-find-all или unist-util-visit с
фильтром, чтобы избежать повторного обхода дерева.Библиотека предоставляет типы, что позволяет безопасно работать с AST:
import type { Node } from 'unist';
import { find } from 'unist-util-find';
const node: Node | undefined = find(tree, { type: 'paragraph' });
Типизация гарантирует, что свойства узлов проверяются корректно и исключает ошибки при работе с AST.
unist-util-find — легковесный и мощный инструмент для поиска конкретных узлов в деревьях AST, который отлично интегрируется с экосистемой Remark и Rehype, облегчая извлечение информации, фильтрацию и дальнейшую обработку контента.