Google の検索語入力領域を大きくする Greasemonkey Script

Googleの検索語を入れるところ、もうちょっと大きければいいな、と思って作ってみた。Greasemonkey スクリプトの練習も兼ねて。

var elems, elem;
elems = document.evaluate(
    "//input[@type='text' and @name='q']",
    document,
    null,
    XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
    null);

for (var i = 0; i < elems.snapshotLength; i++) {
    elem = elems.snapshotItem(i);
    elem.size=100;
}

インストール用スクリプトとスクリーンショット

やっていることは、Google から送られてくる HTML 中の type=text で、かつ、name=q input タグを全部取り出して、その size 属性に 100 を書き込む、というもの。type=text と、明示的にソースに書いてないと反応しないっぽい。Google の Top Page だと、type=text と明示的に書いてないので、入力エリアは大きくならない。一度検索した後の、結果表示がされているほうの HTML には、ちゃんと type=text が入っているので、そっちは大きくなる。

ソース中の "//input[@type='text' and @name='q']" の部分は、XPath というものであるらしい。これをたとえば、"//a[@class='keyword']" と書くと、HTML 中の class=keyword と指定されている a タグを全部、っていう意味になる。これをうまく使えば、はてなダイアリーキーワードリンクを全部、リンクしてない単語に変えてしまうこともできるっぽい。で、書いてみた。

var elems;
elems = document.evaluate(
	"//a[@class='keyword']",
	document,
	null,
	XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
	null);

var elem, newText;
for (var i = 0; i < elems.snapshotLength; i++) {
	elem = elems.snapshotItem(i);
	newText = document.createTextNode(elem.firstChild.nodeValue);
	elem.parentNode.replaceChild(newText, elem);
}

これは一応動くけど、<a class="keyword" href="[]http://d.hatena.ne.jp/keyword/Java[]">J<b>av</b>a</a> というように、a タグの中身が複数の Node になるような場合だと、うまくいかない。どうすればいいんだろ。

(って、はてなダイアリーに書くべきことではないかもしれないけど、Web の文章を読むときに、今読んでいるところをマウスカーソルでなぞってしまう私みたいな人間にとって、はてなダイアリーキーワードリンクってウザ過ぎ。キーワードが onMouseOver か何かにパカパカ反応して気が散るったらありゃしない。ちょっと文章をコピろうとした途端に、別ページに飛んじゃったりもするし。文中で使われいるキーワードの説明ページへのリンクを読者に提供することは素晴らしいとは思うけどね。)

Greasemonkeyスクリプトをインストールする時って、スクリプトそのものをバシッと見せつけられる。逆にいうと、スクリプトを表示しないとインストールボタンがでてこない。これってセキュリティ的に素晴らしいかも。

参考にしたところ。

XML Path Language (XPath) バージョン 1.0
http://www.infoteria.com/jp/contents/xml-data/REC-xpath-19991116-jpn.htm
Dive Into Greasemonkey
http://diveintogreasemonkey.org/

keywords: Greasemonkey | Firefox | XML | XPath | HTML | タグ | キーワード | はてなダイアリー