[PATCH v2 2/3] emacs: show: move the insertion of the header button to the top level
Austin Clements
aclements at csail.mit.edu
Thu May 30 15:30:59 PDT 2013
On Sun, 26 May 2013, Mark Walters <markwalters1009 at gmail.com> wrote:
> Previously each of the part insertion handlers inserted the part
> button themselves. Move this up into
> notmuch-show-insert-bodypart. Since a small number of the handlers
> modify the button (the encryption/signature ones) we need to pass the
> header button as an argument into the individual part insertion
> handlers.
>
> The patch is large but mostly simple. The only things of note are that
> we let the text/plain handler insert part buttons itself (as it does
> not always insert one and it applies motmuch-wash to the whole part
> including the button. Also this is by far the most important case so
> this reduces the risk of annoying side effects.
> ---
> emacs/notmuch-show.el | 87 +++++++++++++++++++++++-------------------------
> 1 files changed, 42 insertions(+), 45 deletions(-)
>
> diff --git a/emacs/notmuch-show.el b/emacs/notmuch-show.el
> index 51bda31..591ad56 100644
> --- a/emacs/notmuch-show.el
> +++ b/emacs/notmuch-show.el
> @@ -576,8 +576,7 @@ message at DEPTH in the current thread."
> (mapcar (lambda (inner-part) (plist-get inner-part :content-type))
> (plist-get part :content)))
>
> -(defun notmuch-show-insert-part-multipart/alternative (msg part content-type nth depth declared-type)
> - (notmuch-show-insert-part-header nth declared-type content-type nil)
> +(defun notmuch-show-insert-part-multipart/alternative (msg part content-type nth depth declared-type button)
> (let ((chosen-type (car (notmuch-multipart/alternative-choose (notmuch-show-multipart/*-to-list part))))
> (inner-parts (plist-get part :content))
> (start (point)))
> @@ -654,8 +653,7 @@ message at DEPTH in the current thread."
> content-type)
> nil)))
>
> -(defun notmuch-show-insert-part-multipart/related (msg part content-type nth depth declared-type)
> - (notmuch-show-insert-part-header nth declared-type content-type nil)
> +(defun notmuch-show-insert-part-multipart/related (msg part content-type nth depth declared-type button)
> (let ((inner-parts (plist-get part :content))
> (start (point)))
>
> @@ -674,16 +672,15 @@ message at DEPTH in the current thread."
> (indent-rigidly start (point) 1)))
> t)
>
> -(defun notmuch-show-insert-part-multipart/signed (msg part content-type nth depth declared-type)
> - (let ((button (notmuch-show-insert-part-header nth declared-type content-type nil)))
> - (button-put button 'face 'notmuch-crypto-part-header)
> - ;; add signature status button if sigstatus provided
> - (if (plist-member part :sigstatus)
> - (let* ((from (notmuch-show-get-header :From msg))
> - (sigstatus (car (plist-get part :sigstatus))))
> - (notmuch-crypto-insert-sigstatus-button sigstatus from))
> - ;; if we're not adding sigstatus, tell the user how they can get it
> - (button-put button 'help-echo "Set notmuch-crypto-process-mime to process cryptographic MIME parts.")))
> +(defun notmuch-show-insert-part-multipart/signed (msg part content-type nth depth declared-type button)
> + (button-put button 'face 'notmuch-crypto-part-header)
> + ;; add signature status button if sigstatus provided
> + (if (plist-member part :sigstatus)
> + (let* ((from (notmuch-show-get-header :From msg))
> + (sigstatus (car (plist-get part :sigstatus))))
> + (notmuch-crypto-insert-sigstatus-button sigstatus from))
> + ;; if we're not adding sigstatus, tell the user how they can get it
> + (button-put button 'help-echo "Set notmuch-crypto-process-mime to process cryptographic MIME parts."))
>
> (let ((inner-parts (plist-get part :content))
> (start (point)))
> @@ -696,20 +693,19 @@ message at DEPTH in the current thread."
> (indent-rigidly start (point) 1)))
> t)
>
> -(defun notmuch-show-insert-part-multipart/encrypted (msg part content-type nth depth declared-type)
> - (let ((button (notmuch-show-insert-part-header nth declared-type content-type nil)))
> - (button-put button 'face 'notmuch-crypto-part-header)
> - ;; add encryption status button if encstatus specified
> - (if (plist-member part :encstatus)
> - (let ((encstatus (car (plist-get part :encstatus))))
> - (notmuch-crypto-insert-encstatus-button encstatus)
> - ;; add signature status button if sigstatus specified
> - (if (plist-member part :sigstatus)
> - (let* ((from (notmuch-show-get-header :From msg))
> - (sigstatus (car (plist-get part :sigstatus))))
> - (notmuch-crypto-insert-sigstatus-button sigstatus from))))
> - ;; if we're not adding encstatus, tell the user how they can get it
> - (button-put button 'help-echo "Set notmuch-crypto-process-mime to process cryptographic MIME parts.")))
> +(defun notmuch-show-insert-part-multipart/encrypted (msg part content-type nth depth declared-type button)
> + (button-put button 'face 'notmuch-crypto-part-header)
> + ;; add encryption status button if encstatus specified
> + (if (plist-member part :encstatus)
> + (let ((encstatus (car (plist-get part :encstatus))))
> + (notmuch-crypto-insert-encstatus-button encstatus)
> + ;; add signature status button if sigstatus specified
> + (if (plist-member part :sigstatus)
> + (let* ((from (notmuch-show-get-header :From msg))
> + (sigstatus (car (plist-get part :sigstatus))))
> + (notmuch-crypto-insert-sigstatus-button sigstatus from))))
> + ;; if we're not adding encstatus, tell the user how they can get it
> + (button-put button 'help-echo "Set notmuch-crypto-process-mime to process cryptographic MIME parts."))
>
> (let ((inner-parts (plist-get part :content))
> (start (point)))
> @@ -722,8 +718,7 @@ message at DEPTH in the current thread."
> (indent-rigidly start (point) 1)))
> t)
>
> -(defun notmuch-show-insert-part-multipart/* (msg part content-type nth depth declared-type)
> - (notmuch-show-insert-part-header nth declared-type content-type nil)
> +(defun notmuch-show-insert-part-multipart/* (msg part content-type nth depth declared-type button)
> (let ((inner-parts (plist-get part :content))
> (start (point)))
> ;; Show all of the parts.
> @@ -735,8 +730,7 @@ message at DEPTH in the current thread."
> (indent-rigidly start (point) 1)))
> t)
>
> -(defun notmuch-show-insert-part-message/rfc822 (msg part content-type nth depth declared-type)
> - (notmuch-show-insert-part-header nth declared-type content-type nil)
> +(defun notmuch-show-insert-part-message/rfc822 (msg part content-type nth depth declared-type button)
> (let* ((message (car (plist-get part :content)))
> (body (car (plist-get message :body)))
> (start (point)))
> @@ -757,7 +751,7 @@ message at DEPTH in the current thread."
> (indent-rigidly start (point) 1)))
> t)
>
> -(defun notmuch-show-insert-part-text/plain (msg part content-type nth depth declared-type)
> +(defun notmuch-show-insert-part-text/plain (msg part content-type nth depth declared-type button)
> (let ((start (point)))
> ;; If this text/plain part is not the first part in the message,
> ;; insert a header to make this clear.
I know you're trying to minimize side-effects, but I think this will
also complicate maintenance. I'd rather see this call to
notmuch-show-insert-part-header removed and have the only call and all
special-case logic be in notmuch-show-insert-bodypart. As it is,
reasoning about exactly when a part button is inserted requires
understanding the conjunction of two widely separated parts of the code.
> @@ -770,8 +764,7 @@ message at DEPTH in the current thread."
> (run-hook-with-args 'notmuch-show-insert-text/plain-hook msg depth))))
> t)
>
> -(defun notmuch-show-insert-part-text/calendar (msg part content-type nth depth declared-type)
> - (notmuch-show-insert-part-header nth declared-type content-type (plist-get part :filename))
> +(defun notmuch-show-insert-part-text/calendar (msg part content-type nth depth declared-type button)
> (insert (with-temp-buffer
> (insert (notmuch-get-bodypart-content msg part nth notmuch-show-process-crypto))
> ;; notmuch-get-bodypart-content provides "raw", non-converted
> @@ -794,8 +787,8 @@ message at DEPTH in the current thread."
> t)
>
> ;; For backwards compatibility.
> -(defun notmuch-show-insert-part-text/x-vcalendar (msg part content-type nth depth declared-type)
> - (notmuch-show-insert-part-text/calendar msg part content-type nth depth declared-type))
> +(defun notmuch-show-insert-part-text/x-vcalendar (msg part content-type nth depth declared-type button)
> + (notmuch-show-insert-part-text/calendar msg part content-type nth depth declared-type button))
>
> (defun notmuch-show-get-mime-type-of-application/octet-stream (part)
> ;; If we can deduce a MIME type from the filename of the attachment,
> @@ -813,7 +806,7 @@ message at DEPTH in the current thread."
> nil))
> nil))))
>
> -(defun notmuch-show-insert-part-text/html (msg part content-type nth depth declared-type)
> +(defun notmuch-show-insert-part-text/html (msg part content-type nth depth declared-type button)
> ;; text/html handler to work around bugs in renderers and our
> ;; invisibile parts code. In particular w3m sets up a keymap which
> ;; "leaks" outside the invisible region and causes strange effects
> @@ -821,11 +814,10 @@ message at DEPTH in the current thread."
> ;; tell w3m not to set a keymap (so the normal notmuch-show-mode-map
> ;; remains).
> (let ((mm-inline-text-html-with-w3m-keymap nil))
> - (notmuch-show-insert-part-*/* msg part content-type nth depth declared-type)))
> + (notmuch-show-insert-part-*/* msg part content-type nth depth declared-type button)))
>
> -(defun notmuch-show-insert-part-*/* (msg part content-type nth depth declared-type)
> +(defun notmuch-show-insert-part-*/* (msg part content-type nth depth declared-type button)
> ;; This handler _must_ succeed - it is the handler of last resort.
> - (notmuch-show-insert-part-header nth content-type declared-type (plist-get part :filename))
> (notmuch-mm-display-part-inline msg part nth content-type notmuch-show-process-crypto)
> t)
>
> @@ -848,13 +840,13 @@ message at DEPTH in the current thread."
>
> ;;
>
> -(defun notmuch-show-insert-bodypart-internal (msg part content-type nth depth declared-type)
> +(defun notmuch-show-insert-bodypart-internal (msg part content-type nth depth declared-type button)
> (let ((handlers (notmuch-show-handlers-for content-type)))
> ;; Run the content handlers until one of them returns a non-nil
> ;; value.
> (while (and handlers
> (not (condition-case err
> - (funcall (car handlers) msg part content-type nth depth declared-type)
> + (funcall (car handlers) msg part content-type nth depth declared-type button)
> (error (progn
> (insert "!!! Bodypart insert error: ")
> (insert (error-message-string err))
> @@ -882,6 +874,9 @@ message at DEPTH in the current thread."
> "Insert the body part PART at depth DEPTH in the current thread.
>
> If HIDE is non-nil then initially hide this part."
> +
> + ;; We handle text/plain specially as its code does things before
> + ;; inserting a part button (and does not always insert a part button).
I think this comment would be clearer right above the button binding (or
maybe the separate diff hunks just make it more confusing than it is).
> (let* ((content-type (downcase (plist-get part :content-type)))
> (mime-type (or (and (string= content-type "application/octet-stream")
> (notmuch-show-get-mime-type-of-application/octet-stream part))
> @@ -889,9 +884,11 @@ If HIDE is non-nil then initially hide this part."
> "text/x-diff")
> content-type))
> (nth (plist-get part :id))
> - (beg (point)))
> + (beg (point))
> + (button (unless (string= mime-type "text/plain")
> + (notmuch-show-insert-part-header nth mime-type content-type (plist-get part :filename)))))
If you take my suggestion above, this would become something like
(unless (and (string= mime-type "text/plain) (<= nth 1)) ...)
or maybe clearer
(when (or (not (string= mime-type "text/plain")) (> nth 1)) ...)
>
> - (notmuch-show-insert-bodypart-internal msg part mime-type nth depth content-type)
> + (notmuch-show-insert-bodypart-internal msg part mime-type nth depth content-type button)
> ;; Some of the body part handlers leave point somewhere up in the
> ;; part, so we make sure that we're down at the end.
> (goto-char (point-max))
> --
> 1.7.9.1
>
> _______________________________________________
> notmuch mailing list
> notmuch at notmuchmail.org
> http://notmuchmail.org/mailman/listinfo/notmuch
More information about the notmuch
mailing list