XUL/Migemo hoge

えいや、と思いたって、まえまえから気になっていた、 tekezo さんの「w3m ユーザに送る Firefox のススメ」を参考に Firefox を設定しまくってみようと思いました。

http://www.pqrs.org/~tekezo/firefox/firefox.html

やってみたところ、えらいすばらしかったです。ありがたすぎてありがとうございますと思いました。 Hint-a-Hint でリンクたどる、ってのが少し遅い、とかレンダリングが遅い、とか、 w3m に比べて少し不満も残りますが。 GoogleAutoPager もすばらしいものだなと思いました。

これで足りないのは migemo くらいだ…と思って XUL/Migemo を入れてみたのですが、なんか違うな、と思ったのでいつも使ってる cmigemo を使おうと思いました。

もともと私は cmigemo が毎度起動するのに耐えられないので、 cmigemo-(client|server) とか作っていたので、 cmigemo-server を少し書き換えて、そのクライアントを JS で書けば良いだろう、と思いました。


やる気起きないのでスクリプトをはりまくろうと思いました。

cmigemo-server:

#!/usr/local/bin/ruby-yarv
#!/usr/bin/env ruby

require 'socket'
require 'nkf'

gs = TCPServer.open('localhost', 31413)
addr = gs.addr
addr.shift
printf("server is on %s\n", addr.join(":"))

io = IO.popen("/usr/local/bin/cmigemo -q -d /usr/local/share/migemo/euc-jp/migemo-dict", 'r+')

while true
  Thread.start(gs.accept) do |s|
    print(s, " is accepted\n")
    while s.gets
      $_.chomp!
      if /^POST/
        len = 0
        while s.gets
          $_.chomp!
          if /Content-Length: (\d+)/
            len = $1.to_i
          end
          break if $_ == ''
        end
        $_ = s.read(len)
        $_.chomp!
        io.write("#{$_}\n")
        io.gets
        s.write(NKF.nkf('-Ew', $_))
        break
      end
      io.write("#{$_}\n")
      io.gets
      s.write($_)
    end
    print(s, " is gone\n")
    s.close
  end
end

cmigemo-client:

#!/usr/local/bin/ruby-yarv
#!/usr/bin/env ruby

require "socket"

s = TCPSocket.open('localhost', 31413)
while (gets)
  s.write($_)
  s.gets
  $_.chomp!
  print("#{$_}\n")
  STDOUT.flush
end
s.close

今回は別に client の方は関係ないと思いました。

で、 XUL/Migemo の romaninput の search 関数を以下のように書き換えました。サーバとか決め打ちなのはださいなとは思いました。

function search(back,keyword,aSilently){mydump("search");
    var roman= keyword || gCurrentKeyword;
    if(roman==""){return false;}

    var xmlhttp = new XMLHttpRequest();
    xmlhttp.open("POST", "http://localhost:31413/", false);
    xmlhttp.send(roman);
    var myExp = xmlhttp.responseText;
    var findFlag;
    if(gPrevKeyword==roman){
        findFlag = back ? XM_FIND_BACK : XM_FIND_FORWARD ;//F4なり。back次第で方向が変わる。
    }else{
        findFlag = XM_FIND_DEFAULT;
    }
    var win = document.commandDispatcher.focusedWindow;
    var doc = (win != window) ? Components.lookupMethod(win, 'document').call(win) :
        (findFlag & XM_FIND_BACK) ? getLastChildDocument(document.getElementById("content").contentDocument) :
        document.getElementById("content").contentDocument;
    searchInDocument(findFlag,doc,(new RegExp(myExp.replace(/\n/im,""),"im")),aSilently);
    gPrevKeyword=roman;
}

こんな適当一瞬 hack で migemo が快適に使えるようになったので、 cmigemo とか XUL/Migemo とかありがとうございますと思いました。

あと、なんとなく語尾を全部思いましたにしましたがどうでもいいと思いました。

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h