diff options
-rw-r--r-- | emacs/notmuch-show.el | 20 | ||||
-rwxr-xr-x | test/emacs-show | 20 |
2 files changed, 29 insertions, 11 deletions
diff --git a/emacs/notmuch-show.el b/emacs/notmuch-show.el index d061367e..49961fbb 100644 --- a/emacs/notmuch-show.el +++ b/emacs/notmuch-show.el @@ -996,6 +996,24 @@ message at DEPTH in the current thread." "Insert the forest of threads FOREST." (mapc (lambda (thread) (notmuch-show-insert-thread thread 0)) forest)) +(defvar notmuch-id-regexp + (concat + ;; Match the id: prefix only if it begins a word (to disallow, for + ;; example, matching cid:). + "\\<id:\\(" + ;; If the term starts with a ", then parse Xapian's quoted boolean + ;; term syntax, which allows for anything as long as embedded + ;; double quotes escaped by doubling them. We also disallow + ;; newlines (which Xapian allows) to prevent runaway terms. + "\"\\([^\"\n]\\|\"\"\\)*\"" + ;; Otherwise, parse Xapian's unquoted syntax, which goes up to the + ;; next space or ). We disallow [.,;] as the last character + ;; because these are probably part of the surrounding text, and not + ;; part of the id. This doesn't match single character ids; meh. + "\\|[^\"[:space:])][^[:space:])]*[^])[:space:].,:;?!]" + "\\)") + "The regexp used to match id: links in messages.") + (defun notmuch-show-buttonise-links (start end) "Buttonise URLs and mail addresses between START and END. @@ -1004,7 +1022,7 @@ a corresponding notmuch search." (goto-address-fontify-region start end) (save-excursion (goto-char start) - (while (re-search-forward "id:\\(\"?\\)[^[:space:]\"]+\\1" end t) + (while (re-search-forward notmuch-id-regexp end t) ;; remove the overlay created by goto-address-mode (remove-overlays (match-beginning 0) (match-end 0) 'goto-address t) (make-text-button (match-beginning 0) (match-end 0) diff --git a/test/emacs-show b/test/emacs-show index 5d7151b5..e2d7c706 100755 --- a/test/emacs-show +++ b/test/emacs-show @@ -136,23 +136,23 @@ To: Notmuch Test Suite <test_suite@notmuchmail.org> Date: Fri, 05 Jan 2001 15:43:57 +0000 <<id:abc>> -<<id:abc.def.>> <<id:abc,def,>> <<id:abc;def;>> <<id:abc:def:>> -<<id:foo@bar.?baz?>> <<id:foo@bar!.baz!>> -(<<id:foo@bar.baz)>> [<<id:foo@bar.baz]>> -<<id:foo@bar.baz...>> +<<id:abc.def>>. <<id:abc,def>>, <<id:abc;def>>; <<id:abc:def>>: +<<id:foo@bar.?baz>>? <<id:foo@bar!.baz>>! +(<<id:foo@bar.baz>>) [<<id:foo@bar.baz>>] +<<id:foo@bar.baz>>... <<id:2+2=5>> <<id:=_-:/.[]@$%+>> -<<id:abc)def>> -<<id:ab>>"c def +<<id:abc>>)def +<<id:ab"c>> def <<id:"abc">>def -<<id:"ab">>"c"def -id:"ab c"def +<<id:"ab""c">>def +<<id:"ab c">>def <<id:"abc">>.def id:"abc " -<<id:)>> +id:) id: -c<<id:xxx>> +cid:xxx EOF test_expect_equal_file OUTPUT EXPECTED |