Sphinx 文書に markdown フォーマットを利用する

この記事は Sphinx アドベントカレンダーの 19日目です。

markdown と Sphinx (reST)

Sphinx では文書を書く際の記述フォーマットに reStructured Text を利用していますが、
世を広く見回すと、github 然り、bitbucket 然り、様々な場所で markdown フォーマットが利用されています。
markdown フォーマットは reST と比べると表現力が低い上、表現を拡張することができないという点が指摘されています。
表現を拡張することができないため、いくつかの方言が存在するという問題もあります。

ですが、reST と比べてシンプルで、なおかつポピュラーに利用されているフォーマットであるため、
新しく Sphinx に触り始める人の取っ掛かりとしては、markdown はうってつけのフォーマットと言えます。

sphinxcontrib_markdown

それでは、Sphinx を markdown を利用するための拡張 sphinxcontrib_markdown を利用します。
今しがた作ったばかりの新しいプログラムなので、gist からソースコードを保存してください。

$ wget https://gist.github.com/raw/4336929/25dfcaad2b2d63a973617757062cec3ab9c31c35/sphinxcontrib_markdown.py

そして、conf.py に以下の記述を追加します。

sys.path += ["."]
extensions += ["markdown"]
 
markdown_title = 'hello world'
source_suffix = '.md'

そして、markdown で書かれた文章を Sphinx プロジェクトディレクトリに配置します。
なお、この時に index.md というファイル名は利用しないでください

あとは、いつもどおり make を実行します。

$ make html

そうすると、markdown を Sphinx で変換した HTML を得ることができます。
もちろん PDF や ePub にも変換することが可能です。

sphinxcontrib_markdown の仕組み

sphinxcontrib_markdown は Sphinx が markdown ファイルを読み込む際に、
pandoc を利用して自動的に reST フォーマットへ変換して Sphinx に取り込んでいます。

また、markdown には toctree に相当するものがなく、各ページをつなぐ目次を生成することができないため、
sphinxcontrib_markdown モジュールでは、ソースとなる markdown ファイルすべてに対する toctree を自動的に生成します。
そのため、make html を実行すると自動的に index.md が生成されます。

まとめ

今日は Sphinx から markdown フォーマットを利用するための sphinxcontrib_markdown モジュールを作成しました。
内部では様々なイベントハンドラを利用したり、Sphinx に実行時パッチを当てて動きを変えたりと、
割と無茶なことをしていますが、Pro GIT を変換してみたところ
特にエラーなく Sphinx ドキュメントとして変換することができました。(一部 pandoc 由来のワーニングが出ます)

僕自身は普段まったく markdown を書かないため、「作ってみた」に近い状態ですので、
どなたか実際に使ったりいじったりして、突っ込んでもらえると助かります。


では、明日は @r_rudi さんの番です。楽しみにしてます :-)