引用のBookmarkletを作ってみますた

Hatenabar言及日記を選べば引用してくれるのはわかっているのだけど、フレーム構造には対応してなかったりするのと、

更に引用元はオンライン上の文書などですから、印刷物とことなり後から修正される可能性があります。修正されると前に書いてあったことは消えてしまいます。引用内容がたまたまそれに当たると、引用内容と引用元の内容が食い違ってきてしまいます。このためオンライン上の引用元は厳密に考えるといついつのどのページという指定の仕方をしなければ正確ではありません。...

(2006-06-26 01:00に引用)

とOKAMURAさんが書かれているのを読みなるほどと思ってチュクチュクと作ってみますた。
どんな感じになるかというと↑の引用のような感じになるです。
本当は、OKAMURAさんが言及されているように、引用元情報の表示はcite要素を使ってblockquote要素の外に書いたほうが良いんだろうけど、Hatenaの場合、引用を表すqタグ、blockquoteタグを利用する場合に、cite属性やtitle属性を指定する事で自動的に引用元を表示する事ができます。となってしまうので、cite要素の自動生成は割愛しますた。
このあたり、心具用にも時間ができたら作ろうかなぁ。。。
といふことで、使ってみたい方は、下のリンクをブックマークにドラッグ&ドロップしてくださいませ。

選択して引用
なぜかa要素のhrefに書いておいたJavaScript(Bookmarklet)が有効にならないので、とりあえず下記ソースと一緒にワンラインのソースも置いております。興味ある方は、お手数ですが、新しいブックマークを作成後、urlの欄にワンラインのソースをコピーしてお使いください… ( ´・ω・`)。


あっ、ちなみに漏れはFireFox1.5.0.4でしか動作確認をしておりません。(´・ω・`)
つうか、ソースはかなり長くなってて1,500文字を超えてるので、この時点でIEでは使えないですよ?( ´∀`)
一応ソースも覚書を兼ねて載せておくことにします。
変なところがあれば、指摘していただけると嬉しかったりします。


以下全文ソース。

javascript:(
function(){
var ss=window.getSelection().toString();
var ul=location.href;
var fnm=top.frames.length;
var ful='';
function fsearch(w){
	for(var i=0;i<w.frames.length;i++){
		if(w.frames[i].length){
			fsearch(w.frames[i]);
			if(ss.length>0){
				return;
			}
		}else{
			ss=w.frames[i].getSelection().toString();
			if(ss.length>0){
				ful=w.frames[i].location.href;
				return;
			}
		}
	}
}
if(fnm>0){
	fsearch(window.top);
}
if(ss.length>0){
	ss=ss.replace(/&/g,'&amp;');
	ss=ss.replace(/</g,'&lt;');
	ss=ss.replace(/>/g,'&gt;');
	ss=ss.replace(/%22/g,'&quot;');
	ss=ss.replace(/'/g,'&#39;');
	var sCR='%'+'0D';
	var sLF='%'+'0A';
	while(true){
		var lcp=ss.length-1;
		var ess=escape(ss.substring(lcp,lcp+1));
		if(ess==sCR||ess==sLF){
			ss=ss.substring(0,lcp);
		}else{
			break;
		}
	}
	var crnm=0;
	var lfnm=0;
	for(var i=0;i<ss.length;i++){
		ess=escape(ss.substring(i,i+1));
		if(ess==sCR){
			crnm++;
		}else if(ess==sLF){
			lfnm++;
		}
	}
	if(crnm>0||lfnm>0){
		var rxp;
		var rxbr;
		if(crnm>0&&lfnm>0){
			rxp=/\r\n\r\n/g;
			rxbr=/\r\n/g;
		}else if(crnm>0){
			rxp=/\r\r/g;
			rxbr=/\r/g;
		}else{
			rxp=/\n\n/g;
			rxbr=/\n/g;
		}
		ss=ss.replace(rxp,'</p><p>');
		ss=ss.replace(rxbr,'<br />');
	}
}
ss='<p>'+ss+'...</p>';
if(ful.length>0){
	ss=ss+'<p><span style=%22font-size:x-small;%22>※引用元のサイトはフレームを使用されています。当該ページを直接参照される場合は<a href=%22'+ful+'%22>コチラ</a>からどうぞ。</span></p>';
}
var tt=document.title;
var dt=new Date();
function getFullStr(v){
	var ps='';
	if(v<10){
		ps='0';
	}
	return ps+v;
}
var dts='('+dt.getFullYear()+'-'+getFullStr(dt.getMonth()+1)+'-'+getFullStr(dt.getDate())+' '+getFullStr(dt.getHours())+':'+getFullStr(dt.getMinutes())+'に引用)';
ss=ss+'<p><span style=%22text-align:right;font-size:x-small;%22>'+dts+'</span></p>';
var bqtag='<blockquote cite=%22'+ul+'%22 title=%22'+tt+'%22>'+ss+'</blockquote>';
var tmp=prompt('',bqtag);
}
)();

こちらが、上記ソースのワンライン版です。コピー&ペーストにご利用ください。

javascript:(function(){var ss=window.getSelection().toString();var ul=location.href;var fnm=top.frames.length;var ful='';function fsearch(w){for(var i=0;i<w.frames.length;i++){if(w.frames[i].length){fsearch(w.frames[i]);if(ss.length>0){return;}}else{ss=w.frames[i].getSelection().toString();if(ss.length>0){ful=w.frames[i].location.href;return;}}}}if(fnm>0){fsearch(window.top);}if(ss.length>0){ss=ss.replace(/&/g,'&amp;');ss=ss.replace(/</g,'&lt;');ss=ss.replace(/>/g,'&gt;');ss=ss.replace(/%22/g,'&quot;');ss=ss.replace(/'/g,'&#39;');var sCR='%'+'0D';var sLF='%'+'0A';while(true){var lcp=ss.length-1;var ess=escape(ss.substring(lcp,lcp+1));if(ess==sCR||ess==sLF){ss=ss.substring(0,lcp);}else{break;}}var crnm=0;var lfnm=0;for(var i=0;i<ss.length;i++){ess=escape(ss.substring(i,i+1));if(ess==sCR){crnm++;}else if(ess==sLF){lfnm++;}}if(crnm>0||lfnm>0){var rxp;var rxbr;if(crnm>0&&lfnm>0){rxp=/\r\n\r\n/g;rxbr=/\r\n/g;}else if(crnm>0){rxp=/\r\r/g;rxbr=/\r/g;}else{rxp=/\n\n/g;rxbr=/\n/g;}ss=ss.replace(rxp,'</p><p>');ss=ss.replace(rxbr,'<br />');}}ss='<p>'+ss+'...</p>';if(ful.length>0){ss=ss+'<p><span style=%22font-size:x-small;%22>※引用元のサイトはフレームを使用されています。当該ページを直接参照される場合は<a href=%22'+ful+'%22>コチラ</a>からどうぞ。</span></p>';}var tt=document.title;var dt=new Date();function getFullStr(v){var ps='';if(v<10){ps='0';}return ps+v;}var dts='('+dt.getFullYear()+'-'+getFullStr(dt.getMonth()+1)+'-'+getFullStr(dt.getDate())+' '+getFullStr(dt.getHours())+':'+getFullStr(dt.getMinutes())+'に引用)';ss=ss+'<p><span style=%22text-align:right;font-size:x-small;%22>'+dts+'</span></p>';var bqtag='<blockquote cite=%22'+ul+'%22 title=%22'+tt+'%22>'+ss+'</blockquote>';var tmp=prompt('',bqtag);})();