[PATCH v3 8/9] emacs/mua: Insert part headers depending on the message

Subject: [PATCH v3 8/9] emacs/mua: Insert part headers depending on the message

Date: Mon, 12 May 2014 13:29:28 +0100

To: notmuch@notmuchmail.org

Cc:

From: David Edmondson


Whether to insert part headers should depend on the details of the
message being cited.
---
 emacs/notmuch-mua.el | 45 +++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 43 insertions(+), 2 deletions(-)

diff --git a/emacs/notmuch-mua.el b/emacs/notmuch-mua.el
index c800c38..239cc1a 100644
--- a/emacs/notmuch-mua.el
+++ b/emacs/notmuch-mua.el
@@ -132,6 +132,47 @@ list."
   (funcall original-func header references)
   (unless (bolp) (insert "\n")))
 
+(defun notmuch-mua-reply-determine-part-function (message)
+  "Determine the part header rendering function to use when
+citing MESSAGE."
+
+  (let* ((body (plist-get message :body))
+	 (first-part (car body)))
+    (cond
+     ;; If there are multiple top-level parts, we need the
+     ;; headers. Will this ever happen?
+     ((> (length body) 1)
+      #'notmuch-show-insert-header-p-always)
+     
+     ;; If the type of the part is multipart/mixed, we need to see the
+     ;; part headers.
+     ((notmuch-match-content-type (plist-get first-part :content-type) "multipart/mixed")
+      #'notmuch-show-insert-header-p-always)
+
+     ;; If it is multipart/alternative the renderer will choose a
+     ;; default part and render it. There's no need to show the
+     ;; alternative part buttons, as they are not active.
+     ((notmuch-match-content-type (plist-get first-part :content-type) "multipart/alternative")
+      #'notmuch-show-insert-header-p-never)
+
+     ;; If it's a multipart/signed with a single text/* part and a
+     ;; signature, we don't need to see the headers.
+     ((let ((inner-content (plist-get first-part :content)))
+	(and (notmuch-match-content-type (plist-get first-part :content-type) "multipart/signed")
+	     (eq (length inner-content) 2)
+	     (notmuch-match-content-type (plist-get (nth 0 inner-content) :content-type) "text/*")
+	     (notmuch-match-content-type (plist-get (nth 1 inner-content) :content-type) "application/pgp-signature")))
+      #'notmuch-show-insert-header-p-never)
+
+     ;; If the type of the part is text/*, we don't need to see the
+     ;; part headers.
+     ((notmuch-match-content-type (plist-get first-part :content-type) "text/*")
+      #'notmuch-show-insert-header-p-never)
+     
+     ;; Otherwise insert the part headers.
+     (t
+      #'notmuch-show-insert-header-p-always))))
+
 (defun notmuch-mua-reply (query-string &optional sender reply-all)
   (let ((args '("reply" "--format=sexp" "--format-version=1"))
 	(process-crypto notmuch-show-process-crypto)
@@ -206,8 +247,8 @@ list."
 		      ;; citations, etc. in the original message before
 		      ;; quoting.
 		      ((notmuch-show-insert-text/plain-hook nil)
-		       ;; Don't insert part buttons.
-		       (notmuch-show-insert-header-p-function #'notmuch-show-insert-header-p-never))
+		       ;; Determine how to insert part headers.
+		       (notmuch-show-insert-header-p-function (notmuch-mua-reply-determine-part-function original)))
 		    (notmuch-show-insert-body original (plist-get original :body) 0)
 		    (buffer-substring-no-properties (point-min) (point-max)))))
 
-- 
2.0.0.rc0


Thread: