Pandoc: 20 лет конвертера, который изменил документооборот

04.08.2026 · 5 мин

Есть инструменты, которые ты используешь каждый день, но не задумываешься об их авторе. Pandoc — один из таких: в августе 2026 исполнилось 20 лет с момента публикации первой версии, а путь от учебного проекта до индустриального стандарта оказался неожиданно длинным.

От любопытства до миллионов установок

Всё началось с желания попрактиковаться. Джон Макфарлейн хотел изучить Haskell — функциональный язык программирования, популярный в академической среде. Единственный способ по-настоящему освоить язык — написать что-то реальное, и он выбрал парсер Markdown. Так в 2006 году появился Pandoc.

Но был один нюанс: к тому моменту уже существовали парсеры Markdown на Perl, Python, Ruby и PHP. Все они работали через цепочку регулярных выражений — грубо говоря, через поиск и замену текста по шаблону. Pandoc пошёл другим путём.

РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯ VS AST-ПАРСИНГ
───────────────────────────────────
Регексп-подход:
  Markdown ──▶ [Ряды регексп-подстановок] ──▶ HTML
              └──▶ [Доп. правила] ──▶ LaTeX
              └──▶ [Другие форматы] ──▶ RTF
  Каждый формат = своя цепочка правил

AST-подход (Pandoc):
  Markdown ──▶ AST ──▶ HTML
              └──▶ LaTeX
              └──▶ RTF
              └──▶ 50+ форматов
  Один парсер = N рендереров
Ключевое архитектурное решение: AST вместо цепочки регулярок

AST (Abstract Syntax Tree) — это древовидная структура данных, которая представляет документ в виде дерева элементов: заголовки, параграфы, списки, ссылки. Парсер разбирает текст и строит такое дерево, а рендерер берёт готовую структуру и преобразует её в нужный формат.

Главное преимущество такого подхода: один парсер даёт столько конвертаций, сколько форматов поддерживается. Добавил новый формат — написал один рендерер. Масштабируемость становится естественной частью архитектуры.

Первая версия: 3000 строк кода

Pandoc 0.1, выпущенный в августе 2006 года, поддерживал Markdown, reStructuredText, HTML и LaTeX на входе; те же форматы плюс RTF и S5 — на выходе. Первый релиз Макфарлейн не анонсировал широко: просто выложил код на сайте и написал двум друзьям.

Один из тех друзей оказался турецким разработчиком Рекаи Окташем, который хотел стать Debian-разработчиком и предложил запаковать Pandoc для этого дистрибутива. Так проект получил первое серьёзное распространение.

Рост форматов: от 4 до 50+

Дальше история Pandoc — это история постоянного добавления форматов и возможностей. Год за годом проект рос:

РОСТ КОЛИЧЕСТВА ФОРМАТОВ
────────────────────────
2006:  4 формата на вход + 6 на выход
       ████░░░░░░░░░░░░░░░░░░░░░░░░░░░

2008:  6 форматов на вход + 12 на выход
       ██████░░░░░░░░░░░░░░░░░░░░░░░░░

2013:  14 форматов на вход + 24 на выход
       ████████████████████░░░░░░░░░░░

2026:  50+ форматов на вход + 50+ на выход
       ████████████████████████████████
Экспоненциальный рост: каждый год добавлялись новые форматы

Каждый новый формат требовал работы. Например, для ODT нужен был zip-архив — готовой Haskell-библиотеки не было, поэтому пришлось написать свою. Для подсветки синтаксиса появился highlighting-kate, который парсил XML-определения из редактора Kate и генерировал кодеры для десятков языков.

Философия расширяемости

Макфарлейн с самого начала закладывал расширяемость. В 2013 году появились JSON-фильтры — внешние программы, которые получают сериализованное AST документа и могут трансформировать его перед рендерингом. Это позволяло делать кастомную обработку без модификации ядра Pandoc.

Lua-фильтры пошли дальше: можно писать скрипты на Lua прямо в командной строке для преобразования документа. А Citation Style Language интегрировали через внешний фильтр pandoc-citeproc.

Сообщество и вклад

Проект не был бы тем, чем стал, без сообщества. Ключевые контрибьюторы помогали с отдельными форматами и направлениями:

География была почти мировой: Германия, Италия, США, Великобритания, Турция. Макфарлейн вспоминал, как просыпался утром и находил пулл-реквесты от участников из других часовых поясов.

Интеграция в современные инструменты

Сегодня Pandoc — не просто консольная утилита. Он стал движком для многих современных инструментов:

Если вы рендерите .md в PDF через Quarto или конвертируете Jupyter Notebook в HTML, под капотом с высокой вероятностью работает Pandoc.

Выводы

Pandoc — пример того, как правильная архитектура побеждает: регексп-подход быстрее на старте, но не масштабируется, а AST-подход требует больше усилий вначале, зато растёт десятилетиями без переписывания с нуля.

Второй урок — важен не инструмент, а задача, которую он решает. Макфарлейн хотел изучить Haskell, но результатом стал инструмент, которым пользуются миллионы, потому что он развивался под реальные потребности.

Третий вывод — открытый код и сообщество делают проекты живыми. Pandoc не стал бы 50-форматным монстром без десятков контрибьюторов, но и без единого мейнтейнера с видением проект не выдержал бы такой эволюции.

Ссылки

Дмитрий Полухин — продуктовый дизайнер. Пишу про разработку, AI и дизайн интерфейсов. Обо мне, контакты и профили.