Function: gnus-mm-display-part

gnus-mm-display-part is a byte-compiled function defined in gnus-art.el.gz.

Signature

(gnus-mm-display-part HANDLE)

Documentation

Display HANDLE and fix MIME button.

Source Code

;; Defined in /usr/src/emacs/lisp/gnus/gnus-art.el.gz
(defun gnus-mm-display-part (handle)
  "Display HANDLE and fix MIME button."
  (let ((id (get-text-property (point) 'gnus-part))
	(point (point))
	(inhibit-read-only t)
	(window (selected-window))
	(mail-parse-charset gnus-newsgroup-charset)
	(mail-parse-ignored-charsets
	 (if (gnus-buffer-live-p gnus-summary-buffer)
	     (with-current-buffer gnus-summary-buffer
	       gnus-newsgroup-ignored-charsets)
	   nil))
	start retval)
    (unwind-protect
	(progn
	  (let ((win (gnus-get-buffer-window (current-buffer) t)))
	    (when win
	      (select-window win)
	      (goto-char point)))
	  (setq start (next-single-property-change point 'gnus-data
						   nil (point-max))
		point (previous-single-property-change start 'gnus-data))
	  (if (mm-handle-displayed-p handle)
	      ;; This will remove the part.
	      (setq point (copy-marker point)
		    retval (mm-display-part handle))
	    (let ((part (or (and (mm-inlinable-p handle)
				 (mm-inlined-p handle)
				 t)
			    (with-temp-buffer
			      (gnus-bind-mm-vars
			       (setq retval (mm-display-part handle)))
			      (unless (zerop (buffer-size))
				(buffer-string))))))
	      (goto-char start)
	      (unless (bolp)
		;; This is a header button.
		(forward-line 1))
	      (cond ((stringp part)
		     (save-restriction
		       (narrow-to-region (point)
					 (progn
					   (insert part)
					   (unless (bolp) (insert "\n"))
					   (point)))
		       (gnus-treat-article nil id
					   (gnus-article-mime-total-parts)
					   (mm-handle-media-type handle))
		       (mm-handle-set-undisplayer
			handle
			(let ((beg (copy-marker (point-min) t))
			      (end (point-max-marker)))
			  (lambda ()
			    (let ((inhibit-read-only t))
			      (delete-region beg end)))))))
		    (part
		     (mm-display-inline handle))))))
      (when (markerp point)
	(setq point (prog1 (marker-position point)
		      (set-marker point nil))))
      (goto-char point)
      ;; Toggle the button appearance between `[button]...' and `[button]'.
      (let ((displayed-p (mm-handle-displayed-p handle)))
	(gnus-insert-mime-button handle id (list displayed-p))
	(delete-region
	 (point)
	 (next-single-property-change (point) 'gnus-data nil (point-max)))
	(setq start (point))
	(if (search-backward "\n\n" nil t)
	    (progn
	      (goto-char start)
	      (unless (or displayed-p (eolp))
		;; Add extra newline.
		(insert (propertize (buffer-substring (1- start) start)
				    'gnus-undeletable t))))
	  ;; We're in the article header.
	  (delete-char -1)
	  (let ((ovl (make-overlay point (point))))
	    (overlay-put ovl 'gnus-button-attachment-extra t)
	    (overlay-put ovl 'evaporate t))
	  (save-restriction
	    (message-narrow-to-field)
	    (let ((gnus-treatment-function-alist
		   '((gnus-treat-highlight-headers
		      gnus-article-highlight-headers))))
	      (gnus-treat-article 'head)))))
      (goto-char point)
      (if (window-live-p window)
	  (select-window window)))
    retval))