Remark и Rehype являются частью экосистемы универсальных процессоров для работы с текстовыми форматами в JavaScript. Remark фокусируется на Markdown, Rehype — на HTML. Основная идея унифицированного процессора заключается в том, чтобы предоставлять единый интерфейс для парсинга, трансформации и генерации текстовых форматов через промежуточное представление в виде абстрактного синтаксического дерева (AST).
В основе архитектуры лежит дерево узлов, где каждый узел представляет отдельный элемент исходного текста: заголовок, абзац, список, текстовый фрагмент, ссылка или атрибут HTML. AST обеспечивает:
Пример структуры узла Markdown в Remark:
{
type: 'heading',
depth: 2,
children: [
{ type: 'text', value: 'Пример заголовка' }
]
}
Архитектура процессора построена вокруг плагинов, которые выполняют три основные функции:
remark-parse, Rehype —
rehype-parse.remark-stringify,
Rehype — rehype-stringify.Каждый плагин получает AST и возвращает модифицированное дерево. Такой подход обеспечивает высокую гибкость и возможность создавать кастомные конвейеры обработки текста.
Процесс обработки текста через унифицированный процессор можно представить как тройной конвейер:
Parse Stage: исходный Markdown или HTML → AST.
Transform Stage: модификации AST, добавление плагинов, например:
Compile Stage: AST → конечный текстовый формат.
Такой поток позволяет создавать цепочки обработки, где каждый этап строго разделен и легко настраивается.
Remark и Rehype могут работать совместно через
унифицированный формат AST unist
(Universal Syntax Tree). Использование remark-rehype
позволяет преобразовать Markdown AST в HTML AST, после чего его можно
обрабатывать через плагины Rehype, а затем сгенерировать HTML.
Пример схемы взаимодействия:
Markdown → Remark Parser → Markdown AST → Remark Plugins → remark-rehype → HTML AST → Rehype Plugins → HTML Compiler → HTML
Ключевые преимущества:
unified.Унифицированная архитектура предусматривает сильную кастомизацию через плагины:
Пример использования нескольких плагинов в цепочке:
import { unified } from 'unified'
import remarkParse from 'remark-parse'
import remarkRehype from 'remark-rehype'
import rehypeStringify from 'rehype-stringify'
import remarkSlug from 'remark-slug'
import rehypeAutolinkHeadings from 'rehype-autolink-headings'
const processor = unified()
.use(remarkParse)
.use(remarkSlug)
.use(remarkRehype)
.use(rehypeAutolinkHeadings)
.use(rehypeStringify)
В этом примере Markdown сначала парсится, затем заголовки получают
уникальные идентификаторы (remark-slug), после чего
происходит преобразование в HTML с автоматическими ссылками на заголовки
(rehype-autolink-headings).
Унифицированный процессор строится так, чтобы обеспечить:
unist.unist и промежуточные конвертеры.Эта архитектура превращает Remark и Rehype в мощный инструмент для обработки текстовых форматов, обеспечивая единообразный, модульный и легко масштабируемый подход к построению текстовых пайплайнов.