Поддержка Emoji в Markdown Библиотека Marked
предоставляет гибкий механизм работы с Markdown, включая возможность
расширений для обработки Emoji. По умолчанию Marked не преобразует
текстовые обозначения типа :smile: или :heart:
в графические иконки. Для этого необходимо подключение дополнительных
парсеров или ручное использование токенов.
Настройка пользовательского рендерера Marked
позволяет определить собственный объект renderer, в котором
можно переопределять методы для рендеринга отдельных элементов. Для
обработки Emoji ключевой метод — это text. Пример создания
рендерера для замены стандартных обозначений Emoji на соответствующие
символы Unicode:
import { marked } from 'marked';
const emojiMap = {
':smile:': '?',
':heart:': '❤️',
':thumbsup:': '?',
':star:': '⭐'
};
const renderer = {
text(text) {
return text.replace(/:\w+:/g, (match) => emojiMap[match] || match);
}
};
marked.use({ renderer });
const markdown = 'Привет :smile:, я люблю :heart: Markdown!';
const html = marked(markdown);
console.log(html);
// Вывод: Привет ?, я люблю ❤️ Markdown!
Регулярные выражения для расширенной поддержки Для
полноценной работы с Emoji удобно использовать регулярные выражения,
позволяющие находить все обозначения в тексте. Часто используется шаблон
/:\w+:/g, но для более сложных обозначений, включая дефисы
и цифры, лучше применять /:[\w-]+:/g.
Комбинация с внешними библиотеками Для полноценного
рендеринга Emoji можно интегрировать Marked с библиотеками вроде
emoji-dictionary или twemoji, которые
предоставляют полный набор Unicode-эмодзи и возможность замены на
изображения:
import twemoji from 'twemoji';
import { marked } from 'marked';
const renderer = {
text(text) {
return twemoji.parse(text, { folder: 'svg', ext: '.svg' });
}
};
marked.use({ renderer });
const markdown = 'Салют :star: и :thumbsup:!';
const html = marked(markdown);
console.log(html);
// Вывод: HTML с SVG-иконками Emoji
Использование в парсинге и токенизации Marked предоставляет возможность создания собственных лексеров. Для Emoji можно добавить отдельный токен:
import { marked } from 'marked';
const lexer = new marked.Lexer();
lexer.rules.emoji = /^:([\w-]+):/;
lexer.inlineRules.emoji = function(src) {
const match = this.rules.emoji.exec(src);
if (match) {
return {
type: 'emoji',
raw: match[0],
text: match[1]
};
}
};
const renderer = {
emoji(token) {
return emojiMap[`:${token.text}:`] || token.raw;
}
};
marked.use({ renderer });
const markdown = 'Пример :smile: токена';
const html = marked(markdown);
console.log(html);
Совместимость с стандартным Markdown При внедрении Emoji важно сохранять корректность стандартного Markdown. Marked обрабатывает обычные заголовки, списки и ссылки, поэтому рендеринг Emoji должен быть прозрачным и не мешать существующей структуре документа.
Настройка глобальной замены Для проектов, где часто встречаются Emoji, удобно создать глобальный плагин:
function emojiPlugin(md) {
const renderer = {
text(text) {
return text.replace(/:[\w-]+:/g, (match) => emojiMap[match] || match);
}
};
md.use({ renderer });
}
marked.use({ extensions: [emojiPlugin] });
Такой подход позволяет централизованно управлять набором Emoji и облегчает поддержку больших Markdown-документов.
Преимущества использования Emoji в Markdown с Marked
renderer или токены.Заключение по функциональности Emoji в Marked реализуются через расширение рендерера или добавление пользовательских токенов. Такой подход позволяет не только вставлять визуальные символы в текст, но и интегрировать сторонние библиотеки для более богатого визуального оформления. При правильной настройке Markdown-документы сохраняют чистоту синтаксиса и остаются удобными для редактирования и рендеринга.