]> code.delx.au - gnu-emacs/blobdiff - lisp/gnus/mm-decode.el
Merge from mainline.
[gnu-emacs] / lisp / gnus / mm-decode.el
index 812ee7396dda454b9eaa6412567712c36f1c32e5..7274708f014f3a46a092c41478c950dda81d08ca 100644 (file)
@@ -29,8 +29,7 @@
 
 (require 'mail-parse)
 (require 'mm-bodies)
-(eval-when-compile (require 'cl)
-                  (require 'term))
+(eval-when-compile (require 'cl))
 
 (autoload 'gnus-map-function "gnus-util")
 (autoload 'gnus-replace-in-string "gnus-util")
   :group 'news
   :group 'multimedia)
 
+(defface mm-command-output
+  '((((class color)
+      (background dark))
+     (:foreground "ForestGreen"))
+    (((class color)
+      (background light))
+     (:foreground "red3"))
+    (t
+     (:italic t)))
+  "Face used for displaying output from commands."
+  :group 'mime-display)
+
 ;;; Convenience macros.
 
 (defmacro mm-handle-buffer (handle)
@@ -813,6 +824,8 @@ external if displayed external."
 
 (declare-function gnus-configure-windows "gnus-win" (setting &optional force))
 (defvar mailcap-mime-extensions)       ; mailcap-mime-info autoloads
+(declare-function term-mode "term" ())
+(declare-function term-char-mode "term" ())
 
 (defun mm-display-external (handle method)
   "Display HANDLE using METHOD."
@@ -982,9 +995,12 @@ external if displayed external."
                               (let ((buffer-read-only nil)
                                     (point (point)))
                                 (forward-line 2)
-                                (mm-insert-inline
-                                 handle (with-current-buffer buffer
-                                          (buffer-string)))
+                                (let ((start (point)))
+                                  (mm-insert-inline
+                                   handle (with-current-buffer buffer
+                                            (buffer-string)))
+                                  (put-text-property start (point)
+                                                     'face 'mm-command-output))
                                 (goto-char point))))
                           (when (buffer-live-p buffer)
                             (kill-buffer buffer)))
@@ -1803,11 +1819,12 @@ If RECURSIVE, search recursively."
             (replace-match (char-to-string char))))
         ;; Remove "soft hyphens".
         (goto-char (point-min))
-        (while (search-forward "­" nil t)
+        (while (search-forward "­" nil t)
           (replace-match "" t t))
         (libxml-parse-html-region (point-min) (point-max))))
       (unless (bobp)
        (insert "\n"))
+      (mm-convert-shr-links)
       (mm-handle-set-undisplayer
        handle
        `(lambda ()
@@ -1815,6 +1832,25 @@ If RECURSIVE, search recursively."
            (delete-region ,(point-min-marker)
                           ,(point-max-marker))))))))
 
+(defvar shr-map)
+
+(autoload 'widget-convert-button "wid-edit")
+
+(defun mm-convert-shr-links ()
+  (let ((start (point-min))
+       end)
+    (while (and start
+               (< start (point-max)))
+      (when (setq start (text-property-not-all start (point-max) 'shr-url nil))
+       (setq end (next-single-property-change start 'shr-url nil (point-max)))
+       (widget-convert-button
+        'url-link start end
+        :help-echo (get-text-property start 'help-echo)
+        :keymap shr-map
+        (get-text-property start 'shr-url))
+       (put-text-property start end 'local-map nil)
+       (setq start end)))))
+
 (defun mm-handle-filename (handle)
   "Return filename of HANDLE if any."
   (or (mail-content-type-get (mm-handle-type handle)
@@ -1825,7 +1861,7 @@ If RECURSIVE, search recursively."
 (provide 'mm-decode)
 
 ;; Local Variables:
-;; coding: iso-8859-1
+;; coding: utf-8
 ;; End:
 
 ;;; mm-decode.el ends here