Remark и Rehype предоставляют мощные инструменты для работы с Markdown и HTML через AST (Abstract Syntax Tree). Настройка опций трансформации позволяет точно управлять поведением этих библиотек, добавлять плагины, изменять вывод и интегрировать собственные обработчики узлов.
Remark использует объект опций, который передается в метод
remark() или при инициализации через
unified(). Основные параметры:
extensions – массив расширений для
парсинга Markdown. Позволяет включать поддержку нестандартных
синтаксисов.
plugins – массив плагинов, которые
применяются последовательно. Каждый плагин может принимать свои
опции.
settings – объект, определяющий
общие настройки работы парсера и компилятора, например:
position: указывает, сохранять ли позицию узлов в
исходном тексте.gfm: включение расширений GitHub Flavored
Markdown.commonmark: строгий режим CommonMark.Пример настройки Remark с плагинами:
import { remark } from 'remark';
import remarkGfm from 'remark-gfm';
import remarkSlug from 'remark-slug';
const processor = remark()
.use(remarkGfm)
.use(remarkSlug, { prefix: 'section-' })
.processSync('# Заголовок');
Здесь remarkGfm расширяет синтаксис Markdown, а
remarkSlug добавляет идентификаторы к заголовкам.
Rehype работает аналогично, но с фокусом на HTML AST. Основные опции:
settings – объект глобальных
настроек. Часто используемые параметры:
fragment: если true, процессор будет
работать с HTML-фрагментами, без обёртки в
<html>.space: управление пробелами между текстовыми
узлами.plugins – массив плагинов для
трансформации HTML-дерева. Плагины могут модифицировать узлы, добавлять
атрибуты или удалять элементы.
Пример использования Rehype с плагином:
import { rehype } from 'rehype';
import rehypeFormat from 'rehype-format';
import rehypeSanitize from 'rehype-sanitize';
const processor = rehype()
.data('settings', { fragment: true })
.use(rehypeFormat)
.use(rehypeSanitize);
const result = processor.processSync('<div><strong>Текст</strong></div>');
rehypeFormat форматирует HTML с отступами, а
rehypeSanitize очищает код от потенциально опасного
содержимого.
Порядок подключения плагинов влияет на результат трансформации. Плагины применяются последовательно, и изменения, внесённые одним плагином, видны следующим. Для сложных цепочек важно правильно распределять плагины:
remark-parse).remark-slug, remark-autolink-headings).remark-stringify или
rehype-stringify).Большинство плагинов принимает объект с параметрами. Например,
remark-autolink-headings позволяет настроить символ ссылки,
позицию и классы:
import remarkAutolinkHeadings from 'remark-autolink-headings';
remark()
.use(remarkAutolinkHeadings, {
beh * avior: 'prepend',
content: { type: 'text', value: '§' },
});
Настройка через объект гарантирует гибкость и позволяет использовать один плагин в разных частях проекта с разными параметрами.
.data('settings', {...}) и влияют на все последующие
плагины..use(plugin, options).Гибридное использование позволяет контролировать как общие параметры работы процессора, так и поведение отдельных плагинов.
Для тонкой настройки трансформаций можно использовать собственные функции-обработчики узлов:
import { visit } from 'unist-util-visit';
function customPlugin() {
return (tree) => {
visit(tree, 'heading', (node) => {
node.data = node.data || {};
node.data.customId = `heading-${node.position.start.line}`;
});
};
}
remark().use(customPlugin).processSync('# Тест');
Такой подход позволяет интегрировать Remark/Rehype в сложные системы генерации документации и сайтов с динамическим управлением контентом.
processSync для быстрых операций,
process для асинхронных.settings при работе с HTML-фрагментами
для Rehype, чтобы избежать добавления лишних тегов
<html> и <body>.Настройка опций трансформации Remark и Rehype обеспечивает контроль над каждой стадией обработки Markdown и HTML, от парсинга до финального вывода, позволяя создавать гибкие, расширяемые и безопасные системы генерации контента.