枕を欹てて聴く

香炉峰の雪は簾を撥げて看る

GoogleReader の適当メモ

最新版のTomblooにGoogleReader用extractorとGreasemonkey ScriptのGoogleReader + Tomblooを追加してきました.自分ははてなダイアリーよりTumblrからはじめたようなTumblrファンなので, GoogleReaderからもTumblr使う人が増えるといいなという気分で書きました.
GoogleReaderの難読っぷりがすさまじかった.
最初は誰か解析してるかと思ってuserscript.orgで検索かけてたのですが, みんな独自に自分用に関数を定義しなおしてました.
で, なんか使ったところをメモ. いちいちaddEventListenerからやるのもなんかなあだったので.

キー定義

正直一番知りたいところです. キー定義. これがわかればかなり拡張しやすくなります.

  • function O

addEventListenerおよびattachEvent, また, 独自定義のEventのListenerをObjectに関連付けるかなり中心的な関数です. ちなみにsetしたlistener情報は, Kkに保存してます. Kkに保管されてるのは, listener情報用ObjのHkのインスタンスです.

しかし, これで

O(target, evname, func, boolean about capture, this obj);

としてもいいのですが, この関数はGRのかなり下層部分に当たります. 上層にはより利用しやすいハードコートしたobjがあるのでそれを使います.

  • function o

一言で言うとbindです. 多重にすることもできる設計です. そこまでは使わないので

var f = o(fun, obj);
// f = function(){
//   return fun.apply(obj, arguments);
// }

的なくらいの扱いでいいです. このfをさらにoにかけるといろいろできるみたいですが, そこまで使いません.

  • object Yv

ちなみに, cpはYvのインスタンスです(cp = new Yv). YvはEventを管理しています. 今回の場合は, cp.Nrに注目です.これはkeycodeを解釈し, listenerと同時に管理, key eventのときに実行するようにしてくれるありがたい今回の本題です.

cp.Nr([keycode], func, this object);

ここですばらしい話なのですが, GoogleReaderのkeycodeは, かなり簡単にshiftやaltの設定ができます.
2ストロークも簡単です.

cp.Nr(['shift+t'], function(e){ console.info(this) }, 'aaaa');
cp.Nr(['ctrl+t'], function(e){ console.info(this) }, 'aaaa');
cp.Nr(['alt+t'], function(e){ console.info(this) }, 'aaaa');
cp.Nr(['g t'], function(e){ console.info(this) }, 'aaaa');
// 全部結果は'aaaa'

定義済みkeyはcp.Piに保管されています.

console.info(cp.Pi);

でいろいろみれます.

実際の定義に. GoogleReader本体の定義法に従ってやるとこんな感じです.

var h = o(cp.Nr, cp);
h(['shift+t'], function(e){ console.info(e) }, 'aaaa');
// 'aaaa'がthisになる

と, 意外ときれいに定義できます.

P

変数Pはとにかく巨大. いろいろと継承しており, なんでもありの状態になってます.
firebugあたりで

P.Kd();
//または P.rf();

ってやってみると若干感動できますよ!!
このように管理的位置を占めているのが変数Pに入っているZのインスタンスです.
今のはもともとはZではなく$のメソッドです. が, Zが取り込んでます.
なんといっても巨大なPなのですが, やはりLDRのget_active_item(true);的ものがほしいところ. ありがたいことに, Pはその需要をしっかり満たしてくれます.

console.info(P.ia)//feed itemの配列
console.info(P.os);//現在のindex
console.info(P.Fa());// 現在のitem獲得
console.info(ib)// feedの配列

あとは煮るなり焼くなり.
ついでに, このitemはUuのインスタンスです.

そのほかにもPには面白いものがいろいろあります.

Uu

あとおおーと思ったのはitemそのものUuです.

  • Uu.yt

下の部分のwidgetをつかさどるおいしいメソッド
追加するwidgetを管理するのはP.ueの中身で独特の形式を持ったobj. ちなみに, P.sf(a)で追加可能
このaはnew a(Uu)され, a.Ec()でチェックされた後, a.C()をWidgetなどを入れるところにappendChildします.
一つ前のuserscriptはこれを使ってWidgetを登録することができたのです.
list view変換時などにa.l()が呼ばれます.

補足

まあほかにもいろいろあるけど, これぐらいあると結構いろいろできたので, ここまで.
一番つらいのは, Firebugがあると読み込みにめちゃくちゃ時間がかかること.
あと, これが自動生成だとすると, verがあがるとめちゃくちゃに変更になるかもしれないので, それはそれで利用しづらい.