読者です 読者をやめる 読者になる 読者になる

Blank File

LinuxとかPythonとかVimとか、趣味でいじる感じで

Python製の静的サイトジェネレータを色々試してみました

このブログははてなブログで運用していますが、最近ブログを静的サイトジェネレータで作ってGitHub Pagesにおこうかな、と考えています。 ということでいくつか静的サイトジェネレータを調べたのでまとめました。

ついでに比較用に作ったブログをいくつかGitHub Pagesで公開しておきます。 内容はこのブログの過去数回分です。 同じテーマでも日本語だと雰囲気が違ったりするので、よかったら参考にしてください。

ブログの移行を考えたきっかけは、はてなブログgifファイルのアップロードができなかったからです。 それ以外は特に不満はないのですが、せっかくなので勉強がてら静的サイトジェネレータを使ってみようかと。

私が静的サイトジェネレータに求める機能としては、

  • Markdownで書ける
    • バッククォート3つでのコードブロックも対応
  • 一からデザインするのは無理なのでそれなりのテーマがある
  • 開発が続いている
  • 画像も扱える
  • トップに表示する記事の要約の範囲指定

です。 あと、いざという時にコードを読んで対応できるように、自分の読めるPython製に絞って検討しました。 なのでJekyllやHugo、Hexoは検討していません。

逆に重視しない機能は、運用(公開)の自動化や確認用のサーバーです。 GitHub Pagesで公開する場合はghp-importを使ってghp-import [directory]してgit push origin gh-pagesするだけなので、特になくてもいいかと。 サーバーも、ビルドするコマンドさえ提供されていればliveralodを使ったスクリプトを用意するので不要でした。

今回検討した静的サイトジェネレータは以下の五つです。

他にドキュメンテーションツールSphinxやMkDocsでもhtmlを出力できますが、これらはブログ向けではないので候補から外しました。 Hydeも気になりましたが、サイトのデザインが好みでなかったのと面倒になったのでパスしました。

以下、メモです。 結論としてはとりあえずPelicanを使ってみることにしたので、その前提でお願いします。 長いです。

Pelican

日本語ブログのサンプル (pelican-bootstrap3をベースにフォントと文字サイズいじりました)

Python製静的サイトジェネレータの中では最も有名で、GitHubのスターも一番多いです。 日本語でもPelicanでブログを作った記事はたくさんありました。

テーマやプラグインが豊富でドキュメントも充実しているので、だいたいのことはなんとかなりそうです。 テーマはPelican themesスクリーンショット付きでたくさん紹介されています。

使い方はすでにたくさん公開されているので割愛します。 基本的にはpelican-quickstart -> content以下に記事追加 -> make html です。

画像はcontent/imagesディレクトリに入れておけば出力先にコピーされます。 リンクする時は{filename}/images/filename.pngで、 {filename}の部分はビルド時に設定したSITE_URLで置き換えられます。 開発用と本番用の設定ファイルが分離されているので、開発用(pelicanconf.py)ではSITE_URL=''にしておいて、本番用(publishconf.py)でSITE_URL='https://user.github.com/page/'のようにしておけば、開発(make html)と本番(make publish)でURLを切り替えられます。

記事の要約はWord数で指定できるのですが、日本語だとwordカウントが微妙だったので自分で簡単なプラグインを書きました。

テンプレートはJinja2なので、カスタマイズの敷居も低そうでした。 また、プラグイン用のフックが色々用意されているので、欲しい機能があったら自分で追加するのも簡単そうでした。

Cactus

Djangoベースの静的サイトジェネレータです。 スター数は2600くらいでかなり多い方です。 デザイナー向けを謳っていて、記事の公開など運用面でかなりサポートしてくれる感じですが、今回そういう機能は不要です。

インストールは普通にpip install cactusでインストールされます。 使い方は、サイトの新規作成がcactus create pathで、ビルドはcactus build、閲覧用サーバーの起動はcactus serveです。

ドキュメントは見つかりませんでした。 GitHubのREADMEにかなり書かれているので、それで十分ということなのでしょうか? チュートリアルのビデオはありましたが、README以上の情報はありませんでした。

Django使うとなんか大げさな気がしてそれだけで少し敬遠してしまいました・・・ あと cactus serve でサーバーを立ち上げたらいきなりエラーになって印象悪かったです・・・ 設定ファイルがjsonなのも個人的には微妙でした。

デフォルトではブログというよりもポートフォリオサイトのようなものが作られます。 ブログも作れるということでブログの例が公開されているのですが、これ記事も全部html(djangoテンプレート)で書かれています・・・ Markdown使いたかったら自分でビルドスクリプト書けということでしょうか・・・ 一応プラグインサポートもあるのかな? 誰も考えていないわけではなさそうです(First pass at Markdown-only blog posts)。

ということで、デザインはいい感じだったのですが手軽にブログが書ける感じではなかったので見送ります。

Lektor

昨年末に公開された新しい静的サイトジェネレータです。 作者はFlaskやJinja2、clickなど有名なpythonパッケージを作っているArminさんです。 Flaskを作った方ということで、拡張性・柔軟性も強く意識しているようです。 ドキュメントも充実しています。 ただ、まだptyhon3で動かないみたいですね・・・これは厳しい・・・ Issueは立っていたので、すぐサポートされると思います。

これは普通の静的サイトジェネレータとは毛色が異なります。 記事を書いたり画像などのリソースを追加したり、コンテンツの管理は基本的に管理画面または専用のアプリから行うようです。 ローカルでhtmlファイルを出力するという意味では静的サイトジェネレータなのですが、運用面ではWordPressなどのCMSに近い感じです。

コマンドラインから操作する場合は、まずlektor quickstartでプロジェクトを作って、そこでlektor serverするとサーバーが立ち上がります。 http://localhost:5000にアクセスすると寂しい感じのページが表示されると思います。 http://localhost:5000/adminにアクセスすると管理画面が開いて、そこから記事の追加などが行えます。

記事本文はMarkdownで書けます。 管理画面からプレビューもできます。 記事のデータはテキストで保存されるのですが、.lrという専用?のフォーマットです。 直接テキストを編集するような使い方はあまり想定されていないのかもしれません。

公開されたばかりなので、テーマが少ないのは仕方ないと思います。 テンプレートエンジンは当然Jinja2なので、自分で作るのも難しくはないと思います。

私はVimで記事を書きたかったので見送りました。 WordPressのような感じで管理画面から記事を投稿したい人や、複数人で共同してサイトを作成する場合などはいいかもしれません。 まだできたばかりなので、興味ある人は今から使ってテーマやプラグインを作ると第一人者になれますよ!

Nikola

日本語ブログのサンプル

普通の静的サイトジェネレータです。 python-announce-listに頻繁に更新メールが送られてくるので、開発は活発だと思います。

Pelicanよりもマイナーなのでテーマや情報は少ないです。 ドキュメントは非常に充実しているので、使う上で困ることはそんなになさそうです。 機能は豊富だと思います。

デフォルト(デモ?)のサイトを作るのはnikola init --demo [path]です。 後はnikola buildとかnikola serveでビルドしたり閲覧用のサーバーを起動したりできます。 デフォルトのフォーマットはrstですが、設定ファイル(conf.py)に以下の行を追加することでmarkdownも使えます。

POSTS = (
    ("posts/*.md", "posts", "post.tmpl"),  # ここを追加
    ("posts/*.rst", "posts", "post.tmpl"),
    ("posts/*.txt", "posts", "post.tmpl"),
    ("posts/*.html", "posts", "post.tmpl"),
)

nikola new_postで新しい記事が作れるのはいいですね。 どの静的サイトジェネレータもタイトルや日付などのメタデータを入力する必要があったのですが、フォーマットを覚えてられないので他の記事からコピペして使うのが地味に面倒でした。 (Pelicanはプラグインとかありそうですが、見つからなかったのでスクリプトを書きました。)

画像などの静的ファイルはfilesディレクトリに放り込めば出力先にコピーされます。 困ったのはコンテンツへのリンクでした。 設定ファイルのSITE_URLでサイトのURLを指定するとそこを起点としたリンクが作成されるのですが、これを開発環境と本番環境で切り替える方法がわかりませんでした。 組み込みのサーバ(nikola serve)を立ち上げてローカルで確認する場合はローカルのリンクに変換されているようなので、これを使えばそんなに不便はないと思います。 私は組み込みのサーバーを使わずにlivereloadでファイルの変更を検出して自動でビルド・ブラウザのリロードまでしたかったのですが、ちょっとその方法はわかりませんでした。

記事の要約は、区切りとなるコメントを挿入することで範囲を指定できます。 Markdownの場合、デフォルトでは<!-- TEASER_END -->というコメントまでが要約になります。 はてなブログと同じ<!-- more -->を使いたかったので、設定ファイルで以下のように設定しました。

INDEX_TEASERS = True
TEASER_REGEXP = re.compile(r'<!--\s*(more)(:(.+))?\s*-->')

今回見送った理由は、上記の理由の他に、ビルドにかかる時間が他より長く感じたからです。 長いと言っても数秒で終わるのですが、なんとなく不安を感じて。 あと、なんかプロジェクトのロゴが残念な感じだったので。

サンプルを見ていただければわかりますが、デフォルトのbootstrapを使ったデザイン結構いい感じです。 珍しいものでサイトを作りたい人にはいいかもしれません。

Ark

日本語ブログのサンプル

めっちゃマイナーです(githubのスター20個くらい)。 つい最近pypiに登録されたばかりです。

実は静的サイトジェネレータでブログを作ろうかと思ったきっかけの一つはこれです。 デフォルトのテーマがかっこいいんですよ。 WordPressのtwentyfifteenがベースらしいのですが、WordPressはこんなにかっこいいテーマがすぐ使えるんですね、人気なの納得しました。

機能はシンプルです。 新しいので情報はないに等しいと思うのですが、ドキュメントが充実しているので意外と普通に使えました。 むしろドキュメントが充実していて機能もシンプルなので、CactusやLektorよりとっつきやすかったです。

使い方は簡単で、pip install ark でインストールして ark init すると必要なファイルが用意されます。 あとは ark build すれば out ディレクトリに出力されます。 とはいえ、いざとなったらソースを読む覚悟は必要です。 今回、サイトのタイトルを設定する方法がわからなかったのでソース眺めましたが、設定ファイルにtitle='タイトル'で設定出来ました。 このあたりはテーマ(テンプレート)次第な気もしますが。

ブログ記事は src/[posts] ディレクトリに置くだけです。 新規記事の作成や既存記事の編集はコマンドも用意されていて、ark edit posts filenameで作成・編集できます。 各記事はMarkdownで書けて、ファイルの最初にメタデータとしてタイトル、日付を書き、後は本文を書くだけです。 メタデータには著者やタグなども書けます。 コマンドから作成した時は時刻が入力されています。

Markdownの拡張はconfig.pyに以下の設定を追加する必要がありました。

markdown = {
    'extensions': ['fenced_code', 'codehilite', 'extra']
}

画像などはsrc以下のディレクトリに置けば出力時にコピーされます。 ディレクトリも追加可能なので、src/imagesなどのディレクトリを作っておけば同じ構造で出力されます。 リンクは@root/で始めれば設定ファイル(config.py)で指定するサイトのルートURLに置き換えられます。 ルートURLを開発用と本番用で切り替えるコマンドなどはないようですが、ルートURLを空(root="")にしておくと上記の@root/の部分を相対リンクに変換してくれるので、特に問題なく使えました。

正直かなり惹かれました。 作者の方は(これ用なのかわかりませんが)Markdownの方言?的なもの(Syntex)やDjango/Jinja風のテンプレートエンジン(Ibis)も作って公開しています。 このジェネレータはそれらの形式もサポートしていますが、今回は興味なかったので内容は確認しませんでした。 デフォルトでMarkdownやJinja2もサポートしているので実用上問題ありません。

採用しなかった理由は、さすがにマイナー過ぎて今後が心配なことと、記事の要約を出力する機能がみつからなかったことです。 プラグインの機構はあるので拡張で作れそうですが、要約出力から作る必要がありそうで、ちょっとめんどくさそうでした。 よく見たら記事のアーカイブもない? 設定で出せるんでしょうか。 タグ一覧は設定があったので出せると思います(未確認)。

ブログ用に使うのはまだちょっと厳しい感じでした。 小さなプロジェクトのページくらいなら使えそうな気がします。

まとめ

結局Pelicanを使ってみることにしました。 テーマが豊富なのは大きいです。 せっかくなのでマイナーなものとか新しいものに挑戦したかったのですが、結局無難なところに落ち着いてしまって悲しい・・・ Arkは何かのプロジェクトページで使うかもしれません。

あとがき

この記事書いてたらmattnさんがJekyll 3.0の記事を公開していました。

Big Sky :: GitHub Pages が Jekyll 3.0 になり、ますますブログが書きやすくなった。

Jekyllも便利そうです。