理系学生日記

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

現在のページ番号を永続化する

Read It Later 上の現在のページが、リロード後、あるいは再訪問時に引き継がれるようにしました。

localStorage を使ってみたかったのですが、UserScript からは unsafeWindow 経由じゃないと呼び出せないんですかね。いざ呼び出そうとすると、例外が発生してしまっていたので、素直に GM_{get,set}Value で現在のページ番号を引き継ぐようにしています。

ついでに、ソートオプションがリロード毎に毎回 new (新しいもの順) になるのが個人的にいけすかなかったので、このオプションも使い回せるようにしました。

追記

'x' キーで、エントリを開くことなく既読化することもできるようになりました。

diff --git a/rildrize.user.js b/rildrize.user.js
index 2452427..815501b 100644
--- a/rildrize.user.js
+++ b/rildrize.user.js
@@ -14,6 +14,7 @@
     const KEY_RELOAD = 'r';
     const KEY_NEXT   = 's';
     const KEY_PREV   = 'a';
+    const KEY_REMOVE = 'x';

     // class names
     const CLASS_CURRENT = 'rildrize-current';
@@ -21,6 +22,7 @@
     const CLASS_READ    = 'rildrize-read';

     const OPEN_MAX_NUM = 5;
+    const DELAY = 1000;

     var currentPos = 0;
     var entryList  = [];
@@ -36,6 +38,12 @@
         entryList = getElementsBySelectors('ul#list > li').filter( isUnreadItem );
         setClassName(entryList[0], CLASS_CURRENT);

+        var sort_by = GM_getValue("sort_by");
+        document.getElementById("sort_by").value = sort_by || "1";
+
+        var page = GM_getValue("page") || "1";
+        next( Number(page) - 1 );
+
         window.addEventListener("keypress", function (evt) {
             entryList = getElementsBySelectors('ul#list > li').filter( isUnreadItem );
             if ( document.getElementsByClassName(CLASS_CURRENT).length <= 0 ) {
@@ -49,18 +57,28 @@
               case KEY_OPEN: open();      break;
               case KEY_NEXT: next(+1);    break;
               case KEY_PREV: next(-1);    break;
-              case KEY_RELOAD: window.location.reload(true); break;
+              case KEY_RELOAD: reload();  break;
+              case KEY_REMOVE: remove();  break;
             }

         }, true );
     }

+    function remove() {
+        makeRead( entryList[currentPos] );
+    }
+
+    function reload() {
+        window.location.reload(true);
+    }
+
     function next(n) {
         var evt = document.createEvent("HTMLEvents");
         evt.initEvent("change", true, true);

         var page = document.getElementById("page");
         page.value = Number(page.value) + n;
+        GM_setValue("page", page.value);
         page.dispatchEvent(evt);

         currentPos = 0;
@@ -77,6 +95,7 @@

         removeClassName(prevItem,    CLASS_CURRENT);
         setClassName(currentItem, CLASS_CURRENT);
+        GM_setValue("sort_by", document.getElementById("sort_by").value);
     }

     function mark() {