Библиотеки Remark и Rehype предоставляют мощный инструментарий для работы с Markdown и HTML в экосистеме JavaScript. Одним из частых требований при работе с технической документацией или блогами является подсветка синтаксиса в кодовых блоках. Для этого используется Prism, легковесный и расширяемый синтаксический парсер и подсветчик. Интеграция Remark/Rehype с Prism позволяет получать красивую, семантически правильную и настраиваемую подсветку прямо при преобразовании Markdown в HTML.
Для полноценной работы понадобится несколько модулей:
npm install remark remark-html rehype rehype-stringify rehype-highlight prismjs
remark — основной парсер Markdown.remark-html — конвертация Markdown в HTML.rehype — обработка HTML AST.rehype-stringify — преобразование AST HTML обратно в
строку.rehype-highlight — готовый плагин для подсветки
синтаксиса.prismjs — движок подсветки кода.Дополнительно можно установить языковые пакеты Prism для нужных языков, например:
npm install prismjs@components/prism-javascript prismjs@components/prism-css
Для интеграции необходимо создать конвейер обработки Markdown:
import { remark } from 'remark';
import remarkHtml from 'remark-html';
import { rehype } from 'rehype';
import rehypeStringify from 'rehype-stringify';
import rehypePrism from 'rehype-prism-plus';
import fs from 'fs';
const markdownContent = fs.readFileSync('example.md', 'utf-8');
const processed = await remark()
.use(remarkHtml) // Преобразование Markdown в HTML
.use(() => (tree) => {
// Встраивание Rehype-процессора для подсветки Prism
return rehype()
.data('settings', { fragment: true })
.use(rehypePrism)
.process(tree);
})
.process(markdownContent);
console.log(String(processed));
Ключевой момент — использование
rehype-prism-plus, который обеспечивает
корректное применение Prism к HTML AST после того, как Markdown
преобразован в HTML. Этот плагин поддерживает большое количество языков
и автоматически добавляет CSS-классы для стилизации.
Prism предоставляет набор готовых тем для подсветки:
<link href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.css" rel="stylesheet" />
CSS-файл необходимо подключить в проекте, иначе HTML с классами Prism будет отображаться без подсветки.
Примеры дополнительных языков:
import 'prismjs/components/prism-python';
import 'prismjs/components/prism-go';
import 'prismjs/components/prism-rust';
Prism также поддерживает плагины, например:
Подключение производится через импорт соответствующих модулей:
import 'prismjs/plugins/line-numbers/prism-line-numbers.css';
import 'prismjs/plugins/line-numbers/prism-line-numbers.js';
В HTML необходимо добавить класс line-numbers для
<pre>:
<pre class="language-js line-numbers">
<code>const x = 42;</code>
</pre>
import { remark } from 'remark';
import remarkParse from 'remark-parse';
import remarkRehype from 'remark-rehype';
import rehypeStringify from 'rehype-stringify';
import rehypePrism from 'rehype-prism-plus';
const markdown = `
\`\`\`javascript
function sum(a, b) {
return a + b;
}
\`\`\`
`;
const html = await remark()
.use(remarkParse) // Разбор Markdown
.use(remarkRehype) // Конвертация в HTML AST
.use(rehypePrism) // Подсветка кода Prism
.use(rehypeStringify) // Генерация HTML
.process(markdown);
console.log(String(html));
Результат — HTML с корректными классами Prism
(language-js) и подсветкой синтаксиса.
rehype-prism-plus вместо устаревшего
rehype-highlight для полной поддержки новых возможностей
Prism.Хотите, могу подготовить отдельный подробный пример динамической подсветки с пользовательской темой и нумерацией строк, прямо интегрированный с Remark/Rehype. Это будет максимально полный учебный кейс.