HN 日本語サマリー

← 一覧へ戻る
プログラミング

Pandoc 20年の歩み

Twenty Years of Pandoc (pandoc.org)

344 pointsby fiddlosopher42 コメント

要約

2006年にHaskellで書かれた小さなドキュメントコンバーターとして始まったPandocは、20年を経て50以上のフォーマットをサポートし、学術執筆ツールに統合されるなど、世界中で広く利用されるプロジェクトへと成長しました。著者は、Haskellを選んだ理由、初期リリース、そしてプロジェクトがどのようにして現在の地位を確立するに至ったのか、その開発の道のりを振り返ります。

全文翻訳

Pandoc 20年の歩み 2006年8月3日、私はpandocの最初のバージョンを私のウェブサイトにアップロードし、フリーのGPLライセンスで公開しました。Pandoc 0.1は、GHCの標準ライブラリ以外に依存関係のない、約3000行のHaskellコードで構成されていました。Markdown、reStructuredText、HTML、LaTeXドキュメントを、これらフォーマットのいずれかに、さらにRTFやS5に変換することができました。当時、これが20年以上にわたる200以上のリリースの中で最初のものであること、このプロジェクトがHaskellで書かれた最も人気のあるプログラムになること、バグ修正、改善、プロジェクト管理に数えきれないほどの時間を費やすこと、多くの国のプログラマーと協力すること、pandocが50以上のドキュメントフォーマットをサポートするようになること、自動的な引用と参考文献の生成を可能にすること、QuartoやJupyter Notebookのような学術執筆ツールに統合されること、世界中の何百万台ものコンピューターにインストールされることになるとは、全く想像もしていませんでした。どうしてこうなったのでしょうか? pandocの誕生日を利用して、私が覚えている限り、このプロジェクトの物語を語りたいと思います。 John MacFarlane 2026年8月2日 前史 人々はよく尋ねます。「なぜpandocはHaskellで書かれているのですか?」この質問には良い答えがあったかもしれません。Haskellはこの種のアプリケーションを書くのに非常に優れた言語です。しかし実際には、私はドキュメントコンバーターを書こうと決めてから、それを使う言語としてHaskellを選んだわけではありません。私はHaskellを使うことを決めて、それからその言語でドキュメントコンバーターを書くことにしました。友人の哲学者で論理学者のGreg RestallのブログでHaskellについて耳にしました。Haskellの入門書について、彼はこう言いました。「もしこれが、昔の1986年の私のコンピュータサイエンスの入門コースの教科書だったら、私はコンピューティングに夢中になり、決して哲学者にならなかったかもしれません」(consequently.org)。このこと(そして私の将来の哲学的生産性への潜在的な影響に関するRestallの警告を無視して)に興味をそそられ、私はHaskellの基本的な理解を得るために『A Gentle Introduction to Haskell』を読みました。しかし、プログラミング言語を本当に学ぶ唯一の方法は、それを使って何かを書くことです。私はHaskellがパーサーやコンパイラを書くのに適していること、そして非常に優れたパーサーコンビネータライブラリ(parsec)が付属していることを知っていたので、Markdownパーサーを書くことにしました。当時、Perl、Python、Ruby、PHPにはMarkdownの実装がありましたが、それらはすべて正規表現の変換シーケンスを通じてMarkdownを直接HTMLに変換していました。Pandocは異なるアプローチを取りました。パーサーコンビネータを使用してMarkdownを解析し、実際の抽象構文木(AST)を生成し、それをHTMLや他のフォーマットにレンダリングしました。これはより信頼性の高いアーキテクチャ(正規表現バージョンにおける多くの奇妙な点を回避)であり、より拡張性の高いものでした。N個のパーサー(「リーダー」)とM個のレンダラー(「ライター」)を書くことで、N×Mの変換をサポートできました。すぐに、私は講義ノートやハンドアウトの多くをそのフォーマットで保持していたため、reStructuredTextのリーダーを追加しました。そして、PDFを生成できるように、LaTeXのライターを追加しました。その後、Markdownのライターを追加して、reStructuredTextのノートをMarkdownに変換できるようにしました。そこからプロジェクトは雪だるま式に大きくなっていきました。このように、単なる先延ばしの産物として始まったプロジェクトは、Haskellで書くことの喜びと、私自身の学術的な仕事における有用性の向上によって育まれました。 最初のリリース(2006–8年) 2006年8月3日、私はソースコードを私のウェブサイトで公開することにしました。この時点でpandocは、HTML、LaTeX、RST、Markdownを入力および出力フォーマットとしてサポートし、RTFを出力フォーマットとしてサポートしていました。また、LaTeX経由でPDFもサポートしていました。最初のリリースでは、2人の友人にメールを送った以外、プロジェクトの宣伝は一切行いませんでした。これはソーシャルメディア(私はまだ使ったことがありません)が登場する前、GitHubが登場する前、そしてHaskellパッケージリポジトリであるHackageが登場する前でした。しかし、明らかに人々は私のウェブサイトで見つけて使い始めました。10月には、Debian開発者としての認定を受けようとしていたトルコの開発者、Recai Oktaşから連絡がありました。彼はpandocをDebian Linux用にパッケージ化したいと考えていました。そこで私は彼と協力してそれを行いました。これは私にとって素晴らしい学習経験となり、プロジェクトの知名度を大いに高めました。2007年中、私は主に自身のニーズに導かれてpandocの改善を続けました。バージョン0.3ではDocBookライターとMarkdownの現在標準となっている脚注構文が追加されました。バージョン0.4ではMarkdownテーブル、定義リスト、上付き文字/下付き文字、打ち消し線、拡張順序リスト、そしてgroff manページとConTeXtのライターのサポートが追加されました。これはHackage Haskellパッケージリポジトリに初めて掲載されたリリースであり、Hackageは2007年に開始されました。Hackageアーカイブと、依存関係を自動的に解決・取得する新しいcabal-installツールは、外部パッケージに依存する可能性を開きました。 Pandoc 1(2008–17年) Pandoc 1.0は2008年9月にリリースされ、MediaWiki、GNU Texinfo(Peter Wang提供)、OpenDocument(Andrea Rossato提供)、ODT、そして自動構文ハイライト付きの区切りコードブロック(現在は「fenced」と呼ばれています)の新しいライターが追加されました。ODTのサポートにはzipアーカイブを作成する能力が必要でしたが、当時Haskellにはそのためのパッケージがなかったため、私はそれを作成しました(zip-archive)。構文ハイライトのサポートには構文ハイライトライブラリが必要でしたが、これもHaskellには存在しませんでした。このため、私はKateテキストエディタで使用されているXML構文定義を解析し、Haskellコードハイライターに変換するhighlighting-kateを書きました。これにより、pandocは最初から多数の構文をサポートできるようになりました。このバージョンには、Andrea Rossatoのciteproc-hsライブラリを使用した、CSLスタイルによる自動的な引用と参考文献の生成サポートも含まれていました。この期間中、私は(現在廃止されている)markdown-discussメーリングリストで他のMarkdown実装者との議論に関わっていました。pandocがGitHubがfencedコードブロックを普及させるずっと前からサポートしていた区切りコードブロックの構文は、PHP Markdown ExtraのメンテナーであるMichel Fortinと協力して考案されました。pandocのMarkdownに拡張機能を追加する際には、PHP Markdown Extraの定義リスト構文をコピーするなど、先行事例に注意を払いました。この期間中、私はMarkdown構文の多くの曖昧さにも気づき、後にcommonmarkプロジェクトで改善しようとしました。pandocへの次の大きな変更は、2010年1月にリリースされたバージョン1.4で導入された柔軟なテンプレートシステムであり、ハードコードされたヘッダーを置き換え、pandocの出力をはるかにカスタマイズ可能にしました。2010年には、Google CodeからGitHubに移行し、プロジェクトの知名度をさらに高めました。2010年と2011年のさらなるリリースでは、EPUB出力、Org-mode出力(Puneeth Chagantiによる)、およびTextile入力(Paul Rivierによる)のサポートが追加されました。pandocは、私のtexmathライブラリを介して、TeX数式をMathML(DocBookまたはHTML用)に変換するサポートも得ました。2012年に公開されたPandoc 1.9では、Word docx出力を生成できるようになりました。数式を適切に処理するために、私はtexmathにWordのOMMLフォーマットのサポートを追加しました。このリリースでは、AsciiDocライターとBeamerおよびDZSlidesのサポートも追加され、1.9.3ではDocBookリーダー(長年の貢献者となったMauro Biegからの貢献を含む)が利用可能になりました。2013年には、pandocをより柔軟でカスタマイズ可能にするいくつかの機能に注力しました。最初のものは、当時普及していたMarkdownの多くのバリアントのサポートを可能にする、きめ細かなMarkdown「拡張機能」システムでした。2番目は、MarkdownにYAMLメタデータブロックを、テンプレート変数を埋める任意の構造化フィールドと共に含める機能でした。3番目は、Luaでカスタムライターを作成できる機能であり、ユーザーがアドホックな出力フォーマットをサポートできるようになりました。4番目は、JSONフィルターの導入でした。