subscldr.js をちょっといじった

フィードが見つからなかったときに Page2Feed のプレビューに遷移するようにしてみた

subscldr.js の特徴である「ページ遷移なしで」を破るものなので微妙.
しかしプレビューを見ずに Page2Feed で登録するはもっと微妙だと思ったのでこうした.

diff --git a/dot.vimperator/plugin/subscldr.js b/dot.vimperator/plugin/subscldr.js
index 11faba8..59c3806 100644
--- a/dot.vimperator/plugin/subscldr.js
+++ b/dot.vimperator/plugin/subscldr.js
@@ -77,7 +77,20 @@ liberator.plugins.subscldr = (function() {
   function addCommand (command, servicename, endpoint) {
 
     function handleFeedRequest(opts, redirectUrl, force) {
-        var subscribeInfo = getSubscription(redirectUrl);
+        try {
+          var subscribeInfo = getSubscription(redirectUrl);
+        } catch (e if e == "Cannot find subscribe info about this page!") {
+          commandline.input(e + " See Page2Feed preview? [y/N]:",
+            function(ans) {
+              if (ans.toLowerCase().indexOf("y") == 0)
+                liberator.open("http://ic.edge.jp/page2feed/preview/" + (redirectUrl || buffer.URI));
+              else
+                liberator.echo("Canceled.");
+              commandline.close();
+            }
+          );
+          return;
+        }
         var availableLinks = subscribeInfo.feedlinks.filter(function(info) info[1]);
         var alreadySubscribed = availableLinks.length != subscribeInfo.feedlinks.length;

フォルダを指定できるようにしてみた

:subscldr -f foobar のように指定できる.
ただし既存のフォルダ限定.もし指定されたフォルダが存在しない場合は従来通り「未分類」として登録される.

diff --git a/dot.vimperator/plugin/subscldr.js b/dot.vimperator/plugin/subscldr.js
index 59c3806..7bd1006 100644
--- a/dot.vimperator/plugin/subscldr.js
+++ b/dot.vimperator/plugin/subscldr.js
@@ -155,8 +155,12 @@ liberator.plugins.subscldr = (function() {
     function postSubscription(info, opts) {
       liberator.log("subscribe:" + info.toSource());
 
+      var folder_id = "0";
+      if (opts.folder && info.folder_ids[opts.folder]) {
+        folder_id = info.folder_ids[opts.folder];
+      }
       var postBody= "url=" + encodeURIComponent(info.target_url) +
-                    "&folder_id=0" +
+                    "&folder_id=" + folder_id +
                     "&rate=" + (opts.rate || "0") +
                     "&register=1" +
                     "&feedlink=" + encodeURIComponent(info.feedlinks[0]) +
@@ -189,14 +193,15 @@ liberator.plugins.subscldr = (function() {
       "Register feed subscriptions to " + servicename + ".",
       function(args) {
         try {
-          handleFeedRequest({rate: args["-rate"]});
+          handleFeedRequest({rate: args["-rate"], folder: args["-folder"]});
         } catch (e) {
           liberator.echoerr(e);
         }
       },
       {
         options: [
-          [["-rate", "-r"], commands.OPTION_INT]
+          [["-rate", "-r"], commands.OPTION_INT],
+          [["-folder", "-f"], commands.OPTION_STRING],
         ]
       },
       true  // Use in DEVELOP
@@ -209,7 +214,8 @@ liberator.plugins.subscldr = (function() {
        target_url: null,
        register: 1,
        apiKey: null,
-       feedlinks: []
+       feedlinks: [],
+       folder_ids: {},
     };
 
     $LXs('id("feed_candidates")/xhtml:li', htmldoc).forEach( function(item) {
@@ -228,6 +234,12 @@ liberator.plugins.subscldr = (function() {
 
     subscribeInfo.apiKey = $LX('//*[@name="ApiKey"]', htmldoc).value;
     if (!subscribeInfo.apiKey) throw "Can't get API key for subscription!";
+
+    var select = $LX('//*[@name="folder_id"]', htmldoc);
+    if (!select) throw "Can't get foldr_id";
+    $LXs('*', select).forEach( function(item) {
+      subscribeInfo.folder_ids[item.innerHTML] = item.value;
+    });
     return subscribeInfo;
   }

3月11日 追記

このままだとすべてのフィードが登録されているときに Can't get folder_id となってしまうので,その前にこれ以上登録できないエラーを出すようにした.

diff --git a/dot.vimperator/plugin/subscldr.js b/dot.vimperator/plugin/subscldr.js
index 7bd1006..0556b48 100644
--- a/dot.vimperator/plugin/subscldr.js
+++ b/dot.vimperator/plugin/subscldr.js
@@ -108,20 +108,11 @@ liberator.plugins.subscldr = (function() {
           return;
         }
 
-        switch (availableLinks.length) {
-        case 0:
-          if (alreadySubscribed)
-            liberator.echo("The feed of this site has already been subscribed.");
-          else
-            // Maybe never reach here.
-            liberator.echoerr("SITE FEED NOT AVAILABLE!!!");
-          break;
-        case 1:
+        if (availableLinks.length == 1) {
           liberator.log("FEED ONLY ONE!!");
           subscribeInfo.feedlinks = [availableLinks[0][0], true];
           postSubscription(subscribeInfo, opts);
-          break;
-        default:
+        } else {
           liberator.log("SOME FEED AVAILABLE");
           selectFeed( availableLinks.map(function(i) [i[0], i[2]]),
             function(sel) {
@@ -226,6 +217,9 @@ liberator.plugins.subscldr = (function() {
       liberator.log("input:" + feedlink.href);
       subscribeInfo.feedlinks.push([feedlink.href, (yet != null), (title ? title.textContent : '' ) + ' / ' + (users ? users.textContent :  '0 user')]);
     });
+    if (subscribeInfo.feedlinks.filter(function(info) info[1]).length == 0) {
+      throw "The feed of this site has already been subscribed.";
+    }
 
     var target_url = $LX('id("target_url")', htmldoc);
     if (!target_url) throw "Cannot find subscribe info about this page!";


あと,postSubscription のときの Request のオプションが asyncronous に typo ってる…
まぁそもそもこれは同期的にする必要もないと思うのでこのままでも問題はないけど.