Для начала работы с библиотекой Markdown-it необходимо установить пакет через npm:
npm install markdown-it
Подключение в проекте Node.js осуществляется следующим образом:
const MarkdownIt = require('markdown-it');
const md = new MarkdownIt();
В браузере можно использовать скрипт из CDN:
<script src="https://cdn.jsdelivr.net/npm/markdown-it/dist/markdown-it.min.js"></script>
<script>
const md = window.markdownit();
</script>
После создания экземпляра MarkdownIt доступны несколько
ключевых методов:
md.render(markdownString) — преобразует строку Markdown
в HTML.md.renderInline(markdownString) — преобразует строку
без обертки в блоки <p>.md.set(options) — настраивает параметры парсера.Пример использования:
const result = md.render('# Заголовок\n\nТекст **жирным** шрифтом');
console.log(result);
// Вывод:
// <h1>Заголовок</h1>
// <p>Текст <strong>жирным</strong> шрифтом</p>
Markdown-it поддерживает множество опций, которые
позволяют гибко настраивать парсер:
html — разрешает или запрещает HTML-теги в исходной
строке (по умолчанию false).linkify — автоматически превращает URL в кликабельные
ссылки.typographer — включает типографические преобразования
(например, замену кавычек и тире).breaks — преобразует переносы строк в
<br>.Пример:
const md = new MarkdownIt({
html: true,
linkify: true,
typographer: true,
breaks: true
});
Markdown-it поддерживает подключение плагинов, которые добавляют новые синтаксические конструкции или расширяют возможности парсинга.
Пример использования плагина markdown-it-emoji:
const emoji = require('markdown-it-emoji');
md.use(emoji);
console.log(md.render('I :heart: Markdown-it'));
// <p>I ❤️ Markdown-it</p>
Для тонкой настройки HTML-вывода можно переопределять рендереры отдельных токенов:
md.renderer.rules.strong_open = () => '<b>';
md.renderer.rules.strong_close = () => '</b>';
console.log(md.render('**Текст**'));
// <p><b>Текст</b></p>
Можно изменять рендеринг любого блока, включая заголовки, параграфы, списки и изображения.
Markdown-it сначала превращает исходный текст в токены, после чего рендерит их в HTML. Это позволяет анализировать структуру документа:
const tokens = md.parse('# Заголовок\n\nТекст', {});
tokens.forEach(token => {
console.log(token.type, token.content);
});
Типы токенов:
heading_open / heading_close — открытие и
закрытие заголовка.paragraph_open / paragraph_close —
открытие и закрытие параграфа.inline — содержимое внутри блоков.Markdown-it не выполняет автоматическую проверку корректности входного Markdown. Для обеспечения безопасности и предотвращения XSS рекомендуется:
Фильтрация HTML Если включена опция
html: true, пользовательский ввод может содержать опасные
теги. Для безопасного рендеринга применяют библиотеки, например
DOMPurify:
const DOMPurify = require('dompurify')(new JSDOM().window);
const cleanHTML = DOMPurify.sanitize(md.render(userInput));Ограничение длин строк Для защиты от DoS-атак проверяют размер входного текста:
if (userInput.length > 10000) throw new Error('Слишком длинный Markdown');Проверка типов данных Перед рендерингом необходимо убедиться, что на вход подается строка:
if (typeof userInput !== 'string') throw new TypeError('Входные данные должны быть строкой');Валидация URL и ссылок Если включена опция
linkify, можно дополнительно проверять корректность
ссылок:
const urlRegex = /^(https?:\/\/[^\s]+)$/;
if (!urlRegex.test(userInput)) {
console.warn('Некорректная ссылка в Markdown');
}Markdown-it позволяет добавлять свои проверки через плагины. Например, ограничение на использование изображений:
function imageValidator(md) {
const defaultRender = md.renderer.rules.image;
md.renderer.rules.image = function(tokens, idx, options, env, self) {
const src = tokens[idx].attrGet('src');
if (!src.startsWith('https://')) return '';
return defaultRender(tokens, idx, options, env, self);
};
}
md.use(imageValidator);
console.log(md.render('')); // Пусто
console.log(md.render('')); // Рендерится
Такой подход позволяет интегрировать строгую валидацию контента на уровне рендеринга, что особенно важно при работе с пользовательским вводом.
Для сложных документов полезно анализировать токены и их структуру:
const tokens = md.parse(userInput, {});
tokens.forEach(token => {
console.log(`type: ${token.type}, tag: ${token.tag}, content: ${token.content}`);
});
Это облегчает выявление потенциально опасных или некорректных конструкций до этапа генерации HTML.
DOMPurify или аналог для очистки HTML.Эти меры позволяют использовать Markdown-it безопасно и надежно в любых приложениях, обрабатывающих данные пользователей.