アップデート: LDR フィード絞込みスクリプト

(id:reinyannyan:20061013:p1 のスクリプトのアップデートです。概要・使用方法についてはそちらをご参照ください。)

コロン・コマンド ":reload" を新たに追加しました。

これまでは、フィード一覧を全部読み込んでから絞り込みを行う必要があったんですが、それが一手間で済むようになります。

また後述の、リロードをキャンセルする機能と組み合わせることで、未読フィードが大量に溜まりすぎた状況を (気分的に) 緩和する効果を得ることが出来ます。


利用例

"tech" フォルダのうち、レートが 4 以上のものをリロード:

:! :reload +tech #{ rate >= 4 }

未読が少ないものだけ表示:

:! :r #{ unread_count <= 3 }

一ヶ月以上更新されていないフィードを表示:

:! :r! #{ modified_on < new Date / 1000 - 30*24*60*60 }

最後に "!" を付けると、既読フィードも含めた全購読から検索することが出来ます (デフォルトでは設定に関わらず未読フィードのみ検索対象となります)。

また、":r" という省略形も使えます。

ダウンロードはこちら: ldr_subs_filter.user.js (注: 前のバージョンをインストールされている方は事前にアンインストールをお願いします)

一応今回は動作テストをしたんですが (Firefox 2.0.0.1)、不具合等ありましたらご報告ください。


なお、スクリプトには含めませんでしたが、この機能はフィード一覧の読み込みをキャンセルする機能と組み合わせると効果的だと思います。

とりあえずレートの高いものだけとか、未読記事の少ないものだけ、という風に、少しずつ読み込めるようになりますから、未読フィードが溜まりすぎて気が重くなった時に役に立つはずです。

以下を実行することで、エスケープ・キーで一覧の読み込みを中断できるようになります (LDR 本体のキー・バインドが定義される前に実行する必要があります)。

  Control.blur_findbox = Control.blur_findbox.addAfter(function() {
    if (State.subs_loader) {
      State.subs_loader.cancel();
      State.subs_loader = null;
      State.subs_reloading = false;
      State.load_progress = false;
      subs.readyState = 0;
    }
  });

お好みでスクリプトの適当な箇所に入れてみてください。

ちなみに LDR 起動時に読み込みを中断するコツですが、マイフィードの箱にある「モード」、「ソート」の表示が設定値に切り替わるタイミングを目安にすると良いでしょう。


ここからは技術的なお話です。

新機能以外の内部的な変更なんですが、フィルタリングの仕組みにこだわってみました。

これまでは、「フォルダの表示・非表示」、「JavaScript 式」の条件毎に別々にフィルタリングしていたんですが、これを一度に行えるようにしました。

濾紙を何種類か重ねて濾過する、という感じです。すなわち、

list = list.filter(FILTER_A);
list = list.filter(FILTER_B);
list = list.filter(FILTER_C);

という処理を

composed_filter = compose(FILTER_C,FILTER_B,FILTER_A);
list = composed_filter(list);

と出来るようにしたわけです (以前はフィルターを適用する箇所がばらばらだったので、これが出来なかったんです)。

実際には、引数リストよりも配列の方が都合が良かったので、こんな関数を用いました:

function lcompose(ls) {
  return function(x) {
    ls.forEach(function(f){ x = f(x) });
    return x;
  };
}

フィルター関数群を配列として受け取り、一つに纏めています。

各フィルター関数 (f) は配列 (x) を受け取ってそのフィルター結果 (smaller set of x) を返す、というものです。Array#filter メソッドへの引数とする場合とは定義方法が異なることに注意してください:

// Array#filter への引数
POSITIVE = function(v) {
  return v > 0; 
};
[1,-3,2,-5,3].filter(POSITIVE); // -> [1,2,3]

// フィルターそのもの
POSITIVE = function(ls) {
  return ls.filter(function(v){ return v > 0 });
};
POSITIVE([1,-3,2,-5,3]); // -> [1,2,3]


追記 [20070319]:

読み込みをキャンセルすることなく、起動時に表示されるフィードを制御することも可能です。

少々荒っぽいんですが、"Config.load" という関数を書き換えて、コールバック関数の実行箇所を以下のように変更する、というものです:

// 例: レート 4 以上のフィードのみ表示 (":r" (リロード) オプションが必要)
invoke_hook.next(function(){vi["!"](":r #{rate>3}")})("AFTER_CONFIGLOAD");
};