appendAnchor.js refactoring

前々からニコ動で blog 晒してるひととか mp3 配布してくれてるひとの URL を選択するのにマウス使っててどうにかならないかと思ってたんだけど今更ながら appendAnchor.js に気付いたので使ってみたら便利すぎて鼻血でそうになったというハナシ。ではなくソース読むのに難儀したので refactoring してしまったというハナシ。おれは cosmetic change がしたかったんだけど。おかしい。

http://coderepos.org/share/changeset/25324

とりあえずポイントは 2 つ。

  • buffer.evaluateXPath は結果に iterator generator を仕込んでくれる
    • ので普通に for in で回せばおk。 document.evaluate method を使う場合はこういう書き方できないけど今回は vimp の plugin なのでこっちのがいいね。てかここの loop の終了条件はなんか怪しげだったので全面的に書き直してしまった。
  • window.eval は使わない
    • 今回は liberator.globalVariables.auto_append_anchor の値 ( 文字列 ) を真偽値として扱いたいわけなので以下に示す関数で対処するようにした。 3 項演算子もこうやって使うと if よか見やすい ( ラクダ本からパクってきてる ) 。てか :let での指定はすべて文字列扱いなのと JavaScript の String object に toBoolean method がないのがアレというハナシなんだけどまぁそこはそれということで。
function stringToBoolean(str, defaultValue) {
    return !str                          ? (defaultValue ? true : false)
         : str.toLowerCase() === 'false' ? false
         : /^\d+$/.test(str)             ? (parseInt(str) ? true : false)
         :                                 true;
}

あーあと eval 関連で vimperator の場合は liberator.eval があるんだけどこれは旧 eval ( https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Functions/eval ) を emulate していて第 2 引数で context の指定ができるんだけどなんで旧 eval 仕様が obsolete になったかを考えるとあまり使わないほうがいい。 http://d.hatena.ne.jp/ZIGOROu/20070730/1185783891http://d.hatena.ne.jp/brazil/20080102/1199271357 の例のように開発中にアレコレするってんならわからないことはないけど plugin 内で使うとかは避けるべき。