『livedoor Readerをはてブと合体』on IE


実は 東京嫉妬: livedoor Readerをはてブと合体 を初めて見たときから「IE でもできたらいいな〜」と思っていたんです。

最近になって id:reinyannyan:20060518:p1 等により IE でも Greasemonkey 並みのことが可能だと分かってきたということで、思い切って移植してみました。

オリジナルの作者さんに感謝しつつ、リクエスト回数を少なくする工夫も加えてみました。(これに関しては mala さんの livedoor ReaderにSimpleAPIのサムネイルを加えるGreasemonkeyスクリプトの、フックを利用する手法を参考にさせて頂きました。併せて感謝いたします)

スクリプト本体です:

(ご覧の様に、LDR と完全に一体となったコーディングができることが IE の特徴ではないかと思います)

さらに、GM スクリプトを移植しやすいように、GM_xmlhttpRequest を実装してみました:

function GM_xmlhttpRequest(details) {
  var req = new XMLHttpRequest;
  req.open(details.method, details.url, true);
 
  for (var h in details.headers)
    req.setRequestHeader(h, details.headers[h]);
 
  req.onload = function () {
    (details.onload || function(){})(req);
  };
  req.send(details.data);
}

簡易版ですが、これ自体なかなか便利です。

よろしければご利用または参考にしてください。


Update [20060526]:

初めて読むフィード等で、記事数が表示限界を超えて大量に存在した場合に問題が生じる可能性があるようなので修正しました。

具体的には、ブックマーク数表示のためのメソッドが setTimeout 関数により無制限に再帰呼び出しされてしまう、またそのような実行待ちメソッドが大量に存在し続ける事態となる可能性があった、ということです。


Update [20060613]:

上と同様ですが、未読記事が沢山あるフィードで、現在の記事の描画をキャンセルして過去記事に遡った場合、実行されずじまいのカウント表示メソッドが永久に再帰実行されてしまう問題がありました。

このため、"fails" という変数で失敗を記録し、再帰しすぎを防ぐ仕組みを取り入れてみました:

  if ((this.fails[link] = (this.fails[link] || 0)+1) >= 10)
    return;
  setTimeout(...)

10 回失敗すると自己消滅する、というのを実現したつもりです (ただし未テスト)。