このページでは、ユーザ定義フィルタの記述方法について説明します。基本的なフィルタについては、「フィルタの記述方法」を参照してください。
注意) ユーザ定義フィルタは上級者向けの機能です。フィルタを作成するにはJavaScriptとDOMに関する知識が必要です。
RSSやスレッドの各アイテムは以下の順に処理されて描画を行います。ユーザ定義フィルタはこのうち4番のRWフィルタ内で実行されます。
ユーザ定義フィルタのスクリプト欄には、アイテム描画時に実行するJavaScriptのコードを入力してください。
このスクリプトの目的は、各アイテムのDOMデータを直接操作して書き換えることです。 例えば、getElementsByTagNameで特定のタグ要素を取得して属性を変更するとか、リンクに関連した画像を埋め込むとか、JavaScriptが行える範囲でアイテムの描画内容を書換えることができます。
「draw」という名前の変数は、ユーザ定義のスクリプトに渡される唯一のオブジェクトです。以下にdrawオブジェクトのプロパティを列挙します。
| プロパティ名 | 内容 |
|---|---|
| mode | アイテムの表示モードを表す文字列。
|
| elem | 描画されたアイテムのDOMエレメント。 |
| item | 描画されたアイテムの情報を格納するオブジェクト。アイテムの種類により内容が変わります。 RSS・RSS検索のアイテム情報
掲示板のアイテム情報
スレッドのアイテム情報
|
| channel | 描画されたフィードの情報を格納するオブジェクト
|
ユーザ定義フィルタのスクリプトで、「draw.elem」に格納されたDOMデータを書き換えてください。
「draw.elem」が指し示すものは、本文のDOMエレメントそのものです。 (タイトル行のDOMエレメントはpreviousSiblingで参照できますが、タイトル行は書き換えないでください。)
例: RSSではてなブックマーク数を表示する
if (draw.item.link) {
var url = draw.item.link.replace(/\?ref=rss.*|#.*/, ""); // URLを調整
var img = document.createElement("IMG");
img.src = "http://b.hatena.ne.jp/entry/image/"+url;
draw.elem.appendChild(img);
}
例: Twitter検索でRTを見やすく表示する
// Twitter検索でなければ何もしない
if (draw.item.type != "osr_twitter") return;
// ノードツリーを探索してRTをハイライト表示
function highlight_RT (elem) {
var node = elem.firstChild;
while (node) {
switch (node.nodeType) {
case 1:
highlight_RT(node);
break;
case 3:
var pos = node.nodeValue.search(/\bRT:?\s/);
if (pos >= 0) {
node = elem.insertBefore(document.createElement("SPAN"), node.splitText(pos));
while (node.nextSibling)
node.appendChild(elem.removeChild(node.nextSibling));
node.style.backgroundColor = "#ddd";
node.style.fontSize = "80%";
}
break;
}
node = node.nextSibling;
}
}
highlight_RT(draw.elem);
例: 掲示板でスレッドの勢いをフォントサイズに反映する
// n時間あたりの書き込み数を求める
var hour = 1;
var time = (new Date()).getTime()/1000 - parseInt(draw.item.id);
var rows = parseInt(draw.item.rows);
if (time > 0 && rows > 0) {
rows = Math.round(rows / (time/3600) * hour);
draw.elem.style.fontSize = Math.min(rows,100)+100+"%"; // 最大200%
}
例: スレッドでリンク先のJPG画像を表示する
// フル表示でなければ何もしない
if (draw.mode != "full") return;
// 全リンクの拡張子を調べる
var pat = /\.(?:jpg|jpeg)$/i;
var list = draw.elem.getElementsByTagName("A");
for (var i=0; i<list.length; i++) {
if (pat.test(list[i].href)) {
var img = document.createElement("IMG");
img.src = list[i].href;
list[i].parentNode.insertBefore(img, list[i]);
}
}
スクリプトのデバッグについて。パーサーエラーなどの単純な間違いは、ダイアログのOKボタンを押したときにアラートを表示します。
スクリプトの実行中に発生したエラーがある場合は、再びダイアログを開いたときに、スクリプト欄の下に表示します。
スクリプトを高度にデバッグする機能はありませんので、期待通りの動作をしない時などは、変数値やメッセージをコンソールに出力するなどして確認してください。