静的サイトジェネレータ Miyadaiku
ここ数年、www.python.jp は、 Pelican を使って構築していた。
Pelican は実績のある静的サイトジェネレータで使いやすくはあるが、基本的にはBlogサイトの構築ツールであり、あまり柔軟性や拡張性には重点を置かれていないように感じていた。www.python.jp 以外でもいくつかのサイト構築に使用したが、以下のような不満を感じていた。
アーティクルに Jinjaテンプレートを書きたい
reStructuredTextやMarkdown には、定型文などを記述するため手段として、エクステンションやディレクティブなどを開発して組み込む仕組みがあるが、開発・管理はそれなりに面倒で、そう気軽には作れない。Jinjaのマクロ機能などを使って、手軽に拡張できる仕組みがほしい。
アーティクル全体を検索するAPIがない。このため、Blogサイトなどでよくある、サイドバーに「最近の記事ボックス」などを表示する機能の実装が難しい。
サイトのデザインテーマを指定して既存のデザインを共有する機能があるが、テーマとして指定できるのは一つだけしかなく、指定したテーマ以外からテンプレートやCSS、Javascriptの共有手段する手段がない。
目次の作成機能がない
などだ。
それでは、ということで独自に静的サイトジェネレータを開発した。
Jinja2テンプレート
Miyadaikuでは、reStructuredTextとMarkdown用にJinja2を記述するための 拡張 を提供しており、テンプレートだけでなく、コンテンツ中でもJinja2でHTMLを生成できる。
Sample Miyadaiku article --------------------------- This is a *plain* reST article. .. jinja:: {% for i in range(10) %} <p>{{ i }}</p> {% endfor %}
テーマ
作成したテンプレートやCSS、画像などの素材・コンテンツからPythonのパッケージを作成し、テーマとして再利用できる。Miyadaikuには組み込みのテーマとして
miyadaiku.themes.base - 必要最低限のHTMLテンプレートと、Google Analytics や Open Graph などの、汎用的なマクロを提供
miyadaiku.themes.pygments - Pygmentsによる構文ハイライト用CSS
などがある。
また、別パッケージとして、次のようなテーマを提供している。
- miyadaiku.themes.jquery - プロジェクトに jQueryを組み込む
- miyadaiku.themes.bootstrap4 - プロジェクトにBootstrap4を組み込む
- miyadaiku.themes.fontawesome - プロジェクトにFontawesomeを組み込む
テーマは通常のPythonパッケージと同様に pipなどでインストールし、同時に複数のテーマを利用できる。また、テーマが利用しているテーマは自動的にインポートされる。
API
Jinja2テンプレートからコンテンツの表示や検索を行うAPIにアクセスできるので、独自のページ構成や目次などを自由に作成できる。
コンテンツオブジェクトはアーティクルなどのコンテンツや画像などの素材ファイルなどにアクセスするオブジェクトで、タイトルやカテゴリなどのメタデータの参照や、ページへのリンク作成などを行える。
コンテンツコレクション は、すべてのコンテンツを管理するオブジェクトで、条件を指定してコンテンツを検索できる。検索条件として、プロパティやタグなどのメタデータや、格納ディレクトリなどを指定できる。