nanoc - Markdown でコード表示!

Updated:


nanoc の Markdown 記法によるページでソースコードをハイライト表示(シンタックスハイライト)させる方法についてです。

nanoc の ColorizeSyntax というフィルターを使用します。

0. 前提条件

  • Linux Mint 14 Nadia (64bit) での作業を想定。
  • nanoc 3.4.3 を使用。
  • Ruby 1.9.3-p362 を使用。
  • nanoc 用ブログヘルパー(Blogging, Rendering, LinkTo, Tagging)のインクルード設定済み。
  • Markdown パーサに Kramdown を使用している。
  • ハイライトに使用する手法は CodeRay とした。(Pygmentize, Pygmentrb 等も選択可能)
  • スタイルは HTML タグで style 属性を使用するのではなく、 class 属性と CSS ファイルを使用する。

1. CodeRay インストール

今回はスタイルシートを使用するので、スタイルシートの雛形を作成してくれるコマンドを使用できるように CodeRay をインストールする。
apt-get でインストールするなら以下のようにする。

$ sudo apt-get install coderay

2. RubyGem パッケージインストール

シンタックスハイライトをするための RubyGems パッケージ coderay をインストールする。
さらに、HTML 解析等するためパッケージ nokogiri も必要のようなのでインストールする。

$ sudo gem install coderay
$ sudo gem install nokogiri

ちなみに、nokogiri をインストールするには libxml2, libxml2-dev, libxslt1.1, libxslt1-dev がインストール済みである必要があるので、あらかじめパッケージマネージャか apt-get 等でインストールしておく。

3. Rules 編集

Kramdown によるフィルター処理の後に ColorizeSyntax のフィルター処理を行うようにする。
さらに、Kramdown フィルターがデフォルトで CodeRay を有効にしているので無効に設定しおく。
以下は当方の例。(環境により適宜読み替えて下さい)

File: Rules

1
2
3
4
5
6
7
8
9
10
compile '/articles/*/' do
  filter :erb
  filter :kramdown, :enable_coderay => false
  filter :colorize_syntax,
         :coderay    => {
           :css => :class,
           :line_numbers => :table
         }
  layout 'article'
end

ちなみに、 class 属性+ CSS ではなく style 属性で実現させるには、:css => :class の部分を :css => :style にすればよい。

4. CSS 雛形作成

今回は class 属性+ CSS ファイルの運用とするので、CSS ファイルを作成する。
以下のコマンドで CodeRay 用の CSS ファイルの雛形が作成される。
作成された CSS ファイルを必要なら編集し適切な場所に配置する。当方は、nanoc 本体の CSS ファイルと同じディレクトリ content/assets/stylesheets/ に配置した。

$ coderay stylesheet > coderay.css

ちなみに、 coderaystylesheet_ でつなげたコマンドを使用するような説明をしているサイトもあったが現在は上記のようになっている。(ヘルプで確認できる。環境により異なるのかもしれないが。。。)

5. CSS 読み込み設定

作成した CSS ファイルを使用できるようにするために HTML の head タグ内に以下の記述を追加する。

File: layouts/_head.html

1
<link rel="stylesheet" type="text/css" href="/assets/stylesheets/coderay.css" media="screen">

6. Rules 編集

nanoc コンパイル時に、作成した CSS ファイルはコンパイルせずにそのまま指定に位置にコピーするよう Rules ファイルを編集する。
以下は当方の例。(環境により適宜読み替えて下さい)

File: Rules

1
2
3
4
5
6
7
compile '/assets/stylesheets/coderay/' do
  # don’t filter or layout
end

route '/assets/stylesheets/coderay/' do
  '/assets/stylesheets/coderay.css'
end

7. 記事作成

Markdown 記法で記事を作成してみる。
Markdown 記法では、行頭に4つの半角スペースか1つのタブがあるとコードブロックとみなされる。
コードブロック直後の行に {: .language-<言語名>} のように表示させたい言語に合わせた記述を追加する。(これは Kramdown 特有の書き方)
もしくは、コードを3個以上のチルダ ~ の行ではさみ、最初のチルダ行の末尾に言語名を付与する。(チルダと言語名の間には半角スペースが有っても無くてもOK)(これも Kramdown 特有の書き方)
以下の例では2種類の書き方を試しているが、チルダ行で挟んで最後に {: .language-<言語名>} 行を追加する方法も可能。

File: 2013-01-19-test-syntaxhighlight.md

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 

  :

### 8. サンプルスクリプト

~~~ ruby
class Test1
  def test(foo, bar)
    puts "#{foo}, #{bar}"
  end
end

obj = Test1.new
obj.test
~~~

    void hello() {
      printf("Hello, world!\n");
    }
{: .language-c}

  :

9. 確認

コンパイルしてプレビューで確認してみる。
以下は当方の例で、CSS ファイルを若干編集している。

NANOC_MD_COLORIZESYNTAX

行番号部分をダブルクリックすると行番号が表示されたり非表示になったりする。
行番号をシングルクリックするとその行番号が強調される。

10. 参考サイト


取り敢えずは、ColorizeSyntax フィルタの CodeRay による最低限(?)のシンタックスハイライトができるようになりました。

ColorizeSyntax フィルタを使用せず Kramdown フィルタの機能で CodeRay を使用する方法もある。(と言うか、今は Kramdown フィルタを使用すればデフォルトで使用できる)
Web で調査する際は、Kramdown フィルタのオプションとしての CodeRay 設定と、ColorizeSyntax のオプションとしての CodeRay 設定が混同しやすいので要注意です。
当方も目的の情報(ColorizeSyntax での CodeRay 設定の「最近」の情報)が少なく(ほとんど無く)苦慮しました。

ちなみに、nanoc によるブログを Octopress によるメインのブログのクローンとして公開しています。

但し、mk-mode BLOG (by Octopress)の記事を機械的に変換しているため、人知の及ばない部分もあるかと思います。ご了承下さい。

以上。





 

Sponsored Link

 

Comments