読者です 読者をやめる 読者になる 読者になる

Googleの検索結果にサイト内検索ボックスを追加するScript

Greasemonkey UserJS

Googleに第2検索ボックス登場 をみて、さくっと書いてみた。

http://ss-o.net/userjs/googleinsitesearchbox.user.js

Opera9,Firefox2/3,Safari3で動作すると思います。AutoPagerize対応。

// ==UserScript==
// @name           GoogleInsiteSearchBox
// @namespace      http://ss-o.net/
// @include        http://www.google.co.jp/search*
// @include        http://www.google.com/search*
// ==/UserScript==
(function(){
  var q = document.getElementsByName('q')[0];
  if(!q || q.value.match(/site:/)) return;
  var f = function(nodes){
    for (var i = 0,l = nodes.length;i<l;i++) {
      var node = nodes[i];
      var sites = document.evaluate('.//span[@class="a"]',node,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);
      for (var j=0,len=sites.snapshotLength;j<len;j++){
        var site = sites.snapshotItem(j);
        var host = site.textContent.replace(/([^\/]*)\/\/?([^\/]*).*/,'$1');
        if (host == 'https:') host = RegExp.$2
        var div = document.createElement('div');
        div.innerHTML = [
          '<form name=gs method=GET onsubmit="this.q.value+=\' site:' + host + '\';return true;" action=/search>',
          '<input type=text name=q size=41 maxlength=2048 value="" title="Search '+host+'">',
          '<input type=submit name="btnG" value="Search '+host+'">',
          '</form>'
        ].join('');
        site.parentNode.appendChild(div);
      }
    }
  }
  f([document]);
  setTimeout(function(){
    if(window.AutoPagerize && AutoPagerize.addFilter) AutoPagerize.addFilter(f);
  },0)
})();

こんな感じ
http://ss-o.net/img/google_clipboard01.jpg
追記:この画像見たらhttpsのときに失敗してるのに気が付いたので修正した

蛇足

元記事は「Googleの新しい第2検索ボックスをいいと思うか」って投票してるんだけど、実際試してないのに投票って言われてもなーと思って、じゃあ試してみるかということで書いてみた感じです。
記事によると一部のサイトにしか表示されないらしいんだけど、確かにこのScriptで全件に追加した感じはちょっとゴテッとした感じがあって一部のほうが良さそうな印象。まあ、「ある方」に慣れてしまえばなくなったときに物足りなさを感じる可能性は高いと思うけど。
こう書けばクロスブラウザになるってのが感覚的にわかってきたので、だいぶコード書く時間・手間が短縮できるようになった感じ。