2 ;;; A MIME viewer for GNU Emacs
4 ;;; by Morioka Tomohiko, 1994/07/13
23 (defconst mime-viewer/RCS-ID
24 "$Id: tm-view.el,v 6.15 1995/04/18 16:48:08 morioka Exp $")
26 (defconst mime-viewer/version (get-version-string mime-viewer/RCS-ID))
27 (defconst mime/viewer-version mime-viewer/version)
33 (defconst mime/tspecials "\000-\040()<>@,;:\\\"/[\093?.=")
34 (defconst mime/token-regexp
35 (concat "[^" mime/tspecials "]*"))
36 (defconst mime/content-type-subtype-regexp
37 (concat mime/token-regexp "/" mime/token-regexp))
38 (defconst mime/content-parameter-value-regexp
40 message/quoted-string-regexp
43 (defconst mime/output-buffer-name "*MIME-out*")
44 (defconst mime/decoding-buffer-name "*MIME-decoding*")
50 (defvar mime/content-decoding-condition
51 ;;(setq mime/content-decoding-condition
52 '(((type . "text/plain")
53 (method "tm-plain" nil 'file 'type 'encoding 'mode 'name))
54 ;;((type . "text/x-latex")
55 ;; (method "tm-latex" nil 'file 'type 'encoding 'mode 'name))
56 ((type . "audio/basic")
57 (method "tm-au" nil 'file 'type 'encoding 'mode 'name))
59 (method "tm-image" nil 'file 'type 'encoding 'mode 'name))
60 ((type . "image/jpeg")
61 (method "tm-image" nil 'file 'type 'encoding 'mode 'name))
62 ((type . "image/tiff")
63 (method "tm-image" nil 'file 'type 'encoding 'mode 'name))
64 ((type . "image/x-tiff")
65 (method "tm-image" nil 'file 'type 'encoding 'mode 'name))
66 ((type . "image/x-xbm")
67 (method "tm-image" nil 'file 'type 'encoding 'mode 'name))
68 ((type . "image/x-pic")
69 (method "tm-image" nil 'file 'type 'encoding 'mode 'name))
70 ((type . "video/mpeg")
71 (method "tm-mpeg" nil 'file 'type 'encoding 'mode 'name))
72 ((type . "application/octet-stream")
73 (method "tm-file" nil 'file 'type 'encoding 'mode 'name))
74 ;;((type . "message/external-body")
75 ;; (method "xterm" nil
76 ;; "-e" "showexternal"
77 ;; 'file '"access-type" '"name" '"site" '"directory"))
78 ((type . "message/partial")
79 (method . mime/decode-message/partial-region))
81 "-m" "tm" "-x" "-d" "-z" "-e" 'file)(mode . "play"))
84 (defvar mime-viewer/content-filter-alist
85 '(("text/plain" . mime-viewer/filter-text/plain)))
87 (defvar mime-viewer/content-subject-function
89 (lambda (cnum subj ctype params)
91 (format "[%s %s (%s)]\n"
95 (format "%s" (+ num 1))
102 (defvar mime-viewer/content-header-filter-function
103 (function mime-viewer/default-content-header-filter-function))
105 (defvar mime-viewer/childrens-header-showing-Content-Type-list
108 (defvar mime-viewer/ignored-field-list
111 (defun mime-viewer/default-content-header-filter-function (cnum cinfo)
112 (if (and (listp cnum)
114 (mime::content-info/type
115 (mime::article/get-content-region (butlast cnum) cinfo)
117 mime-viewer/childrens-header-showing-Content-Type-list)
119 (delete-region (goto-char (point-min))
120 (or (and (re-search-forward "^$" nil t)
126 (narrow-to-region (goto-char (point-min))
127 (or (and (re-search-forward "^$" nil t)
133 (goto-char (point-min))
134 (while (and (re-search-forward
135 (concat "^" (regexp-quote field) ":")
142 (concat message/field-body-regexp "\n")
148 )) mime-viewer/ignored-field-list)
151 (defvar mime-viewer/default-showing-Content-Type-list
152 '("text/plain" "text/richtext" "text/enriched"
153 "text/x-latex" "application/x-latex"
154 "application/octet-stream" nil))
156 (defvar mime-viewer/decoding-mode "play" "MIME body decoding mode")
162 (defun mime::viewer/quitting-method-for-gnus4 ()
163 (mime-viewer/kill-buffer)
164 (delete-other-windows)
165 (gnus-article-show-summary)
168 (defun mime::viewer/quitting-method-for-rmail ()
169 (mime-viewer/kill-buffer)
171 (delete-other-windows)
174 (defun mime::viewer/quitting-method-for-mh-e ()
175 (let ((win (get-buffer-window
176 mime/output-buffer-name))
178 (mime::preview-content-info/buffer
179 (car mime::preview/content-list)))
184 (mime-viewer/kill-buffer)
186 (let ((name (buffer-name buf)))
187 (string-match "show-" name)
188 (substring name (match-end 0))
190 ;; patch for mh-narrow.el
191 ;; by YAMAOKA Katsumi <yamaoka@ga.sony.co.jp>
192 (if (and (featurep 'mh-narrow)
193 (fboundp 'mh-narrow-to-page))
195 (set-buffer mh-show-buffer)
196 (mh-narrow-to-page)))
200 (defvar mime-viewer/quitting-method-alist
201 '((gnus-article-mode . mime::viewer/quitting-method-for-gnus4)
202 (rmail-mode . mime::viewer/quitting-method-for-rmail)
203 (mh-show-mode . mime::viewer/quitting-method-for-mh-e)
204 (mime/show-message-mode
206 (set-window-configuration
207 mime/show-mode-old-window-configuration)
208 (let ((mother mime/mother-buffer))
210 (mime::preview-content-info/buffer
211 (car mime::preview/content-list)))
212 (mime-viewer/kill-buffer)
213 (pop-to-buffer mother)
214 (goto-char (point-min))
215 (mime-viewer/up-content)
226 (defun mime::make-content-info (beg end ctype params encoding children)
227 (vector beg end ctype params encoding children)
230 (defun mime::content-info/point-min (cinfo)
234 (defun mime::content-info/point-max (cinfo)
238 (defun mime::content-info/type (cinfo)
242 (defun mime::content-info/parameters (cinfo)
246 (defun mime::content-info/encoding (cinfo)
250 (defun mime::content-info/children (cinfo)
254 ;;; @@ preview-content-info
257 (defun mime::make-preview-content-info (beg end buf cinfo)
258 (vector beg end buf cinfo)
261 (defun mime::preview-content-info/point-min (pcinfo)
265 (defun mime::preview-content-info/point-max (pcinfo)
269 (defun mime::preview-content-info/buffer (pcinfo)
273 (defun mime::preview-content-info/content-info (pcinfo)
278 ;;; @ buffer local variables
281 (defvar mime::article/content-info)
282 (defvar mime::article/preview-buffer)
284 (defvar mime::preview/content-list nil)
285 (defvar mime::preview/original-major-mode nil)
291 (defun mime-viewer/parse-message (&optional ctl encoding)
292 (make-variable-buffer-local 'mime::article/content-info)
293 (setq mime::article/content-info (mime-viewer/parse ctl encoding))
294 (let ((ret (mime-viewer/make-preview-buffer)))
295 (make-variable-buffer-local 'mime::article/preview-buffer)
296 (setq mime::article/preview-buffer (car ret))
299 (defun mime-viewer/parse (&optional ctl encoding)
304 (goto-char (point-min))
309 (setq encoding (progn
310 (goto-char (point-min))
311 (mime/Content-Transfer-Encoding)
314 (let ((ctype (car ctl))
318 (setq ctype (downcase ctype))
320 (if (stringp encoding)
321 (setq encoding (downcase encoding))
323 (let ((boundary (assoc "boundary" params)))
324 (search-forward "\n\n" nil t)
327 (message/strip-quoted-string (cdr boundary)))
328 (mime-viewer/parse-multipart
331 (search-forward (concat "--" boundary "--\n") nil t)
334 boundary ctype params encoding)
336 ((string= ctype "message/rfc822")
337 (mime::make-content-info
338 (point-min) (point-max)
339 ctype params encoding
342 (narrow-to-region (match-end 0) (point-max))
343 (list (mime-viewer/parse))
348 (mime::make-content-info (point-min) (point-max)
349 ctype params encoding nil)
353 (defun mime-viewer/parse-multipart (beg end boundary ctype params encoding)
354 (let ((sep (concat "^--" boundary "$"))
355 cb ce ct ret ncb children)
358 (narrow-to-region beg end)
359 (goto-char (point-min))
360 (search-forward (concat "--" boundary "\n") nil t)
361 (setq cb (match-end 0))
362 (while (re-search-forward sep nil t)
363 (setq ce (match-beginning 0))
364 (setq ncb (match-end 0))
367 (narrow-to-region cb ce)
368 (setq ret (mime-viewer/parse))
370 (setq children (nconc children (list ret)))
371 (goto-char (mime::content-info/point-max ret))
372 (search-forward (concat "--" boundary "\n") nil t)
373 (goto-char (setq cb (match-end 0)))
375 (setq ce (point-max))
378 (narrow-to-region cb ce)
379 (setq ret (mime-viewer/parse))
381 (setq children (nconc children (list ret)))
383 (setq beg (point-min))
385 (mime::make-content-info beg end ctype params encoding children)
388 (defun mime/Content-Type ()
391 (if (and (re-search-forward "^Content-Type:[ \t]*" nil t)
395 (and (re-search-forward ".*\\(\n[ \t].*\\)*" nil t)
398 (goto-char (point-min))
399 (re-search-forward mime/content-type-subtype-regexp nil t)
403 (buffer-substring (match-beginning 0) (match-end 0))
405 dest attribute value)
406 (while (and (re-search-forward "[ \t\n]*;[ \t\n]*" nil t)
407 (re-search-forward mime/token-regexp nil t)
411 (buffer-substring (match-beginning 0) (match-end 0))
413 (if (and (re-search-forward "=[ \t\n]*" nil t)
414 (re-search-forward mime/content-parameter-value-regexp
419 (message/strip-quoted-string
420 (buffer-substring (match-beginning 0)
428 (defun mime/Content-Transfer-Encoding (&optional default-encoding)
431 (if (and (re-search-forward "^Content-Transfer-Encoding:[ \t]*" nil t)
432 (re-search-forward mime/token-regexp nil t)
434 (downcase (buffer-substring (match-beginning 0) (match-end 0)))
438 (defun mime/get-subject (param)
442 (or (and (setq ret (assoc "name" param))
443 (message/strip-quoted-string (cdr ret))
445 (and (setq ret (assoc "x-name" param))
446 (message/strip-quoted-string (cdr ret))
449 (narrow-to-region (point-min)
450 (or (and (search-forward "\n\n" nil t)
455 (message/get-field-body "Content-Description")
456 (message/get-field-body "Subject")
461 (defun mime/get-name (param)
462 (replace-as-filename (mime/get-subject param))
465 (defun mime-viewer/make-preview-buffer (&optional buf cinfo obuf)
466 (let ((the-buf (current-buffer)) pcl dest)
474 (switch-to-buffer buf)
475 (setq cinfo mime::article/content-info)
478 (setq obuf (concat "*Preview-" (buffer-name buf) "*"))
480 (setq pcl (mime::make-flat-content-list cinfo))
481 (if (get-buffer obuf)
488 (let ((beg (mime::content-info/point-min cell))
489 (end (mime::content-info/point-max cell))
490 (ctype (mime::content-info/type cell))
491 (params (mime::content-info/parameters cell))
492 cnum e nb ne subj str)
493 (setq cnum (mime::get-point-content-number beg cinfo))
494 (switch-to-buffer buf)
499 mime-viewer/default-showing-Content-Type-list))
503 (search-forward "\n\n" nil t)
507 (if (> e (point-max))
510 (setq str (buffer-substring beg e))
511 (switch-to-buffer obuf)
518 (narrow-to-region nb ne)
519 (mime/decode-message-header)
520 (setq subj (mime/get-subject params))
524 mime-viewer/content-filter-alist))))
525 (if (and f (fboundp f))
526 (funcall f ctype params)
528 (funcall mime-viewer/content-header-filter-function
531 (funcall mime-viewer/content-subject-function
532 cnum subj ctype params)
533 (setq ne (point-max))
534 (mime::make-preview-content-info nb (- ne 1)
540 (set-buffer-modified-p nil)
541 (setq buffer-read-only t)
542 (switch-to-buffer the-buf)
547 ;;; @ content information
550 (defun mime::get-point-content-number (p &optional cinfo)
552 (setq cinfo mime::article/content-info)
554 (let ((b (mime::content-info/point-min cinfo))
555 (e (mime::content-info/point-max cinfo))
556 (c (mime::content-info/children cinfo))
558 (if (and (<= b p)(<= p e))
559 (or (let (co ret (sn 0))
563 (setq ret (mime::get-point-content-number p co))
564 (cond ((eq ret t) (throw 'tag (list sn)))
565 (ret (throw 'tag (cons sn ret)))
572 (defun mime::article/get-content-region (cn &optional cinfo)
574 (setq cinfo mime::article/content-info)
581 (let ((rc (nth sn (mime::content-info/children cinfo))))
583 (mime::article/get-content-region (cdr cn) rc)
587 (defun mime::make-flat-content-list (&optional cinfo)
589 (setq cinfo mime::article/content-info)
591 (let ((dest (list cinfo))
592 (rcl (mime::content-info/children cinfo))
595 (setq dest (nconc dest (mime::make-flat-content-list (car rcl))))
600 (defun mime::point-preview-content (p &optional pcl)
602 (setq pcl mime::preview/content-list)
608 (if (and (<= (mime::preview-content-info/point-min cell) p)
609 (<= p (mime::preview-content-info/point-max cell))
622 (defun mime/Quoted-Printable-decode-region (beg end)
626 (narrow-to-region beg end)
627 (goto-char (point-min))
628 (while (re-search-forward "=\n" nil t)
631 (goto-char (point-min))
633 (while (re-search-forward mime/Quoted-Printable-octet-regexp nil t)
634 (setq b (match-beginning 0))
635 (setq e (match-end 0))
636 (setq str (buffer-substring b e))
638 (insert (mime/Quoted-Printable-decode-string str))
642 (defun mime/Base64-decode-region (beg end)
646 (narrow-to-region beg end)
647 (goto-char (point-min))
648 (while (search-forward "\n" nil t)
651 (let ((str (buffer-substring (point-min)(point-max))))
652 (delete-region (point-min)(point-max))
653 (insert (mime/base64-decode-string str))
656 (defun mime/make-method-args (cal format)
661 (let ((ret (cdr (assoc (eval arg) cal))))
669 (defun mime/start-external-method-region (beg end cal)
672 (narrow-to-region beg end)
674 (let ((method (cdr (assoc 'method cal)))
675 (name (mime/get-name cal))
678 (let ((file (make-temp-name
679 (expand-file-name "TM" mime/tmp-dir)))
683 (search-forward "\n\n" nil t)
684 (setq b (match-end 0))
687 (write-region b end file)
689 'name (replace-as-filename name) cal))
690 (setq cal (put-alist 'file file cal))
693 mime/output-buffer-name (car method)
695 (mime/make-method-args cal (cdr (cdr method)))
697 (apply (function start-process) args)
698 (mime/show-output-buffer)
702 (defun mime/decode-message/partial-region (beg end cal)
704 (let* ((root-dir (expand-file-name
705 (concat "m-prts-" (user-login-name)) mime/tmp-dir))
706 (id (cdr (assoc "id" cal)))
707 (number (cdr (assoc "number" cal)))
708 (total (cdr (assoc "total" cal)))
709 (the-buf (current-buffer))
711 (mother mime::article/preview-buffer))
712 (if (not (file-exists-p root-dir))
713 (make-directory root-dir)
715 (setq id (replace-as-filename id))
716 (setq root-dir (concat root-dir "/" id))
717 (if (not (file-exists-p root-dir))
718 (make-directory root-dir)
720 (setq file (concat root-dir "/FULL"))
721 (if (not (file-exists-p file))
723 (re-search-forward "^$")
724 (goto-char (+ (match-end 0) 1))
725 (setq file (concat root-dir "/" number))
726 (write-region (point) (point-max) file)
727 (if (get-buffer "*MIME-temp*")
728 (kill-buffer "*MIME-temp*")
730 (switch-to-buffer "*MIME-temp*")
732 (max (string-to-int total))
736 (setq file (concat root-dir "/" (int-to-string i)))
737 (if (not (file-exists-p file))
739 (switch-to-buffer the-buf)
742 (insert-file-contents file)
743 (goto-char (point-max))
746 (delete-other-windows)
747 (write-file (concat root-dir "/FULL"))
748 (setq major-mode 'mime/show-message-mode)
749 (mime/viewer-mode mother)
750 (pop-to-buffer (current-buffer))
754 (delete-other-windows)
756 (setq major-mode 'mime/show-message-mode)
757 (mime/viewer-mode mother)
758 (pop-to-buffer (current-buffer))
762 (defun mime/get-content-decoding-alist (al)
763 (get-unified-alist mime/content-decoding-condition al)
766 (defun mime::article/decode-content-region (cinfo)
768 (let ((beg (mime::content-info/point-min cinfo))
769 (end (mime::content-info/point-max cinfo))
770 (ctype (mime::content-info/type cinfo))
771 (params (mime::content-info/parameters cinfo))
772 (encoding (mime::content-info/encoding cinfo))
775 (let (method cal ret)
776 (setq cal (append (list (cons 'type ctype)
777 (cons 'encoding encoding)
778 (cons 'major-mode major-mode)
781 (if mime-viewer/decoding-mode
783 (cons 'mode mime-viewer/decoding-mode)
786 (setq ret (mime/get-content-decoding-alist cal))
787 (setq method (cdr (assoc 'method ret)))
788 (cond ((and (symbolp method)
790 (funcall method beg end ret)
792 ((and (listp method)(stringp (car method)))
793 (mime/start-external-method-region beg end ret)
795 (t (mime/show-output-buffer
796 "No method are specified for %s\n" ctype)
801 (defun mime/show-output-buffer (&rest forms)
802 (let ((the-buf (current-buffer)))
803 (if (null (get-buffer-window mime/output-buffer-name))
804 (split-window-vertically (/ (* (window-height) 3) 4))
806 (pop-to-buffer mime/output-buffer-name)
807 (goto-char (point-max))
809 (insert (apply (function format) forms))
811 (pop-to-buffer the-buf)
818 (defun mime-viewer/filter-text/plain (ctype params)
821 (let ((charset (cdr (assoc "charset" params)))
825 (goto-char (point-min))
826 (narrow-to-region (point-min)
827 (or (and (search-forward "\n\n" nil t)
830 (goto-char (point-min))
831 (mime/Content-Transfer-Encoding "7bit")
833 (beg (point-min)) (end (point-max))
835 (goto-char (point-min))
836 (if (search-forward "\n\n" nil t)
837 (setq beg (match-end 0))
839 (if (cond ((string= encoding "quoted-printable")
840 (mime/Quoted-Printable-decode-region beg end)
842 ((string= encoding "base64")
843 (mime/Base64-decode-region beg end)
845 (mime/code-convert-region-to-emacs beg (point-max) charset)
850 ;;; @ MIME viewer mode
853 (defvar mime/viewer-mode-map nil)
854 (if (null mime/viewer-mode-map)
856 (setq mime/viewer-mode-map (make-keymap))
857 (suppress-keymap mime/viewer-mode-map)
858 (define-key mime/viewer-mode-map
859 "u" (function mime-viewer/up-content))
860 (define-key mime/viewer-mode-map
861 "p" (function mime-viewer/previous-content))
862 (define-key mime/viewer-mode-map
863 "n" (function mime-viewer/next-content))
864 (define-key mime/viewer-mode-map
865 " " (function mime-viewer/scroll-up-content))
866 (define-key mime/viewer-mode-map
867 "\M- " (function mime-viewer/scroll-down-content))
868 (define-key mime/viewer-mode-map
869 "\177" (function mime-viewer/scroll-down-content))
870 (define-key mime/viewer-mode-map
871 "\C-m" (function mime-viewer/next-line-content))
872 (define-key mime/viewer-mode-map
873 "\C-\M-m" (function mime-viewer/previous-line-content))
874 (define-key mime/viewer-mode-map
875 "v" (function mime-viewer/play-content))
876 (define-key mime/viewer-mode-map
877 "e" (function mime-viewer/extract-content))
878 (define-key mime/viewer-mode-map
879 "\C-c\C-p" (function mime-viewer/print-content))
880 (define-key mime/viewer-mode-map
881 "q" (function mime-viewer/quit))
882 (define-key mime/viewer-mode-map
883 "\C-c\C-x" (function mime-viewer/kill-buffer))
886 (defun mime/viewer-mode (&optional mother ctl encoding)
887 "Major mode for viewing MIME message.
889 u Move to upper content
890 p Move to previous content
891 n Move to next content
895 RET Move to next line
896 M-RET Move to previous line
897 v Decode the content as `play mode'
898 e Decode the content as `extract mode'
899 C-c C-p Decode the content as `print mode'
903 (let ((buf (get-buffer mime/output-buffer-name))
904 (the-buf (current-buffer))
908 (switch-to-buffer buf)
910 (switch-to-buffer the-buf)
912 (let ((ret (mime-viewer/parse-message ctl encoding))
914 (switch-to-buffer (car ret))
915 (setq major-mode 'mime/viewer-mode)
916 (setq mode-name "MIME-View")
917 (make-variable-buffer-local 'mime::preview/original-major-mode)
918 (setq mime::preview/original-major-mode
921 (make-variable-buffer-local
922 'mime/show-mode-old-window-configuration)
923 (setq mime/show-mode-old-window-configuration
924 (current-window-configuration))
925 (make-variable-buffer-local 'mime/mother-buffer)
926 (setq mime/mother-buffer mother)
927 'mime/show-message-mode)
929 (use-local-map mime/viewer-mode-map)
930 (make-variable-buffer-local 'mime::preview/content-list)
931 (setq mime::preview/content-list (nth 1 ret))
933 (let ((ce (mime::preview-content-info/point-max
934 (car mime::preview/content-list)
937 (goto-char (point-min))
938 (search-forward "\n\n" nil t)
939 (setq e (match-end 0))
943 (run-hooks 'mime/viewer-mode-hook)
946 (defun mime::preview/decode-content ()
948 (let ((pc (mime::point-preview-content (point))))
950 (let ((the-buf (current-buffer)))
951 (switch-to-buffer (mime::preview-content-info/buffer pc))
952 (mime::article/decode-content-region
953 (mime::preview-content-info/content-info pc))
954 (if (eq (current-buffer)
955 (mime::preview-content-info/buffer pc))
956 (switch-to-buffer the-buf)
960 (defun mime-viewer/play-content ()
962 (let ((mime-viewer/decoding-mode "play"))
963 (mime::preview/decode-content)
966 (defun mime-viewer/extract-content ()
968 (let ((mime-viewer/decoding-mode "extract"))
969 (mime::preview/decode-content)
972 (defun mime-viewer/print-content ()
974 (let ((mime-viewer/decoding-mode "print"))
975 (mime::preview/decode-content)
978 (defun mime-viewer/up-content ()
980 (let ((pc (mime::point-preview-content (point))) cinfo
981 (the-buf (current-buffer))
983 (switch-to-buffer (mime::preview-content-info/buffer pc))
984 (setq cinfo (mime::preview-content-info/content-info pc))
985 (setq cn (mime::get-point-content-number
986 (mime::content-info/point-min cinfo)))
988 (mime-viewer/quit the-buf
989 (mime::preview-content-info/buffer pc)
991 (setq r (mime::article/get-content-region (butlast cn)))
992 (switch-to-buffer the-buf)
994 (let ((rpcl mime::preview/content-list) cell)
996 (setq cell (car rpcl))
997 (if (eq r (mime::preview-content-info/content-info cell))
999 (goto-char (mime::preview-content-info/point-min cell))
1002 (setq rpcl (cdr rpcl))
1006 (defun mime-viewer/previous-content ()
1008 (let* ((pcl mime::preview/content-list)
1010 (i (- (length pcl) 1))
1014 (setq beg (mime::preview-content-info/point-min (nth i pcl)))
1016 (throw 'tag (goto-char beg))
1022 (defun mime-viewer/next-content ()
1024 (let ((pcl mime::preview/content-list)
1029 (setq beg (mime::preview-content-info/point-min (car pcl)))
1031 (throw 'tag (goto-char beg))
1033 (setq pcl (cdr pcl))
1037 (defun mime-viewer/scroll-up-content (&optional h)
1040 (setq h (- (window-height) 1))
1042 (let ((pcl mime::preview/content-list)
1048 (setq beg (mime::preview-content-info/point-min (car pcl)))
1052 (setq pcl (cdr pcl))
1060 (defun mime-viewer/scroll-down-content (&optional h)
1063 (setq h (- (window-height) 1))
1065 (let ((pcl mime::preview/content-list)
1069 (or (let ((i (- (length pcl) 1)))
1072 (setq beg (mime::preview-content-info/point-min
1080 (forward-line (- h))
1085 (defun mime-viewer/next-line-content ()
1087 (mime-viewer/scroll-up-content 1)
1090 (defun mime-viewer/previous-line-content ()
1092 (mime-viewer/scroll-down-content 1)
1095 (defun mime-viewer/quit (&optional the-buf buf)
1098 (setq the-buf (current-buffer))
1101 (setq buf (mime::preview-content-info/buffer
1102 (mime::point-preview-content (point))))
1105 (switch-to-buffer buf)
1106 (assoc major-mode mime-viewer/quitting-method-alist)
1110 (switch-to-buffer the-buf)
1115 (defun mime-viewer/kill-buffer ()
1117 (kill-buffer (current-buffer))
1120 (fset 'mime/view-mode 'mime/viewer-mode)
1122 (run-hooks 'tm-view-load-hook)