Nov 08, 2008

XUL/Migemo 0.11.5でMinefield 3.1b2preのタブ検索に対応したよ

表題の通り。昨日と今日とでガラッとUIが変わったりしてカオスな事この上ないMinefield 3.1b2preですが、最終版まで残るものと踏んで、タブの一覧を表示した時に絞り込みを行う検索欄でMigemo検索できるようにしました。ページ内検索の物とは異なり、スマートロケーションバーと同様にスペース区切りで複数語句のAND検索になります。入力からそれに対応する正規表現を生成する部分の処理はスマートロケーションバーの物を汎用化して使っているので、語句の頭に「-」を付ければNOT検索もできます。

で、その関係でpIXMigemoインターフェース(XMigemoCore)に新しくいくつかメソッドが加わりました。以下、IDL定義から抜粋。

AString getRegExpFunctional(
   in AString input,
   out AString termsRegExp,
   out AString exceptionsRegExp
);
attribute boolean andFindAvailable;
attribute boolean notFindAvailable;
boolean isValidFunctionalInput(in AString input);
AString trimFunctionalInput(in AString input);

getRegExpFunctional()に「nihon go -hoge」という風な文字列を渡すと、nihonとgoをローマ字入力として解釈した結果でAND検索を行うための正規表現が返ってきます。第2引数に渡したオブジェクトのvalueプロパティには、AND検索ではなくOR検索のための正規表現が格納されます(これを使うと、検索にマッチした単語を取り出すことができる)。第3引数に渡したオブジェクトのvalueプロパティには、NOT検索で「これにマッチしたら除外する」という用途に使う正規表現が格納されます。先の例だと「hoge」をローマ字入力として解釈した結果の正規表現ですね。

trimFunctionalInput()メソッドは、例えば「nihon go -」という風な(NOT検索の入力中と思われる)文字列を渡すと、前後の空白と最後のハイフンを取り除いた結果を返します。NOT検索が無効な時は、前後の空白だけが取り除かれます。今の所はそれだけしかしません。

isValidFunctionalInput()は、trimFunctionalInput()getRegExpFunctional()に渡してMigemo検索するに値する内容かどうかを判定します。このメソッドがfalseを返した場合はMigemo検索のための処理を丸ごとスキップする、という風な感じで使います。

タブの一覧の絞り込み部分のコード(filterListFromInputメソッド)が、まさにこれらの実際の利用例ということになります。自分のアドオンやらuserChrome.jsやらで使ってみたい人は参考にしてください。

他の目につく改良点として、スマートロケーションバーの検索処理を改善しました。というか修正しました。元々スマートロケーションバーでは、例えば「moz」と入力して出てきた候補から「mozilla.jp」を選択した場合、2度目以降はその候補が真っ先に表示されるし、同様に「mozilla.gr.jp」や「addons.mozilla.org」なども選択したことがある場合には選択回数が多い物から順に表示される、という仕様になってるんですが、これを再現するためのSQL文を書き間違えてて(MAX関数をJavaScriptのMath.max()みたいなものと勘違いしてた)、同じ項目を何度選んでも表示の順位が上がらないという状態になってました。スマートロケーションバーが全然スマートじゃなくなってたという……

エントリを編集します。

wikieditish message: Ready to edit this entry.











拡張機能