Remark — это мощная библиотека для парсинга, анализа и трансформации Markdown-документов в AST (Abstract Syntax Tree). Она предоставляет средства для работы с содержимым Markdown, включая создание плагинов, обработку синтаксиса и генерацию новых структур данных. Rehype, в свою очередь, предназначен для работы с HTML-документами и AST, который соответствует HTML-дереву. Переход от Remark к Rehype позволяет преобразовывать Markdown в HTML и применять к нему расширенные трансформации.
Remark разбивает процесс работы с Markdown на несколько ключевых этапов:
Ключевой особенностью Remark является модульность: каждый плагин работает с AST и может быть добавлен или удалён без изменения основного потока обработки документа.
HAST (Hypertext Abstract Syntax Tree) — это формат AST, используемый
Rehype для HTML. Чтобы конвертировать Markdown в HTML через
промежуточное AST, используется утилита remark-rehype.
Пример конверсии:
import { unified } from 'unified';
import remarkParse from 'remark-parse';
import remarkRehype from 'remark-rehype';
import rehypeStringify from 'rehype-stringify';
const processor = unified()
.use(remarkParse)
.use(remarkRehype) // преобразует MDAST в HAST
.use(rehypeStringify); // преобразует HAST в HTML
const markdown = '# Заголовок\n\nТекст параграфа.';
processor.process(markdown).then(file => {
console.log(String(file));
});
В этом примере:
remarkParse создает MDAST из Markdown.remarkRehype преобразует MDAST в HAST.rehypeStringify превращает HAST в готовый HTML.Remark и Rehype поддерживают плагины для расширенной обработки узлов AST.
Примеры возможностей:
Пример плагина для добавления класса к заголовкам:
import rehypeVisit from 'unist-util-visit';
function addHeadingClass() {
return (tree) => {
rehypeVisit(tree, 'element', node => {
if (node.tagName === 'h1') {
node.properties = node.properties || {};
node.properties.className = ['main-heading'];
}
});
};
}
const processor = unified()
.use(remarkParse)
.use(remarkRehype)
.use(addHeadingClass)
.use(rehypeStringify);
Remark и Rehype поддерживают каскадные цепочки трансформаций:
Это позволяет комбинировать мощь обеих библиотек и создавать гибкие пайплайны. Например, Markdown-документ можно анализировать с помощью Remark, затем обогащать HTML-атрибутами и классами с помощью Rehype, а затем превращать в статический HTML для сайта.
unist-util-visit и unist-util-map упрощают
модификацию AST.Rehype позволяет полностью контролировать итоговый HTML:
rehype-react.Пример интеграции с React:
import rehypeReact from 'rehype-react';
import { createElement } from 'react';
const processor = unified()
.use(remarkParse)
.use(remarkRehype)
.use(rehypeReact, { createElement });
const reactElements = processor.processSync(markdown).result;
Этот подход позволяет использовать Markdown как источник контента и динамически рендерить его в компоненты React.
remark-rehype соединяет две библиотеки через
конвертацию AST.Такой подход обеспечивает мощный, модульный и расширяемый пайплайн для преобразования, анализа и генерации веб-контента из Markdown.