2006-06-11

mew-absfilter 1.37 への patch その二

Mew でスパム・フィルター bsfilter を走らせるスクリプト mew-absfilter.el にバグがあったので、パッチを公開する。

Mewbsfiltermew-absfilter.el の説明、インストール方法、使い方については前記事を参照されたし。

パッチ

前記事では、関数 mew-expand-folder の引数の扱いが変わったことから、新設の関数 mew-expand-file を使うように修正するパッチも併せて公開していた。

けれど、K4Family さんの報告によると、前パッチを適用しても問題が起こるという。以下、該当記事の引用:

mew 5 にして、
(setq mew-use-suffix t)とすると

拡張子が邪魔をして、bsfilter の db が更新されない orz

この問題を解決するべく、K4Family さんはパッチも公開しておられる。彼のパッチでは、mew-expand-file の代わりに mew-expand-msg を使う。正確には、mew-expand-msg, mew-expand-file, mew-expand-folder の順に関数の有無をチェックし、存在する関数を使う。

Mew のソースを見た所、mew-expand-msg は mew-expand-file を補う動作をすることが分かった。そこで、mew-expand-msg と mew-expand-folder のみを使うよう新しくパッチを書いた。新パッチでは、同様の問題が起きた時に保守性を上げるため、mew-absfilter-expand-msg という関数を新設した。

新パッチは、mew-absfilter.el 最新版 1.37 用。前記事のパッチを当てておられる方は、パッチ済みのファイルを削除し、もう一度 mew-absfilter.el の最新版をダウンロードした上で下記パッチを当てて下さい。

--- mew-absfilter.el.org 2005-05-17 11:54:00.000000000 +0900
+++ mew-absfilter.el 2006-06-11 15:35:27.112181280 +0900
@@ -224,7 +224,7 @@
    (when (mew-sumsyn-match mew-regex-sumsyn-short)
      (let* ((msg (mew-sumsyn-message-number))
      (case:folder (mew-sumsyn-folder-name))
-     (file (mew-expand-folder case:folder msg)))
+     (file (mew-absfilter-expand-msg case:folder msg)))
        (when (eq (mew-summary-get-mark) mew-absfilter-mark-spam)
   (mew-summary-undo))
        (unless mark-only
@@ -239,12 +239,20 @@
    (when (mew-sumsyn-match mew-regex-sumsyn-short)
      (let* ((msg (mew-sumsyn-message-number))
      (case:folder (mew-sumsyn-folder-name))
-     (file (mew-expand-folder case:folder msg)))
+     (file (mew-absfilter-expand-msg case:folder msg)))
        (mew-absfilter-summary-spam-one)
        (unless mark-only
   (mew-absfilter-add-spam (list file))
   (message "Learned as spam"))))))
 
+(defun mew-absfilter-expand-msg (folder msg)
+  "Expand message MSG in FOLDER.
+Function `mew-expand-msg' is defined after Mew 4.2.53.
+Use `mew-expand-folder' iff `mew-expand-msg' is not available."
+  (if (fboundp 'mew-expand-msg)
+      (mew-expand-msg folder msg)
+    (mew-expand-folder folder msg)))
+
 (defun mew-absfilter-mark-learn-clean (&optional mark-only)
   "Learn all messages marked with '*' as clean (not spam)."
   (interactive "P")

6 comments:

  1. 拡張子をつけている環境(うちは.emlを付加しています)でmew-absfilter-check-spam-regionを呼び出すとbsfilterへ拡張子がわたらず、spamチェックが効きません。また、bsfilterから返されるリストの解釈でも拡張子を考慮していないような...。

    ReplyDelete
  2. 不具合をお知らせ下さり、ありがとうございます。
    確認ですが、最新の Mew で
    (setq mew-use-suffix ".eml")
    と設定して、問題が起きるということですね。

    調べてみますので、少々お待ち下さい。

    ReplyDelete
  3. @aka です。
    拡張子をつける設定を次のようにしてみても、同じ問題が起きますか?

    (setq mew-use-suffix t
    mew-suffix ".eml")

    ReplyDelete
  4. ありがとうございます。
    .mew.elは↓のようにしています。
    (setq mew-use-suffix t)
    (setq mew-suffix ".eml")

    absfilter.elからbsfilterへわたしている引数を見ると、
    拡張子が入っていませんでした(引数をファイルへ書き出すbsfilter.batを作って確認)。

    思うに、↓のmsgsリストで拡張子が入っていないままbsfilterへわたっているのではないかなあと。
    absfilter.el(142行目): (let ((msgs (mew-absfilter-collect-message-region begin end))

    ReplyDelete
  5. すいません。帰省します。
    調査と返事は、8/20 以降になります。ごめんなさい。

    ReplyDelete
  6. 遅くなりましたが、パッチを書きました。お試し下さい。
    - clmemo@aka: mew-absfilter 1.37 へのパッチ その三

    ReplyDelete