理系学生日記

おまえはいつまで学生気分なのか

Read It Later 用 GreaseMonkey (1)

Read It Later は便利な Web サービスですが、マウス操作前提なのがいただけない。記事を読むのに逐一クリックが必要になるし、既読化するのもクリックが必要になる。もちろん Vimperator を使えばキーボードで全て操作可能にはなるが、基本的には 2 キータッチが必要になる。

やはり LDR のように、1 度のキータッチのみで一気に複数の記事が Open されるのが便利だと思う。LDRize 対応させるようにすれば一番良かったのかもしれないけれど、LDRize のソースを見ると、読み解くのが大変な感じがしたので、喫緊で欲しい機能を一旦 GreaseMonkey 化した。「o」の押下で 5 つのタブが開き、「r」の押下で最初の記事が既読になる。

今後 LDR のように Pin 機能でも作れれば良いなと思うが、はたしていつになるのやらさっぱり分からない。今の設計だと永続化が必須になるが、JSON 化したものを GM_setValue しておけばとりあえずなんでも永続化できて、ブラウザの起動間で使いまわせるって考えていいんですか教えてエロい人。

// ==UserScript==
// @name           openRIL
// @namespace      com.kiririmode
// @include        http://readitlaterlist.com/*
// ==/Userscript==
(function() {
    const OPEN_ENTRY_NUM = 5;
    const KEY_OPEN = 'o';
    const KEY_READ = 'r';
    
    function openTabs( num ) {
        var nodeList = document.getElementsByClassName('item');
        for ( i = 0; i < Math.min(num, nodeList.length); i++ ) {
            var link = nodeList.item(i);
            window.open(link.href, link.textContent);
        }
    }
    
    function makeRead() {
        var evt = document.createEvent("MouseEvents");
        evt.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null );
        
        var nodeList = document.getElementsByClassName('check');
        if ( nodeList.length <= 0 ) {
            return;
        }
        nodeList.item(0).dispatchEvent(evt);
    }
    
    window.addEventListener("keypress", function (evt) {
        switch( String.fromCharCode(evt.charCode) ) {
          case KEY_OPEN: openTabs(OPEN_ENTRY_NUM); break;
          case KEY_READ: makeRead();               break;
        }
    }, false );
})();

加筆

makeRead これじゃダメだった。
Read It Later の既読化は画面上で style="display: none;" するだけなので、document.getElementsByClassName すると、既に既読化しているものに対してクリックイベントが発火されてしまうのか。また考える。ねむい。