diff options
author | Stefan Monnier <monnier@iro.umontreal.ca> | 2011-01-13 16:48:34 -0500 |
---|---|---|
committer | Stefan Monnier <monnier@iro.umontreal.ca> | 2011-01-13 16:48:34 -0500 |
commit | b49a2dbf58c276d48e3251e0d565557bf031a43e (patch) | |
tree | a0c2782874ef7d05098a56ced5242a81de012764 /lisp | |
parent | db5d03ea568aa674569d7792a04c95e0ebffac68 (diff) | |
download | emacs-b49a2dbf58c276d48e3251e0d565557bf031a43e.tar.gz |
* lisp/mail/mail-utils.el (mail-strip-quoted-names): Make the regexp code
work for nested comments.
Diffstat (limited to 'lisp')
-rw-r--r-- | lisp/ChangeLog | 3 | ||||
-rw-r--r-- | lisp/mail/mail-utils.el | 73 |
2 files changed, 30 insertions, 46 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 6d531655d7f..94d2ba209aa 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,5 +1,8 @@ 2011-01-13 Stefan Monnier <monnier@iro.umontreal.ca> + * mail/mail-utils.el (mail-strip-quoted-names): Make the regexp code + work for nested comments. + * progmodes/prolog.el: Use syntax-propertize. Further code cleanup. (prolog-use-prolog-tokenizer-flag): Change default when syntax-propertize can be used. diff --git a/lisp/mail/mail-utils.el b/lisp/mail/mail-utils.el index 81a2bd49441..1e9412cb7a1 100644 --- a/lisp/mail/mail-utils.el +++ b/lisp/mail/mail-utils.el @@ -182,56 +182,37 @@ Return a modified address list." (mapconcat 'identity (rfc822-addresses address) ", ")) (let (pos) - ;; Detect nested comments. - (if (string-match "[ \t]*(\\([^)\\]\\|\\\\.\\|\\\\\n\\)*(" address) - ;; Strip nested comments. - (with-temp-buffer - (insert address) - (set-syntax-table lisp-mode-syntax-table) - (goto-char 1) - (while (search-forward "(" nil t) - (forward-char -1) - (skip-chars-backward " \t") - (delete-region (point) - (save-excursion - (condition-case () - (forward-sexp 1) - (error (goto-char (point-max)))) - (point)))) - (setq address (buffer-string))) - ;; Strip non-nested comments an easier way. - (while (setq pos (string-match - ;; This doesn't hack rfc822 nested comments - ;; `(xyzzy (foo) whinge)' properly. Big deal. - "[ \t]*(\\([^)\\]\\|\\\\.\\|\\\\\n\\)*)" - address)) - (setq address (replace-match "" nil nil address 0)))) + ;; Strip comments. + (while (setq pos (string-match + "[ \t]*(\\([^()\\]\\|\\\\.\\|\\\\\n\\)*)" + address)) + (setq address (replace-match "" nil nil address 0))) - ;; strip surrounding whitespace - (string-match "\\`[ \t\n]*" address) - (setq address (substring address - (match-end 0) - (string-match "[ \t\n]*\\'" address - (match-end 0)))) + ;; strip surrounding whitespace + (string-match "\\`[ \t\n]*" address) + (setq address (substring address + (match-end 0) + (string-match "[ \t\n]*\\'" address + (match-end 0)))) - ;; strip `quoted' names (This is supposed to hack `"Foo Bar" <bar@host>') - (setq pos 0) - (while (setq pos (string-match + ;; strip `quoted' names (This is supposed to hack `"Foo Bar" <bar@host>') + (setq pos 0) + (while (setq pos (string-match "\\([ \t]?\\)\\([ \t]*\"\\([^\"\\]\\|\\\\.\\|\\\\\n\\)*\"[ \t\n]*\\)" address pos)) - ;; If the next thing is "@", we have "foo bar"@host. Leave it. - (if (and (> (length address) (match-end 0)) - (= (aref address (match-end 0)) ?@)) - (setq pos (match-end 0)) - ;; Otherwise discard the "..." part. - (setq address (replace-match "" nil nil address 2)))) - ;; If this address contains <...>, replace it with just - ;; the part between the <...>. - (while (setq pos (string-match "\\(,\\s-*\\|\\`\\)\\([^,]*<\\([^>,:]*\\)>[^,]*\\)\\(\\s-*,\\|\\'\\)" - address)) - (setq address (replace-match (match-string 3 address) - nil 'literal address 2))) - address)))) + ;; If the next thing is "@", we have "foo bar"@host. Leave it. + (if (and (> (length address) (match-end 0)) + (= (aref address (match-end 0)) ?@)) + (setq pos (match-end 0)) + ;; Otherwise discard the "..." part. + (setq address (replace-match "" nil nil address 2)))) + ;; If this address contains <...>, replace it with just + ;; the part between the <...>. + (while (setq pos (string-match "\\(,\\s-*\\|\\`\\)\\([^,]*<\\([^>,:]*\\)>[^,]*\\)\\(\\s-*,\\|\\'\\)" + address)) + (setq address (replace-match (match-string 3 address) + nil 'literal address 2))) + address)))) ;; The following piece of ugliness is legacy code. The name was an ;; unfortunate choice --- a flagrant violation of the Emacs Lisp |