LDR/Fastladderの各記事に何かをするUserJSを書くとき

タイトル変更した→旧「LDR/Fastladderはてなブックマーク登録数を表示させる」

既にいいのがあったので、ここらへんは読み飛ばしてください。


どっかにありそうだったけど探すのが面倒だったので作った。需要があったっぽかったし。

  • LDR_hateb_count.user.js
// ==UserScript==
// @name	LDR_hateb_count.user.js
// @include	http://reader.livedoor.com/reader/
// @include	http://fastladder.com/reader/
// ==/UserScript==

(function(win){
win.ItemFormatter.TMPL.tmpl = win.ItemFormatter.TMPL.tmpl.replace(/(<span id="pin)/, '<a href="http://b.hatena.ne.jp/entry/[[ item ]]" style="height:18px;margin-right:4px;float:left;"><img alt="" border="0" src="http://b.hatena.ne.jp/entry/image/[[ link ]]"></a>\n$1');
})(this.unsafeWindow || window)

Opera & Firefox で試したけど、たぶん全部の UserJS 機構で動くはず。Greasemonkey 用ダウンロードリンク


こっから本題

LDR/Fastladder の各記事に何かをくっつける UserJS の類 (ちょっと探したところ↓とか) は多いと思うのだけど、

書き換えは以下のタイミングに大別できると思う。

タイミング 特徴 柔軟性
AFTER_PRINTFEED DOM を弄るのが重そうだし、実際にはこのタイミングでは全部のフィードが表示されていないため、setTimeout などで複数回実行しないといけない。 高い
BEFORE_PRINTFEED DOM ではなく文字列操作なので気分はラクだけど、同じフィードを何度も表示すると操作が何度も実行されてしまう。(ので既に書き換えたかどうか判定する必要がある) 中くらい
テンプレート直接弄る 基本的に実行は1回 & 速い。 低い

できるなら下のほうでやりたい。

全部のフィードが表示されてから実行される COMPLATE_PRINTFEED というレジスターが (ソースを見ると) あるっぽいのだけど、まだ出来ていないらしい。(COMPLETE でないのはミスか)


ちなみに、上のスクリーンショットで「Permalink」の変わりに URL が表示されているのは、テンプレートを書き換えたのではなく CSS でやっている。

div.item_info a{
	color: #008080;
	text-decoration: none;
	content: attr(href) "\A";
}
div.item_info a:visited{
	color: #800080;
}

CSS でやる方法を上の表にあてはめて考えるならこんな感じになる。

タイミング 特徴 柔軟性
COMPLATE_PRINTFEED 未完。早く作って。 極めて高そう
AFTER_PRINTFEED DOM を弄るのが重そうだし、実際にはこのタイミングでは全部のフィードが表示されていないため、setTimeout などで複数回実行しないといけない。 高い
BEFORE_PRINTFEED DOM ではなく文字列操作なので気分はラクだけど、同じフィードを何度も表示すると操作が何度も実行されてしまう。(ので既に書き換えたかどうか判定する必要がある) 中くらい
テンプレート直接弄る 基本的に実行は1回 & 速い。 低い
CSS ほぼ負荷なし。 極めて低い

entry_widget、channel_widgetというAPIがあるのをコメントで教えてもらった

各記事表示時に実行されるもので、この位置に何かを足すことができる。

表でいうなら、こんな感じかな。

タイミング 特徴 柔軟性
COMPLATE_PRINTFEED 未完。早く作って。 極めて高そう
AFTER_PRINTFEED DOM を弄るのが重そうだし、実際にはこのタイミングでは全部のフィードが表示されていないため、setTimeout などで複数回実行しないといけない。 高い
entry_widget 将来の仕様変更に左右されにくい。 どちらとも言えない
BEFORE_PRINTFEED DOM ではなく文字列操作なので気分はラクだけど、同じフィードを何度も表示すると操作が何度も実行されてしまう。(ので既に書き換えたかどうか判定する必要がある) 中くらい
テンプレート直接弄る 基本的に実行は1回 & 速い。 低い
CSS ほぼ負荷なし。 極めて低い

innerHTML での書き換えなので、「何かをくっつける」ためには柔軟性があって良い API だと思う。「何かをする」のは難しいかも? 頑張れば出来そうな気もするけど。

「何かをする」スクリプトの例↓


続きを書いた。