*** empty log message ***
[gnus] / lisp / mm-view.el
1 ;;; mm-view.el --- Functions for viewing MIME objects
2 ;; Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
3
4 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
5 ;; This file is part of GNU Emacs.
6
7 ;; GNU Emacs is free software; you can redistribute it and/or modify
8 ;; it under the terms of the GNU General Public License as published by
9 ;; the Free Software Foundation; either version 2, or (at your option)
10 ;; any later version.
11
12 ;; GNU Emacs is distributed in the hope that it will be useful,
13 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
14 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 ;; GNU General Public License for more details.
16
17 ;; You should have received a copy of the GNU General Public License
18 ;; along with GNU Emacs; see the file COPYING.  If not, write to the
19 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 ;; Boston, MA 02111-1307, USA.
21
22 ;;; Commentary:
23
24 ;;; Code:
25
26 (eval-when-compile (require 'cl))
27 (require 'mail-parse)
28 (require 'mailcap)
29 (require 'mm-bodies)
30 (require 'mm-decode)
31
32 (eval-and-compile
33   (autoload 'gnus-article-prepare-display "gnus-art")
34   (autoload 'vcard-parse-string "vcard")
35   (autoload 'vcard-format-string "vcard")
36   (autoload 'fill-flowed "flow-fill")
37   (unless (fboundp 'diff-mode)
38     (autoload 'diff-mode "diff-mode" "" t nil)))
39
40 ;;;
41 ;;; Functions for displaying various formats inline
42 ;;;
43 (defun mm-inline-image-emacs (handle)
44   (let ((b (point-marker))
45         buffer-read-only)
46     (insert "\n")
47     (put-image (mm-get-image handle) b)
48     (mm-handle-set-undisplayer
49      handle
50      `(lambda () (remove-images ,b (1+ ,b))))))
51
52 (defun mm-inline-image-xemacs (handle)
53   (insert "\n")
54   (forward-char -1)
55   (let ((b (point))
56         (annot (make-annotation (mm-get-image handle) nil 'text))
57         buffer-read-only)
58     (mm-handle-set-undisplayer
59      handle
60      `(lambda ()
61         (let (buffer-read-only)
62           (delete-annotation ,annot)
63           (delete-region ,(set-marker (make-marker) b)
64                          ,(set-marker (make-marker) (point))))))
65     (set-extent-property annot 'mm t)
66     (set-extent-property annot 'duplicable t)))
67
68 (eval-and-compile
69   (if (featurep 'xemacs)
70       (defalias 'mm-inline-image 'mm-inline-image-xemacs)
71     (defalias 'mm-inline-image 'mm-inline-image-emacs)))
72
73 (defvar mm-w3-setup nil)
74 (defun mm-setup-w3 ()
75   (unless mm-w3-setup
76     (require 'w3)
77     (w3-do-setup)
78     (require 'url)
79     (require 'w3-vars)
80     (require 'url-vars)
81     (setq mm-w3-setup t)))
82
83 (defun mm-inline-text (handle)
84   (let ((type (mm-handle-media-subtype handle))
85         text buffer-read-only)
86     (cond
87      ((equal type "html")
88       (mm-setup-w3)
89       (setq text (mm-get-part handle))
90       (let ((b (point))
91             (url-standalone-mode t)
92             (url-current-object
93              (url-generic-parse-url (format "cid:%s" (mm-handle-id handle))))
94             (width (window-width))
95             (charset (mail-content-type-get
96                       (mm-handle-type handle) 'charset)))
97         (save-excursion
98           (insert text)
99           (save-restriction
100             (narrow-to-region b (point))
101             (goto-char (point-min))
102             (if (or (and (boundp 'w3-meta-content-type-charset-regexp)
103                          (re-search-forward
104                           w3-meta-content-type-charset-regexp nil t))
105                     (and (boundp 'w3-meta-charset-content-type-regexp)
106                          (re-search-forward
107                           w3-meta-charset-content-type-regexp nil t)))
108                 (setq charset
109                       (or (let ((bsubstr (buffer-substring-no-properties
110                                           (match-beginning 2)
111                                           (match-end 2))))
112                             (if (fboundp 'w3-coding-system-for-mime-charset)
113                                 (w3-coding-system-for-mime-charset bsubstr)
114                               (mm-charset-to-coding-system bsubstr)))
115                           charset)))
116             (delete-region (point-min) (point-max))
117             (insert (mm-decode-string text charset))
118             (save-window-excursion
119               (save-restriction
120                 (let ((w3-strict-width width)
121                       ;; Don't let w3 set the global version of
122                       ;; this variable.
123                       (fill-column fill-column)
124                       (url-standalone-mode t))
125                   (condition-case var
126                       (w3-region (point-min) (point-max))
127                     (error
128                      (delete-region (point-min) (point-max))
129                      (let ((b (point))
130                            (charset (mail-content-type-get
131                                      (mm-handle-type handle) 'charset)))
132                        (if (or (eq charset 'gnus-decoded)
133                                (eq mail-parse-charset 'gnus-decoded))
134                            (save-restriction
135                              (narrow-to-region (point) (point))
136                              (mm-insert-part handle)
137                              (goto-char (point-max)))
138                          (insert&nb