at posts/single.html

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>

ちょっとした変更だけど、それっぽく見えてきたかな。 タイトルが整形されないなど、まだまだ完璧じゃない。 ま、この辺は後で(そればっか)。

screenshot (Ruby on Rails) - (7)

リポジトリにも変更を反映した。

関連する日記