
2026/08/04 0:04
Pandoc の二十年
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
重要要点には、日付、著者の動機、特定のバージョンでの追加といった具体的な歴史的事実が含まれており、これらは要約には全く含まれていないため、要約の代わりに、これらの事実に統合しつつ読みやすさを保ちながらよりバランスの取れたバージョンに置換することをお勧めします。
改善された要約:
2006 年のデビューから 2026 年 8 月に 20 周年を迎えるPandocは、当初は Haskell コードで約 3,000 行規模の単純なプロジェクトとしていたものが、400 以上のフォーマット変換に対応する堅牢な協業エコシステムへと進化しました。当初は書籍推薦に触発され、壊れやすい正規表現パターンを使用する代わりにパーサーコンビネータを利用して Markdown を抽象構文木 (AST) に解析するというアプローチを採用し、その建築構造によって開始時から N 入力から M 出力という複雑な変換を可能にしました。20 年間にわたり、コミュニティからの貢献と専門ライブラリを通じて成長し、citeproc-hs を介して引用機能の追加、バージョン 1.0 での MediaWiki および Texinfo のライター拡張、バージョン 1.4 での柔軟なテンプレートシステムの導入といった成果を達成しました。プロジェクトの安定性は、2018 年にメンテナーを支援するための 10 万ドルの寄付によって強化され、近年のバージョンである 3.0 では Lua フィルターと Typst のサポートが追加され、最新リリース(3.9)ではブラウザ実行用の WebAssembly コンパイルと AI アシスタンスで設計された直感的な GUI インターフェースが導入されました。Pandoc はこれらの機能を単一プラットフォームに統合し、Google Code から GitHub へ移行することで、デジタル環境全体におけるドキュメント作成と変換の再定義を継続しています。
本文
Pandoc の二十周年:歴史と未来
序章
2006 年 8 月 3 日、私は最初のバージョンの Pandoc を自らのウェブサイトへアップロードし、GPL ライセンスの下で公開しました。
- 初期の状態: Pandoc 0.1 は約 3,000 行の Haskell コードから構成され、GHC の標準ライブラリ以外に依存関係はありませんでした。
- 機能: Markdown や reStructuredText、HTML、LaTeX などの変換だけでなく、RTF や S5 形式への変換もサポートしていました。
当時の私には以下のことが予想できませんでした:
- 今後二十年間にわたる 二百以上のリリースの実現
- Haskell で書かれたプログラムの中で最も人気のあるプロジェクトとなること
- 無数の時間をバグ修正や機能改善に費やすこと
- 世界中の多くの国々のプログラマーとの協力関係の確立
- サポートされるドキュメント形式が 51 に増加すること
- 参考文献や目録の自動生成が可能になること
- Quarto や Jupyter Notebook といった学術書作成ツールへの統合
- 世界中の数百万台のコンピュータへのインストール
史前時代:Haskell の選択とアーキテクチャ
なぜ Haskell か?
多くの人が「なぜ Pandoc は Haskell で書かれているのか?」と問いますが、それはアプリケーション開発の最良の言語だからではなく、まず Haskell を使い、その中でドキュメント変換器を書くことにしたからです。
- きっかけ: 哲学者であり論理学者であるグレッグ・レスターが Haskell の入門書を著し、「計算機科学に恋をしてしまい、哲学者にはなれなかっただろう」と警告しました(consequently.org)。
- 学習方法: レスターの言葉に興味を持ち「Haskell の優しい入門」を読みましたが、言語を学ぶには実装が必要です。
- 最初の目的: パーサーやコンパイラを書くのに適しており、**
**という優れたパーサーコンビネータライブラリが付属するため、Markdown パーサーを書くことに決めました。parsec
アーキテクチャの違い
当時の Perl、Python などはレギュラー式変換のシーケンスで Markdown を HTML に直変換していました。Pandoc は異なるアプローチを採用しました。
- 抽象構文木 (AST) の生成: パーサーコンビネータを使用して AST を生成し、その後レンダリングする手法を採用しました。
- 多くのレギュラー式ベースのバージョンに存在したpeculiar な挙動を回避できるため信頼性が高いです。
- 拡張性が高く、N 個のパーサー(「リーダ」)と M 個のレンダラ(「ライタ」)を書くことで N × M の変換をサポートできました。
- 成長: reStructuredText リーダーや LaTeX ライターの追加から雪だるま式に成長し、プロジェクトは Haskell で書く喜びと学術作業の有用性によって支えられました。
最初のリリース(2006–8)
初期の公開
2006 年 8 月 3 日の公開時点での機能:
- 入力形式: HTML, LaTeX, RST, Markdown
- 出力形式: HTML, LaTeX, RTF, PDF (LaTeX を通じて)
- 宣伝: ソーシャルメディアや GitHub は未登場。友人二人へのメール送付のみ。
認知度の上昇
- Debian のパッケージ化: 2006 年 10 月、トルコ系開発者のRecai Oktaşから連絡があり、共同で Debian Linux でパッケージ化する作業を行いました。
- プロジェクトの認知度を大幅に高め、大きな学びの機会となりました。
バージョンの進化 (0.3–0.4)
主に著者自身の必要性により改善が進みました:
- バージョン 0.3:
ライターの追加DocBook- Markdown フットノート用の標準構文の追加
- バージョン 0.4 (Hackageへの初リリース):
- Markdown テーブル、定義リスト、上/下付き文字、取り消し線
- 強化された番号付きリスト
およびgroff man ページ
のライターの追加ConTeXt
Pandoc 1(2008–17):多様な形式と標準化
Pandoc 1.0 の導入 (2008 年 9 月)
- 新ライターの追加: MediaWiki, GNU Texinfo (Peter Wang), OpenDocument (Andrea Rossato), ODT
- 区切られたコードブロック: 「fenced」と呼ばれる形式と自動構文強調機能の追加。
を開発し、Kate の XML 定義を解析して Haskell コードハイライターへ変換しました(当時 Haskell には該当ライブラリが存在しなかったため)。highlighting-kate
- 参考文献の自動生成:
ライブラリを使用した CSL スタイルに基づくシステムを実装。citeproc-hs
コミュニティとの協業と標準化
- Markdown 拡張機能: PHP Markdown Extra (Michel Fortin) の定義リスト構文を採用。
- CommonMark への貢献:
- 2014 年、John Gruber とワーキンググループを立ち上げ、Markdown 構法の曖昧性を排除する仕様を策定。
- John Gruber の反対を受け、名称を「CommonMark」に変更しました。
- Pandoc は初期のレガシー Markdown パーサーに加え、
コアと拡張機能をサポートしています。commonmark
期間中の主要機能追加
| 時期 | 主な更新内容 |
|---|---|
| 2010 | Google Code → GitHub 移行 EPUB (Puneeth Chaganti), Org-mode (Puneeth Chaganti), Textile (Paul Rivier) のサポート TeX 数学の MathML 変換 ( 使用) |
| 2012 | Word docx出力の生成開始 (方程式処理のため への OMML 追加)AsciiDoc ライター、Beamer, DZSlides のサポート DocBook リーダー (Mauro Bieg) の導入 |
| 2013 | YAML メタデータブロックによるテンプレート変数の populated Lua でカスタムライターの作成可能化 JSON フィルターと への参考文献処理分離Haddock, MediaWiki 入力、DokuWiki 出力の追加 |
| 2014 | Org-mode 入力 (Albert Krewinkel) Word docx リーダー (Jesse Rosenthal) EPUB/Txt2Tags 入力 (Matthew Pickering) |
表と参考文献の強化
- テーブルモデルの変更: 従来の制限的なモデルから、行および列のスパンをサポートする新しいモデルへ変更(Christian Despres)。
- 参考文献の刷新:
を独自に書き直し、より速く CSL に忠実で外部フィルタ不要なシステム (citeproc-hs
ベース) をPandoc 2.11 で導入。Unicode Collation アルゴリズムを実装(citeproc-hs
ライブラリ)。unicode-collation - データベース形式間の変換: BibTeX, BibLaTeX, CSL JSON, EndNote XML/RIS, CSV/TSV, Markua, RTF などから Pandoc テーブルへの変換が可能に。
Pandoc 2(2017–23):アーキテクチャの転換点
Pandoc 2.0 (2017 年) で大きなアーキテクチャ変更が実施されました。
パンドック・モナド (PandocMonad) の導入
以前はリーダとライタが「純粋」でしたが、画像読み込みやファイル包括などの I/O を必要とする形式が増加していました。
- システム:
タイプクラスを定義し、純粋なインスタンス(テスト用など)と I/O 操作を許可するインスタンスの両方を提供。PandocMonad- docx や EPUB のような形式でリソースとして包括されている画像を処理可能に。
Lua フィルターの採用
- 実装: 埋め込まれた Lua インタプリータ内で動作し、Pandoc AST を直接操作するフィルター。
(Haskell-Lua ブリッジライブラリ) を基盤として Albert Krewinkel が開発。hslua- JSON フィルターよりもはるかに優れたパフォーマンスを提供し、外部ソフトウェア不要。
機能の拡大
- 新しいフォーマット: Emacs Muse, TikiWiki, Vimwiki, Creole, groff ms, JATS のサポート導入。
- ライターの更新:
→ **highlighting-kate
**への置き換え(より良いパフォーマンスと正確な KDE 定義解釈)。skylighting- PowerPoint ライター (Jesse Rosenthal), FictionBook2 (Krotov), man 入力形式の追加。
寄付と持続可能性
- 2018 年の寄付: Handshake から10 万ドルを受賞。
- 5 年間にわたり、最もアクティブな維持者を支援するための**stipend(生活扶助)**を支給するために使用されました。
その他の重要な更新
- 2019 年: IPynb (Jupyter Notebook) のサポート追加(データサイエンスワークフローへの活用)。Jira wiki マークアップの出力可能化。
ファイルによるデフォルトオプションのコレクション指定が可能に(Pandoc 2.8)。defaults
- 参考文献データベース変換: Pandoc 2.15 で
オプション追加(I/O 副作用なしの保証)。--sandbox
Pandoc 3(2023–present):モジュラー化と新しい時代
2023 年までに Pandoc は大規模なモノリシックプロジェクトに成長していました。
- モジュール化: より軽量なプログラムへの要望に応え、Pandoc を四つに分割しました。
: Haskell ライブラリpandoc
: Lua 統合を持つエンジンpandoc-lua-engine
: HTTP API を公開するサーバーpandoc-server
: コマンドラインプログラム(オプションでコンパイル)pandoc-cli
新しいフォーマットと機能
- Figure 要素: AST にネイティブの Figure 要素導入。多章 HTML 書籍およびドキュメント用の"chunked HTML"ライタ実装。
- Typst 対応: 2023 年リリース(Hackage
パッケージ作成)。Pandoc 3.1.3 で Typst リーダー追加。typst- Typst は現代の LaTeX コピーであり、增量コンパイルをサポート。
- djot フォーマット: 軽量マークアップ言語
の入力・出力サポート(Pandoc 3.1.12)。djot - その他のフォーマット (2024–2025):
- ANSI ライター (フォーマルターミナル出力)
- mdoc, POD リーダー (Evan Silberman)
- XML レプレゼンテーション (massifrg)
- vimdoc ライター, PowerPoint/Excel スプレッドシートリーダ (Anton Antich)
- BBCode ライター, AsciiDoc リーダー
ブラウザでの実行と GUI
- Pandoc 3.9 (2026 年 2 月):
- Pandoc を WASM にコンパイルする機能追加。完全な Pandoc バージョンをブラウザで実行可能に。
- 「人々のための pandoc」という GUI インターフェースの実装(Claude Opus の設計支援)。
統計情報
サポートされる形式
- 入力形式: 51
- 出力形式: 76
- 異なる変換: 3,876 (拡張機能の調整によるバリエーション含む)
コードと貢献者数
- ソースコード: 四つのコアパッケージにテストを除く約 85,684 行の Haskell コード。
- 依存関係 (
,texmath
,typst
など) を含めると約倍になる。djot
- 依存関係 (
- Issue 解決数: GitHub で 7,346の issue が解決。
- 貢献者: 何年もかけて Pandoc に貢献したのは 600 人以上。
トップコントリビューター(変更行数)
| 貢献者 | 変更行数 | アクティブ年数 |
|---|---|---|
| John MacFarlane (著者) | 372,317 | 2006– |
| Albert Krewinkel | 77,136 | 2014– |
| Jesse Rosenthal | 39,644 | 2014– |
| Christian Despres | 15,314 | 2019–2021 |
| Alexander Krotov | 8,657 | 2017–2019 |
| Matthew Pickering | 6,919 | 2014–2015 |
最も長期間貢献した人々
- John MacFarlane: 2006–2026 (20 年間)
- Albert Krewinkel, Andrew Dunning, Thomas Hodgson: 2014/2015–2026
- Pascal Wagler: 2019–2026
回顧:Haskell の選択について
Pandoc に Haskell を選んだのは、当初から「最良の言語である」という判断によるものではありませんでしたが、結果的に非常に良かった言語でした。
Haskell の利点
- 代数データ型: 構造化されたドキュメントのクリーンで使い勝手の良い表現を提供。
- 強力な型システム:
- 物事のタイプを正しく結合しないとコンパイラエラーが表示されるため、変更時に自信を持って作業できる。
- Python や JavaScript と違い、長期的な保守において「バグ防止」のセーフガードとして機能。
- 純粋関数性:
- 型で明示的に許可されていない副作用(ファイル操作、ネットワーク通信など)は不可能。
- サンドボックスモードなどでリーダとライターがファイルシステムに触れないことを強力に保証。
- コミュニティ: 貢献者の質が高く人数が少ないという組み合わせ(リソースの少ないプロジェクトに好ましい)。
Rust との比較
- Rust: Haskell の多くの良い特徴を持ちつつ、より速く、メモリ効率的でコンパクトなコードを生産している。
- Haskell: まだ著者にとって「使い勝手がよく」、抽象概念を表すのに適しており、開発者の思考を助ける言語として理想に近い。
Pandoc の未来:LLM との共存
必要性への疑問
現在の LLM(大規模言語モデル)は翻訳や形式変換において高い性能を発揮しています:
- ChatGPT は Markdown から HTML への変換で良好な結果を出す。
- reStructuredText への変換でもそこそこの結果が見られる。
著者は、LLM が意図を推測してドキュメントを変換する未来を予想しているが、以下の理由から Pandoc に依存する利点が依然としてあると考えています:
- 生態学的な利点: 同じ変換を行うために LLM より遥かに少ないエネルギーが必要。
- 再現性 (Determinism): Pandoc で変換すると常に同じ結果が得られ、予測可能。LLM とは異なり、ランダム性がない。
- 信頼性: 現時点では Pandoc の方がより信頼性の高い変換を提供している(将来は変わる可能性あり)。
CommonMark とエッジケース
- CommonMark 仕様の設計目標は「複雑な文字列を人間の自然な解釈方法で解釈」することでしたが、ネストされた強調の規則などにおいてアルゴリズムと人間の直感が乖離するエッジケースが存在します。
- これに対し著者は、「AI がない限り、私たちはこのようなエッジケースを受け入れる必要があります」と言及しました。しかし、今ではテキストの意味と意図を理解するツールがあり、設計されるあらゆる軽量マークアップ構法よりも著者の意図を認識できる可能性があります。
お祝い:Pandoc の二十歳へ
二十年間のプロジェクトの歴史に誇りを持ち、世界中の人々に無数の時間分の手間を救って来ました。
Pandoc は二十歳の誕生日おめでとう!
この機会に以下のグッズを作成しました:
- 変換図入り マグカップ
- Pandoc キャラクター入り ステッカー
- Pandoc ロゴ入り ステッカー
- Pandoc ロゴ入り マグカップ