// ==UserScript== // @name with hatebu search // @namespace http://b.hatena.ne.jp/ // @description google 検索の画面で、はてブ検索へのナビゲーションを出します // @include http://www.google.co.jp/search* // @include http://www.google.com/search* // ==/UserScript== location.href = "javascript:"+encodeURIComponent(uneval(function () { (function (Global) { var td = $X('//table/tbody/tr/td[@class="nobr xsm"]'); if (td.length) { var text = document.getElementsByName('q')[0].value; var tr = td[0].parentNode; var container = document.createElement('td'); tr.appendChild(container); var img = document.createElement('img'); img.src = 'http://b.hatena.ne.jp/images/search-mini.png'; img.alt = 'はてな検索で "' + text + '" を検索'; img.title = img.alt; container.appendChild(img); img.style.cursor = 'pointer'; img.addEventListener('mousedown', function() { location.href = 'http://b.hatena.ne.jp/search?q=' + encodeURIComponent(text); }, false); } function $X (exp, context, type /* want type */) { if (typeof context == "function") { type = context; context = null; } if (!context) context = document; exp = (context.ownerDocument || context).createExpression(exp, function (prefix) { var o = document.createNSResolver(context)(prefix); if (o) return o; return (document.contentType == "application/xhtml+xml") ? "http://www.w3.org/1999/xhtml" : ""; }); switch (type) { case String: return exp.evaluate(context, XPathResult.STRING_TYPE, null).stringValue; case Number: return exp.evaluate(context, XPathResult.NUMBER_TYPE, null).numberValue; case Boolean: return exp.evaluate(context, XPathResult.BOOLEAN_TYPE, null).booleanValue; case Array: var result = exp.evaluate(context, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); for (var ret = [], i = 0, len = result.snapshotLength; i < len; i++) { ret.push(result.snapshotItem(i)); } return ret; case undefined: 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: // not ensure the order. var ret = [], i = null; while ((i = result.iterateNext())) ret.push(i); return ret; } return null; default: throw(TypeError("$X: specified type is not valid type.")); } } })(this); }))+"()";