CreamMonkey

mzp2007-06-17

Safari用のGreaseMonkey - Creammonkey:phpspot開発日誌

おおすごい。さっそくインストール。

でもって、Google x はてブを使おうとしけれど、使えない。
で、ごにょごにょいじくってみる。

  • const宣言があった。たぶんFirefox独自の機能だろう。varに変更
  • document.evaluateでXPathを使ってる。SVN trunkでは実装されているらしいけれど、とりあえず使えないらしい。getElementsByTagNameなどを使って書き換え
  • XMLリクエストがうまくいかない。(dataを無視してる)。ソースを修正。(あとで、要点をまとめてTBを打つ)

いちおう、修正版G+?Bをば。

// ==UserScript==
// @name          G+?B
// @namespace     http://ukgk.g.hatena.ne.jp/faerie/
// @description   show ?B count in Google search result(for Safari)
// @include       http://*.google.*/*q=*
// ==/UserScript==

(function() {
  function setBookmarkCount(link, count) {
    var a = document.createElement("a");
    a.setAttribute("href", "http://b.hatena.ne.jp/entry/"+link.href);
    a.appendChild(document.createTextNode(""+count+" user"+(count>1?"s":"")));
    with (a.style) {
      fontSize = "0.9em";
      textDecoration = "none";
      if (count >= 5) {
        fontWeight = "bold";
        backgroundColor = "#fff0f0";
        color = "#f66";
      }
      if (count >= 10) {
        backgroundColor = "#ffcccc";
        color = "red";
      }
    }
    link.parentNode.insertBefore(a, link.nextSibling);
    link.parentNode.insertBefore(document.createTextNode(" "), link.nextSibling);
  }

  function callXmlrpc(requestbody, url2link) {
    var endpoint = "http://b.hatena.ne.jp/xmlrpc"; // const から変更
    function onload(response) {
      var pattern = /<name>([^<]+)<\/name>\s*<value><int>(\d+)/g;
      var m;
      while (m = pattern.exec(response.responseText)) {
        var link = url2link[m[1]];
        if (link && m[2] > 0) setBookmarkCount(link, m[2]);
      }
    }
    GM_xmlhttpRequest({method: "POST", url: endpoint, data: requestbody, onload: onload});
  }
  var links = document.getElementsByTagName('a');
  if (!links.length) return;

  var request = '<?xml version="1.0"?>\n<methodCall>\n';
  request += <methodName>bookmark.getCount</methodName>\n<params>\n';
  var url2link = new Array(links.length);
  String.prototype.htmlescape = function() {
    return this.replace(/&/, "&amp;").replace(/</g, "&lt;");
  }
  for (var i = 0; i < links.length; ++i) {
    var link = links[i];

    // XPathがつかえないので、ここでフィルタする
    if(link.className == 'l'){
      request += "<param><value><string>"+link.href.htmlescape()+"</string></value></param>\n";
      url2link[link.href] = link;
    }
  }
  request += "</params>\n</methodCall>\n";
  callXmlrpc(request, url2link);
})();

# うお、12時間前にリリースされたばかりだったのか