at posts/single.html

日記の記法をGFM (Git Flavored Markdown) に変えた

時代はMarkdownらしいので、これまでWikiスタイルで書いてきたこの日記も GFM スタイルに変えることにした。GFMはMarkdownをGitHubがちょっとアレンジしたものらしい。日記を書くときとGitHubを使うときで記法が違うのも紛らわしいので、これを機にGFMで書けるようになろう。

GFMスタイルを導入

導入方法

GFMスタイルはつい先日trunkに入ったばかり。 git pull origin master で最新版のtDiaryにアップデートする。(安定志向の人は次のリリースまで待ちましょう) 使い方を読みながら作業を進める。

misc/styleの下にあるgfm_style.rbを、インストールディレクトリにあるtdiary ディレクトリにコピーし、tdiary.confに以下の設定をする。 @style = 'GFM'

スタイルをコピーた後に、tdiary.confを編集する。

$ cp misc/style/gfm/gfm_style.rb tdiary/style
$ vim tdiary.conf
@style = 'GFM'

これで日記にアクセスすると、残念ながらエラーになる。

500 Internal Server Error
cannot load such file -- redcarpet (LoadError)

なるほど、内部でredcarpetというライブラリを使っているのか。 うちはrbenv + ruby1.9.3で動かしている(参考: rbenvが使える環境)ので、普通にgemを使ってインストールする。

$ gem install redcarpet
$ rbenv rehash

Bundlerがインストールされているのであれば、gemでわざわざパッケージ名を指定せずとも、bundle installでOK。

使ってみた

最初はこれまでのWiki記法とちょっと混乱してけど、すぐに慣れそう。

ただ、日記内でtDiaryのプラグイン記法を使うと以下のようにシンタックスエラーになる。

SyntaxError

(TDiary::Plugin#eval_src):67: syntax error, unexpected ';'
; _erbout.concat((section_leav...
 ^
(TDiary::Plugin#eval_src):191: syntax error, unexpected $end, expecting ')'
; _erbout.force_encoding(__ENCODING__)
                                      ^

こっちはちょっと調査かな。

…原因判明。Redcarpetがシングルクオートを ' (数値文字参照)に変換しちゃってるので、erbのパースでエラーになる。さてどうしたものか。

こんなパッチにしてみた。副作用がありそうな気もするが。

diff --git a/misc/style/gfm/gfm_style.rb b/misc/style/gfm/gfm_style.rb
index b6d5d83..112537d 100644
--- a/misc/style/gfm/gfm_style.rb
+++ b/misc/style/gfm/gfm_style.rb
@@ -109,7 +109,7 @@ module TDiary
       r.gsub!(/<h(\d)/) { "<h#{$1.to_i + 2}" }
       r.gsub!(/<\/h(\d)/) { "</h#{$1.to_i + 2}" }
       r.gsub!(/\{\{(.+?)\}\}/) {
-        "<%=#{$1}%>"
+        "<%=#{CGI.unescapeHTML($1)}%>"
       }
       r
     end