[Mew-dist 12813] Re: Reply string

Shun-ichi GOTO gotoh at example.com
2000年 4月 12日 (水) 19:04:04 JST


>>>>> at Wed, 12 Apr 2000 14:16:28 +0900
>>>>> kazu == Kazu Yamamoto (山本和彦) <kazu at example.com> said,

kazu> やるなら、Forward: と Fw: もやりましょう。
kazu> Subject: Re: Fw: Re: hoge     = reply   => Subject: Re: hoge
kazu> Subject: Re: Fw: Re: hoge     = forward => Subject: Fw: hoge
kazu> のように、Re: と Fw: が 1 回だけ現れるようになっていて欲しいです。

今日の現実逃避ネタとして使わせていただきました(._.)>

Subject: のbody に対して simplify 処理を行なう関数、mew-subject-simplify
を作ってみました。一例としてどうでしょうか。
# subject: 以外で必要になるかどうか?
## 単体なので、これだけで draft のメッセージが置き換わるわけではないです。


詳細説明はしませんが、ご所望の動作は出来ていると思います。
mew-subject-simplify-test というテストプログラム用意してあるので
そのサンプルあたりもご確認いただければと思います。
## 苛めてみるのもいいかも。


kazu> あと、
kazu> 	(was ....)
kazu> を削除するオプションが欲しいですね。

オプションではないですが、これもやってみました。
完全な動作は望みようが無いのでこれくらいでカンベン


kazu> それで、いかようにもカスタマイズ可能なように、柔軟にプログラミングして
kazu> 頂けると嬉しいです。

このあたりの処理って、似たようなコードがいくつもありそうですね。
例えば config-guess -> replace とか、自分では使ってたりする。

ま、1例ということで

## これから飲みに出ます(^^;

--- Regards,
 Shun-ichi Goto  <gotoh at example.com>
   R&D Group, TAIYO Corp., Tokyo, JAPAN
-------------- next part --------------
;; Sample code for simplify Subject: field (in reply for example)
;; Date: 2000/04/12
;; Author: Shun-ichi Goto <gotoh at example.com>  
;; Note: * See [Mew-dist 12807] Re: Reply string
;;       * Not work on Emacs 19.28 (for 4th arg of replace-match)

(defconst mew-subject-re-regex 
  "Re\\(\\|\\^[0-9]+\\|\\[[0-9]+\\]\\|([0-9]+)\\|\\*[0-9]+\\): *"
  "Regexp of various Re: expression in Subject:")

(defconst mew-subject-fw-regex "\\(Fw\\|Forward\\): *"
  "Regexp of various Fw: expression in Subject:")

(defvar mew-subject-simplify-replace-alist
  (list
   ;; (REGEXP . NEW)   ... NEW may be nil for deletion (same to "")
   ;; replace multiple Re: and Fw: into single Re:
   (cons (concat "^"			; regexp
		 mew-subject-re-regex
		 "\\("
		 mew-subject-re-regex
		 "\\|"
		 mew-subject-fw-regex
		 "\\)*")
	 "Re: ")			; new text
   ;; replace multiple Fw: and Re: into single Fw:
   (cons (concat "^"			; regexp
		 mew-subject-fw-regex
		 "\\("
		 mew-subject-re-regex
		 "\\|"
		 mew-subject-fw-regex
		 "\\)*")
	 "Fw: ")			; new text
   ;; delete extra string (no new text means delete)
   (cons " *(was[^)]*) *$" nil))	; regexp

  "*Replacement alist to simplify Subject: field body
Each element is cons cell whos car is REGEXP to replace,
cdr is new text. "
)


(defun mew-subject-simplify ( str &optional action-list)
  ""
  (let (regexp replace)
    (if (null action-list)
	(setq action-list mew-subject-simplify-replace-alist))
    (while action-list
      (setq regexp  (car (car action-list))
	    replace (cdr (car action-list))
	    action-list (cdr action-list))
      (if (string-match regexp str)
	  (setq str (replace-match (or replace "") t t str))))
    str))


;; test  .... make test for some samples.
;;            1st element of test-alist is EXPECTED string.
;;            Rests are list of test string which should result 1st elem.
;; 
;;                            +--- C-x C-e here!
;;                            |
;;                            V
;;  (mew-subject-simplify-test)
(defun mew-subject-simplify-test ()
  (let ((test-alist '(("hoge" "hoge")	; no change

		      ;; simplify into single Re:
		      ("Re: hoge"	; expected result
		       "Re: hoge" "RE: hoge" "re: hoge"
		       "Re*2: hoge" "Re*124: hoge"
		       "Re(2): hoge" "Re(987): hoge"
		       "Re[2]: hoge" "Re[182736]: hoge"
		       ;; multi
		       "Re: Re: hoge"
		       "Re: Re*22: hoge"
		       "Re*2: Re[13]: hoge"
		       ;; mixed
		       "re^1234: fw: RE: hoge"
		       )
		      ;; Re: in middle
		      ("Re: hoge Re: hage"
		       "Re: Fw: hoge Re: hage")

		      ;; simplify into single Fw:
		      ("Fw: hoge"	; expected result
		       "FW: hoge"
		       "Forward: hoge"
		       ;; multi
		       "Fw: Fw: hoge"
		       "Forward: Fw: hoge"
		       "Fw:   Forward: hoge"
		       ;; mixed
		       "fw: re^1234: forward: RE: hoge"
		       )

		      ;; Fw: in middle
		      ("Re: hoge Fw: hage"
		       "Re: Fw: hoge Fw: hage")

		      ;; test for deletion of trailing "(was ...)"
		      ("New Subject"	; expected result
		       "New Subject (was old title)"
		       "New Subject (was old title)  "
		       "New Subject   (was old title)")
		      ;; mixed
		      ("Re: New Subject"
		       "RE: New Subject (was re: old title)"
		       "Re^3: Fw: Re*00: New Subject  (was re: old title Re:  ) "
		       )

		      ;; exceptions ... no change
		      ("Re(): hoge" "Re(): hoge")
		      ("Re[20: hoge" "Re[20: hoge")
		      ("Re^: hoge" "Re^: hoge")
		      ))
	expect srcs ans)
    (while test-alist
      (setq expect (car (car test-alist))
	    srcs (cdr (car test-alist))
	    test-alist (cdr test-alist))
      (while srcs
	(setq ans (mew-subject-simplify (car srcs)))
	(if (not (string= ans expect))
	    (error "Failed: \"%s\" => \"%s\" != \"%s\"" (car srcs) ans expect))
	(setq srcs (cdr srcs))))
    (message "All passed")))



Mew-dist メーリングリストの案内