Rubyではてな記法をパースしよう

よくid:hakobe932が「CP○Nにはid:jkondoの書いたはてな記法パーサがあるんだよ」などと自慢していましたが,Rubyでも探せばちゃんとあるんです.
http://rubyforge.org/projects/hparser/

Hatena format parser for Ruby. This format used at Hatena Diary (http://d.hatena.ne.jp) which is blog service in Japan.

id:mzpさん,ご苦労様です.とても同世代とは思えない….
コードをチラチラと読んでみたところ,相当複雑な作りで,とても読み切る事はできなさそう.時間をかけて少しずつ読んでいこうかな(多分読まない).でもこれは勉強になると思う.すごく.

使ってみた.

で,hparserのwikiを見ながら,ほとんどそのままやってみた.

require 'rubygems'
require 'hparser'

unless filename = ARGV.shift
  puts "usage: #{$0} [text file]"
  exit
end

text = File.open(filename).read

parser = HParser::Parser.new
hatena = parser.parse text

puts hatena.map{|e| e.to_html}

適当なテキストファイルを作成して,実行してみる.

$ ruby hatena.rb text.txt 
<h1>こんにちは,世界</h1>
<p>はてな記法パーサを試してみます.</p>
<p>[<a href="http://d.hatena.ne/jp">http://d.hatena.ne/jp</a>:title=はてな]</p>
<ol><li>sudo</li><li>gem</li><li>install</li><li>hparser</li></ol>

リンク記法の辺りが,非常に怪しい.そのうち改善されると信じて….


続きはオマケ.

関係無いけれど

本題とは関係無いんだけれども,Rubyの不思議に出会ってしまった.

puts hatena.map{|e| e.to_html}
puts hatena.map do |e| e.to_html end

これは同じ結果が返ると思ってたんですが,実際に実行してみるとこうなります.

<h1>こんにちは,世界</h1>
<p>はてな記法パーサを試してみます.</p>
<p>[<a href="http://d.hatena.ne/jp">http://d.hatena.ne/jp</a>:title=はてな]</p>
<ol><li>sudo</li><li>gem</li><li>install</li><li>hparser</li></ol>
<pre>$ sudo gem install hparser</pre>
#<HParser::Block::Head:0x5f18c0>
#<HParser::Block::P:0x5ee490>
#<HParser::Block::P:0x5ea070>
#<HParser::Block::OrderList:0x6c908>
#<HParser::Block::SuperPre:0x6c3f4>

ブレースとdo-endは同じだと思ってたんですが,微妙に挙動が変わるんですね.