Работа с Markdown в Rust: обзор ключевых библиотек
Язык Rust предоставляет мощные и безопасные средства для обработки текстовых данных, включая парсинг и рендеринг Markdown. Благодаря строгой типизации, отсутствию сборщика мусора и высокой производительности, библиотеки для работы с Markdown на Rust отлично подходят для создания статических сайтов, документации, блогов, чат-систем и любых приложений, где требуется конвертация Markdown в HTML или другие форматы. В этой статье мы рассмотрим три наиболее популярных инструмента: pulldown-cmark, comrak и официальный markdown crate.
1. pulldown-cmark — событийно-ориентированный парсер
pulldown-cmark — это самая популярная и производительная библиотека для парсинга Markdown в Rust. Она построена на событийной модели (pull parser), что позволяет обрабатывать документы потоково, без построения полного AST в памяти. Это делает её идеальной для больших файлов и приложений с ограниченными ресурсами.
Библиотека соответствует спецификации CommonMark и поддерживает все основные элементы: заголовки, списки, код, таблицы, ссылки, изображения и экранирование.
// Пример парсинга Markdown в HTML с помощью pulldown-cmark
use pulldown_cmark::{Parser, Options, html};
let markdown_input = "# Привет, мир!\n\nЭто **жирный текст** и *курсив*.";
let mut options = Options::empty();
options.insert(Options::ENABLE_TABLES);
options.insert(Options::ENABLE_FOOTNOTES);
let parser = Parser::new_ext(&markdown_input, options);
let mut html_output = String::new();
html::push_html(&mut html_output, parser);
println!("{}", html_output);
// Вывод: <h1>Привет, мир!</h1>
// <p>Это <strong>жирный текст</strong> и <em>курсив</em>.</p>
Особенности pulldown-cmark:
- Минимальное потребление памяти — парсинг без AST.
- Поддержка расширений: таблицы, сноски, зачеркивание, автолинковка URL.
- Полная поддержка CommonMark 0.31.2.
- Возможность кастомной обработки событий (например, для подсветки синтаксиса).
2. comrak — расширяемый парсер с поддержкой GFM
Comrak — это форк популярной JavaScript-библиотеки cmark-gfm, портированный на Rust. Он обеспечивает полную совместимость с GitHub Flavored Markdown (GFM), включая такие расширения, как списки задач, таблицы, зачеркивание, автоматические ссылки и экранирование HTML.
Comrak предоставляет гибкий API с возможностью настройки парсера через структуру ComrakOptions. Вы можете включить или отключить отдельные расширения, задать ширину табуляции, разрешить или запретить определённые HTML-теги.
// Пример использования comrak для конвертации Markdown в HTML
use comrak::{markdown_to_html, ComrakOptions};
let markdown = "## Список задач\n\n- [x] Сделать домашнее задание\n- [ ] Купить продукты\n\n```rust\nfn main() {\n println!(\"Hello\");\n}\n```";
let options = ComrakOptions::default();
let html = markdown_to_html(markdown, &options);
println!("{}", html);
// Вывод включает: заголовок, чекбоксы, блок кода с подсветкой
Преимущества comrak:
- Полная поддержка GFM (GitHub Flavored Markdown).
- Настраиваемая безопасность: экранирование опасных HTML-тегов.
- Поддержка вложенных блоков кода, математических формул (через расширения).
- Высокая скорость работы, сопоставимая с
pulldown-cmark.
3. markdown crate — простой и лёгкий парсер
Официальный markdown crate (crate markdown) — это минималистичная библиотека, которая реализует базовую спецификацию Markdown. Она не поддерживает расширения и таблицы, но отлично подходит для простых задач, когда требуется только конвертация базовых элементов (заголовки, списки, ссылки, выделение).
Библиотека очень проста в использовании — достаточно вызвать функцию markdown::to_html().
// Пример использования markdown crate
use markdown;
let md = "## Заголовок\n\nОбычный текст с **жирным** и `кодом`.";
let html = markdown::to_html(md);
assert_eq!(
html,
"<h2> Также в библиотеке
MailKit для C# (.NET): полное руководство с примерами
Обработка Markdown в C# (.NET): библиотеки и инструменты
Bull для JavaScript (Node.js): полное руководство с примерами
Стандартная библиотека Java: полный обзор и примеры кода
Работа с CSV в Java: библиотеки OpenCSV, Apache Commons CSV и Java Scanner