nanocとは
nanocはRuby製の静的サイトジェネレーターです。
静的サイトジェネレーターとは、固定的な内容のウェブサイトを作るのに使われるサイトジェネレーターです。
ホームページ制作ツールのような複雑な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
は自動で削除されます。