«前の日記(2012-02-12 (日)) 最新 次の日記(2012-02-26 (日))»  

まちゅダイアリー


2012-02-18 (土)

日記の記法を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
本日のツッコミ(全4件) [ツッコミを入れる]
hsbt (2012-02-19 (日) 00:09)

GFM という名前ですが、redcarpet は実はただの Markdown の C 実装を呼んでいるだけなのでした…。<br>github 特有の書き方は js 実装はあるので、そこからつまみ食いか、ruby 実装があったらそれを使うようにちょくちょく改造していこうと思っています。

chobi_e (2012-02-19 (日) 03:32)

Redcarpetが使っているMarkdownライブラリであるSundownに以前はGithub FlavoredなMarkdown記法がありました。ただ、標準のMarkdownライブラリとしてGithubスタイルのオプションをつけるというのは適切ではない、ということでtanoku/sundown@2c4b7f5689c19ee1f6c5239597c63c0dbb3b9233で削除されたのです。<br><br>もしGithub Styleのものを使いたいというのであればカスタムしたものを使うという感じですねぇ。因みにjs実装であったshowdownのほうもredcarpetを使うようになってから使われなくなったようなきがします(未確認ですが)

まちゅ (2012-02-19 (日) 06:57)

なるほど。まだベースを作った段階なのですね。<br>Sundown(MarkdownのC実装)のRubyインタフェースがRedcarpetだと理解しました。<br>Markdownの登場でWiki記法戦争も終結するかと思いきや、まだまだ先は長そうです。

hsbt (2012-02-19 (日) 08:17)

>chobi_e さん<br>おー、勉強になります。