Для работы с библиотекой Markdown-it необходимо подключить её через
npm или yarn:
const MarkdownIt = require('markdown-it');
const md = new MarkdownIt();
После инициализации создается объект md, который
отвечает за разбор и генерацию HTML из Markdown. Базовые опции включают
управление HTML-тегами, ссылками, переносами строк и прочими
стандартными функциями Markdown.
Markdown-it поддерживает плагины, которые позволяют добавлять
нестандартные возможности, включая управление классами и
атрибутами HTML-элементов. Для работы с атрибутами применяется
плагин markdown-it-attrs.
Установка плагина:
npm install markdown-it-attrs
Подключение к Markdown-it:
const mdAttrs = require('markdown-it-attrs');
md.use(mdAttrs);
После подключения плагина можно добавлять классы и id прямо в Markdown:
# Заголовок {.title #main-title}
Параграф с классом {.text-center .highlight}
Результирующий HTML будет следующим:
<h1 id="main-title" class="title">Заголовок</h1>
<p class="text-center highlight">Параграф с классом</p>
Ключевые особенности синтаксиса:
.class-name — добавление класса к элементу.#id-name — назначение id.[attr=value] — добавление произвольного атрибута.{.class1 .class2}.Пример с атрибутами и классами:
{.responsive width=300 title="Пример изображения"}
HTML:
<img src="image.png" alt="Альтернативный текст" class="responsive" width="300" title="Пример изображения">
Markdown-it предоставляет возможность переопределять рендереры отдельных токенов, что позволяет добавлять атрибуты программно, без использования синтаксиса в Markdown.
Пример добавления класса ко всем ссылкам:
const defaultRender = md.renderer.rules.link_open || function(tokens, idx, options, env, self) {
return self.renderToken(tokens, idx, options);
};
md.renderer.rules.link_open = function(tokens, idx, options, env, self) {
const token = tokens[idx];
token.attrPush(['class', 'external-link']); // добавление класса
return defaultRender(tokens, idx, options, env, self);
};
const result = md.render('[Ссылка](https://example.com)');
console.log(result);
Результат:
<p><a href="https://example.com" class="external-link">Ссылка</a></p>
Для автоматического добавления классов и id к заголовкам можно использовать встроенные события токенов:
md.core.ruler.push('add_header_class', function(state) {
state.tokens.forEach(token => {
if (token.type === 'heading_open') {
token.attrSet('class', 'custom-heading');
}
});
});
const html = md.render('# Пример заголовка');
console.log(html);
HTML:
<h1 class="custom-heading">Пример заголовка</h1>
Атрибуты могут добавляться к любым блокам Markdown. Например, списки и элементы списка:
- Пункт 1 {.important}
- Пункт 2 {.secondary}
Результат:
<ul>
<li class="important">Пункт 1</li>
<li class="secondary">Пункт 2</li>
</ul>
Также можно комбинировать плагин markdown-it-attrs с
пользовательскими рендерерами для сложной логики, например,
динамического добавления data-атрибутов на основе содержимого:
md.renderer.rules.bullet_list_open = function(tokens, idx, options, env, self) {
tokens[idx].attrSet('data-list', 'true');
return self.renderToken(tokens, idx, options);
};
const htmlList = md.render('- Элемент списка');
console.log(htmlList);
Результат:
<ul data-list="true">
<li>Элемент списка</li>
</ul>
Markdown-it поддерживает расширения для таблиц. С помощью
markdown-it-attrs можно добавлять классы и стили:
| Заголовок 1 | Заголовок 2 |
|-------------|-------------|
| Ячейка 1 | Ячейка 2 {.highlight} |
HTML:
<table>
<thead>
<tr>
<th>Заголовок 1</th>
<th>Заголовок 2</th>
</tr>
</thead>
<tbody>
<tr>
<td>Ячейка 1</td>
<td class="highlight">Ячейка 2</td>
</tr>
</tbody>
</table>
markdown-it-attrs с пользовательскими рендерерами.Если потребуется, можно реализовать функцию автоматического присвоения классов по типу элемента, чтобы не прописывать их вручную в Markdown, обеспечивая единый стиль на всех страницах.