「はてなグリースモンキー」>「アンテナ手動更新リンク」のBUG?と修正案



まず始めに、私は Firefox なら使ってるけれども、グリースなんとか? って云う拡張は使った事が無いので、以下に書く日記は、”まったくの誤り!”の可能性が在る事を、ここにお断りしておきます。


ここでのお話は Opera Ver.8.50 日本語版「はてなグリースモンキー」 のページで紹介されている 「アンテナ手動更新リンク」の HatenaAntennaManualUpdate.user.js を適用した場合の事です。


で、手短に結論を書くと
はてなアンテナでは、各々のアンテナについて「サイト更新チェック用のURL」「表示用URL」の2つを指定できるが、 「アンテナ手動更新リンク」の HatenaAntennaManualUpdate.user.js で生成されるリンクは「表示用URL」で更新チェックしてしまう。
当然、「サイト更新チェック用のURL」で更新チェックするべきジャマイカ!!!


そんでもって、↓が、私の修正案。

// Copyright (C) 2005, hatena.
// Released under the GPL license
// http://www.gnu.org/copyleft/gpl.html
//
// ==UserScript==
// @name           Hatena Antenna ManualUpdate
// @namespace      http://www.hatena.ne.jp
// @include        http://a.hatena.ne.jp/*
// ==/UserScript==

(function() {
	function createUpdateLink(url) {
		var text = unescape("%u66F4%u65B0");
		var aTag = document.createElement("a");
		aTag.style.fontSize = "9pt";
		aTag.style.fontWeight = "normal";
		aTag.href = "http://a.hatena.ne.jp/check?robots=1&fixpage=1&url=" + escape(url);
		aTag.appendChild(document.createTextNode(text));
		return aTag;
	}
	
	var pageName = location.pathname.split("/")[2];
	if (! (pageName=="" || pageName=="simple" || pageName=="detail"))
		return;
	
	var liTags = document.getElementsByTagName("li");
	for (var i=0; i<liTags.length; i++) {
		var li = liTags[i];
		if (li.firstChild.nodeName.toLowerCase()=="script") continue;
		for (var n=1; n<li.childNodes.length ; n++) {
			if (li.childNodes[n].nodeName.toLowerCase()=="a") {
				var url = li.childNodes[n].href;
				if (url.match(/^http:\/\/a.hatena.ne.jp\/include\?/)) {
					var checkurl=url.replace(/^http:\/\/a.hatena.ne.jp\/include\?(.*)$/,"$1");
					if (checkurl) { 
						if (pageName=="" || pageName=="detail") {
							var pTag = li.getElementsByTagName("p")[0];
							li.insertBefore(createUpdateLink(checkurl), pTag);
						} else {
							li.appendChild(createUpdateLink(checkurl));
						}
						break;
					}
				}
			}
		}
	}
})();



こんなダサい修正案でお恥ずかしいけれど、すくなくとも、はてなアンテナ - borbisのアンテナでは適正に動作してます。
ていうか、今回の修正に関しては↑のアンテナは、すべての検査項目が入っているものと思います。
ま、はてな歴の浅い私の話じゃアテになりませんけど。。。。。




追記(2005-10-01)
過去にも同じ様な日記を書いている人を見つけた。
HM weblog
ドシロウトの私には、如何にも専門家っぽく見えて「カコイイ!」っぽいので真似してみたくなった。
検索してみると diff っていうツールを使うらしい事が判ったので早速 Vector からダウンロードして出来上がったのが↓。

--- HatenaAntennaManualUpdate.user.js.orig	Fri Aug 19 18:47:46 2005
+++ HatenaAntennaManualUpdate.user.js	Fri Sep 30 14:57:34 2005
@@ -27,16 +27,20 @@
 	for (var i=0; i<liTags.length; i++) {
 		var li = liTags[i];
 		if (li.firstChild.nodeName.toLowerCase()=="script") continue;
-		if (! li.childNodes[1]) continue;
-		if (li.childNodes[1].nodeName.toLowerCase()=="a") {
-			var url = li.childNodes[1].href;
-			url.match(/^http:\/\/a.hatena.ne.jp\/go\?(.*)\d{14}$/);
-			if (RegExp.$1) { 
-				if (pageName=="" || pageName=="detail") {
-					var pTag = li.getElementsByTagName("p")[0];
-					li.insertBefore(createUpdateLink(RegExp.$1), pTag);
-				} else {
-					li.appendChild(createUpdateLink(RegExp.$1));
+		for (var n=1; n<li.childNodes.length ; n++) {
+			if (li.childNodes[n].nodeName.toLowerCase()=="a") {
+				var url = li.childNodes[n].href;
+				if (url.match(/^http:\/\/a.hatena.ne.jp\/include\?/)) {
+					var checkurl=url.replace(/^http:\/\/a.hatena.ne.jp\/include\?(.*)$/,"$1");
+					if (checkurl) { 
+						if (pageName=="" || pageName=="detail") {
+							var pTag = li.getElementsByTagName("p")[0];
+							li.insertBefore(createUpdateLink(checkurl), pTag);
+						} else {
+							li.appendChild(createUpdateLink(checkurl));
+						}
+						break;
+					}
 				}
 			}
 		}

なんだか、最後のあたりがチョッと違うけど気にしない事にする。