Pandoc: 20 лет конвертера, который изменил документооборот
Есть инструменты, которые ты используешь каждый день, но не задумываешься об их авторе. 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 (Abstract Syntax Tree) — это древовидная структура данных, которая представляет документ в виде дерева элементов: заголовки, параграфы, списки, ссылки. Парсер разбирает текст и строит такое дерево, а рендерер берёт готовую структуру и преобразует её в нужный формат.
Главное преимущество такого подхода: один парсер даёт столько конвертаций, сколько форматов поддерживается. Добавил новый формат — написал один рендерер. Масштабируемость становится естественной частью архитектуры.
Первая версия: 3000 строк кода
Pandoc 0.1, выпущенный в августе 2006 года, поддерживал Markdown, reStructuredText, HTML и LaTeX на входе; те же форматы плюс RTF и S5 — на выходе. Первый релиз Макфарлейн не анонсировал широко: просто выложил код на сайте и написал двум друзьям.
Один из тех друзей оказался турецким разработчиком Рекаи Окташем, который хотел стать Debian-разработчиком и предложил запаковать Pandoc для этого дистрибутива. Так проект получил первое серьёзное распространение.
Рост форматов: от 4 до 50+
Дальше история Pandoc — это история постоянного добавления форматов и возможностей. Год за годом проект рос:
- 2007: добавлен DocBook writer, сноски в Markdown, таблицы, надстрочный и подстрочный текст
- 2008: MediaWiki, OpenDocument, ODT, подсветка синтаксиса кода
- 2010: гибкая система шаблонов вместо жёстко зашитого вывода
- 2012: Word docx на выходе
- 2013: расширения Markdown, YAML-метаданные, Lua-фильтры, JSON-фильтры
- 2014: чтение Org-mode, полноценный ридер docx с track changes
РОСТ КОЛИЧЕСТВА ФОРМАТОВ
────────────────────────
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.
Сообщество и вклад
Проект не был бы тем, чем стал, без сообщества. Ключевые контрибьюторы помогали с отдельными форматами и направлениями:
- Albert Krewinkel — поддержка Org-mode на вход
- Jesse Rosenthal — ридер Word docx с track changes
- Matthew Pickering — EPUB и Txt2Tags
- Andrea Rossato — OpenDocument writer, citeproc-hs
- Mauro Bieg — DocBook reader
География была почти мировой: Германия, Италия, США, Великобритания, Турция. Макфарлейн вспоминал, как просыпался утром и находил пулл-реквесты от участников из других часовых поясов.
Интеграция в современные инструменты
Сегодня Pandoc — не просто консольная утилита. Он стал движком для многих современных инструментов:
- Quarto — системы публикации научных статей
- Jupyter Notebook — конвертации ноутбуков в разные форматы
- R Markdown — формата для создания отчётов с кодом в экосистеме R
- Hugo — генератора сайтов из текстовых файлов
Если вы рендерите .md в PDF через Quarto или конвертируете Jupyter Notebook в HTML, под капотом с высокой вероятностью работает Pandoc.
Выводы
Pandoc — пример того, как правильная архитектура побеждает: регексп-подход быстрее на старте, но не масштабируется, а AST-подход требует больше усилий вначале, зато растёт десятилетиями без переписывания с нуля.
Второй урок — важен не инструмент, а задача, которую он решает. Макфарлейн хотел изучить Haskell, но результатом стал инструмент, которым пользуются миллионы, потому что он развивался под реальные потребности.
Третий вывод — открытый код и сообщество делают проекты живыми. Pandoc не стал бы 50-форматным монстром без десятков контрибьюторов, но и без единого мейнтейнера с видением проект не выдержал бы такой эволюции.
Ссылки
- Twenty Years of Pandoc — оригинальная статья Джона Макфарлейна
- Quarto — система публикации научных статей
Дмитрий Полухин — продуктовый дизайнер. Пишу про разработку, AI и дизайн интерфейсов. Обо мне, контакты и профили.