В экосистеме Remark и Rehype провайдеры компонентов играют ключевую роль в гибкой трансформации Markdown и HTML-структур. Они позволяют не только управлять парсингом и обработкой узлов дерева, но и внедрять собственные компоненты для рендеринга контента.
Провайдер компонента — это объект или функция, которая сообщает движку обработки, как рендерить определённый узел в AST (Abstract Syntax Tree). В контексте Remark и Rehype это может быть:
paragraph, heading,
link и др.)div, span, a и
др.)Принцип работы:
Пример простого провайдера в Rehype:
import { unified } from 'unified';
import rehypeParse from 'rehype-parse';
import rehypeReact from 'rehype-react';
import React from 'react';
import ReactDOM from 'react-dom';
const components = {
h1: (props) => <h1 style={{ color: 'red' }} {...props} />,
a: (props) => <a target="_blank" {...props} />
};
unified()
.use(rehypeParse, { fragment: true })
.use(rehypeReact, { createElement: React.createElement, components })
.process('<h1>Заголовок</h1><a href="https://example.com">Ссылка</a>')
.then(file => {
ReactDOM.render(file.result, document.getElementById('root'));
});
В этом примере:
components — объект провайдеров компонентов.h1, a), а
значения — функции-компоненты React.Remark работает с Markdown. Провайдеры компонентов здесь используют
AST-узлы типа MDAST:
headingparagraphlinklist и др.Особенность Remark: узлы Markdown не всегда соответствуют HTML-тегам напрямую. Поэтому провайдеры требуют сопоставления типов узлов с компонентами.
Пример интеграции с React:
import { unified } from 'unified';
import remarkParse from 'remark-parse';
import remarkRehype from 'remark-rehype';
import rehypeReact from 'rehype-react';
import React from 'react';
import ReactDOM from 'react-dom';
const components = {
h2: (props) => <h2 style={{ fontStyle: 'italic' }} {...props} />,
p: (props) => <p style={{ lineHeight: 1.6 }} {...props} />
};
unified()
.use(remarkParse)
.use(remarkRehype)
.use(rehypeReact, { createElement: React.createElement, components })
.process('# Заголовок уровня 1\n\nПараграф текста.')
.then(file => {
ReactDOM.render(file.result, document.getElementById('root'));
});
remarkParse преобразует Markdown в MDAST.remarkRehype конвертирует MDAST в HAST.rehypeReact рендерит HAST через React-компоненты.Провайдеры поддерживают каскадирование и переопределение компонентов:
Пример использования контекста:
const components = {
p: (props) => <p style={{ color: props.color }}>Текст: {props.children}</p>
};
const MyContext = React.createContext({ color: 'blue' });
function App() {
const contextValue = { color: 'green' };
return (
<MyContext.Provider value={contextValue}>
<ReactMarkdown components={components}>
{'Параграф текста'}
</ReactMarkdown>
</MyContext.Provider>
);
}
Провайдеры можно использовать для:
Tooltip,
Button).Пример добавления кастомного блока кода с подсветкой:
const components = {
code({ className, children }) {
const language = className?.replace('language-', '');
return <SyntaxHighlighter language={language}>{children}</SyntaxHighlighter>;
}
};
className с типом языка.react-syntax-highlighter для
рендеринга.Провайдеры компонентов являются мощным инструментом, который превращает статический Markdown или HTML в гибкую и динамическую систему визуализации. Они дают полный контроль над узлами AST и позволяют интегрировать сложные UI-компоненты без изменения исходного контента.