rehype-stringify является плагином для Rehype,
отвечающим за преобразование дерева HTML-узлов (HAST, HTML Abstract
Syntax Tree) обратно в строку HTML. Он играет ключевую роль на этапе
рендеринга после обработки и трансформации
HTML-документа другими плагинами Rehype.
Основная функция плагина — конвертация HAST в корректный
HTML-код, с учётом структуры узлов, атрибутов, текстового
содержимого и вложенности. Настройка rehype-stringify
позволяет управлять форматом выходного HTML, включая пробелы, отступы,
переносы строк и обработку специальных символов.
import { unified } from 'unified';
import rehypeParse from 'rehype-parse';
import rehypeStringify from 'rehype-stringify';
const processor = unified()
.use(rehypeParse, { fragment: true })
.use(rehypeStringify);
const html = '<div><p>Пример текста</p></div>';
processor.process(html).then(file => {
console.log(String(file));
});
В этом примере:
rehype-parse превращает HTML в дерево HAST.rehype-stringify преобразует HAST обратно в строку
HTML.Плагин предоставляет несколько ключевых опций для настройки формата вывода:
closeSelfClosingОпределяет стиль закрытия самозакрывающихся тегов:
.use(rehypeStringify, { closeSelfClosing: true });
true — <img />,
<br /> закрываются в стиле XHTML.false — <img>,
<br> без слэша, стандарт HTML5.quoteУправляет типом кавычек для атрибутов:
.use(rehypeStringify, { quote: '"' });
"\"" — двойные кавычки (по умолчанию)."'" — одинарные кавычки.entitiesНастройка кодирования специальных символов:
.use(rehypeStringify, { entities: 'utf8' });
'utf8' — вывод в UTF-8 без HTML-сущностей.'xml' — кодирование в формате XML
(<, >,
&).'escape' — экранирование только специальных
символов.allowDangerousCharactersПозволяет включать в вывод символы, которые обычно экранируются:
.use(rehypeStringify, { allowDangerousCharacters: true });
Используется в случаях, когда необходимо сохранить оригинальный текст без экранирования.
rehype-stringify по умолчанию не добавляет
автоматические переносы строк или отступы. Для красивого
форматирования часто применяют связку с rehype-pretty-code
или rehype-format. Пример использования с кастомной
функцией форматирования:
import rehypeFormat from 'rehype-format';
const processor = unified()
.use(rehypeParse, { fragment: true })
.use(rehypeFormat, { indent: 2 })
.use(rehypeStringify);
processor.process('<div><p>Текст</p></div>').then(file => {
console.log(String(file));
});
indent задаёт количество пробелов для вложенных
элементов.rehypeFormat подготавливает HAST к красивому выводу, а
rehype-stringify делает финальный рендер.Иногда дерево HAST содержит кастомные теги или нестандартные
атрибуты. По умолчанию rehype-stringify корректно
обрабатывает все узлы, но важно учитывать:
null или undefined
пропускаются.checked,
disabled) выводятся как checked или
disabled без значения.<my-component>) выводятся
без изменений, если HAST их содержит.const processor = unified()
.use(rehypeParse, { fragment: true })
.use(rehypeStringify);
const html = '<my-component custom-attr="value"></my-component>';
processor.process(html).then(file => {
console.log(String(file));
});
Результат:
<my-component custom-attr="value"></my-component>
Для проектов, где Markdown обрабатывается через Remark, часто используется комбинация:
import remarkParse from 'remark-parse';
import remarkRehype from 'remark-rehype';
const processor = unified()
.use(remarkParse)
.use(remarkRehype)
.use(rehypeStringify);
rehype-stringify здесь является завершающим
этапом.rehype-stringify достаточно быстрый для большинства
проектов, так как его задача ограничена сериализацией HAST.entities и closeSelfClosing для минимизации
лишних преобразований.rehype-format,
rehype-pretty-code), так как встроенного «pretty print»
нет.const processor = unified()
.use(rehypeParse, { fragment: true })
.use(rehypeFormat, { indent: 4 })
.use(rehypeStringify, {
closeSelfClosing: false,
quote: "'",
entities: 'xml',
allowDangerousCharacters: false
});
processor.process('<div><img src="image.png"></div>').then(file => {
console.log(String(file));
});
Результат:
<div>
<img src='image.png'>
</div>
<img> представлен без
слэша.rehype-stringify обеспечивает гибкую и надёжную
сериализацию HAST в HTML с широкими возможностями настройки формата и
безопасности вывода.