rehype-raw — это плагин для экосистемы Unified, который позволяет обрабатывать встроенный HTML внутри Markdown-документов, преобразуемых через Remark и Rehype. Он особенно полезен, когда необходимо сохранить или модифицировать HTML-теги, присутствующие в исходном Markdown, вместо того чтобы игнорировать или экранировать их.
По умолчанию Markdown-парсеры, такие как remark-parse, воспринимают HTML как обычный текст или экранируют его, чтобы предотвратить прямую вставку в итоговый HTML. rehype-raw решает эту проблему, позволяя:
Важно понимать, что rehype-raw работает только на этапе преобразования Markdown в HAST через remark-rehype. Он не применяется к чистому HTML напрямую.
npm install rehype-raw
Пример подключения в цепочке Unified:
import { unified } from 'unified';
import remarkParse from 'remark-parse';
import remarkRehype from 'remark-rehype';
import rehypeStringify from 'rehype-stringify';
import rehypeRaw from 'rehype-raw';
const processor = unified()
.use(remarkParse)
.use(remarkRehype, { allowDangerousHtml: true })
.use(rehypeRaw)
.use(rehypeStringify);
const markdown = `
# Заголовок
<p style="color:red;">HTML внутри Markdown</p>
`;
const html = processor.processSync(markdown).toString();
console.log(html);
Ключевые моменты подключения:
allowDangerousHtml: true в
remark-rehype обязателен для корректной обработки
встроенного HTML.remarkRehype, но перед rehypeStringify и
другими плагинами, которые работают с HAST.HTML, вставленный напрямую в Markdown, может содержать вредоносный код. Поэтому рекомендуется использовать rehype-sanitize после rehype-raw для фильтрации небезопасных тегов и атрибутов.
Пример безопасной цепочки:
import rehypeSanitize from 'rehype-sanitize';
const processor = unified()
.use(remarkParse)
.use(remarkRehype, { allowDangerousHtml: true })
.use(rehypeRaw)
.use(rehypeSanitize) // фильтрация потенциально опасного HTML
.use(rehypeStringify);
1. Обработка <div> и
<span> внутри Markdown
Исходный Markdown:
# Заголовок
<div class="note">
Это заметка внутри HTML
</div>
После применения rehype-raw HTML-теги остаются полноценными элементами HAST:
<h1>Заголовок</h1>
<div class="note">Это заметка внутри HTML</div>
2. Интеграция с другими плагинами Rehype
После rehype-raw можно использовать плагины, например, для добавления классов или модификации структуры:
import rehypeAddClasses from 'rehype-add-classes';
processor.use(rehypeAddClasses, { 'div.note': 'highlight' });
Результат:
<h1>Заголовок</h1>
<div class="note highlight">Это заметка внутри HTML</div>
HTML не преобразуется Причина: отсутствует
allowDangerousHtml: true в
remarkRehype.
rehype-raw применяется до remarkRehype Ошибка: плагин работает только с HAST, поэтому порядок имеет значение.
Небезопасный HTML приводит к XSS Решение: всегда
использовать rehype-sanitize после rehype-raw
при обработке пользовательского контента.
rehype-raw обеспечивает гибкость и мощь при работе с встроенным HTML, превращая Markdown-документы в полноценные HTML-структуры без потери информации, при этом требуя аккуратного подхода к безопасности и последовательности обработки.