twitterに張られたニコニコのリンクをサムネ(というかiframe)展開するぐりもん

とりあえず公開ー

// ==UserScript==
// @name mata saume
// @namespace	http://d.hatena.ne.jp/noboruhi
// @description matemiteru samuneiru
// @include http://twitter.com/*
// @author	noboruhi
// @version	 0.1
// ==/UserScript==


(
function() {
	var entry = $X("//tr[@class='hentry']//a[starts-with(@href,'http://www.nicovideo.jp/watch/')]").forEach(function (a) {
		a.href.match(/http:\/\/www\.nicovideo\.jp\/watch\/(sm\d+)/);
		var id = RegExp.$1;
	  var br =$N('br',{},'');
		var iframe = $N('iframe',{
			'width' : '312',
			'height' : '176',
			'src' : 'http://www.nicovideo.jp/thumb/' + id,
			'scrolling'	: 'no',
			'style' : 'border:solid 1px #CCC;',
			'frameborder' : '0'
		},'');
		a.parentNode.appendChild(br);
		a.parentNode.appendChild(iframe);
		iframe.appendChild(a);
		a.parentNode.removeChild(a);
	});


// cho45 san toko no inyou
function $N(name, attr, childs) {
		var ret = document.createElement(name);
		for (k in attr) {
			if (!attr.hasOwnProperty(k)) continue;
			v = attr[k];
			if (k == "class") {
				ret.className = v;
			} else {
				ret.setAttribute(k, v);
			}
		}
		switch (typeof childs) {
			case "string": {
				ret.appendChild(document.createTextNode(childs));
				break;
			}
			case "object": {
				for (var i = 0, len = childs.length; i < len; i++) {
					var child = childs[i];
					if (typeof child == "string") {
						ret.appendChild(document.createTextNode(child));
					} else {
						ret.appendChild(child);
					}
				}
				break;
			}
		}
		return ret;
	}
	
	function $X(exp, context) {
		if (!context) context = document;
		var resolver = function (prefix) {
			var o = document.createNSResolver(context)(prefix);
			return o ? o : (document.contentType == "text/html") ? "" : "http://www.w3.org/1999/xhtml";
		}
		var exp = document.createExpression(exp, resolver);

		var result = exp.evaluate(context, XPathResult.ANY_TYPE, null);
		switch (result.resultType) {
			case XPathResult.STRING_TYPE : return result.stringValue;
			case XPathResult.NUMBER_TYPE : return result.numberValue;
			case XPathResult.BOOLEAN_TYPE: return result.booleanValue;
			case XPathResult.UNORDERED_NODE_ITERATOR_TYPE: {
				result = exp.evaluate(context, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
				var ret = [];
				for (var i = 0, len = result.snapshotLength; i < len ; i++) {
					ret.push(result.snapshotItem(i));
				}
				return ret;
			}
		}
		return null;
	}
})();

ぐりもんは初めて書いたんで無駄・無理な所があるやもしれません。ツッコミ・添削などお待ちしております。

追記:ツッコミきました!なんか不具合直ってるっぽいんでコッチ使ってくださいな。
http://blog.fulltext-search.biz/articles/2008/01/29/re-mata-samune