Hatena::Diary

Sybianの日記

2007-05-15

[]ウェブ魚拓に残ってる2chスレッドを専ブラ風に読みたい

http://live23.2ch.net/test/read.cgi/liveanb/1179144169/ - 2007蟷エ5譛?15譌・ 09:11 - 繧ヲ繧ァ繝夜ュ壽挙を読んでたんだけど、専ブラに慣れた今となっては生のHTMLを読むのはきついのでざっと書いた。

ざっとなのでOperaでしか検証してないし、機能も「>>([0-9]+)」「>>([0-9]+)-([0-9]+)」にマウスオーバーしたら当該レスがポップアップするだけです。

http://sybian.picopico.cc/misc/gyotaku-2ch-dressup.user.js

// ==UserScript==
// @name           2ch gyotaku 
// @include        http://megalodon.jp/?url=http://*.2ch.net/
// @namespace      http://d.hatena.ne.jp/Sybian/
// @version        1.0
// ==/UserScript==

(function(){

var res=document.getElementsByTagName('dd');
if(!res) return;
var dt=document.getElementsByTagName('dt');
for(var i=0,len=res.length; i<len; i++){
	res[i].value=dt[i].innerHTML+'<br />'+res[i].innerHTML;
}

function popup(a,e){
	var id='popup-'+a.res;
	if(document.getElementById(id)) return ;
	var div=document.createElement('div');
	div.flag=false;
	div.id=id;
	var html='';
	if(a.res.length == 2){
		html+=res[a.res[0]-1].value;
	}else{
		for(var i=a.res[0]; i<=a.res[1]; i++){
			html+=res[i-1].value || '';
		}
	}
	div.innerHTML=html.replace(/<br><br>[\r\n]*$/i,'');
	div.addEventListener(
		'mousemove'
		,function(e){
			this.flag=true;
		}
		,false
	);
	div.addEventListener(
		'mouseout'
		,function(e){
			this.flag=false;
			var self=this;
			setTimeout(
				function(){
					if(!self.flag) self.parentNode.removeChild(self);
				}
				,400
			);
		}
		,false
	);
	div.setAttribute(
		'style'
		,[
			'position:absolute'
			,'background:#efefef'
			,'border:2px solid #333'
			,'padding:1ex'
			,'top:'+(e.pageY-5)+'px'
			,'left:'+(e.pageX+20)+'px'
		].join(';')
	);
	document.body.appendChild(div);
	setup(div);
}

function setup(parent){
	var parent=parent || document;
	var a=parent.getElementsByTagName('a');
	for(var i=0,len=a.length; i<len; i++){
		if(typeof a[i].innerHTML == 'string' && a[i].innerHTML.match(/>>([0-9-]+)/)){
			var arr=(RegExp.$1+'-').split('-');
			a[i].res=arr;
			a[i].addEventListener(
				'mouseover'
				,function(e){
					popup(this,e);
				}
				,false
			);
			a[i].addEventListener(
				'mouseout'
				,function(e){
					return ;
					var div=document.getElementById('popup-'+this.res);
					if(div && !flag){
						document.body.removeChild(div);
					}
				}
				,false
			);
		}
	}
};
setup();

})();