// CSS内のURLをリンクアンカー化するスクリプト
// Mozilla, Firefox用
// 最終更新: 2005-04-27
// 書いた人: 北村曉

function(){
	var d = document;
	// text/css か text/plain の時のみ動作
	if ( !d.contentType.match(/^text\/(css|plain)$/i) ) {
		alert('Not CSS file.');
		return;
	};
	// CSSの内容はpre要素として扱われる
	var nPre = d.getElementsByTagName('PRE').item(0);
	// CSSテキストを取り込み
	// (pre要素の子ノードは複数のテキストノードとなることがある)
	var cssStr = '';
	while (nPre.firstChild) {
		cssStr += nPre.removeChild(nPre.firstChild).nodeValue;
	}
	// @import "..." を、一旦 @import iurl(...) という書式に変換
	while ( cssStr.match(/(@import\s+)(["'])([^\2\s]+)(\2)/) ) {
		cssStr = RegExp.leftContext
			+ RegExp.$1 + 'iurl('
			+ RegExp.$2 + RegExp.$3 + RegExp.$2
			+ ')' + RegExp.rightContext;
	};
	// URL部分とその他のテキスト部分に分割
	var urls = new Array();
	var texts = new Array();
	while ( cssStr.match(/(i?url\(\s*)([^)\s]+)(\s*\))/i ) ){
		urls[urls.length] = RegExp.$2;
		var t = RegExp.leftContext;
		cssStr = RegExp.rightContext;
		// "iurl(", ")" は含めないようにする
		if ( RegExp.$1 != 'iurl(' ) {
			t += RegExp.$1;
			cssStr = RegExp.$3 + cssStr;
		}
		texts[texts.length] = d.createTextNode(t);
	}
	texts[texts.length] = d.createTextNode(cssStr);
	// URL部分をHTMLのa要素ノードに変換
	for (var i = 0; i < urls.length; i++) {
		var frag = d.createDocumentFragment();
		var quote = '';
		if ( urls[i].match(/^(["']).+\1$/) ) {
			urls[i] = urls[i].substr(1, urls[i].length - 2);
			quote = RegExp.$1;
		}
		var nA = d.createElement('A');
		nA.href = urls[i];
		nA.appendChild(d.createTextNode(urls[i]));
		quote && frag.appendChild(d.createTextNode(quote));
		frag.appendChild(nA);
		quote && frag.appendChild(d.createTextNode(quote));
		urls[i] = frag;
	}
	// CSSテキストノードとa要素ノードをpre要素に戻す
	while (texts.length || urls.length) {
		texts.length && nPre.appendChild(texts.shift());
		urls.length && nPre.appendChild(urls.shift());
	}
}

/*
bookmarklet URL:
javascript:(function(){var d=document;if(!d.contentType.match(/^text\/(css|plain)$/i)){alert('Not CSS file.');return;};var nPre=d.getElementsByTagName('PRE').item(0);var cssStr='';while(nPre.firstChild){cssStr+=nPre.removeChild(nPre.firstChild).nodeValue;}while(cssStr.match(/(@import\s+)([%22'])([^\2\s]+)(\2)/)){cssStr=RegExp.leftContext+RegExp.$1+'iurl('+RegExp.$2+RegExp.$3+RegExp.$2+')'+RegExp.rightContext;};var urls=new Array();var texts=new Array();while(cssStr.match(/(i?url\(\s*)([^)\s]+)(\s*\))/i)){urls[urls.length]=RegExp.$2;var t=RegExp.leftContext;cssStr=RegExp.rightContext;if(RegExp.$1 !='iurl('){t+=RegExp.$1;cssStr=RegExp.$3+cssStr;}texts[texts.length]=d.createTextNode(t);}texts[texts.length]=d.createTextNode(cssStr);for(var i=0;i<urls.length;i++){var frag=d.createDocumentFragment();var quote='';if(urls[i].match(/^([%22']).+\1$/)){urls[i]=urls[i].substr(1, urls[i].length-2);quote=RegExp.$1;}var nA=d.createElement('A');nA.href=urls[i];nA.appendChild(d.createTextNode(urls[i]));quote && frag.appendChild(d.createTextNode(quote));frag.appendChild(nA);quote && frag.appendChild(d.createTextNode(quote));urls[i]=frag;}while(texts.length || urls.length){texts.length && nPre.appendChild(texts.shift());urls.length && nPre.appendChild(urls.shift());}})()
*/

/*

*bookmarkに登録する方法(Mozilla Firefox)

1. Bookmarkメニューより、"Manage Bookmark"を選択し、
   Bookmark Managerを起動します。
2. "New Bookmark"で新しいbookmarkを作成
3. "Name:"には適当な名前を記入、"Location:"に上記のbookmarklet URLを
   コピー&ペーストし、"OK"を押します。
4. 適当なフォルダに移してご利用下さい。


*対応しているURLの形式

 - @import "[URL]"
 - @import '[URL]'
 - url([URL])            (url() は大文字・小文字両方対応)
 - url("[URL]")
 - url('[URL]')
 - url(  [URL]  )        (括弧とURLの間に空白文字入り)
 - url(  "[URL]"  )
 - url(  '[URL]'  )


*Memo
 - url()を使わない@importに対応するところで結構無理なことをしてます。
 - スクリプトを精錬してくれる方の出現を望みます。

*変更履歴

2004-12-21
初出

2005-04-27
 - bookmarklet URLでダブルクォーテーション(")をそのまま使っていたので、
   %22に置き換えました。
 - bookmarkに登録する方法を書きました。

*/
