Библиотека Markdown-it поддерживает мощный механизм автоматических замен текста, который позволяет преобразовывать определённые последовательности символов в более сложные конструкции HTML или специальные символы. Этот функционал часто используется для автоматического создания эмодзи, кавычек, тире, ссылок и других текстовых элементов, упрощая процесс написания Markdown.
Автоматические замены в Markdown-it реализуются
через систему core rules и
inline rules, которые проходят по тексту и
ищут совпадения с определёнными паттернами. Эти правила можно разделить
на:
Для автоматических замен чаще всего используются inline правила, так как они позволяют заменять символы на лету при рендеринге.
Markdown-it поставляется с базовым набором замен, которые можно включать или отключать при инициализации:
const MarkdownIt = require('markdown-it');
const md = new MarkdownIt({
typographer: true // включает автоматические типографские замены
});
Опция typographer: true активирует
следующие замены:
-- → длинное тире (—)... → многоточие (…)" " → «елочки» в кавычках (“”)' ' → апострофы и одинарные кавычки
(‘’)Эти преобразования работают автоматически на всех блоках текста, где разрешён inline Markdown.
Для более тонкой настройки замен можно использовать объект
md.core.ruler или
md.inline.ruler:
md.inline.ruler.before('emphasis', 'custom_replace', function(state) {
const src = state.src;
state.src = src.replace(/\(c\)/gi, '©');
return true;
});
Здесь:
before('emphasis', ...) указывает, что
правило сработает перед обработкой курсивов.state, содержащий текст
документа.replace позволяет внедрять
собственные правила замены.Таким образом, можно создавать собственные сокращения, заменять текст на специальные символы или HTML-теги.
Markdown-it имеет отдельный плагин для эмодзи — markdown-it-emoji, который интегрируется через стандартные правила inline:
const md = require('markdown-it')().use(require('markdown-it-emoji'));
console.log(md.render('I :heart: Markdown-it!'));
// Выведет: I ❤️ Markdown-it!
Плагин использует словарь эмодзи и автоматически заменяет обозначения
вида :name: на соответствующий символ. Также можно
расширять словарь или переопределять существующие замены.
md.renderer.rules.emoji = function(token, idx) {
return `<span class="emoji">${token[idx].content}</span>`;
};
Для сложных сценариев удобно использовать регулярные
выражения. Например, чтобы автоматически заменять даты в
формате YYYY-MM-DD на <time>:
md.inline.ruler.after('text', 'date_replace', function(state) {
state.tokens.forEach(token => {
if (token.type === 'text') {
token.content = token.content.replace(
/\b(\d{4}-\d{2}-\d{2})\b/g,
'<time>$1</time>'
);
}
});
return true;
});
Такой подход позволяет внедрять сложные логики преобразования, сохраняя совместимость с существующими правилами Markdown.
Markdown-it выполняет inline правила строго в том порядке, в котором они зарегистрированы. Это важно при работе с автоматическими заменами:
Использование методов before и
after позволяет гибко контролировать
последовательность:
md.inline.ruler.before('emphasis', 'custom_quotes', customQuotesRule);
В некоторых случаях автоматические замены могут быть нежелательными. Для этого можно:
const md = new MarkdownIt({ typographer: false });
Исключить замену внутри определённых блоков с помощью специальных
inline правил, проверяя state.pos и
token.type.
Комбинировать Markdown-it с плагинами, которые фильтруют замену в определённых областях, например внутри кода или ссылок.
Автоматические замены в Markdown-it — это гибкий инструмент для улучшения читаемости и стилистики текста. С их помощью можно реализовать:
Правильное использование core и inline правил вместе с плагинами позволяет создавать мощные и безопасные преобразования текста без вмешательства в основную структуру Markdown.