subjectの[...]

Mar 12, 2007 From: zn@m...

西山和広です。

subjectに[hoge:1]のようにMLが自動でつけるものと似たものが
あると削除されてしまいますが、他のMLのメールを転送したときに
元のMLの[hoge:1]まで削除されてしまって困っています。

これを削除しないようにするか、そのML自身のものだけ削除するように
出来ないでしょうか?


ZnZ(ゼット エヌ ゼット)
西山和広(Kazuhiro NISHIYAMA)

Mar 15, 2007 From: yasuo@e...

えとーです。
調べてみました。

On Mon, 12 Mar 2007 16:10:07 +0900
Kazuhiro NISHIYAMA <zn@m...> wrote:

西山和広です。

subjectに[hoge:1]のようにMLが自動でつけるものと似たものが あると削除されてしまいますが、他のMLのメールを転送したときに 元のMLの[hoge:1]まで削除されてしまって困っています。

これを削除しないようにするか、そのML自身のものだけ削除するように 出来ないでしょうか?

subjectを加工しているメソッド
ファイル名: mail-header.rb
モジュール名: QuickML,
クラス名: Mail

subject処理部1

   def self.get_unified_subject(s)
     s = Mail.clean_subject(s)
     s.sub!(/(?:Re:\s*)+/i, '')
     s.sub!(/\A\s+/, '')
     s.sub!(/\s+\z/, '')
     s.gsub!(/\s+/, ' ')       # Thanks to Mr. Atsushi SHICHI.
     return s
   end
       :Re: と、Reが複数続いているものを削除
       先頭のスペースやタブを削除
       末尾のスペースやタブを削除

subject処理部2

   def self.decode_subject(s)
     s = s.gsub(/\n\s+/, ' ').gsub(/\n/, '')
     s = s.tosjis
     return s
   end
       改行コードとスペースを削除
       sjisに変換

subject処理部3

   def self.clean_subject(s)
     s = Mail.decode_subject(s)
     s.gsub!(/(?:\[[^\]]+:\d+\])/, '')
     s.sub!(/(?:Re:\s*)+/i, 'Re: ')
     return s
   end
       [「]」でない文字列:数字] を削除
  Re:につづくスペースやタブ を Re: に変更

ML名+通し番号付記部

   def self.rewrite_subject (s, name, count)
     s = Mail.clean_subject(s)
     s = "[#{name}:#{count}] " + s
     return Mail.encode_field(s)
   end
       Subjectに[ML-Name : 番号] の文字列を付記

正規表現で処理マッチしてsubjectのML名/番号と思われる箇所を削っているが
どこのものか判断せずに一切合財削っているので、問題が発生している。
subject処理3が問題な気がするが、、、他のも条件にマッチする可能性がありそう。

メインの対象は subject処理部3の「self.clean_subject(s)」

   def self.clean_subject(s, name)
     s = Mail.decode_subject(s)
     s.gsub!(/(?:\[[#{name}^\]]+:\d+\])/, '')
     s.sub!(/(?:Re:\s*)+/i, 'Re: ')
     return s
   end

とするといけるのでわないか。

clean_subjectが使われている場所を捜すと
$ grep -r clean_subject lib/qwik/*
4$ grep -r clean_subject lib/qwik/*
lib/qwik/mail-header.rb: s = Mail.clean_subject(s)
lib/qwik/mail-header.rb: def self.clean_subject(s)
lib/qwik/mail-header.rb: s = Mail.clean_subject(s)
lib/qwik/mail-header.rb: # test_clean_subject
lib/qwik/mail-header.rb: ok_eq('t', c.clean_subject('t'))
lib/qwik/mail-header.rb: ok_eq(' Re: Test ', c.clean_subject('[test:1] Re: Test '))
lib/qwik/mail-header.rb: ok_eq('Re: eXg ', c.clean_subject('Re: [test:1] eXg '))
lib/qwik/test-ms-quopri.rb:# mail.get_clean_subject)
lib/qwik/test-ms-quopri.rb: mail.get_clean_subject)
lib/qwik/test-sub-quopri.rb:# mail.get_clean_subject)
という箇所があった。

lib/qwik/test-ms-quopri.rb の mail.get_clean_subject 引数渡していませんがよいのでしょうか?
という疑問をいだきつつ、パッチを書いてみましたので添付します。

パッチ中のキモは

  • def self.clean_subject(s)
  1. def self.clean_subject(s, name)
      s = Mail.decode_subject(s)
  • s.gsub!(/(?:\^\create+:\d+\])/, )
  1. s.gsub!(/(?:\#{name}^\create+:\d+\])/, )
      s.sub!(/(?:Re:\s*)+/i, 'Re: ')
      return s
    end

の所だと思います。

  1. s.gsub!(/(?:\#{name}^\create+:\d+\])/, )

としましたが、もっとよい正規表現かける人お願いします。。

Mar 15, 2007 From: zn@m...

西山和広です。

At Thu, 15 Mar 2007 00:14:16 +0900,
Eto Yasuo wrote:

メインの対象は subject処理部3の「self.clean_subject(s)」 def self.clean_subject(s, name) s = Mail.decode_subject(s) s.gsub!(/(?:\#{name}^\create+:\d+\])/, ) s.sub!(/(?:Re:\s*)+/i, 'Re: ') return s end とするといけるのでわないか。

「[#{name}^\]]」の部分は、nameに文字クラスの中でのメタ文字がないとして

  • nameに含まれる文字
  • 「^」という文字
  • 「]」という文字

からなる文字クラスという意味になるので、
「/(?:\#{name}^\create+:\d+\])/」
ではなく
「/(?:\[#{Regexp.quote(name)}:\d+\])/」
ではないでしょうか?


ZnZ(ゼット エヌ ゼット)
西山和広(Kazuhiro NISHIYAMA)

Apr 25, 2007 From: zn@m...

西山和広です。

そのML自身のものだけ削除するようにする変更を/qwik以下に
commitしました。

ついでに make test で(同名のディレクトリがあるので)
テストが実行できないのが不便だったので、.PHONYを
Makefile に追加しました。


ZnZ(ゼット エヌ ゼット)
西山和広(Kazuhiro NISHIYAMA)
Last modified: 2007-04-25 Attached files total: 1MB