В работе с библиотеками Remark и Rehype критически важным инструментом становится возможность инспектировать промежуточные состояния AST (Abstract Syntax Tree), которые создаются на разных этапах обработки Markdown или HTML. Это позволяет точно понимать, как структура документа трансформируется, а также выявлять ошибки или неточности в кастомных плагинах.
AST в Remark и Rehype представлена в виде дерева объектов, где каждый
узел имеет обязательные поля type и children.
Узлы могут иметь дополнительные свойства, специфичные для их типа,
например value для текстовых узлов или tagName
для HTML-узлов. Для инспекции промежуточных состояний используются
следующие методы:
Прямой вывод дерева через консоль
import { unified } from 'unified';
import remarkParse from 'remark-parse';
const processor = unified().use(remarkParse);
const tree = processor.parse('# Заголовок\n\nТекст абзаца');
console.log(JSON.stringify(tree, null, 2));
В данном примере JSON.stringify с отступами позволяет
визуально отследить структуру документа на этапе парсинга.
Промежуточные плагины для логирования Remark и Rehype позволяют создавать плагины, которые выполняются на любом этапе трансформации. Для логирования состояния дерева можно использовать следующий подход:
function inspectTree() {
return (tree, file) => {
console.log('Промежуточное состояние AST:');
console.dir(tree, { depth: null });
};
}
const processor = unified()
.use(remarkParse)
.use(inspectTree)
.use(/* другие плагины */);
Такой метод дает гибкость, позволяя анализировать дерево перед или после любого этапа трансформации.
Использование утилит типа
unist-util-visit Для более избирательной инспекции
удобно обходить дерево и извлекать только интересующие узлы:
import { visit } from 'unist-util-visit';
visit(tree, 'heading', node => {
console.log('Найден заголовок:', node);
});
Это позволяет отслеживать изменения только в конкретных типах узлов, не перегружая вывод.
В Rehype, где обрабатывается HTML, узлы дерева имеют тип
Element или Text, а структура более близка к
DOM. Применяются те же принципы инспекции, но стоит учитывать
различия:
properties.value.Пример инспекции заголовков HTML:
import rehypeParse from 'rehype-parse';
import { unified } from 'unified';
import { visit } from 'unist-util-visit';
const html = '<h1>Заголовок</h1><p>Параграф</p>';
const tree = unified().use(rehypeParse, { fragment: true }).parse(html);
visit(tree, 'element', node => {
if (node.tagName === 'h1') {
console.log('Заголовок H1:', node.children[0].value);
}
});
Для сложных документов инспекция через консоль может быть неудобна. Существуют следующие подходы:
Очень важно понимать, что каждый плагин Remark/Rehype может модифицировать дерево. Практически всегда имеет смысл вставлять инспекционные плагины после ключевых шагов, чтобы фиксировать состояние:
Пример цепочки с инспекцией на нескольких этапах:
const processor = unified()
.use(remarkParse)
.use(inspectTree) // после парсинга
.use(myCustomPlugin)
.use(inspectTree) // после кастомной трансформации
.use(remarkStringify);
Инспектирование промежуточных состояний AST является фундаментальным
навыком при работе с Remark и Rehype. Использование логирования, обхода
дерева через unist-util-visit и визуализации через внешние
инструменты позволяет точно понимать поведение плагинов, выявлять ошибки
и разрабатывать сложные трансформации Markdown и HTML. Правильное
использование этих методов обеспечивает прозрачность и управляемость
всего процесса обработки документов.