Nanoc+Markdownでコードのシンタックスハイライト
NanocではColorizeSyntaxフィルターを使うことでコードの色づけができる。
codeタグのクラスを「language-<言語名>」のように指定すると、その言語用に色付けされる。
<code class="language-ruby">
が、Markdownで書いているとタグにclassを当てることができない。
そこでフィルターを書いてみた。
lib/default.rbに書いてもいいし、適当にファイルを分けてもいい。
module Nanoc3::Filters class CodeWithLanguage < Nanoc3::Filter def run(content, params={}) content.gsub(/<pre><code>@@@(.+)/, '<pre><code class="language-\1">') end end Nanoc3::Filter.register '::Nanoc3::Filters::CodeWithLanguage', :code_with_language end
ShowOffと同じようにコードブロックの一行目を「@@@<言語名>」と書くと、codeにクラスが当たってシンタックスハイライトが効くようにしてみた。
これをRulesでColorizeSyntaxフィルターよりも前に適用する。
compile '*' do if item.binary? # don’t filter binary items else filter :erb filter :redcarpet filter :code_with_language filter :colorize_syntax, :colorizers => {}, :coderay => { :css => :style } layout 'default' end end
Markdown文書内では以下のように書く。
@@@ruby # -*- coding: utf-8 -*- class Hoge def hige "hoge-hige" end end
きちんとシンタックスハイライトされる。
フィルター素晴らしい。
ColorizeSyntaxについて
シンタックスハイライトを行うフィルター。
デフォルトではCodeRayでシンタックスハイライトを行うが、他にPygmentsやHiligntといったシンタックスハイライターを使うこともできる。
参考
ColorizeSyntaxを使わずにKramdownの機能でシンタックスハイライトしてしまうこともできるらしい。
自分はRedcarpetを使っているので無理だけど。
ちなみにRedcarpetを使っているのは改行したところに<br>を入れられるのと、いざというときカスタマイズが楽そうだから。