w3mのローカルCGI経由でReFeを使う

w3mのローカルCGI経由でReFeを使ってみようと思います。w3mmanと同じアイディアです。
ファイル: w3mrefe2html.cgi

#!/usr/bin/env ruby
# -*- ruby -*-
# $Id: w3mrefe2html.cgi,v 1.1 2005/10/28 21:39:40 s-tanaka Exp $

require 'cgi'

def run_with_rpipe(*args)
  io = IO.popen("-", "r")
  if io.nil?
    exec(*args)
  end
  io
end

def convert_refe_output(input)
  result = ''
  classname = nil
  first_f = true
  link_f = false
  sep_f = false
  while line = input.gets
    sep_f = false
    if first_f
      tokens = line.split(/\s+/)
      if tokens.size > 1 and tokens[1] != '<'
        link_f = true
      end
      first_f = false
    end

    case line
    when /^====\s+(.+)\s+====$/
      link_f = false
      sep_f = true
      classname = $1
    when /^----\s+(.+)\s+----$/
      link_f = true
      sep_f = true
    end

    line = CGI::escapeHTML(line)
    if not sep_f and link_f
      line.gsub!(/[^\s]+/) do |matched|
        uri = "file:///\$LIB/w3mrefe2html.cgi?query=" + 
          CGI::escape(classname ? "#{classname} #{matched}" : matched)
        "<a href=#{uri}>#{matched}</a>"
      end
    end
    result << line
  end
  result
end

query = CGI.new['query'].split
result = convert_refe_output(run_with_rpipe('refe', *query))

puts 'Content-Type: text/html'
puts
puts '<html><head><title>w3mrefe</title></head><body><pre>'
puts "#{result}</pre></body></html>"

ファイル: w3mrefe

#!/usr/bin/env ruby
# -*- ruby -*-
# $Id: w3mrefe,v 1.1 2005/10/28 21:39:40 s-tanaka Exp $

require 'cgi'

exec 'w3m', "file:///\$LIB/w3mrefe2html.cgi?query=" + CGI::escape(ARGV.join(' '))

まずw3mrefe2html.cgiw3mのローカルCGIを格納するディレクトリ(dirlist.cgiとかw3mman2html.cgiがあるディレクトリです)に保存します。あとはw3mrefeをrefeの代りに使用するだけです。シェルのエイリアスでalias refe=w3mrefeと設定しておくと便利です。
BUGS: w3mrefeの引数がなかった場合に、検索フォームを表示する機能は実装していません。