Библиотека Marked предназначена для преобразования
текста в формате Markdown в HTML. Одной из ключевых задач является
корректная обработка ссылок, как внутренних, так и внешних. Marked
предоставляет гибкие возможности для настройки рендеринга ссылок через
объект Renderer и функции обратного вызова.
Markdown поддерживает несколько форматов ссылок:
Инлайн-ссылки Синтаксис:
[текст ссылки](URL "опциональный заголовок")
Пример:
[Google](https://www.google.com "Поиск")Ссылки с определением Синтаксис:
[текст ссылки][идентификатор]
[идентификатор]: URL "опциональный заголовок"
Пример:
[Google][1]
[1]: https://www.google.com "Поиск"Автоматические ссылки Синтаксис:
<https://www.google.com>Marked корректно обрабатывает все три типа ссылок, преобразуя их в
HTML-теги <a>.
Объект Renderer позволяет переопределить поведение
рендеринга ссылок. В частности, можно задать собственные атрибуты для
всех ссылок или изменить структуру HTML.
Пример создания кастомного рендерера для ссылок:
import { marked } from 'marked';
const renderer = new marked.Renderer();
renderer.link = (href, title, text) => {
const titleAttr = title ? ` title="${title}"` : '';
return `<a href="${href}" target="_blank" rel="noopener noreferrer"${titleAttr}>${text}</a>`;
};
marked.setOptions({ renderer });
const markdown = '[Google](https://www.google.com "Поиск")';
const html = marked(markdown);
console.log(html);
В этом примере:
target="_blank").rel="noopener noreferrer".title) и текст ссылки.При рендеринге внешних ссылок важно учитывать
XSS-уязвимости. Marked предоставляет опцию
sanitize, но начиная с версии 1.x рекомендуется
использовать внешние библиотеки для безопасного экранирования, такие как
DOMPurify.
Пример безопасного рендеринга:
import DOMPurify from 'dompurify';
const unsafeHtml = marked('[Click me](jav * ascript:alert("XSS"))');
const safeHtml = DOMPurify.sanitize(unsafeHtml);
Это предотвращает выполнение вредоносного JavaScript кода через ссылки.
Через рендерер можно добавлять любые атрибуты к ссылкам. Например,
можно автоматически добавлять data-* атрибуты для
аналитики:
renderer.link = (href, title, text) => {
return `<a href="${href}" data-tracked="true"${title ? ` title="${title}"` : ''}>${text}</a>`;
};
Это удобно для интеграции Markdown-контента с системами аналитики и отслеживания кликов.
Marked позволяет рендерить ссылки, находящиеся внутри списков, абзацев и заголовков. Встроенный парсер корректно обрабатывает вложенность. Например:
1. Список с ссылкой: [Example](https://example.com)
2. Еще один пункт
Рендерер ссылок вызывается для каждого <a> внутри
элементов списка без дополнительной настройки.
Markdown позволяет вставлять изображения в виде ссылок:
[](https://example.com)
В этом случае рендерер ссылок вызывается для внешнего
<a>, а рендерер изображений
(renderer.image) — для <img>. Можно
комбинировать кастомный рендеринг для обеих сущностей:
renderer.image = (href, title, text) => {
return `<img src="${href}" alt="${text}"${title ? ` title="${title}"` : ''} class="markdown-image"/>`;
};
renderer.link = (href, title, text) => {
const isExternal = /^https?:\/\//.test(href);
const icon = isExternal ? ' ?' : '';
return `<a href="${href}"${title ? ` title="${title}"` : ''}>${text}${icon}</a>`;
};
const currentUrl = '/about';
renderer.link = (href, title, text) => {
const activeClass = href === currentUrl ? ' class="active"' : '';
return `<a href="${href}"${activeClass}${title ? ` title="${title}"` : ''}>${text}</a>`;
};
Renderer позволяет
добавлять атрибуты, управлять безопасностью и визуальной
презентацией ссылок.Хотите, я могу подготовить отдельный раздел “Расширенные возможности рендеринга ссылок с динамическими данными и шаблонами”, который охватывает использование Marked для CMS и веб-приложений?