Thursday, March 13, 2008

Greasemonkey Script for Using HatenaStar on Google Reader

I made a Greasemonkey script for using Hatena Star on Google Reader. Don't you know Hatena Star? You can add a star by clicking button aside of this post's title. Whatever you want to do, if you like the post, want to show gratitude, and so on. If you are interested in Hatena Star, see here.

This feature can be used on blog normally, but many people read the blogs by rss reader. So, they can't use Hatena Star. This script can solve the problem for Google Reader user.

// ==UserScript==
// @name HatenaStar on Google Reader
// @namespace http://www.google.com/reader
// @description Automatically load the feature of HatenaStar.
// @include http://www.google.com/reader/*
// ==/UserScript==

(function(){
var head = document.getElementsByTagName('head')[0];
var s = document.createElement('script');
s.type='text/javascript';
s.src='http://s.hatena.ne.jp/js/HatenaStar.js'
var w=unsafeWindow;
var entries_count=0;
function loadHatenaStarFeature(f){
setTimeout(function(){
var entries=document.getElementById('entries');
if(entries&&entries.className=='single-source cards'){
if(!f){
entries_count=entries.childNodes.length-1;
w.Hatena.Star.EntryLoader();
}else{
w.Hatena.Star.EntryLoader.loadAddedEntries();
}
}else{
setTimeout(arguments.callee,500);
}
},500);

}
function checkItem(evt){
if((evt.keyCode==79 &&
!evt.ctrlKey && evt.shiftKey)||evt.button==0){
loadHatenaStarFeature();
}
}
function addedItem(evt){
var entries=document.getElementById('entries');
if(entries&&entries.className=='single-source cards' &&
entries.childNodes.length>entries_count){
loadHatenaStarFeature(true);
}
}
function setEntryLoader(){
if(w.Hatena){
w.Hatena.Star.EntryLoader.headerTagAndClassName =
["h2","entry-title"];
loadHatenaStarFeature();
w.Hatena.Star.EntryLoader.loadAddedEntries = function(node) {
var c = w.Hatena.Star.EntryLoader;
if (!node) node = document.body;
var entries_org = c.entries;
c.entries = null;
var entries;
entries = c.loadEntriesByHeader(node);
c.entries = [];
if (entries && typeof(entries.length) == 'number') {
for (var i = entries_count; i < class="synIdentifier">{
var e = new w.Hatena.Star.Entry(entries[i]);
e.showButtons();
c.entries.push(e);
}
entries_count=entries.length;
}
c.getStarEntries();
if (entries_org) {
c.entries.push(entries_org);
c.entries = w.Ten.Array.flatten(c.entries);
}
}
}else{
setTimeout(arguments.callee,500);
}
}
window.addEventListener('load',setEntryLoader,false);
head.appendChild(s);
window.addEventListener('keydown',checkItem,false);
window.addEventListener('keydown',addedItem,false);
document.addEventListener('mouseover',addedItem,false);
document.getElementById('sub-tree').addEventListener('mousedown',checkItem,false);

})();

No comments: