2010年6月24日木曜日

rd2 が動かなくなった

ひさしぶりに RT を使った RD ファイルに rd2 (rdrt2) をかけたらこんなエラーメッセージが出て失敗した。

$ rdrt2 -r rd/rd2html-ext-lib --out-code=utf8 --native-inline --ref-extension aaa.rd > aaa.html
/opt/local/lib/ruby/site_ruby/1.8/rd/search-file.rb:7:in `+': can't convert nil into String (TypeError)
        from /opt/local/lib/ruby/site_ruby/1.8/rd/search-file.rb:7:in `search_file'
        from /opt/local/lib/ruby/site_ruby/1.8/rd/search-file.rb:6:in `each'
        from /opt/local/lib/ruby/site_ruby/1.8/rd/search-file.rb:6:in `search_file'
        from /opt/local/lib/ruby/site_ruby/1.8/rd/search-file.rb:5:in `each'
        from /opt/local/lib/ruby/site_ruby/1.8/rd/search-file.rb:5:in `search_file'
        from /opt/local/lib/ruby/site_ruby/1.8/rd/output-format-visitor.rb:23:in `apply_to_Include'
        from (eval):2:in `visit_Include'
        from /opt/local/lib/ruby/site_ruby/1.8/rd/block-element.rb:65:in `accept'
        from /opt/local/lib/ruby/site_ruby/1.8/rd/visitor.rb:20:in `visit_children'
        from /opt/local/lib/ruby/site_ruby/1.8/rd/element.rb:45:in `each_child'
        from /opt/local/lib/ruby/site_ruby/1.8/rd/element.rb:44:in `each'
        from /opt/local/lib/ruby/site_ruby/1.8/rd/element.rb:44:in `each_child'
        from /opt/local/lib/ruby/site_ruby/1.8/rd/visitor.rb:19:in `visit_children'
        from (eval):2:in `visit_DocumentElement'
        from /opt/local/lib/ruby/site_ruby/1.8/rd/element.rb:144:in `accept'
        from /opt/local/lib/ruby/site_ruby/1.8/rd/tree.rb:78:in `accept'
        from /opt/local/lib/ruby/site_ruby/1.8/rd/visitor.rb:14:in `visit'
        from /opt/local/lib/ruby/site_ruby/1.8/rd/rd2html-lib.rb:62:in `visit'
        from /opt/local/lib/ruby/site_ruby/1.8/rd/rd2html-ext-lib.rb:42:in `visit'
        from /opt/local/bin/rd2:241
$ 

調べてみたら、どうも rd2 が optparse の古いあるいは隠し機能を使ってるみたいだった。こんな風に変えてみた。

--- rd2.orig    2008-01-14 16:40:04.000000000 +0900
+++ rd2 2010-06-23 18:25:52.000000000 +0900
@@ -127,8 +127,14 @@
   
   # accept "PART:FILTER" and "PART"
   q.on("--with-part=PART",
-       /(\w+)(?:\s*:\s*(\w+))?/,
-       "include PART with Filter") do |src, part, filter|
+       String,
+       "include PART with Filter") do |i|
+    if /(\w+)(?:\s*:\s*(\w+))?/ =~ i
+      part   = $1
+      filter = $2
+    else
+      raise OptionParser::InvalidArgument, "--with-part=#{i}"
+    end
     with_part.push([part, filter || part])
     unless include_path.index(RD::RDTree.tmp_dir)
       include_path.push(RD::RDTree.tmp_dir)

optparse も Ruby もあまり詳しくないからもしかしたら適切な直し方じゃないかも知れないけど、一応動いたみたい。

ん、Firefox で見ると右の方が切れて見えるなぁ。デザイン変えた方がいいのかな。コピペするのは大丈夫みたいだけど。