Работа с Markdown в Rust: библиотеки и инструменты

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

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

Начать курс

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

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