Для работы с Remark и Rehype в Node.js необходимо установить соответствующие пакеты через npm или yarn:
npm install remark remark-html rehype rehype-stringify unified
или
yarn add remark remark-html rehype rehype-stringify unified
После установки создаётся база для построения пайплайнов обработки текста.
Для обработки Markdown в Node.js используется цепочка unified() с подключением нужных плагинов:
import { unified } from 'unified';
import remarkParse from 'remark-parse';
import remarkHtml from 'remark-html';
const processor = unified()
.use(remarkParse)
.use(remarkHtml);
remarkParse превращает Markdown в AST (Abstract Syntax Tree), называемое MDAST, которое представляет структуру документа. remarkHtml преобразует MDAST в HTML, используя внутреннее представление Rehype (HAST — HTML AST).
После настройки процессора можно обрабатывать Markdown-текст:
const markdown = `
# Заголовок уровня 1
Текст с **жирным выделением** и [ссылкой](https://example.com).
`;
async function convertMarkdown() {
const file = await processor.process(markdown);
console.log(String(file));
}
convertMarkdown();
process возвращает объект типа
VFile, который содержит содержимое, метаданные и
информацию о возможных ошибках.Rehype позволяет работать с HTML-представлением AST:
import rehypeParse from 'rehype-parse';
import rehypeStringify from 'rehype-stringify';
const htmlProcessor = unified()
.use(rehypeParse, { fragment: true }) // парсит HTML-фрагменты
.use(rehypeStringify); // сериализует обратно в HTML
Преимущество использования Rehype заключается в возможности добавлять плагины для модификации HTML:
Пример модификации ссылок:
import rehypeVisit from 'unist-util-visit';
function addTargetBlank() {
return (tree) => {
rehypeVisit(tree, 'element', (node) => {
if (node.tagName === 'a') {
node.properties = node.properties || {};
node.properties.target = '_blank';
}
});
};
}
const enhancedProcessor = unified()
.use(rehypeParse, { fragment: true })
.use(addTargetBlank)
.use(rehypeStringify);
Remark и Rehype можно объединять в единый процессор, используя remark-rehype:
import remarkRehype from 'remark-rehype';
const fullProcessor = unified()
.use(remarkParse)
.use(remarkRehype) // конвертирует MDAST в HAST
.use(rehypeStringify); // преобразует HAST в HTML
Цепочка выполняет:
Это позволяет подключать плагины как на этапе Markdown, так и на этапе HTML.
Remark и Rehype используют плагины для расширения функциональности. Плагины бывают двух типов:
remark-gfm,
rehype-highlightПример добавления поддержки GitHub Flavored Markdown и подсветки синтаксиса:
import remarkGfm from 'remark-gfm';
import rehypeHighlight from 'rehype-highlight';
const processor = unified()
.use(remarkParse)
.use(remarkGfm)
.use(remarkRehype)
.use(rehypeHighlight)
.use(rehypeStringify);
remark-gfm добавляет таблицы, списки с чекбоксами,
авто-ссылки.rehype-highlight подсвечивает синтаксис внутри блоков
кода.Все плагины Remark и Rehype поддерживают асинхронную работу. Для обработки файлов можно использовать VFile напрямую:
import { readFile } from 'fs/promises';
import { VFile } from 'vfile';
async function processFile(path) {
const content = await readFile(path, 'utf-8');
const file = new VFile({ path, value: content });
const result = await processor.process(file);
console.log(String(result));
}
Обратное преобразование HTML → Markdown Можно
использовать rehype-remark, чтобы HAST обратно
преобразовать в MDAST, затем в Markdown.
Использование с потоками (Streams) Remark/Rehype поддерживают работу с потоками для больших файлов и интеграции с Node.js потоковой системой.
Настройка обработки AST Возможность полностью контролировать структуру документа через функции-плагины на любом этапе: MDAST → HAST → HTML.
Поддержка TypeScript Все библиотеки имеют типы для TypeScript, обеспечивая автодополнение и строгую проверку типов.
fragment: true при работе с
фрагментами HTML, чтобы избежать ошибок парсинга.rehype-validate для
соблюдения стандартов.Remark и Rehype в Node.js обеспечивают гибкую, расширяемую систему для работы с Markdown и HTML, предоставляя полный контроль над обработкой документов на уровне AST с поддержкой плагинов, асинхронной работы и TypeScript.