+ (unless charset
+ (goto-char (point-min))
+ (when (setq charset (w3m-detect-meta-charset))
+ (delete-region (point-min) (point-max))
+ (insert (mm-decode-string text charset))))
+ (let ((w3m-safe-url-regexp mm-w3m-safe-url-regexp)
+ w3m-force-redisplay)
+ (w3m-region (point-min) (point-max) nil charset))
+ (when (and mm-inline-text-html-with-w3m-keymap
+ (boundp 'w3m-minor-mode-map)
+ w3m-minor-mode-map)
+ (add-text-properties
+ (point-min) (point-max)
+ (list 'keymap w3m-minor-mode-map
+ ;; Put the mark meaning this part was rendered by emacs-w3m.
+ 'mm-inline-text-html-with-w3m t)))
+ (mm-handle-set-undisplayer
+ handle
+ `(lambda ()
+ (let ((inhibit-read-only t))
+ (delete-region ,(point-min-marker)
+ ,(point-max-marker)))))))))
+
+(defvar mm-w3m-standalone-supports-m17n-p (if (featurep 'mule) 'undecided)
+ "*T means the w3m command supports the m17n feature.")
+
+(defun mm-w3m-standalone-supports-m17n-p ()
+ "Say whether the w3m command supports the m17n feature."
+ (cond ((eq mm-w3m-standalone-supports-m17n-p t) t)
+ ((eq mm-w3m-standalone-supports-m17n-p nil) nil)
+ ((not (featurep 'mule)) (setq mm-w3m-standalone-supports-m17n-p nil))
+ ((condition-case nil
+ (let ((coding-system-for-write 'iso-2022-jp)
+ (coding-system-for-read 'iso-2022-jp)
+ (str (mm-decode-coding-string "\
+\e$B#D#o#e#s!!#w#3#m!!#s#u#p#p#o#r#t#s!!#m#1#7#n!)\e(B" 'iso-2022-jp)))
+ (mm-with-multibyte-buffer
+ (insert str)
+ (call-process-region
+ (point-min) (point-max) "w3m" t t nil "-dump"
+ "-T" "text/html" "-I" "iso-2022-jp" "-O" "iso-2022-jp")
+ (goto-char (point-min))
+ (search-forward str nil t)))
+ (error nil))
+ (setq mm-w3m-standalone-supports-m17n-p t))
+ (t
+ ;;(message "You had better upgrade your w3m command")
+ (setq mm-w3m-standalone-supports-m17n-p nil))))
+
+(defun mm-inline-text-html-render-with-w3m-standalone (handle)
+ "Render a text/html part using w3m."
+ (if (mm-w3m-standalone-supports-m17n-p)
+ (let ((source (mm-get-part handle))
+ (charset (or (mail-content-type-get (mm-handle-type handle)
+ 'charset)
+ (symbol-name mail-parse-charset)))
+ cs)
+ (unless (and charset
+ (setq cs (mm-charset-to-coding-system charset))
+ (not (eq cs 'ascii)))
+ ;; The default.
+ (setq charset "iso-8859-1"
+ cs 'iso-8859-1))
+ (mm-insert-inline
+ handle
+ (mm-with-unibyte-buffer
+ (insert source)
+ (mm-enable-multibyte)
+ (let ((coding-system-for-write 'binary)
+ (coding-system-for-read cs))
+ (call-process-region
+ (point-min) (point-max)
+ "w3m" t t nil "-dump" "-T" "text/html"
+ "-I" charset "-O" charset))
+ (buffer-string))))
+ (mm-inline-render-with-stdin handle nil "w3m" "-dump" "-T" "text/html")))
+
+(defun mm-links-remove-leading-blank ()
+ ;; Delete the annoying three spaces preceding each line of links
+ ;; output.
+ (goto-char (point-min))
+ (while (re-search-forward "^ " nil t)
+ (delete-region (match-beginning 0) (match-end 0))))
+
+(defun mm-inline-wash-with-file (post-func cmd &rest args)
+ (let ((file (mm-make-temp-file
+ (expand-file-name "mm" mm-tmp-directory))))
+ (let ((coding-system-for-write 'binary))
+ (write-region (point-min) (point-max) file nil 'silent))
+ (delete-region (point-min) (point-max))
+ (unwind-protect
+ (apply 'call-process cmd nil t nil (mapcar 'eval args))
+ (delete-file file))
+ (and post-func (funcall post-func))))
+
+(defun mm-inline-wash-with-stdin (post-func cmd &rest args)
+ (let ((coding-system-for-write 'binary))
+ (apply 'call-process-region (point-min) (point-max)
+ cmd t t nil args))
+ (and post-func (funcall post-func)))
+
+(defun mm-inline-render-with-file (handle post-func cmd &rest args)
+ (let ((source (mm-get-part handle)))
+ (mm-insert-inline
+ handle
+ (mm-with-unibyte-buffer
+ (insert source)
+ (apply 'mm-inline-wash-with-file post-func cmd args)
+ (buffer-string)))))
+
+(defun mm-inline-render-with-stdin (handle post-func cmd &rest args)
+ (let ((source (mm-get-part handle)))
+ (mm-insert-inline
+ handle
+ (mm-with-unibyte-buffer
+ (insert source)
+ (apply 'mm-inline-wash-with-stdin post-func cmd args)
+ (buffer-string)))))
+
+(defun mm-inline-render-with-function (handle func &rest args)
+ (let ((source (mm-get-part handle))
+ (charset (or (mail-content-type-get (mm-handle-type handle) 'charset)
+ mail-parse-charset)))
+ (mm-insert-inline
+ handle
+ (mm-with-multibyte-buffer
+ (insert (if charset
+ (mm-decode-string source charset)
+ source))
+ (apply func args)
+ (buffer-string)))))
+
+(defun mm-inline-text-html (handle)
+ (let* ((func (or mm-inline-text-html-renderer mm-text-html-renderer))
+ (entry (assq func mm-text-html-renderer-alist))
+ buffer-read-only)
+ (if entry
+ (setq func (cdr entry)))
+ (cond
+ ((functionp func)
+ (funcall func handle))
+ (t
+ (apply (car func) handle (cdr func))))))
+
+(defun mm-inline-text-vcard (handle)
+ (let (buffer-read-only)
+ (mm-insert-inline
+ handle
+ (concat "\n-- \n"
+ (ignore-errors
+ (if (fboundp 'vcard-pretty-print)
+ (vcard-pretty-print (mm-get-part handle))
+ (vcard-format-string
+ (vcard-parse-string (mm-get-part handle)
+ 'vcard-standard-filter))))))))
+
+(defun mm-inline-text (handle)
+ (let ((b (point))
+ (type (mm-handle-media-subtype handle))
+ (charset (mail-content-type-get
+ (mm-handle-type handle) 'charset))
+ buffer-read-only)
+ (if (or (eq charset 'gnus-decoded)
+ ;; This is probably not entirely correct, but
+ ;; makes rfc822 parts with embedded multiparts work.
+ (eq mail-parse-charset 'gnus-decoded))
+ (save-restriction
+ (narrow-to-region (point) (point))
+ (mm-insert-part handle)
+ (goto-char (point-max)))
+ (insert (mm-decode-string (mm-get-part handle) charset)))
+ (when (and mm-fill-flowed
+ (equal type "plain")
+ (equal (cdr (assoc 'format (mm-handle-type handle)))
+ "flowed"))
+ (save-restriction
+ (narrow-to-region b (point))
+ (goto-char b)
+ (fill-flowed nil (equal (cdr (assoc 'delsp (mm-handle-type handle)))
+ "yes"))
+ (goto-char (point-max))))
+ (save-restriction
+ (narrow-to-region b (point))
+ (when (or (equal type "enriched")
+ (equal type "richtext"))
+ (set-text-properties (point-min) (point-max) nil)
+ (ignore-errors
+ (enriched-decode (point-min) (point-max))))