diff options
| author | Paul Reilly | 2002-03-19 19:42:46 +0000 |
|---|---|---|
| committer | Paul Reilly | 2002-03-19 19:42:46 +0000 |
| commit | bb0974cf08f071167ac187bab3524783d74d89f2 (patch) | |
| tree | 772c3ad579cc56177be05f143c456f9f9fa06fa9 | |
| parent | 0ffba6bd01475f481f62c8a040de8e1e09bd73e8 (diff) | |
| download | emacs-bb0974cf08f071167ac187bab3524783d74d89f2.tar.gz emacs-bb0974cf08f071167ac187bab3524783d74d89f2.zip | |
(rmail-dont-reply-to): Overhaul to correctly apply the regular
expressions in the variable `rmail-dont-reply-to-names' to the list of
destination addresses. Contributed by lorentey@elte.hu.
| -rw-r--r-- | lisp/mail/mail-utils.el | 94 |
1 files changed, 45 insertions, 49 deletions
diff --git a/lisp/mail/mail-utils.el b/lisp/mail/mail-utils.el index 84ed13e58bb..fb5c7d1330e 100644 --- a/lisp/mail/mail-utils.el +++ b/lisp/mail/mail-utils.el | |||
| @@ -197,63 +197,59 @@ Return a modified address list." | |||
| 197 | nil 'literal address 2))) | 197 | nil 'literal address 2))) |
| 198 | address)))) | 198 | address)))) |
| 199 | 199 | ||
| 200 | ; rmail-dont-reply-to-names is defined in loaddefs | 200 | ;;; The following piece of ugliness is legacy code. The name was an |
| 201 | (defun rmail-dont-reply-to (userids) | 201 | ;;; unfortunate choice --- a flagrant violation of the Emacs Lisp |
| 202 | "Returns string of mail addresses USERIDS sans any recipients | 202 | ;;; coding conventions. `mail-dont-reply-to' would have been |
| 203 | that start with matches for `rmail-dont-reply-to-names'. | 203 | ;;; infinitely better. Also, `rmail-dont-reply-to-names' might have |
| 204 | Usenet paths ending in an element that matches are removed also." | 204 | ;;; been better named `mail-dont-reply-to-names' and sourced from this |
| 205 | ;;; file instead of in rmail.el. Yuck. -pmr | ||
| 206 | (defun rmail-dont-reply-to (destinations) | ||
| 207 | "Prune addresses from DESTINATIONS, a list of recipient addresses. | ||
| 208 | All addresses matching `rmail-dont-reply-to-names' are removed from | ||
| 209 | the comma-separated list. The pruned list is returned." | ||
| 205 | (if (null rmail-dont-reply-to-names) | 210 | (if (null rmail-dont-reply-to-names) |
| 206 | (setq rmail-dont-reply-to-names | 211 | (setq rmail-dont-reply-to-names |
| 207 | (concat (if rmail-default-dont-reply-to-names | 212 | (concat (if rmail-default-dont-reply-to-names |
| 208 | (concat rmail-default-dont-reply-to-names "\\|") | 213 | (concat rmail-default-dont-reply-to-names "\\|") |
| 209 | "") | 214 | "") |
| 210 | (concat (regexp-quote (user-login-name)) | 215 | (if (and user-mail-address |
| 211 | "\\>")))) | 216 | (not (equal user-mail-address user-login-name))) |
| 212 | (let ((match (concat "\\(^\\|,\\)[ \t\n]*" | 217 | (concat (regexp-quote user-mail-address) "\\|") |
| 213 | ;; Can anyone figure out what this is for? | 218 | "") |
| 214 | ;; Is it an obsolete remnant of another way of | 219 | (concat (regexp-quote user-login-name) "\\>")))) |
| 215 | ;; handling Foo Bar <foo@machine>? | 220 | ;; Split up DESTINATIONS and match each element separately. |
| 216 | "\\([^,\n]*[!<]\\|\\)" | 221 | (let ((start-pos 0) (cur-pos 0) |
| 217 | "\\(" | 222 | (case-fold-search t)) |
| 218 | rmail-dont-reply-to-names | 223 | (while start-pos |
| 219 | "\\|" | 224 | (setq cur-pos (string-match "[,\"]" destinations cur-pos)) |
| 220 | ;; Include the human name that precedes <foo@bar>. | 225 | (if (and cur-pos (equal (match-string 0 destinations) "\"")) |
| 221 | "\\([^\,.<\"]\\|\"[^\"]*\"\\)*" | 226 | ;; Search for matching quote. |
| 222 | "<\\(" rmail-dont-reply-to-names "\\)" | 227 | (let ((next-pos (string-match "\"" destinations (1+ cur-pos)))) |
| 223 | "\\)[^,]*")) | 228 | (if next-pos |
| 224 | (case-fold-search t) | 229 | (setq cur-pos (1+ next-pos)) |
| 225 | pos epos) | ||
| 226 | (while (and (setq pos (string-match match userids pos)) | ||
| 227 | (> (length userids) 0)) | ||
| 228 | ;; If there's a match, it starts at the beginning of the string, | ||
| 229 | ;; or with `,'. We must delete from that position to the | ||
| 230 | ;; end of the user-id which starts at match-beginning 2. | ||
| 231 | (let (inside-quotes quote-pos last-quote-pos) | ||
| 232 | (save-match-data | ||
| 233 | (while (and (setq quote-pos (string-match "\"" userids quote-pos)) | ||
| 234 | (< quote-pos pos)) | ||
| 235 | (setq last-quote-pos quote-pos) | ||
| 236 | (setq quote-pos (1+ quote-pos)) | ||
| 237 | (setq inside-quotes (not inside-quotes)))) | ||
| 238 | (if inside-quotes | ||
| 239 | (if (string-match "\"" userids pos) | ||
| 240 | (setq pos (string-match "\"" userids pos)) | ||
| 241 | ;; If the open-quote has no close-quote, | 230 | ;; If the open-quote has no close-quote, |
| 242 | ;; delete the open-quote to get something well-defined. | 231 | ;; delete the open-quote to get something well-defined. |
| 243 | ;; This case is not valid, but it can happen if things | 232 | ;; This case is not valid, but it can happen if things |
| 244 | ;; are weird elsewhere. | 233 | ;; are weird elsewhere. |
| 245 | (setq userids (replace-match "" nil nil userids)) | 234 | (setq destinations (concat (substring destinations 0 cur-pos) |
| 246 | (setq userids (concat (substring userids 0 last-quote-pos) | 235 | (substring destinations (1+ cur-pos)))) |
| 247 | (substring userids (1+ last-quote-pos)))) | 236 | (setq cur-pos start-pos))) |
| 248 | (setq pos (1- pos))) | 237 | (let* ((address (substring destinations start-pos cur-pos)) |
| 249 | (setq userids (replace-match "" nil nil userids))))) | 238 | (naked-address (mail-strip-quoted-names address))) |
| 250 | ;; get rid of any trailing commas | 239 | (if (string-match rmail-dont-reply-to-names naked-address) |
| 251 | (if (setq pos (string-match "[ ,\t\n]*\\'" userids)) | 240 | (setq destinations (concat (substring destinations 0 start-pos) |
| 252 | (setq userids (substring userids 0 pos))) | 241 | (and cur-pos (substring destinations |
| 253 | ;; remove leading spaces. they bother me. | 242 | (1+ cur-pos)))) |
| 254 | (if (string-match "\\(\\s \\|,\\)*" userids) | 243 | cur-pos start-pos) |
| 255 | (substring userids (match-end 0)) | 244 | (setq cur-pos (and cur-pos (1+ cur-pos)) |
| 256 | userids))) | 245 | start-pos cur-pos)))))) |
| 246 | ;; get rid of any trailing commas | ||
| 247 | (if (setq pos (string-match "[ ,\t\n]*\\'" destinations)) | ||
| 248 | (setq destinations (substring destinations 0 pos))) | ||
| 249 | ;; remove leading spaces. they bother me. | ||
| 250 | (if (string-match "\\(\\s \\|,\\)*" destinations) | ||
| 251 | (substring destinations (match-end 0)) | ||
| 252 | destinations)) | ||
| 257 | 253 | ||
| 258 | 254 | ||
| 259 | ;;;###autoload | 255 | ;;;###autoload |