はじめに
先輩、飲みます? nikkieです。
Python Boot Camp(a.k.a. pycamp)のライディングページをSphinxで作って得た知見をアウトプットするシリーズです。
このページ、HTMLなのでmake html
でビルドしてると思うじゃないですか〜1。
実はmake singlehtml
を使うという工夫2をしてるんです!
目次
ドキュメント変換ツールSphinx
Sphinx(スフィンクス)は、あるルールに従って記述されたテキストファイルを、HTMLやPDFなどの形式に変換するドキュメント変換ツールです。
『Sphinxをはじめよう 第3版』(1章)より
pycampランディングページはreStructuredText(reST)というルールに沿って書いたテキストファイル群をHTMLの形式に変換しています。
HTMLをGitHub Pagesでホストして、Webに公開しています。
Sphinxはsphinx-quickstart
でプロジェクトを初期設定できます3。
そのときにMakefile
も作られます。
このMakefile
を使ってmake html
とすると、reSTファイルがHTMLに変換されます!(=reSTからHTMLをビルド)
SphinxのMakefileの秘密
SphinxのMakefile
はsphinx-build
というコマンドをラップしているんです!
make html
はsphinx-build -M html
と渡ります4。
-M
オプションとは別に、ビルダーを指定する-b
オプションもあります(-M
は-b
のAlternative(=-b
に取って代わるもの)という説明です)。
ドキュメントによると-M
オプションは-b
オプションで指定できるビルダーに、いくつかのビルドパイプラインを追加したものです(latexpdfなど)。
singlehtml
ビルダー
-b
オプションには(よく使われるhtml
の他にも)さまざまなビルダーがあります。
その1つがsinglehtml
です5。
すべてのコンテンツが含まれる、単一のHTMLを生成します。(
sphinx-build
のドキュメントより)
pycampのランディングページは1枚に情報を集約している6ので、ドキュメントで偶然singlehtml
を見つけたときに「これだ!」と思いました。
singlehtml
ビルダーの実装はSingleFileHTMLBuilder
です。
SingleFileHTMLBuilder
をはじめとするBuilderクラスのドキュメントを読むと、name
属性がsphinx-build
の-b
オプションに対応しています。
過去の記事との関連
pycampランディングページの実装(reSTファイル群)はGitHubで公開しています。
reSTファイルは細かく分割し、include
ディレクティブを活用しています7。
分割したファイルは*.rst.txt
として、以下の記事で取り上げたwarningが生じないようにしています。
もう一つ別の話題を。
SingleFileHTMLBuilder
のformat
属性の値は"html"
です。
つまり、GitHub Pagesで公開するときはsphinx.ext.githubpages
が使えます!
終わりに
pycampランディングページで使っているmake singlehtml
を紹介しました。
本記事執筆中に偶然知ったのですが、とほほのPython入門でも取り上げられています!(「複数HTML以外の形式にビルドする」)
「単一のHTML生成の使いどころだ!」と気付いたらぜひ使ってみてください。
- ここが俺ガイルのいろはすっぽいなと思ったので、今回の挨拶はいろはすです! ちゃんとあやねるの声で脳内再生してくださいね、先輩↩
- https://github.com/pyconjp/pycamp.landing_page/blob/4b57021eb2a3d1d50b6d9a924050c1545a461f39/.github/workflows/publish.yml#L24↩
- https://www.sphinx-doc.org/ja/master/man/sphinx-quickstart.html↩
-
手元の
Makefile
の中を見てもよいですし、元となるテンプレートは https://github.com/sphinx-doc/sphinx/blob/v5.3.0/sphinx/templates/quickstart/Makefile.new_t#L20 と思われます↩ -
-M
オプションには-b
オプションのビルダーも指定できるので、もちろんsinglehtml
も指定できます↩ - ペライチで作っていたサイト(=ページ1枚)を移行したいという背景があり、nikkieが「まかせて!」と取り組みました↩
- 例えば https://github.com/pyconjp/pycamp.landing_page/blob/4b57021eb2a3d1d50b6d9a924050c1545a461f39/source/index.rst (Rawで見てみてください)↩