Работа с Markdown в Rust: обзор инструментов и библиотек
Rust, известный своей производительностью и безопасностью, предлагает несколько зрелых библиотек для работы с Markdown. Независимо от того, создаёте ли вы статический генератор сайтов, чат-бота, систему документирования или редактор заметок, правильный выбор инструмента сэкономит часы разработки. В этой статье мы разберём три основные библиотеки: pulldown-cmark, markdown и comrak, а также покажем практические примеры их использования.
1. pulldown-cmark — событийно-ориентированный парсер
pulldown-cmark — самая популярная и быстрая библиотека для парсинга Markdown в Rust. Она реализует спецификацию CommonMark и работает по принципу «pull»: вы получаете поток событий (теги, текст, ссылки), который можно обрабатывать напрямую или преобразовывать в HTML.
Основные возможности:
- Полная поддержка CommonMark 0.30
- Минимальное потребление памяти
- Поддержка таблиц, зачёркнутого текста, автоссылок
- Возможность кастомизации через обработку событий
- Работа без аллокаций (zero-copy парсинг)
Пример парсинга и рендеринга в HTML:
use pulldown_cmark::{Parser, html};
fn main() {
let markdown_input = "# Привет, мир!\n\nЭто **жирный** текст и *курсив*.";
let parser = Parser::new(markdown_input);
let mut html_output = String::new();
html::push_html(&mut html_output, parser);
println!("{}", html_output);
}
Результат выполнения — корректный HTML с тегами <h1>, <strong> и <em>. Библиотека идеально подходит для высоконагруженных систем, где важна скорость.
2. markdown (crate) — универсальный конвертер
Библиотека markdown (крейт markdown) предоставляет как парсинг, так и конвертацию в различные форматы. В отличие от pulldown-cmark, она предлагает более высокоуровневый API и дополнительные опции вывода.
Ключевые особенности:
- Поддержка CommonMark и GitHub Flavored Markdown (GFM)
- Рендеринг в HTML, LaTeX, терминал
- Расширяемая архитектура с плагинами
- Встроенная поддержка сантайзинга HTML
- Работа с метаданными YAML front matter
Пример с конфигурацией:
use markdown::to_html_with_options;
use markdown::Options;
fn main() {
let md = "## Код на Rust\n```rust\nfn main() {\n println!(\"Hello\");\n}\n```";
let opts = Options {
compile: markdown::CompileOptions {
allow_dangerous_html: false,
allow_dangerous_protocol: false,
..markdown::CompileOptions::default()
},
..markdown::Options::default()
};
let html = to_html_with_options(md, &opts).unwrap();
println!("{}", html);
}
Этот пример демонстрирует безопасный рендеринг кода с подсветкой синтаксиса (если подключить дополнительный крейт). markdown рекомендуется для проектов, где нужна гибкость и поддержка нестандартных форматов вывода.
3. comrak — расширенный парсер для GFM
comrak — форк популярного парсера cmark с дополнительными расширениями GitHub. Это лучший выбор, если ваш проект требует точного соответствия Markdown GitHub, включая экранирование, списки задач и эмодзи.
Возможности comrak:
- Полная поддержка GFM (таблицы, зачёркивание, автоссылки)
- Расширения: синтаксис LaTeX, математические формулы
- Настраиваемая санитизация HTML
- Поддержка пользовательских рендереров
- Экспорт в абстрактное синтаксическое дерево (AST)
Пример с расширениями:
use comrak::{markdown_to_html, ComrakOptions};
fn main() {
let md = "- [x] Задача выполнена\n- [ ] Ожидает проверки\n\n~~Зачёркнутый текст~~";
let mut opts = ComrakOptions::default();
opts.extension.tasklist = true;
opts.extension.strikethrough = true;
opts.render.unsafe_ = false;
let html = markdown_to_html(md, &opts);