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)
- def self.clean_subject(s, name)
s = Mail.decode_subject(s)
s.sub!(/(?:Re:\s*)+/i, 'Re: ')
return s
end
の所だと思います。
としましたが、もっとよい正規表現かける人お願いします。。
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}^\
+:\d+\])/, ) s.sub!(/(?:Re:\s*)+/i, 'Re: ') return s end とするといけるのでわないか。
「[#{name}^\]]」の部分は、nameに文字クラスの中でのメタ文字がないとして
- nameに含まれる文字
- 「^」という文字
- 「]」という文字
からなる文字クラスという意味になるので、
「/(?:\#{name}^\
+:\d+\])/」
ではなく
「/(?:\[#{Regexp.quote(name)}:\d+\])/」
ではないでしょうか?
| ZnZ(ゼット エヌ ゼット) |
| 西山和広(Kazuhiro NISHIYAMA) |
Apr 25, 2007 From: zn@m...
西山和広です。
そのML自身のものだけ削除するようにする変更を/qwik以下に
commitしました。
ついでに make test で(同名のディレクトリがあるので)
テストが実行できないのが不便だったので、.PHONYを
Makefile に追加しました。
| ZnZ(ゼット エヌ ゼット) |
| 西山和広(Kazuhiro NISHIYAMA) |
