Обработка Markdown на Rust: библиотеки, парсеры и инструменты

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с 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>                    

Рекомендаций