Rails に(再)挑戦 5日目 - ページ本文のパース
今日はページ本文のパース。 今までは入力していたテキストをそのまま出力していたけど、 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>
ちょっとした変更だけど、それっぽく見えてきたかな。 タイトルが整形されないなど、まだまだ完璧じゃない。 ま、この辺は後で(そればっか)。
リポジトリにも変更を反映した。