mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-24 20:08:10 +01:00
emacs: Allow renderer of multipart/related parts access to non-primary parts.
Typically used to allow a `text/html' renderer access to images which are sent along with the HTML. This is not enabled by default, instead the user must execute `notmuch-show-setup-w3m' for it to take effect. Edited-by: Carl Worth <cworth@cworth.org> Add documentation string for notmuch-show-setup-23m and clean up warning about reference/assignment of free variable. Signed-off-by: Jameson Rollins <jrollins@finestructure.net>
This commit is contained in:
parent
31bd2872c3
commit
f3384a322e
1 changed files with 79 additions and 0 deletions
|
@ -335,6 +335,85 @@ current buffer, if possible."
|
||||||
(indent-rigidly start (point) 1)))
|
(indent-rigidly start (point) 1)))
|
||||||
t)
|
t)
|
||||||
|
|
||||||
|
(defun notmuch-show-setup-w3m ()
|
||||||
|
"Instruct w3m how to retrieve content from a \"related\" part of a message."
|
||||||
|
(interactive)
|
||||||
|
(if (boundp 'w3m-cid-retrieve-function-alist)
|
||||||
|
(unless (assq 'notmuch-show-mode w3m-cid-retrieve-function-alist)
|
||||||
|
(push (cons 'notmuch-show-mode 'notmuch-show-w3m-cid-retrieve)
|
||||||
|
w3m-cid-retrieve-function-alist)))
|
||||||
|
(setq mm-inline-text-html-with-images t))
|
||||||
|
|
||||||
|
(defvar w3m-current-buffer) ;; From `w3m.el'.
|
||||||
|
(defvar notmuch-show-w3m-cid-store nil)
|
||||||
|
(make-variable-buffer-local 'notmuch-show-w3m-cid-store)
|
||||||
|
|
||||||
|
(defun notmuch-show-w3m-cid-store-internal (content-id
|
||||||
|
message-id
|
||||||
|
part-number
|
||||||
|
content-type
|
||||||
|
content)
|
||||||
|
(push (list content-id
|
||||||
|
message-id
|
||||||
|
part-number
|
||||||
|
content-type
|
||||||
|
content)
|
||||||
|
notmuch-show-w3m-cid-store))
|
||||||
|
|
||||||
|
(defun notmuch-show-w3m-cid-store (msg part)
|
||||||
|
(let ((content-id (plist-get part :content-id)))
|
||||||
|
(when content-id
|
||||||
|
(notmuch-show-w3m-cid-store-internal (concat "cid:" content-id)
|
||||||
|
(plist-get msg :id)
|
||||||
|
(plist-get part :id)
|
||||||
|
(plist-get part :content-type)
|
||||||
|
nil))))
|
||||||
|
|
||||||
|
(defun notmuch-show-w3m-cid-retrieve (url &rest args)
|
||||||
|
(let ((matching-part (with-current-buffer w3m-current-buffer
|
||||||
|
(assoc url notmuch-show-w3m-cid-store))))
|
||||||
|
(if matching-part
|
||||||
|
(let ((message-id (nth 1 matching-part))
|
||||||
|
(part-number (nth 2 matching-part))
|
||||||
|
(content-type (nth 3 matching-part))
|
||||||
|
(content (nth 4 matching-part)))
|
||||||
|
;; If we don't already have the content, get it and cache
|
||||||
|
;; it, as some messages reference the same cid: part many
|
||||||
|
;; times (hundreds!), which results in many calls to
|
||||||
|
;; `notmuch part'.
|
||||||
|
(unless content
|
||||||
|
(setq content (notmuch-show-get-bodypart-internal (concat "id:" message-id)
|
||||||
|
part-number))
|
||||||
|
(with-current-buffer w3m-current-buffer
|
||||||
|
(notmuch-show-w3m-cid-store-internal url
|
||||||
|
message-id
|
||||||
|
part-number
|
||||||
|
content-type
|
||||||
|
content)))
|
||||||
|
(insert content)
|
||||||
|
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)
|
||||||
|
(let ((inner-parts (plist-get part :content))
|
||||||
|
(start (point)))
|
||||||
|
|
||||||
|
;; We assume that the first part is text/html and the remainder
|
||||||
|
;; things that it references.
|
||||||
|
|
||||||
|
;; Stash the non-primary parts.
|
||||||
|
(mapc (lambda (part)
|
||||||
|
(notmuch-show-w3m-cid-store msg part))
|
||||||
|
(cdr inner-parts))
|
||||||
|
|
||||||
|
;; Render the primary part.
|
||||||
|
(notmuch-show-insert-bodypart msg (car inner-parts) depth)
|
||||||
|
|
||||||
|
(when notmuch-show-indent-multipart
|
||||||
|
(indent-rigidly start (point) 1)))
|
||||||
|
t)
|
||||||
|
|
||||||
(defun notmuch-show-insert-part-multipart/* (msg part content-type nth depth declared-type)
|
(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)
|
(notmuch-show-insert-part-header nth declared-type content-type nil)
|
||||||
(let ((inner-parts (plist-get part :content))
|
(let ((inner-parts (plist-get part :content))
|
||||||
|
|
Loading…
Reference in a new issue