Процессор unified является центральным элементом экосистемы Remark и Rehype, обеспечивая единый способ обработки и трансформации структурированных текстов и документов. В основе лежит концепция дерева синтаксиса (AST), которое используется для представления Markdown или HTML в виде объектов JavaScript. Это позволяет применять универсальные плагины и производить сложные преобразования данных.
Процессор создаётся с помощью функции unified(), которая
возвращает объект с методами use, parse,
stringify и run. Основное назначение этих
методов:
use(plugin, options) — подключение плагинов с
настройками. Плагины могут изменять дерево, добавлять новые узлы или
преобразовывать существующие.parse(input) — разбор входной строки в AST.run(tree, file, callback) — асинхронная обработка
дерева с применением всех подключённых плагинов.stringify(tree) — генерация итогового текста из
дерева.Пример создания базового процессора для Markdown:
import { unified } from 'unified';
import remarkParse from 'remark-parse';
import remarkStringify from 'remark-stringify';
const processor = unified()
.use(remarkParse)
.use(remarkStringify);
const markdown = '# Заголовок\n\nТекст параграфа';
const tree = processor.parse(markdown);
const output = processor.stringify(tree);
AST (Abstract Syntax Tree) состоит из узлов, каждый из которых описывает отдельный элемент документа. Узлы имеют поля:
type — тип узла (root,
heading, paragraph, text и
др.).children — массив дочерних узлов.value — текстовое содержимое для листовых узлов.Для примера Markdown-строки:
# Пример
Текст параграфа
AST будет выглядеть так:
{
"type": "root",
"children": [
{
"type": "heading",
"depth": 1,
"children": [{ "type": "text", "value": "Пример" }]
},
{
"type": "paragraph",
"children": [{ "type": "text", "value": "Текст параграфа" }]
}
]
}
Каждый плагин может обходить дерево, проверять типы узлов и
модифицировать их. Для этого часто используют утилиту
unist-util-visit:
import { visit } from 'unist-util-visit';
visit(tree, 'text', node => {
node.value = node.value.toUpperCase();
});
Remark работает с Markdown, Rehype — с HTML. Оба используют unified и совместимы на уровне AST. Плагины бывают трёх типов:
remark-parse, rehype-parse).remark-slug, rehype-autolink-headings).remark-stringify, rehype-stringify).Пример цепочки обработки Markdown с трансформацией заголовков:
import remarkParse from 'remark-parse';
import remarkSlug from 'remark-slug';
import remarkStringify from 'remark-stringify';
const processor = unified()
.use(remarkParse)
.use(remarkSlug) // добавляет id для заголовков
.use(remarkStringify);
const result = processor.processSync('# Заголовок');
console.log(result.toString());
Unifed позволяет создавать цепочки плагинов, которые могут
выполняться асинхронно. Метод process возвращает
промис:
processor.process(markdown).then(file => {
console.log(String(file));
});
Асинхронность особенно важна при работе с плагинами, которые загружают внешние ресурсы или выполняют сетевые запросы.
Для конвертации Markdown в HTML объединяют Remark и
Rehype через remark-rehype:
import remarkParse from 'remark-parse';
import remarkRehype from 'remark-rehype';
import rehypeStringify from 'rehype-stringify';
const processor = unified()
.use(remarkParse)
.use(remarkRehype)
.use(rehypeStringify);
const html = processor.processSync('# Заголовок').toString();
Промежуточное дерево остаётся AST, но меняется его тип: из
mdast (Markdown AST) оно преобразуется в hast
(HTML AST).
Unified поддерживает работу с файловой структурой через объект
VFile. Он хранит:
path — путь к файлу.contents — содержимое файла.messages — предупреждения и ошибки плагинов.Пример использования VFile:
import { VFile } from 'vfile';
const file = new VFile({ path: 'example.md', contents: '# Заголовок' });
processor.process(file).then(result => {
console.log(result.toString());
});
visit и
visitParents позволяют менять узлы, добавлять новые,
удалять ненужные.unist, что облегчает
создание собственных плагинов.Этот подход позволяет строить гибкие и масштабируемые системы обработки текстов, где каждая стадия — парсинг, трансформация и генерация — управляется прозрачными и модульными инструментами.