Markdown-it — это мощная библиотека для преобразования текста в формате Markdown в HTML. Одной из её ключевых особенностей является поддержка встроенного HTML, что позволяет расширять возможности Markdown за пределы стандартного синтаксиса.
По умолчанию Markdown-it поддерживает HTML внутри текста. Включение и
отключение этой функции осуществляется через опцию html при
создании экземпляра парсера:
const MarkdownIt = require('markdown-it');
const md = new MarkdownIt({
html: true, // разрешение HTML
linkify: true,
typographer: true
});
Если значение опции html установить в
false, все HTML-теги будут экранированы и отображены как
обычный текст:
const mdNoHtml = new MarkdownIt({ html: false });
console.log(mdNoHtml.render('<b>Привет</b>'));
// <b>Привет</b>
Markdown-it обрабатывает HTML следующим образом:
<div>,
<table>, <pre>,
<section> и другие, размещённые на отдельной строке,
распознаются как отдельные блоки. Markdown внутри таких блоков не
интерпретируется.<span>,
<a>, <strong> и другие, включённые
внутрь строки текста, отображаются в месте их вставки без изменения
содержимого.<div> можно
вставлять списки или заголовки, но Markdown внутри некоторых элементов
(например, <pre> или <code>)
игнорируется.Markdown-it поддерживает плагины, которые могут управлять безопасностью и обработкой HTML:
Пример использования фильтрации HTML:
const MarkdownIt = require('markdown-it');
const md = new MarkdownIt({ html: true });
const sanitizeHtml = require('sanitize-html');
md.renderer.rules.html_block = (tokens, idx) => {
const content = tokens[idx].content;
return sanitizeHtml(content, {
allowedTags: ['b', 'i', 'strong', 'em', 'a'],
allowedAttributes: { 'a': ['href'] }
});
};
const result = md.render('<script>alert("XSS")</script><b>Bold</b>');
console.log(result); // <b>Bold</b>
В этом примере все опасные HTML-теги, такие как
<script>, удаляются, а разрешённые элементы
сохраняются.
Разрешение HTML открывает возможность внедрения XSS-атак. Для безопасного использования рекомендуется:
html: false).sanitize-html.Markdown-it поддерживает два вида HTML:
html_block) — отдельные
строки, начинающиеся с < и заканчивающиеся
>. Рендерится как полноценный блок.html_inline) — включён
внутри текста. Не создаёт отдельного блока и интегрируется с
Markdown-разметкой.Пример:
const md = new MarkdownIt({ html: true });
const input = `
Это <span style="color:red">красный текст</span> в строке.
<div>
<p>Блок HTML с параграфом</p>
</div>
`;
console.log(md.render(input));
В результате <span> отобразится внутри строки, а
<div> создаст отдельный блок с параграфом.
html: true
подходит идеально.Использование HTML в Markdown через Markdown-it — мощный инструмент для создания сложных документов и веб-контента с контролем безопасности и структурной гибкости.