クロスポストに便利なtombloo。2種類のポスト方法があります。
- コンテキストメニューからポスト
- ショートカットキーからクイックポスト
一般的なサイトでの挙動はどちらでも大差無いのですが、Google Reader(多分LDRでも?)上だと若干異なります。
前者では現在フォーカスされているエントリーがポスト対象となり、後者ではGoogle Readerのページ自体がポストされてしまいます。後者でもフォーカスされているエントリーをポスト対象として欲しい。
コンテキストメニューの場合、イベント発生元の要素(=マウスポインタが置いてある要素)から遡って親要素からタイトルやリンクを取得している様ですが、ショートカットの場合、マウスの位置が関係ないので親要素の取得が出来ません。
ただ、DOM Inspectorで見る限り、フォーカスのあるエントリーは動的に"current-entry"というIDが振られる様です。なので、ID指定で要素を取得してポストする様に勝手にソース改変。
158: var ctx = update({
159: document : doc,
160: window : win,
161: title : doc.title,
162: }, win.location);
163:// custom start
164: if(ctx.href.match('//www.google.[^/]+/reader/')) {
165: if(item = $x('id("current-entry")', ctx.document)) {
166: // Google Readerで、かつアクティブなエントリーが取得できた場合
167: // タイトル等を取得
168: var res = {
169: author : ($x('descendant::div[@class="entry-author"]/*[@class="entry-author-name"]/text()', item) || ''),
170: title : $x('descendant::a[@class="entry-title-link"]/text()', item) || '',
171: feed : ($x('descendant::a[@class="entry-source-title"]/text()', item) || $x('id("chrome-stream-title")//a/text()')),
172: href : $x('descendant::a[@class="entry-title-link"]/@href', item).replace(/[?&;](fr?(om)?|track|ref|FM)=(r(ss(all)?|df)|atom)([&;].*)?/,''),
173: };
174:
175: // この後ポストフォームで、ctx.titleとctx.hrefが使用される
176: // ので、勝手に書き換える
177: ctx.title = res.feed + (res.title? ' - ' + res.title : '');
178: ctx.href = res.href;
179: ctx.host = res.href.match('http://(.*?)/')[1];
180: } else {
181: // Google Readerだが、アクティブなエントリーが無い場合
182: // 何もしない
183: }
184: } else {
185: // Google Reader以外の場合
186: // 何もしない
187: }
188:// custom end
1403: // ドキュメントタイトルを取得する
1404: var title;
1405:// custom start
1406: if(typeof(ctx.title) == 'string'){
1407: // ctx.title設定済みの場合、ドキュメントタイトルに優先する
1408: title = ctx.title;
1409: } else
1410:// custom end
いささかスマートさに欠ける方法ですが、とりあえず目的は達成。
残る問題はSBM経由だとタイトルに余計な文字が入ることです。例えばDelicious/networkだとタイトルに"[from {user name}]"というプレフィックスが入ってしまいます。非同期でオリジナルソースページにアクセスしてタイトル取得とか、良くあるプレフィックスリストを作って削除、とかする必要がありそう。