monoの開発ブログ

アドレスバーでPinboardをインクリメンタルサーチ

今話題沸騰のPinboardを検索するための拡張を書きました。アイデアはこちらの拡張の丸パクリです、すみません。

こんな感じで検索できます。

ダウンロード

使い方

拡張をインストールし、ログインが完了した状態でロケーションバー(Omnibox)にp、半角スペースの順で入力すると、以下のような表示に切り替わります。

Pinboard

このまま検索したい語句を入力すると、自分のPinboardを検索できます。

Pinboard

検索結果は5件だけ表示されるので、それ以降を表示したい場合は末尾に.(半角ピリオド)を打ち込んでください。ピリオドの数に応じて2ページ目以降が表示されます。

Pinboard

細かい仕様

ブックマークはローカルにキャッシュされ、検索は完全にローカルで完結しています。キャッシュはだいたい1時間に1回くらい更新されます。更新に失敗した場合は失敗した回数*5分(最大60分)待って再試行します。

キャッシュはlocalStorageに保存しようと思ったのですが、数万件のブックマークを格納するには容量制限が厳しいのでIndexedDBを利用しました。

IndexedDBはJavaScriptのオブジェクトをそのまま格納できるいかしたDBなのですが、まだ仕様が固まっていないのであまりおすすめできません。しかし、Chrome拡張で大量のデータを扱おうとすると、オワコンになったWeb SQL Databaseか仕様が固まっていないIndexedDBの二択を迫られるので仕方なく採用しています。

IndexedDBにはインデックスを張って検索、カーソルを辿りながらデータを取り出す、といった機能があるのですが、今回の目的(大文字小文字を無視した部分一致AND検索で複数のプロパティのうちどれか1つでもマッチするものを取り出す)を実現する方法がさっぱり分からなかったので、IndexedDBはただの入れ物にしてしまい、実際の検索は配列を舐めながら正規表現マッチで行っています。すごく無駄な感じがしますが、体感速度は十分に速いので満足してます。