40
Sphinx HTML Theme Hacks @shkumagai Oct 26, 2014 SphinxCon 2014

Sphinx HTML Theme Hacks

Embed Size (px)

DESCRIPTION

Sphinxcon2014でSphinxのHTMLテーマに関して話した際のスライドです。

Citation preview

Page 1: Sphinx HTML Theme Hacks

Sphinx HTML Theme Hacks

@shkumagai Oct 26, 2014

SphinxCon 2014

Page 2: Sphinx HTML Theme Hacks

Ad system backend enginner using Python, Common Lisp, Java, C++... Sphinx-Users.jp member Sphinx HTML Theme Author - sphinxjp.themes.bizstyle - sphinxjp.themes.dotted - sphinxjp.themes.impressjs - sphinxjp.themes.tinkerpress

@shkumagai

Page 3: Sphinx HTML Theme Hacks

話すこと

• HTMLテーマとは

• HTMLテーマの構造

• HTMLテーマの作り方

• パッケージングと配布

Page 4: Sphinx HTML Theme Hacks

HTMLテーマとは

Page 5: Sphinx HTML Theme Hacks

HTMLテーマとは

• Sphinxで「make html」を実行して出力されるHTMLの見せ方をまとめたもの

• 標準で8種類のテーマがある

• バージョン0.6から導入された機能

• 1.3からはbizstyleも組み込みとして使えます

Page 6: Sphinx HTML Theme Hacks

組込みテーマの使い方• conf.pyに次のように指定して...

html_theme = "default" html_theme_options = { "rightsidebar": "true", }

• いつものように「make html」するだけ

Page 7: Sphinx HTML Theme Hacks

どう適用されてるか

• conf.pyのhtml_theme変数の値を元に、Sphinxのパッケージのthemesディレクトリから該当するテーマのファイル群を取得。

• HTML Builderの初期化のタイミングで、テーマを初期化。

• HTML生成時にテーマのテンプレートを使ってドキュメントを生成。

Page 8: Sphinx HTML Theme Hacks

HTMLテーマの構造

Page 9: Sphinx HTML Theme Hacks

HTMLテーマの構造

HTML_THEME_PATH/ └ THEME_NAME/ ├ theme.conf ├ layout.html ├   : └ static/ ├ THEME_NAME.css └ THEME_NAME.js

Page 10: Sphinx HTML Theme Hacks

HTML_THEME_PATH

• Sphinx HTMLテーマが配置されているパス

• デフォルトではインストールされたSphinxパッケージの中のthemesディレクトリ

• conf.pyを使って任意のパスを指定可能

Page 11: Sphinx HTML Theme Hacks

theme.conf

• HTMLテーマの全体の構成を定義するファイル

• 他のテーマを継承するか?

• Pygmentsのスタイルは何を使うか?

• 独自オプションは何があるのか?

Page 12: Sphinx HTML Theme Hacks

layout.html

• 実際に表示されるHTMLの元になるテンプレートの土台

• 記述言語はJinja2

• 別テンプレートを継承したり、マクロを定義したりできる

• カスタマイズするとき、ここから読み始めるとよい(個人の感想です)

Page 13: Sphinx HTML Theme Hacks

THEME_NAME.css

• テーマ専用スタイルを定義するスタイルシート

• しかし必須ではない

• 静的テンプレートで値の埋め込みもできる

Page 14: Sphinx HTML Theme Hacks

HTMLテーマの作り方

Page 15: Sphinx HTML Theme Hacks

テーマを作る

• まず、名前を決める。名前重要。

• ここではsphinxcon14という名前のテーマを作ってみる。

Page 16: Sphinx HTML Theme Hacks

用意するもの

• theme.conf

• layout.html

• sphinxcon14.css

Page 17: Sphinx HTML Theme Hacks

ファイルの配置

sphinxcon14/ ├ theme.conf ├ layout.html └ static/ └ sphinxcon14.css

Page 18: Sphinx HTML Theme Hacks

theme.conf

• themeとoptionsの2つのセクションで構成されている。

• themeセクションは必須。optionsは任意。

• 事実上、HTMLテーマの核。

• 何は無くともtheme.confだけは書く。

Page 19: Sphinx HTML Theme Hacks

theme.conf

[theme] inherit = basic stylesheet = sphinxcon14.css pygments_style = friendly

Page 20: Sphinx HTML Theme Hacks

layout.html

• doctype, header, footer, relbar, sidebar, content 等のブロックで構成されている。

• ベースのテーマを継承する場合は、継承の宣言を記述して、変更したい部分だけ上書きしたり、新規に追加したりする。

• 継承しない場合は、必要なものを全て書く。

Page 21: Sphinx HTML Theme Hacks

layout.html

{% extends "basic/layout.html" %}

{# put the sidebar before the body #} {% block sidebar1 %}{{ sidebar() }}{% endblock %} {% block sidebar2 %}{% endblock %}

{# doctype override #} {%- block doctype %} <!doctype html> {%- endblock %}

Page 22: Sphinx HTML Theme Hacks

sphinxcon14.css

• layout.htmlを使って出力されるHTMLに対して適用するスタイルを記述していく。

• 最初から全部自分で書くよりも、既存のテーマの記述を真似て少しずつ変更していく方が手をつけやすい。

Page 23: Sphinx HTML Theme Hacks

sphinxcon14.css@import url("basic.css");

body { font-family: 'Lucida Grande','Geneva', 'Verdana', sans-serif; font-size: 14px; letter-spacing: -0.01em; line-height: 150%; text-align: center; background-color: white; background-image: url(background_b01.png); color: black; padding: 0;

margin: 0px 40px 0px 40px; } :

Page 24: Sphinx HTML Theme Hacks

ファイルの配置(再掲)

sphinxcon14/ ├ theme.conf ├ layout.html └ static/ └ sphinxcon14.css

Page 25: Sphinx HTML Theme Hacks

実際に使ってみるproject_root/ ├ conf.py ├ index.rst ├ sphinxcon14/ │ ├ theme.conf │ ├ layout.html │ └ static/ │   └ sphinxcon14.css ├ _build └ _static

Page 26: Sphinx HTML Theme Hacks

conf.py

html_theme = "sphinxcon14"

html_theme_path = ["."]

• html_themeにはテーマの名前(=ディレクトリの名前)を指定する。

• html_theme_pathは任意のパスを指定する。conf.pyからの相対パスも指定できる。

Page 27: Sphinx HTML Theme Hacks

パッケージングと配布

Page 28: Sphinx HTML Theme Hacks

作った、はいいけれど

• ドキュメントのプロジェクトを作成する度にテーマのディレクトリをコピーするのはダルい。

• テーマを修正したとき、使っているプロジェクトすべてにさっと反映したい。

• プロジェクトごとに独自の変更をしてしまって収集がつかなくなる。

Page 29: Sphinx HTML Theme Hacks

解決方法

• テーマディレクトリの中身をZIPアーカイブする

• テーマをパッケージにする

Page 30: Sphinx HTML Theme Hacks

ZIPアーカイブする

• HTMLテーマのディレクトリ構造の中身を、そのままZIPでアーカイブ化するだけ(アーカイブにテーマディレクトリ自身は含めない)。

• ドキュメントプロジェクトへの配置方法は、ディレクトリの時と同じ。

Page 31: Sphinx HTML Theme Hacks

ZIPアーカイブする

$ cd sphinxcon14 $ zip -r ../sphinxcon14.zip *

$ unzip -Z sphinxcon14.zip ... layout.html ... static/ ... static/sphinxcon14.css ... theme.conf

Page 32: Sphinx HTML Theme Hacks

ZIPアーカイブの利点

• テーマのZIPファイル1つを配布すればテーマの適用が可能。

• 修正後の再配布も、ディレクトリのまま配布するよりは簡単。

Page 33: Sphinx HTML Theme Hacks

パッケージにする

• HTMLテーマを独立した1つのパッケージに仕立てる。

• テーマをインストールして、conf.pyでテーマを指定することでドキュメントにテーマを適用する。

• 例: sphinxjp.themes.bizstyle

Page 34: Sphinx HTML Theme Hacks

パッケージの利点

• pipやsetuptoolsでインストールできる。

• (実装方法に依存するが)conf.pyの変更箇所が少なくて済む。

• PyPIに上げれば世界中の人に使ってもらえる機会が得られる。

Page 35: Sphinx HTML Theme Hacks

参考資料

Page 36: Sphinx HTML Theme Hacks

• HTML theming supporthttp://sphinx-doc.org/theming.html

• Templatinghttp://sphinx-doc.org/templating.html

• The build configuration filehttp://sphinx-doc.org/config.html

Page 37: Sphinx HTML Theme Hacks

• sphinxjp.themes.bizstylehttps://bitbucket.org/shkumagai/sphinxjp.themes.bizstyle

• sphinxjp.themes.dotted https://github.com/shkumagai/sphinxjp.themes.dotted

• sphinxjp.themes.impressjshttps://github.com/shkumagai/

sphinxjp.themes.impressjs

Page 38: Sphinx HTML Theme Hacks

• Sphinxのテーマを継承して体裁をカスタマイズしようhttp://heartbeats.jp/hbblog/2013/08/sphinx-customize-theme.html

Page 39: Sphinx HTML Theme Hacks

Any Question?

Page 40: Sphinx HTML Theme Hacks

Have a nice Documentation!