読者です 読者をやめる 読者になる 読者になる

ゆるめ

ゆるめなのは公開範囲です。

HideMyAnswer で隠された回答を見るユーザスクリプト 1.1

Hide My Answer (question:1331264191question:1331284462 などで使われているサービス) の回答を、今メインで使っているブラウザでさっくり見たかったのですが、Firefox 用のアドオンなどはまだ開発されていないみたいなので、自分でちまちまユーザスクリプトを書きました。

// ==UserScript==
// @id          ShowOurAnswer
// @name        ShowOurAnswer
// @version     1.1
// @namespace   id:pacochi
// @author      pacochi
// @description HideMyAnswer を見るだけ
// @include     http://q.hatena.ne.jp/*
// @run-at      document-end
// ==/UserScript==

(function() {

if (!document.URL.match(/q\.hatena\.ne\.jp\/\d+(#|$)/)) return;

var url = 'http://hidemyans.appspot.com/getAnswer';
var req = function(id) {

	GM_xmlhttpRequest({
		method: 'POST',
		headers: { 'Content-type': 'application/x-www-form-urlencoded' },
		url: url,
		data: 'hidemyansid=' + id,
		onload: function(res) {

			var txt = document.createElement('span');
			txt.style.cssText = 'display:block; padding:1em; border:1px solid #F6AC5A;';
			/* みんな適度に改行するタイプならこれでもいいと思う
			txt.style.cssText = 'display:block; padding:1em; border:1px solid #F6AC5A; white-space:pre;';
			txt.appendChild(document.createTextNode(res.responseText));
			*/
			var lines = res.responseText.split('\n');

			for (var i = 0; i < lines.length; i++) {

				if (i > 0) txt.appendChild(document.createElement('br'));
				txt.appendChild(document.createTextNode(lines[i]));

			}

			hma[id].ap.parentNode.insertBefore(txt, hma[id].ap);

		}
	});

};
var ans = document.evaluate("//div[@class='section clearfix' and starts-with(@id, 'answer-formatted-body-')]/p/text()",
 document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
var hma = {};

for (var i = 0; i < ans.snapshotLength; i++) {

	var ap = ans.snapshotItem(i);

	// Node.TEXT_NODE って書いたら undefined になった
	if(ap.nodeType == 3 && ap.nodeValue.match(/HideMyAnswer:(\d{13})/)) {

		var id = RegExp.$1;
		// 数日前まで書かれてた「reply_content」が質問によっては消えてたのを確認 (20120316)
		//var name = document.evaluate("ancestor::div[@class='answer reply_content']/h3/span[@class='timestamp']/a/@name",
		var name = document.evaluate("ancestor::div[@class='answer' or @class='answer reply_content']/h3/span[@class='timestamp']/a/@name",
		 ap, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
		var aid = parseInt(name.nodeValue.substr(1), 10);

		// 早く回答した方だけ変換
		if (typeof(hma[id]) == 'undefined' || hma[id].aid > aid) hma[id] = { aid: aid, ap: ap };

	}

}

for (var id in hma) req(id);

})();

Scriptish でしか確認してないので、他のやつだと動かないかもしれません。

以下追記です。

回答周辺のクラス名が変更されていたので修正しました。
回答欄の他に、回答コメント欄と質問コメント欄も変換する版 (ver 1.2)を書きました。