Markdown-it предоставляет мощный механизм работы с HTML, встроенным в текст Markdown. По умолчанию библиотека позволяет вставлять HTML-теги напрямую в документ, но часто возникает необходимость экранировать HTML, чтобы браузер не интерпретировал его как разметку, а отображал как текст. Это важно для защиты от XSS-уязвимостей и для корректного отображения исходного кода.
Markdown-it по умолчанию поддерживает HTML-теги в тексте. Например:
<div>Пример блока HTML</div>
При рендеринге в HTML это будет преобразовано в настоящий
<div> элемент. Для случаев, когда необходимо
вывести тег как текст, используется экранирование.
Экранирование позволяет преобразовать специальные символы в их HTML-сущности:
< → <> → >& → &" → "' → 'Markdown-it предлагает гибкость в обработке HTML через опции
конфигурации и плагины. Основная опция, влияющая на
экранирование, — html.
const md = require('markdown-it')({
html: false // Отключение встроенного HTML
});
Установка html: false гарантирует, что любой HTML в
тексте будет автоматически экранироваться, а не
рендериться как разметка.
Markdown поддерживает обрамление текста обратными апострофами (`) для отображения как кода:
`<div>Текст</div>`
Markdown-it преобразует это в:
<code><div>Текст</div></code>
Такой подход полезен для документации и демонстрации HTML-кода, не нарушая структуру документа.
Markdown-it поддерживает плагины, которые позволяют тонко настраивать
обработку HTML. Один из популярных — markdown-it-attrs,
который позволяет добавлять атрибуты к элементам, сохраняя при этом
возможность экранирования.
Пример использования:
const md = require('markdown-it')()
.use(require('markdown-it-attrs'));
const result = md.render(`
<div{.custom-class}>Пример</div>
`);
Если включить html: false, содержимое тега будет
экранировано:
<div class="custom-class">Пример</div>
Для более сложных случаев можно использовать регистрируемые
рендер-функции (renderer.rules) в Markdown-it.
Например, чтобы экранировать все HTML-теги кроме определённых:
const md = require('markdown-it')();
const defaultRender = md.renderer.rules.html_block || function(tokens, idx, options, env, self) {
return self.renderToken(tokens, idx, options);
};
md.renderer.rules.html_block = function(tokens, idx, options, env, self) {
const content = tokens[idx].content;
// Экранируем все угловые скобки
const escaped = content.replace(/</g, '<').replace(/>/g, '>');
return escaped;
};
Такой подход даёт полную свободу в контроле над тем, какие HTML-теги разрешены к рендерингу, а какие должны быть преобразованы в текст.
html: false.Экранирование HTML в Markdown-it — это сочетание правильной конфигурации и возможностей кастомизации, позволяющее контролировать, как именно будет отображаться HTML в документе, обеспечивая безопасность и корректное визуальное представление.