Markdown-it предоставляет мощный механизм для парсинга Markdown в HTML и позволяет гибко управлять обработкой заголовков, включая автоматическую генерацию якорей. Якоря полезны для создания внутренних ссылок на определённые секции документа и удобной навигации по длинным текстам.
По умолчанию Markdown не добавляет идентификаторы к заголовкам. В
Markdown-it идентификаторы можно создавать с помощью плагина
markdown-it-anchor.
Установка плагина:
npm install markdown-it markdown-it-anchor
Подключение и базовое использование:
const MarkdownIt = require('markdown-it');
const markdownItAnchor = require('markdown-it-anchor');
const md = new MarkdownIt();
md.use(markdownItAnchor);
const result = md.render('# Заголовок 1');
console.log(result);
Результат:
<h1 id="заголовок-1">Заголовок 1</h1>
Ключевой момент: плагин автоматически преобразует текст заголовка в идентификатор, используя транслитерацию и нормализацию пробелов.
Плагин markdown-it-anchor поддерживает кастомные функции
для генерации ID. Это позволяет управлять форматом якорей, избегать
дублирования и использовать собственные правила трансформации
текста.
Пример с кастомной функцией:
md.use(markdownItAnchor, {
slugify: s => s.trim().toLowerCase().replace(/\s+/g, '_')
});
const result = md.render('## Раздел Пример');
console.log(result);
Результат:
<h2 id="раздел_пример">Раздел Пример</h2>
Особенности:
slugify принимает строку заголовка.Markdown-it позволяет создавать ссылки на заголовки для удобной навигации внутри страницы.
Пример:
const md = new MarkdownIt()
.use(markdownItAnchor, {
permalink: true,
permalinkSymbol: '¶',
permalinkBefore: true
});
const result = md.render('### Подраздел');
console.log(result);
Результат:
<h3 id="подраздел">
<a class="header-anchor" href="#подраздел">¶</a>
Подраздел
</h3>
Разбор параметров:
permalink: true — включение автоматической вставки
ссылок.permalinkSymbol: '¶' — символ ссылки на заголовок.permalinkBefore: true — вставка символа перед текстом
заголовка.Это позволяет пользователям быстро копировать ссылку на нужный раздел документа.
При наличии одинаковых заголовков может возникнуть конфликт идентификаторов. Плагин автоматически добавляет суффиксы для устранения дубликатов:
md.use(markdownItAnchor, { uniqueSlugStartIndex: 1 });
Пример:
## Раздел
## Раздел
Рендеринг:
<h2 id="раздел">Раздел</h2>
<h2 id="раздел-1">Раздел</h2>
Ключевые моменты:
uniqueSlugStartIndex задаёт начальное число для
суффикса.uniqueSlugCallback.Markdown-it и markdown-it-anchor легко комбинируются с
плагинами для оглавления, подсветки кода и кастомных стилей:
markdown-it-table-of-contents — автоматическое создание
оглавления.markdown-it-highlightjs — подсветка синтаксиса
кода.Пример интеграции с оглавлением:
const markdownItTOC = require('markdown-it-table-of-contents');
md.use(markdownItAnchor)
.use(markdownItTOC, { includeLevel: [1, 2, 3] });
const result = md.render('[toc]\n\n# Введение\n## Раздел 1\n### Подраздел A');
Результат: [toc] заменяется на HTML-структуру с ссылками
на якоря заголовков.
Для крупных проектов часто требуется:
Пример:
md.use(markdownItAnchor, {
level: [1,2,3],
permalink: true,
permalinkClass: 'custom-anchor',
permalinkSymbol: '?',
slugify: s => s.toLowerCase().replace(/[^\w]+/g, '-')
});
level — массив уровней заголовков, для которых
создаются якоря.permalinkClass — CSS-класс для ссылки на
заголовок.slugify — универсальная функция для генерации
безопасных ID.Markdown-it вместе с markdown-it-anchor обеспечивает
полный контроль над якорями заголовков, что делает
документацию интерактивной, удобной для навигации и готовой для
интеграции с фронтенд-логикой.