emacs: add more part handling functions
authorDavid Edmondson <dme@dme.org>
Fri, 13 May 2011 06:09:30 +0000 (23:09 -0700)
committerCarl Worth <cworth@cworth.org>
Tue, 17 May 2011 23:34:26 +0000 (16:34 -0700)
This adds new notmuch-show-insert-part functions to handle
multipart/alternative and message/rfc822 parts.

emacs/notmuch-show.el

index 9f045d7d2fdb26d5fdb9f4293d094c93644d5363..e08497d98b089486efd792c702182c2808d984dc 100644 (file)
@@ -280,6 +280,21 @@ current buffer, if possible."
              t)
          nil)))))
 
+(defun notmuch-show-insert-part-multipart/alternative (msg part content-type nth depth declared-type)
+  (let ((inner-parts (plist-get part :content)))
+    (notmuch-show-insert-part-header nth declared-type content-type nil)
+    ;; In most cases, multipart/alternative is used to provide both
+    ;; text/plain and text/html (or multipart/related with text/html
+    ;; and image/*) parts. We might allow the user to express a
+    ;; preference about which part to show, but for the moment we just
+    ;; choose the first. This is usually the text/plain part.
+    (notmuch-show-insert-bodypart msg (car inner-parts) depth)
+    (mapc (lambda (inner-part)
+           (let ((inner-type (concat (plist-get inner-part :content-type) " (not shown)")))
+             (notmuch-show-insert-part-header (plist-get inner-part :id) inner-type inner-type nil)))
+         (cdr inner-parts)))
+  t)
+
 (defun notmuch-show-insert-part-multipart/* (msg part content-type nth depth declared-type)
   (let ((inner-parts (plist-get part :content)))
     (notmuch-show-insert-part-header nth declared-type content-type nil)
@@ -289,6 +304,24 @@ current buffer, if possible."
          inner-parts))
   t)
 
+(defun notmuch-show-insert-part-message/rfc822 (msg part content-type nth depth declared-type)
+  (let* ((message-part (plist-get part :content))
+        (inner-parts (plist-get message-part :content)))
+    (notmuch-show-insert-part-header nth declared-type content-type nil)
+    ;; Override `notmuch-message-headers' to force `From' to be
+    ;; displayed.
+    (let ((notmuch-message-headers '("From" "Subject" "To" "Cc" "Date")))
+      (notmuch-show-insert-headers (plist-get part :headers)))
+    ;; Blank line after headers to be compatible with the normal
+    ;; message display.
+    (insert "\n")
+
+    ;; Show all of the parts.
+    (mapc (lambda (inner-part)
+           (notmuch-show-insert-bodypart msg inner-part depth))
+         inner-parts))
+  t)
+
 (defun notmuch-show-insert-part-text/plain (msg part content-type nth depth declared-type)
   (let ((start (point)))
     ;; If this text/plain part is not the first part in the message,