Markdown-it поддерживает расширяемую систему плагинов, одним из которых является плагин для контейнеров. Контейнеры позволяют создавать специальные блоки с настраиваемым содержимым и стилями, которые невозможно реализовать с помощью стандартного синтаксиса Markdown. Это полезно для выделения информации, создания предупреждений, заметок, примеров кода или других визуально оформленных блоков.
Для работы с контейнерами используется официальный плагин
markdown-it-container. Его установка производится через
npm:
npm install markdown-it-container
Подключение к Markdown-it осуществляется следующим образом:
const MarkdownIt = require('markdown-it');
const container = require('markdown-it-container');
const md = new MarkdownIt();
md.use(container, 'info');
Здесь 'info' — это название контейнера. В дальнейшем его
можно использовать в Markdown-файле следующим образом:
::: info
Это информационный блок
:::
Контейнеры имеют три основные компоненты:
::: плюс название контейнера и необязательные
параметры.:::.Пример:
::: warning
Внимание! Этот блок предназначен для предупреждений.
:::
На этапе рендеринга этот блок будет преобразован в HTML:
<div class="warning">
<p>Внимание! Этот блок предназначен для предупреждений.</p>
</div>
Контейнеры используют CSS-классы, соответствующие названию контейнера. Это позволяет настраивать визуальное оформление через стили. Пример CSS:
.info {
background-color: #e0f7fa;
border-left: 4px solid #00acc1;
padding: 10px;
}
.warning {
background-color: #fff3e0;
border-left: 4px solid #ff9800;
padding: 10px;
}
Плагин markdown-it-container позволяет добавлять
кастомную логику при открытии и закрытии блока. Для этого используется
объект с функциями validate и render:
md.use(container, 'note', {
validate: function(params) {
return params.trim().match(/^note\s+(.*)$/);
},
render: function(tokens, idx) {
const m = tokens[idx].info.trim().match(/^note\s+(.*)$/);
if (tokens[idx].nesting === 1) {
// Открывающий тег
return `<div class="note"><strong>${md.utils.escapeHtml(m[1])}</strong>\n`;
} else {
// Закрывающий тег
return '</div>\n';
}
}
});
Markdown для этого блока может выглядеть так:
::: note Важная заметка
Содержимое заметки.
:::
Результат рендеринга:
<div class="note"><strong>Важная заметка</strong>
<p>Содержимое заметки.</p>
</div>
Markdown-it поддерживает вложенные контейнеры, если использовать разные имена для блоков:
::: warning
Внимание!
::: info
Дополнительная информация
:::
:::
При рендеринге получится два вложенных блока:
<div class="warning">
<p>Внимание!</p>
<div class="info">
<p>Дополнительная информация</p>
</div>
</div>
Вложенные блоки позволяют создавать сложные структуры, например, предупреждения с дополнительными подсказками.
Параметры после названия контейнера можно использовать для передачи данных в рендер-функцию. Это удобно для динамического формирования заголовков, идентификаторов или других атрибутов HTML:
md.use(container, 'example', {
validate: function(params) {
return params.trim().match(/^example\s+(.*)$/);
},
render: function(tokens, idx) {
const m = tokens[idx].info.trim().match(/^example\s+(.*)$/);
if (tokens[idx].nesting === 1) {
return `<div class="example" data-title="${md.utils.escapeHtml(m[1])}">\n`;
} else {
return '</div>\n';
}
}
});
Markdown:
::: example Заголовок блока
Содержимое блока.
:::
HTML:
<div class="example" data-title="Заголовок блока">
<p>Содержимое блока.</p>
</div>
Контейнеры в Markdown-it предоставляют мощный инструмент для расширения стандартного синтаксиса Markdown, позволяя создавать структурированные и стилизованные блоки с произвольным содержимым и динамическими параметрами.