favorarate

By koyachi Last update Dec 31, 2007 — Installed 254 times.
// ==UserScript==
// @name       favorarate
// @namespace  http://d.hatena.ne.jp/koyachi
// @include    http://favotter.matope.com/user.php?user=*
// ==/UserScript==
//
// 2007-12-31 t.koyachi
//

(function(){
  var elmFavorare = $x('//h3')[0];
  var favorare_count = elmFavorare.innerHTML.replace(/.*?のふぁぼられ \((.*?)\).*/, "$1");

  var userid = $x('//h3/a')[0].href.replace(/^http:\/\/twitter\.com\/(.*)$/, "$1");
  ajax('http://twitter.com/' + userid, function(res){
    var htmlDoc = createHTMLDocumentByString(res)
    var elmTwitCount = getFirstElementByXPath('//ul[@class="stats"]/li[4]/span', htmlDoc);
    var twit_count = elmTwitCount.innerHTML.replace(/,/g, "");
    var elmFollowersCount = getFirstElementByXPath('//ul[@class="stats"]/li[2]/span[2]', htmlDoc);
    var followers_count = elmFollowersCount.innerHTML.replace(/,/g, "");

    // http://d.hatena.ne.jp/ono_matope/20071219#1198025223
    var parentPopulation = 850;
//    var favorarate = (favorare_count / (twit_count * followers_count)) * 100;
    var aaa = 100;
    var favorarate = (favorare_count / (twit_count * parentPopulation)) * 100;
    favorarate = (Math.round(favorarate * aaa) / aaa) +'(%)';
    var result = ['<span style="font;color:silver">',
                  'favorare:', favorare_count,
                  'twits:', twit_count,
                  'followers:', followers_count,
                  '</span>',
                  '<span style="font;color:red">',
                  'FAVORARATE =', favorarate,
                  '</span>'
         ].join(' ');
    elmFavorare.innerHTML =  elmFavorare.innerHTML + result;
  });

  function log() {
    if (unsafeWindow.console) {
      unsafeWindow.console.log.apply(unsafeWindow.console,
                                     Array.slice(arguments));
    }
  }

  function ajax(url, onload){
    GM_xmlhttpRequest({
      method : 'get',
      url : url,
      onload : function(res){
        onload(res.responseText);
      }
    });
  }

  function createHTMLDocumentByString(str) {
    var html = str.replace(/<!DOCTYPE.*?>/, '').replace(/<html.*?>/, '').replace(/<\/html>.*/, '')
    var htmlDoc  = document.implementation.createDocument(null, 'html', null)
    var fragment = createDocumentFragmentByString(html)
    htmlDoc.documentElement.appendChild(fragment)
    return htmlDoc
  }

  function createDocumentFragmentByString(str) {
    var range = document.createRange()
    range.setStartAfter(document.body)
    return range.createContextualFragment(str)
  }

  function getFirstElementByXPath(xpath, node) {
    var node = node || document
    var result = document.evaluate(xpath, node, null,
                                   XPathResult.FIRST_ORDERED_NODE_TYPE, null)
    // for search element
    var DEBUG_MODE = 0;
    if (DEBUG_MODE) {
      var rule = [".match{border: 3px solid #f00}\n",
                  ".match:after{content:'", xpath, "'}\n"].join('')
      GM_addStyle(rule)
      result.singleNodeValue.className = 
      result.singleNodeValue.className + ' match'
    }
    return result.singleNodeValue ? result.singleNodeValue : null
  }

  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;
  }
})();