Remark и Rehype — это экосистемы плагинов для обработки Markdown и HTML в JavaScript. Они позволяют трансформировать и анализировать контент, предоставляя высокую гибкость для сборки и компиляции документации, статических сайтов и других текстовых проектов. В интеграции с Rollup эти библиотеки становятся мощным инструментом для создания современных сборок.
Rollup — это модульный сборщик, ориентированный на работу с ES-модулями. Он использует плагины для расширения функциональности при обработке файлов различных типов. Для работы с Markdown и HTML используются плагины, которые обрабатывают файлы через Remark и Rehype, а затем преобразуют их в JavaScript-модули.
Простейшая интеграция выглядит так:
import { remark } from 'remark';
import remarkHtml from 'remark-html';
import { createFilter } from '@rollup/pluginutils';
export default function rollupRemark(options = {}) {
const filter = createFilter(options.include, options.exclude);
return {
name: 'rollup-remark',
async transform(code, id) {
if (!filter(id)) return null;
const result = await remark().use(remarkHtml).process(code);
return {
code: `export default ${JSON.stringify(String(result))};`,
map: { mappings: '' },
};
},
};
}
Ключевые моменты:
.md, .markdown).remark-html Преобразует Markdown в HTML. Часто используется как конечный шаг в цепочке трансформаций.
remark-slug Генерирует уникальные идентификаторы
для заголовков (<h1>, <h2> и
т.д.), что удобно для генерации ссылок на секции.
remark-autolink-headings Добавляет ссылку к каждому заголовку, чтобы пользователи могли легко копировать URL к определённой секции документа.
remark-toc Автоматически создаёт оглавление на основе структуры Markdown-документа.
remark-prism или remark-highlight.js Добавляют подсветку синтаксиса для блоков кода.
Пример подключения нескольких плагинов:
remark()
.use(remarkSlug)
.use(remarkAutolinkHeadings, { beh * avior: 'wrap' })
.use(remarkHtml)
Rehype работает на уровне HTML и позволяет делать глубокие трансформации DOM-подобной структуры. Основное отличие от Remark — работа уже с HTML, а не с Markdown.
Популярные плагины Rehype:
Пример цепочки с Rehype:
import { rehype } from 'rehype';
import rehypeParse from 'rehype-parse';
import rehypeSlug from 'rehype-slug';
import rehypeAutolinkHeadings from 'rehype-autolink-headings';
import rehypeStringify from 'rehype-stringify';
const result = await rehype()
.use(rehypeParse, { fragment: true })
.use(rehypeSlug)
.use(rehypeAutolinkHeadings, { beh * avior: 'append' })
.use(rehypeStringify)
.process('<h1>Заголовок</h1>');
Часто Markdown сначала обрабатывается через Remark, а затем HTML-трансформации выполняются через Rehype. Это обеспечивает полный контроль над текстом и его визуальным представлением.
import { remark } from 'remark';
import remarkRehype from 'remark-rehype';
import rehypeStringify from 'rehype-stringify';
const result = await remark()
.use(remarkRehype) // Преобразование AST Markdown в AST HTML
.use(rehypeStringify) // Генерация строки HTML
.process(markdownContent);
Особенности работы:
remark-rehype конвертирует Markdown AST в HTML
AST.Для удобной работы рекомендуется создавать отдельный Rollup-плагин, который объединяет Remark и Rehype. Пример структуры:
import { remark } from 'remark';
import remarkRehype from 'remark-rehype';
import rehypeSlug from 'rehype-slug';
import rehypeAutolinkHeadings from 'rehype-autolink-headings';
import rehypeStringify from 'rehype-stringify';
import { createFilter } from '@rollup/pluginutils';
export default function markdownPlugin(options = {}) {
const filter = createFilter(options.include || '**/*.md', options.exclude);
return {
name: 'markdown',
async transform(code, id) {
if (!filter(id)) return null;
const result = await remark()
.use(remarkRehype)
.use(rehypeSlug)
.use(rehypeAutolinkHeadings, { beh * avior: 'wrap' })
.use(rehypeStringify)
.process(code);
return {
code: `export default ${JSON.stringify(String(result))};`,
map: { mappings: '' },
};
},
};
}
Такой подход позволяет:
remark-toc, remark-slug и Rehype-плагины для
ссылок на заголовки.remark-prism или
rehype-prism-plus.Хотя интеграция Remark и Rehype с Rollup требует внимательной настройки плагинов, она обеспечивает гибкость и позволяет создавать кастомные сборки с полной поддержкой Markdown и HTML, готовые к использованию в современных веб-приложениях.