Google Reader をフォルダわけしたいけど、フォルダ単位ではなくフィード単位で読みたい その2

class 属性が変わる場合があるので手直し。

".//a[contains(@class, 'link tree-link-selected cursor')]",

属性の一部がマッチする場合をどう表現するのかがよく分からなかったので時間かかった。

// ==UserScript==
// @name        Google Reader Scroll Control
// @namespace   http://d.hatena.ne.jp/spider-man/
// @include     http://www.google.co.jp/reader/*
// @include     http://www.google.com/reader/*
// @version     0.5
// ==/UserScript==

(function () {
 var SCROLL_HEIGHT = 150;
 window.addEventListener('keypress',
   function(e) {
     if (e.charCode == 32) {
       // folder control
       var subtree = document.getElementById("sub-tree");
       var result  = document.evaluate(
                        ".//a[contains(@class, 'link tree-link-selected cursor')]",
                        subtree ,
                        null ,
                        XPathResult.FIRST_ORDERED_NODE_TYPE ,
                        null);
       var href = result.singleNodeValue;
       if(href.firstChild.getAttribute("class") == "icon icon-d-1"
                && href.firstChild.getAttribute("src").indexOf("folder") > 0) {
            e.preventDefault();
            e.stopPropagation();
            setTimeout(function(){
                var feed  = document.evaluate(
                              ".//li[@class='sub unselectable collapsed unread']/a",
                              href.parentNode ,
                              null ,
                              XPathResult.FIRST_ORDERED_NODE_TYPE ,
                              null);
                var event = document.createEvent('MouseEvents');
                event.initMouseEvent ('click', true, true, window,
                     1, 0, 0, 0, 0, false, false, false, false, 0, null); 
                feed.singleNodeValue.dispatchEvent(event);
            } , 30);
           return;
       }
       // scroll control
       var h = SCROLL_HEIGHT;
       if(e.shiftKey) {
         h = h * -1;
       }
       var div       = document.getElementById("entries");
       var current   = document.getElementById("current-entry");
       if(current == null) {
           return;
       }
       var scrollTop = div.scrollTop;
      
       if(current.offsetTop + current.clientHeight > div.scrollTop + SCROLL_HEIGHT) {
           div.scrollTop += h;
       }

       if(div.scrollTop != scrollTop) {
           e.preventDefault();
           e.stopPropagation();
       }
     }
   }, true);
})();

グリモンスクリプトのサイトにアップしてみたい。control の綴りを間違えてたのはナイショ。