と思ったら。

ってタグの問題は解決しましたが、今度は空行2行が入ると例外が出るのを見つけてしまいました。

irb(main):001:0> require 'text/hatena'
=> true
irb(main):002:0> p=Text::Hatena.new
=> #<Text::Hatena:0x55c134 @sectionanchor="o-", @ilevel=0, @baseuri="", 
@texthandler=#<Proc:0x00358f5c@./text/hatena.rb:16>, @html="", @invalidnode=[], 
@permalink="">
irb(main):003:0> p.parse("\n\nAAA")
NoMethodError: undefined method `each' for nil:NilClass
        from ./text/hatena/html_filter.rb:105:in `emptyelemtaghandler'
        from ./text/hatena/html_filter.rb:50:in `parse'
        from ./text/hatena/html_filter.rb:44:in `parse'
        from ./text/hatena.rb:46:in `parse'
        from (irb):3

ざっと見たところおぼろげながら分かった気がするので直してみました。これで大丈夫なのか確証は持てませんが。

Index: hatena/html_filter.rb
===================================================================
--- hatena/html_filter.rb	(revision 9)
+++ hatena/html_filter.rb	(working copy)
@@ -102,15 +102,17 @@
       def emptyelemtaghandler(tagname, attr, text)
         if tagname =~ @allowtag
           @html << "<#{tagname}"
-          attr.each do |p, v|
-            if p =~ @allallowattr
-            elsif @allowattr[tagname.to_sym] && /^#{@allowattr[tagname.to_sym]}$/i =~ p
-            else
-              next
-            end
-            v = sanitize(v)
-            @html << %Q| #{p}="#{v}"|
-          end
+          unless attr == nil
+            attr.each do |p, v|
+              if p =~ @allallowattr
+              elsif @allowattr[tagname.to_sym] && /^#{@allowattr[tagname.to_sym]}$/i =~ p
+              else
+                next
+              end
+              v = sanitize(v)
+              @html << %Q| #{p}="#{v}"|
+            end
+          end
           @html << " />"
         else
           @html << sanitize(text)

http://kotomishome.hp.infoseek.co.jp/docs/html_filter.rb.patch