hast-util-to-html — это библиотека для
сериализации абстрактного синтаксического дерева HTML (HAST) в
строку HTML. Она является неотъемлемой частью экосистемы
unified, remark и rehype,
позволяя гибко управлять выводом HTML из структурированных данных.
npm install hast-util-to-html
Импорт в проект:
import { toHtml } from 'hast-util-to-html';
Базовый синтаксис:
const html = toHtml(hastNode, options);
hastNode — объект HAST, например:const hastNode = {
type: 'element',
tagName: 'p',
properties: { className: ['text'] },
children: [
{ type: 'text', value: 'Пример текста' }
]
};
options — объект с настройками сериализации.hast-util-to-html предоставляет множество параметров,
которые позволяют детально управлять выводом:
allowDangerousHtml Если установлено в
true, позволяет включать raw HTML в сериализованный
результат:const html = toHtml(hastNode, { allowDangerousHtml: true });
closeSelfClosing Управляет стилем
самозакрывающихся тегов. Например, <br> вместо
<br />.const html = toHtml(hastNode, { closeSelfClosing: true });
quote Определяет используемые кавычки
для атрибутов: ' или ".const html = toHtml(hastNode, { quote: '"' });
space Контролирует обработку
пробелов в тексте:
"html" — стандартная сериализация HTML"xml" — строгое экранирование для XMLconst html = toHtml(hastNode, { space: 'html' });
tightSelfClosing Убирает пробел перед
закрывающим слешем у самозакрывающихся тегов:const html = toHtml(hastNode, { tightSelfClosing: true });
HAST разделяет элементы и текстовые узлы. Текстовые узлы имеют структуру:
{ type: 'text', value: 'Текстовый контент' }
Сериализация выполняется с экранированием специальных символов
(&, <, >,
") для предотвращения ошибок в HTML. Если используется
allowDangerousHtml: true, можно вставлять raw HTML
напрямую, но это несет риск безопасности.
HAST хранит атрибуты в объекте properties. Некоторые
особенности:
className)
сериализуются корректно:const hastNode = {
type: 'element',
tagName: 'div',
properties: { className: ['container', 'main'] },
children: []
};
toHtml(hastNode);
// <div class="container main"></div>
const hastNode = {
type: 'element',
tagName: 'input',
properties: { disabled: true },
children: []
};
toHtml(hastNode);
// <input disabled>
Можно передать функцию handlers для замены стандартной
сериализации конкретных тегов:
import { toHtml } from 'hast-util-to-html';
const handlers = {
img(node, context, defaultHandler) {
node.properties.alt = node.properties.alt || 'Изображение';
return defaultHandler(node, context);
}
};
const html = toHtml(hastNode, { handlers });
Это позволяет автоматически добавлять атрибуты, изменять содержимое или полностью переопределять вывод конкретных элементов.
rehypehast-util-to-html идеально сочетается с
rehype:
import { unified } from 'unified';
import rehypeParse from 'rehype-parse';
import rehypeSanitize from 'rehype-sanitize';
import { toHtml } from 'hast-util-to-html';
const htmlString = '<div><p>Привет</p></div>';
const hast = unified()
.use(rehypeParse, { fragment: true })
.use(rehypeSanitize)
.parse(htmlString);
const result = toHtml(hast);
Таким образом, можно создавать безопасные HTML-строки из HAST после
любых преобразований rehype.
unified и плагинами rehype
позволяет строить конвейеры трансформации, где HAST может
модифицироваться перед сериализацией.type или
tagName.allowDangerousHtml без
фильтрации Прямое включение raw HTML может привести к
XSS-уязвимостям.hast-util-to-html обеспечивает надежную и гибкую
сериализацию HAST в HTML, позволяя детально управлять выводом,
безопасностью и стилем. Использование этой библиотеки в сочетании с
rehype открывает широкие возможности для преобразования,
фильтрации и генерации HTML в проектах на JavaScript.