Библиотека Marked — это мощный инструмент для работы с Markdown в JavaScript, который обеспечивает быстрый и гибкий способ преобразования текста в HTML. Ключевой особенностью Marked является разделение процесса на токенизацию и парсинг, что позволяет управлять разбором документа на более детальном уровне.
Токенизация — это первый этап обработки Markdown. На этом этапе исходный текст разбивается на токены, каждый из которых представляет собой отдельную смысловую единицу: заголовок, список, ссылку, код, цитату и т.д.
Пример токенов в Marked:
const marked = require('marked');
const lexer = new marked.Lexer();
const tokens = lexer.lex(`
# Заголовок первого уровня
- Элемент списка
- Еще один элемент
`);
console.log(tokens);
В результате выполнения кода получаем массив объектов, где каждый объект содержит:
type — тип токена (например, heading,
list_item, paragraph)raw — исходный текст токенаtext — очищенный текст без Markdown-разметкиdepth — уровень заголовка (для токенов типа
heading)Особенности токенизации:
После токенизации начинается парсинг, на котором токены преобразуются в HTML. Marked использует объект Renderer, который определяет, как каждый тип токена конвертируется в HTML-код.
Пример использования Renderer:
const renderer = new marked.Renderer();
renderer.heading = function (text, level) {
return `${text} `;
};
const html = marked.parser(tokens, { renderer });
console.log(html);
В данном примере заголовки всех уровней получают дополнительный класс
custom-heading. Это демонстрирует гибкость парсинга: можно
изменять конечное представление HTML, не трогая исходный текст
Markdown.
Важные моменты парсинга:
Токенизация и парсинг в Marked работают как двухэтапная цепочка:
Эта модель разделяет ответственность:
Такой подход облегчает:
Marked позволяет создавать кастомные токены, расширяя стандартные правила Markdown. Например, можно добавить поддержку новых синтаксисов:
const lexer = new marked.Lexer({
extensions: [
{
name: 'highlight',
level: 'block',
start(src) { return src.match(/```highlight/)?.index; },
tokenizer(src) {
const rule = /^```highlight\n([\s\S]+?)\n```/;
const match = rule.exec(src);
if (match) {
return {
type: 'highlight',
raw: match[0],
text: match[1]
};
}
},
renderer(token) {
return `${token.text}`;
}
}
]
});
В этом примере добавляется новый блок highlight, который
распознается на этапе токенизации и рендерится в HTML на этапе
парсинга.
Разделение на токенизацию и парсинг обеспечивает:
В Marked токенизация формирует структурное представление документа, а парсинг превращает эту структуру в итоговый HTML. Осознанное управление этими этапами открывает возможности для расширения функционала, кастомного рендеринга и интеграции Markdown с другими форматами данных.