Rails に(再)挑戦 5日目 - ページ本文のパース
2006-10-07
今日はページ本文のパース。 今までは入力していたテキストをそのまま出力していたけど、 Wiki ライクの構文が使えるようにする。 とはいえ、1からパーサを作るのではなくて、 HikiDoc を使わせてもらう。 既存のものを使う理由は以下の通り。
- 自分で書くのは面倒(と言うか多分書けない)
- Rails の勉強が目的だけど、パーサはあまり Rails と関係しない
- HikiDoc は tDiary の Wiki スタイルで使われているので、日記 (tDiary) との親和性が高まる (とりあえず RandomNote にメモしておいて、後から tDiary へコピペできる)
まずは HikiDoc をダウンロードして、 lib ディレクトリに配置する。
$ wget http://projects.netlab.jp/svn/hikidoc/trunk/lib/hikidoc.rb
$ mv hikidoc.rb lib/hiki_doc.rb
ファイル名を hiki_doc.rb にリネームしているのは、 Rails のオートロード機能を有効にするため。 (Rails では HikiDoc というクラスを利用しようとした瞬間に、hiki_doc.rb というファイルを見つけて自動で読み込むようになっている。hikidoc.rb だとオートロードの対象にならない。)
次に、 HikiDoc を使ってテキストを整形するメソッド (parse) を、ヘルパー (note_helper.rb) に追加する。
Index: app/helpers/note_helper.rb
===================================================================
--- app/helpers/note_helper.rb (リビジョン 9)
+++ app/helpers/note_helper.rb (リビジョン 10)
@@ -2,4 +2,8 @@
def show_time(time)
time ? time.strftime('%Y-%m-%d %H:%M') : ''
end
+
+ def parse(body)
+ HikiDoc.new(body, :level => 3).to_html
+ end
end
ビューから parse メソッドを呼び出し、テキストを整形するようにしている。
Index: app/views/note/_page.rhtml
===================================================================
--- app/views/note/_page.rhtml (リビジョン 9)
+++ app/views/note/_page.rhtml (リビジョン 10)
@@ -7,5 +7,5 @@
created: <%=h show_time(page.created_on) %>
updated: <%=h show_time(page.updated_on) %>
</div>
- <%=h page.body %>
+ <%= parse(page.body.sub(/^.*\n/, '')) %>
</div>
ちょっとした変更だけど、それっぽく見えてきたかな。 タイトルが整形されないなど、まだまだ完璧じゃない。 ま、この辺は後で(そればっか)。
リポジトリにも変更を反映した。