素晴らしきNikola

カテゴリ:  Tech タグ:  blogging nikola web
/images/nikola.jpg

ブログの静的ジェネレータをPelicanからNikolaに移行して以来設定を調整したりテーマを カスタマイズしています。

Pelican自体も優れたジェネレータで柔軟性が高く、かつ数多くのプラグインが作られているので かなり自分で思ったようにサイトをカスタマイズできます。

一方でNikolaの方は、ビルトインで多くの機能が実装されており、プラグインなどを多くインストール しなくとも、Out of the boxですぐに色々と実現できてします。

カスタマイズはしばらく続くと思いますが、感心したNikolaの素晴らしさを紹介します。

テーマの修正のしやすさ

Nikolaのテーマは、 Themes for Nikolaのページ にまとめられています。 Pelicanほどたくさんのテーマが作られている訳ではなさそうです。

以前書いたよう、私はHugoベースのテーマであった Hemingwayをポートしたテーマを カスタマイズして使用しています。テーマのカスタマイズの際に驚いたのが、 テーマのコード量が異様に少ないことです。

例えば、以前私が使っていたPelican用のテーマの場合、テンプレートだけで23ファイルありました。 現在 Nikolaで採用した Hemingwayのテーマはテンプレートが4ファイルしかありません。

これは、Nikolaのテーマが親テーマを継承して作成され、差分のみの作成で新たなテーマが作成できる ためです。

Nikolaはテンプレートエンジンの種類(mako/jinja)と基本となるCSSフレームワークの組み合わせで 基本となるテーマとして、以下の4種類が用意されています。

  • bootstrap3

  • bootstra-3-jinja

  • base

  • base-jija

Nikolaでテーマを作成する際には、これらのテーマを親テーマとして作成することが奨励されています。 例えば、私が使っているHemingwayは baseテーマを継承しています。Hemingwayのテンプレートは 4ファイルしかありませんが、用意されていない部分については baseテーマの設定が使用されます。

これによりテーマのコード量が減るので見通しが良くなり、かつ、どのテーマも似た構成になるので カスタマイズの際にテーマの構造を把握しやすくなります。

一方で継承を使うことで、テーマの自由度が減りそうです。 しかし、親クラスの内容を変更したければ継承したテーマ側で上書きできるので、 今のところ困ることはないように思います。実際テーマ側で実装していない部分でカスタマイズしたい 場合は親テーマからテンプレートなどをコピーして変更をかければなんでもありです。

これだけテーマが作りやすいならもう少しテーマの数が増えても良さそうです。

Pelicanの場合はテーマはリポジトリからダウンロードしてPelicanのフォルダに放り込むという 方式のため誰でも自分のリポジトリを公開できます。対して、Nikolaのテーマは以下のよう nikolaコマンドで導入します。

$ nikola theme -i hemingway

このコマンドで扱えるようにするにはテーマ作成後 Nikolaで正式にコマンド対応 するにはNikolaのリポジトリーに追加してもらう必要がありそうです。 継承をベースにカスタマイズできるのでカスタマイズ自体はハードルが低いのですが、 他人にテーマを公開する部分が敷居が高そうですね。

実際には Pelicanと同じように自分のリポジトリーで公開し、Themeフォルダに配置するように すればテーマとして扱えるのですが。

Listings

Nikolaで新しいサイトを作成すると、 "Listings"というフォルダが作成されており サンプルと思われる ”hello.py""というPythonのソースファイルを置かれています。

「これは一体何をするフォルダなんだろう」とマニュアルを確認してみると、 以下のようなディレクティブでこのフォルダに配置したファイルを記事などに取り込めるようです。

.. listing:: 2020/06/hello.py python

実際に、上記のコードで取り込んでみたのが以下です。

2020/06/hello.py (ソース)

#!/usr/bin/python

import sys


def hello(name='world'):
    greeting = "hello " + name
    print(greeting)


if __name__ == "__main__":
    hello(*sys.argv[1:])

プラグインなしで、標準機能でこれができるのは大変便利です。

記事に埋め込みたいソースコードなど、記事のソースに長々と貼り付けるのでなく Listingsフォルダにソースのまま配置して記事から上記の手順で参照し取り込むことができます。 しかも、ファイル名の後にファイルの種別を指定しておけば、 Pygmentsでシンタックスハイライト してくれるのでGist以上にお手軽です。

Post List機能

Listings フォルダを調べていて最初混乱してしまったのですが、Nikolaでは Post Listという機能をサポートしています。

これは、執筆している記事中でNikolaで管理している他の記事の一覧を取得する 機能です。

一覧の取得はメタ情報で対象を絞ったり、出力件数の制限を欠けるなどの指定も 可能です。例えば、「"subaru"というタグを持つ、直近の3記事の一覧」を得るには 以下のように post-listディレクティブを使用して指定します。

.. post-list::
    :tags: subaru
    :stop: 3

以下が出力例です。

この機能をうまく使えば、「関連記事」などを記事の末尾に付与するのも簡単です。

これも標準機能ですから、驚きです。

まとめ

日本では、というより世界でも Pelicanの方がメジャーで Nikolaの情報が なかなかないのですが、当初は豊富なPelicanのプラグインで実現していた 機能などは諦める覚悟もしていました。

実際に使ってみるとほとんどの機能は Nikolaの標準機能で実現できてしました。

日本語でのユーザが発信している情報は少ないですが、公式ドキュメントは整備されており 標準機能でかなりのことができます。

静的ジェネレーターを使っている方は、是非一度お試しを。

早速ですが、

コメント

Comments powered by Disqus