nanocとは
静的サイトジェネレーターとは、固定的な内容のウェブサイトを作るのに使われるサイトジェネレーターです。
ホームページ制作ツールのような複雑なIDEではなく、コマンドラインとエディタでサクっとサイトが作れるので、プログラマーには人気があります。
昨今はそうしたツールでブログを公開する人も珍しくなくなりました。
ちなみにこの記事ではnanocの使い方は説明しません。本家に丁寧な説明があるので、そちらを参照して下さい。
jekyllとの違い
Ruby製の静的サイトジェネレーターといえば、jekyllも有名ですが、最近はnanocを主に使っています。
理由は記事の変換処理を柔軟に扱えるからです。
jekyllでも記事を変換する場合に、独自の処理を設定することは出来ますが、変換エンジン「そのもの」の切り替えしかできません。
しかしnanocでは、変換処理をfilter
という単位で分割定義できて、それらを記事の「メタデータ」に応じて自由に組み合わせて適用させることができます。
例えば「コードハイライトの前処理は、プログラミング系の記事にだけ適用する」といった具合にです。
サンプルケース
マークダウンをCSSフレームワークと合わせて使った場合、デフォルトの出力では困ることがありますよね。
例えばタグに、そのCSSフレームワークで使う特別なクラス属性を付けたかったりとか。
でもマークダウンで次のように書くと、
## これはH2
もちろん次のように変換されるわけですが、
<h2>これはH2</h2>
こういう風に出したい時もあるわけじゃないですか。
<h2 class="my-header">これはH2</h2>
こういう場合、そのまま生でタグを打ってもいいのですが、せっかくマークダウンを使っているのですから、楽をしたいものです。
というわけで、nanocのfilter
を定義しちゃいましょう。
filterを定義する
要件定義として、次のように宣言したら目的のコードが出力される、としましょう。
[myheader2 これはH2]
要はこのコードをマークダウンにかける前に、正規表現で目的のコードに変換すればいいのです。
そこでlib/filters.rb
などというファイルを作り、次のような処理を書いて、my_header
という識別子のフィルタを定義します。
class MyHeader < Nanoc::Filter identifier :my_header type :text def run(content, params={}) content.gsub(/\[myheader(\d)\s+(.+?)\]/, "<h\\1 class='my-header'>\\2</h\\1>") end end
次にRules
というファイルで、今作ったmy_header
というfilterを、マークダウン変換の前に差し込みます。
compile '*' do if item[:extension] == 'md' filter :my_header # <- これを追加! filter :kramdown # マークダウン変換処理 layout 'default' end end
しかしこれだと、全てのマークダウンファイルにmy_header
フィルタを通してしまいますよね。
なので、itemにuse_my_syntax
というメタデータが設定されているときだけ適用させるようにしてみます。
compile '*' do if item[:extension] == 'md' if item[:use_my_syntax] then # 独自文法使う? filter :my_header # <- これを追加! end filter :kramdown # マークダウン変換 layout 'default' end end
比較としてjekyllの独自コンバーター定義の方法を抜粋しておきます。
class Jekyll::Converters::Markdown::MyCustomProcessor def initialize(config) require 'funky_markdown' @config = config def convert(content) ::FunkyMarkdown.new(content).convert end end
上記のconvert
という関数を拡張するわけですが、見たらわかるように引数として元記事のcontent
しかもらえないわけです。
しかしnanocでは記事に付いたメタデータを見ながら処理を分岐できるので、これは大きなアドバンテージです。
ちなみに記事のメタデータを付ける方法は、記事の先頭に次のようなヘッダーを書くだけです。
--- use_my_syntax: true ---
ヘッダーはYAML
で記述します。
最後に
最後に、nanoc.ymlのprune
について。
prune: auto_prune: true exclude: [ '.git', '.hg', '.svn', 'CVS', ".gitignore", "push.sh" ]
auto_prune
を有効にすると、使用されていないファイルを削除してくれます。
デフォルトでは有効になっていませんが、true
に設定することをおすすめします。
これを有効にしてないと、元記事のファイル名を変えた時に、古いファイルが出力先に残り続けてしまいます。
例えばあるときにtop.md
というファイルを、welcome.md
に変えたくなったとしましょう。
そのまま放置してしまうと、出力先にtop/index.html
というファイルが残ってしまいます(a.mdはa/index.htmlに出力されるのがデフォルトのルール)。
しかしprune
をtrue
にしておくとtop/index.html
は自動で削除されます。