hit-a-hint on w3mを更新。

毎日京葉線に乗っていて一番不思議な光景は、平日朝にも関わらず、5〜6人の小学生(大人いない)がネズミの国へと向かう光景だと思うのは私だけでしょうか。
いや、お前ら学校どうした、とね。ただそれだけです。

さて本題ですが、hit-a-hint on w3mをちょっと更新しました。(いい名前が思いつきません。)
更新内容としては以下に挙げる内容になっています。

  • エンコーディングが狂っていてもとりあえずhit-a-hintできるようにした。
  • マークを設定した後のHTMLをキャッシュするようにした。
  • マークを設定したHTMLもバッファから消すようにした。
  • マーク文字列をasdfghjklだけで構成されるようにした。
    • a,aa,df,aaa...のような形。

エンコーディングが狂っている場合、代替文字が表示されるようになっています。かなり意味不明な状態になってしまいますが、なんとかできます。
また、今回の更新で、extension側で何もしなくてもBACKが二回実行されるようになりましたので、extensionがより簡潔に記述できるようになりました。具体的には、extensionで["BACK"]と指定しなくてもよくなりました。というか何で指定しなけりゃならなかったのかがちと理解に苦しみます(ぉ

# -*- coding: utf-8 -*-

#####################################################################################
# hit-a-hintで指定されたマークのリンクを利用し、処理を行うための拡張を設定する。    #
# 拡張は以下のように記述する。                                                      #
#                                                                                   #
# # 指定されたマークを開く。                                                        #
# extension("normal", {"content" => "",                                             #
#                      "operations" => ["GOTO %s"]})                                #
#                                                                                   #
# extensionの第一引数は、?method=で指定される文字列に対応する。                     #
# 第二引数は、W3m-controlとして設定される文字列を配列で指定する。配列の             #
# 一要素が、W3m-controlヘッダ一つに対応し、先頭から順に実行されるように出力される。 #
#####################################################################################

# methodの指定時、先頭一致で検索するようにする。
# normal, newtab があるとき、no => normal 、ne => newtabで検索が行われる。
match_method_first true

# enable_immediatery_inputが有効であり、methodが指定されない場合に利用されるmethod
default_method "normal"

# マークを付けたと同時にマークの入力を行うか
enable_immediatery_input true

# cgiのURL。enable_immediatery_inputがfalseの場合には無視される。
cgi_url "file:///cgi-bin/hit-a-hint.cgi"

# キャッシュの保存先を指定する。指定しない場合はcgi-binのディレクトリが利用される。
cache_directory "~/.w3m/"

# リンク先に同じタブで飛ぶ
extension("normal", {"content" => "",
            "operations" => ["GOTO %s"]}
          )

# リンク先に新しいタブを作成して飛ぶ
extension("newtab", {"content" => "",
            "operations" => ["TAB_GOTO %s"]}
          )

とりあえずはこれで常用できるようにはなってきましたが、まだ不満はあります。

  • マーク文字列の生成アルゴリズムが明らかに非効率。
    • イテレータにしなけりゃならない場所だとはわかっているんですがやりかたがよくわかりません。
  • スクロールしてから実行すると、前回のスクロール位置とは微妙に違う。
    • こればっかりはw3mの制限なので我慢するしか無いような気がしますが。
  • マークの開始地点が常にHTMLの先頭から
    • これをHoKとかと同様に、開始地点を起点としたいのですが、どうやればいいのかさっぱりです。
  • マークを指定しないで終了するとキャッシュが残る。
    • マークを指定した時点でキャッシュを全部消せばいいだけですよね。

ダウンロードは以下よりどうぞ。相変わらずgithubです。
http://github.com/derutakayu/my-ruby-sources/tree/master/hit-a-hint.rb

機能を追加したせいで、設定ファイルの項目が微妙に増えています。↑をコピペしてもらった方が早いと思います。すみません。