(What's EMH?): Modify for the new URLs of APEL, FLIM and SEMI.
[elisp/emh.git] / emh.el
diff --git a/emh.el b/emh.el
index c6187a8..05a9678 100644 (file)
--- a/emh.el
+++ b/emh.el
@@ -1,14 +1,13 @@
 ;;; emh.el --- MIME extender for mh-e
 
-;; Copyright (C) 1995,1996,1997 Free Software Foundation, Inc.
+;; Copyright (C) 1995,1996,1997,1998,2000 Free Software Foundation, Inc.
 
-;; Author: MORIOKA Tomohiko <morioka@jaist.ac.jp>
+;; Author: MORIOKA Tomohiko <tomo@m17n.org>
 ;;         OKABE Yasuo <okabe@kudpc.kyoto-u.ac.jp>
-;; Maintainer: MORIOKA Tomohiko <morioka@jaist.ac.jp>
+;; Maintainer: MORIOKA Tomohiko <tomo@m17n.org>
 ;; Created: 1993/11/21
 ;;     Renamed: 1993/11/27 from mh-e-mime.el
 ;;     Renamed: 1997/02/21 from tm-mh-e.el
-;; Version: $Revision: 0.21 $
 ;; Keywords: MH, MIME, multimedia, encoded-word, multilingual, mail
 
 ;; This file is part of emh.
 ;;; Code:
 
 (require 'mh-e)
+(require 'alist)
 (require 'mime-view)
 
 
 ;;; @ version
 ;;;
 
-(defconst emh-RCS-ID
-  "$Id: emh.el,v 0.21 1997-08-05 09:10:22 morioka Exp $")
-
-(defconst emh-version (get-version-string emh-RCS-ID))
+(defconst emh-version "1.14.1")
 
 
 ;;; @ variable
 ;;;
 
-(defvar emh-automatic-mime-preview t
-  "*If non-nil, show MIME processed message.")
-
-(defvar emh-decode-encoded-word t
-  "*If non-nil, decode encoded-word when it is not MIME preview mode.")
-
+(defgroup emh nil
+  "MIME Extension for mh-e"
+  :group 'mime
+  :group 'mh)
+
+(defcustom emh-automatic-mime-preview t
+  "*If non-nil, show MIME processed message."
+  :group 'emh
+  :type 'boolean)
+
+(defcustom emh-decode-encoded-word t
+  "*If non-nil, decode encoded-word when it is not MIME preview mode."
+  :group 'emh
+  :type 'boolean)
+
+(defcustom emh-icon-directory (if (fboundp 'locate-data-directory)
+                                 (locate-data-directory "emh")
+                               (let ((icons (expand-file-name 
+                                             "emh/icons/"
+                                             data-directory)))
+                                 (if (file-directory-p icons)
+                                     icons)))
+  "*Directory to load the icon files from, or nil if none."
+  :group 'emh
+  :type '(choice (const :tag "none" nil)
+                 string))
 
 ;;; @ functions
 ;;;
 
+(defsubst emh-raw-buffer (folder-buffer)
+  (concat "article-" (if (bufferp folder-buffer)
+                        (buffer-name folder-buffer)
+                      folder-buffer)))
+
 (defun mh-display-msg (msg-num folder &optional show-buffer mode)
   "Display message number MSG-NUM of FOLDER.
 This function uses `mime-view-mode' if MODE is not nil.  If MODE is
@@ -81,37 +103,27 @@ nil, `emh-automatic-mime-preview' is used as default value."
           (setq buffer-read-only nil)
           (erase-buffer)
           (if mode
-              (let* ((aname (concat "article-" folder))
-                     (abuf (get-buffer aname))
-                     )
+              (let* ((aname (emh-raw-buffer folder))
+                     (abuf (get-buffer aname)))
                 (if abuf
                     (progn
                       (set-buffer abuf)
                       (setq buffer-read-only nil)
-                      (erase-buffer)
-                      )
+                      (erase-buffer))
                   (setq abuf (get-buffer-create aname))
                   (set-buffer abuf)
-                  )
-                (as-binary-input-file
-                 (insert-file-contents msg-filename)
-                 ;; (goto-char (point-min))
-                 (while (re-search-forward "\r$" nil t)
-                   (replace-match "")
-                   )
-                 )
+                  (set-buffer-multibyte nil))
+                (8bit-insert-encoded-file msg-filename)
                 (set-buffer-modified-p nil)
                 (setq buffer-read-only t)
                 (setq buffer-file-name msg-filename)
                 (mh-show-mode)
-                (mime-view-mode nil nil nil
-                                aname (concat "show-" folder))
-                (goto-char (point-min))
-                )
+                (mime-display-message (mime-open-entity 'buffer aname)
+                                      (concat "show-" folder))
+                (goto-char (point-min)))
             (let ((clean-message-header mh-clean-message-header)
                   (invisible-headers mh-invisible-headers)
-                  (visible-headers mh-visible-headers)
-                  )
+                  (visible-headers mh-visible-headers))
               ;; 1995/9/21
               ;;   modified by ARIURA <ariura@cc.tuat.ac.jp>
               ;;   to support mhl.
@@ -131,8 +143,7 @@ nil, `emh-automatic-mime-preview' is used as default value."
                     (t
                      (mh-start-of-uncleaned-message)))
               (if emh-decode-encoded-word
-                  (eword-decode-header)
-                )
+                  (mime-decode-header-in-buffer))
               (set-buffer-modified-p nil)
               (setq buffer-read-only t)
               (setq buffer-file-name msg-filename)
@@ -174,13 +185,10 @@ With arg, turn MIME processing on if arg is positive."
        (if (null arg)
            (not emh-automatic-mime-preview)
          arg))
-  (save-excursion
-    (set-buffer mh-show-buffer)
-    (if (null emh-automatic-mime-preview)
-       (if (and mime-raw-buffer
-                (get-buffer mime-raw-buffer))
-           (kill-buffer mime-raw-buffer)
-         )))
+  (let ((raw-buffer (emh-raw-buffer (current-buffer))))
+    (if (get-buffer raw-buffer)
+       (kill-buffer raw-buffer)
+      ))
   (mh-invalidate-show-buffer)
   (mh-show (mh-get-msg-num t))
   )
@@ -194,7 +202,8 @@ With arg, turn MIME processing on if arg is positive."
 (defun emh-header-display ()
   (interactive)
   (mh-invalidate-show-buffer)
-  (let ((mime-view-ignored-field-regexp "^:$")
+  (let (mime-view-ignored-field-list
+       mime-view-visible-field-list
        emh-decode-encoded-word)
     (mh-header-display)
     ))
@@ -225,38 +234,25 @@ digest are inserted into the folder after that message."
 ;;; @ for mime-view
 ;;;
 
-(fset 'emh-text-decode-buffer
-      (symbol-function 'mime-text-decode-buffer))
-
-(set-alist 'mime-text-decoder-alist
-          'mh-show-mode
-          (function emh-text-decode-buffer))
-
-(defvar emh-content-header-filter-hook
-  (if window-system
-      '(emh-highlight-header)
-    )
+(defvar emh-display-header-hook (if window-system '(emh-highlight-header))
   "Hook for header filtering.")
 
 (autoload 'emh-highlight-header "emh-face")
 
-(defun emh-content-header-filter ()
-  "Header filter for mime-view.
-It is registered to variable `mime-view-content-header-filter-alist'."
-  (goto-char (point-min))
-  (mime-view-cut-header)
-  (emh-text-decode-buffer default-mime-charset)
-  (eword-decode-header)
-  (run-hooks 'emh-content-header-filter-hook)
+(defun emh-header-presentation-method (entity situation)
+  (mime-insert-header entity
+                     mime-view-ignored-field-list
+                     mime-view-visible-field-list)
+  (run-hooks 'emh-display-header-hook)
   )
 
-(set-alist 'mime-view-content-header-filter-alist
-          'mh-show-mode
-          (function emh-content-header-filter))
+(set-alist 'mime-header-presentation-method-alist
+          'mh-show-mode #'emh-header-presentation-method)
+
 
 (defun emh-quitting-method ()
   (let ((buf (current-buffer)))
-    (mime-hide-echo-buffer)
+    (mime-maybe-hide-echo-buffer)
     (pop-to-buffer
      (let ((name (buffer-name buf)))
        (substring name 5)
@@ -267,12 +263,9 @@ It is registered to variable `mime-view-content-header-filter-alist'."
     (mh-show (mh-get-msg-num t))
     ))
 
-(set-alist 'mime-view-quitting-method-alist
-          'mh-show-mode
-          (function emh-quitting-method))
-(set-alist 'mime-view-show-summary-method
-          'mh-show-mode
-          (function emh-quitting-method))
+(set-alist 'mime-preview-quitting-method-alist
+          'mh-show-mode #'emh-quitting-method)
+
 
 (defun emh-following-method (buf)
   (save-excursion
@@ -288,40 +281,44 @@ It is registered to variable `mime-view-content-header-filter-alist'."
       (goto-char last)
       )))
 
-(set-alist 'mime-view-following-method-alist
-          'mh-show-mode
-          (function emh-following-method))
+(set-alist 'mime-preview-following-method-alist
+          'mh-show-mode #'emh-following-method)
 
 
 ;;; @@ for mime-partial
 ;;;
 
-(eval-after-load
-    "mime-view"
-  '(progn
-     (autoload 'mime-combine-message/partials-automatically
-       "mime-partial"
-       "Internal method to combine message/partial messages automatically.")
-     (set-atype 'mime-acting-condition
-               '((type . "message/partial")
-                 (method . mime-combine-message/partials-automatically)
-                 (major-mode . mh-show-mode)
-                 (summary-buffer-exp
-                  . (and (or (string-match "^article-\\(.+\\)$"
-                                           article-buffer)
-                             (string-match "^show-\\(.+\\)$" article-buffer))
-                         (substring article-buffer
-                                    (match-beginning 1) (match-end 1))
-                         ))
-                 ))
-     (set-alist 'mime-view-partial-message-method-alist
-               'mh-show-mode
-               (function
-                (lambda ()
-                  (let ((emh-automatic-mime-preview t))
-                    (emh-show)
-                    ))))
-     ))
+(defun emh-request-partial-message ()
+  (let ((msg-filename (mh-msg-filename (mh-get-msg-num t)))
+       (show-buffer mh-show-buffer)
+       (coding-system-for-read 'raw-text))
+    (set-buffer (get-buffer-create " *Partial Article*"))
+    (erase-buffer)
+    (setq mime-preview-buffer show-buffer)
+    (insert-file-contents msg-filename)
+    (mime-parse-buffer)
+    ))
+
+(defun emh-get-folder-buffer ()
+  (let ((buffer-name (buffer-name (current-buffer))))
+    (and (or (string-match "^article-\\(.+\\)$" buffer-name)
+            (string-match "^show-\\(.+\\)$" buffer-name))
+        (substring buffer-name
+                   (match-beginning 1) (match-end 1))
+        )))
+
+(autoload 'mime-combine-message/partial-pieces-automatically
+  "mime-partial"
+  "Internal method to combine message/partial messages automatically.")
+
+(mime-add-condition
+ 'action
+ '((type . message)(subtype . partial)
+   (major-mode . mh-show-mode)
+   (method . mime-combine-message/partial-pieces-automatically)
+   (summary-buffer-exp . (emh-get-folder-buffer))
+   (request-partial-message-method . emh-request-partial-message)
+   ))
 
 
 ;;; @ set up
@@ -340,8 +337,8 @@ It is registered to variable `mime-view-content-header-filter-alist'."
     (if buf
        (let ((the-buf (current-buffer)))
          (switch-to-buffer buf)
-         (if (and mime-view-buffer
-                  (setq buf (get-buffer mime-view-buffer))
+         (if (and mime-preview-buffer
+                  (setq buf (get-buffer mime-preview-buffer))
                   )
              (progn
                (switch-to-buffer the-buf)
@@ -359,6 +356,12 @@ It is registered to variable `mime-view-content-header-filter-alist'."
 
 (eval-after-load "bbdb" '(require 'mime-bbdb))
 
+;;; @ Toolbar
+
+(if (and (not (featurep 'xemacs))
+        (boundp 'emacs-major-version)
+        (>= emacs-major-version 21))
+    (require 'emh-e21))
 
 ;;; @ end
 ;;;