(eword-decode-header): New implementation; add new argument
[elisp/semi.git] / mime-edit.el
index 243c1dd..439707a 100644 (file)
@@ -7,7 +7,7 @@
 ;; Maintainer: MORIOKA Tomohiko <morioka@jaist.ac.jp>
 ;; Created: 1994/08/21 renamed from mime.el
 ;;     Renamed: 1997/2/21 from tm-edit.el
-;; Version: $Revision: 0.90 $
+;; Version: $Revision: 0.100 $
 ;; Keywords: MIME, multimedia, multilingual, mail, news
 
 ;; This file is part of SEMI (SEMI is Emacs MIME Interfaces).
@@ -92,7 +92,7 @@
 ;;
 ;; This is a conventional plain text.  It should be translated into
 ;; text/plain.
-;; 
+;;
 ;;--[[text/plain]]
 ;; This is also a plain text.  But, it is explicitly specified as is.
 ;;--[[text/plain; charset=ISO-8859-1]]
 ;;;
 
 (defconst mime-edit-RCS-ID
-  "$Id: mime-edit.el,v 0.90 1997-09-18 02:56:12 morioka Exp $")
+  "$Id: mime-edit.el,v 0.100 1998-02-06 00:39:23 morioka Exp $")
 
 (defconst mime-edit-version `,(get-version-string mime-edit-RCS-ID))
 
 ;;; @ variables
 ;;;
 
-(defvar mime-ignore-preceding-spaces nil
-  "*Ignore preceding white spaces if non-nil.")
+(defgroup mime-edit nil
+  "MIME edit mode"
+  :group 'mime)
+
+(defcustom mime-ignore-preceding-spaces nil
+  "*Ignore preceding white spaces if non-nil."
+  :group 'mime-edit
+  :type 'boolean)
 
-(defvar mime-ignore-trailing-spaces nil
-  "*Ignore trailing white spaces if non-nil.")
+(defcustom mime-ignore-trailing-spaces nil
+  "*Ignore trailing white spaces if non-nil."
+  :group 'mime-edit
+  :type 'boolean)
 
-(defvar mime-ignore-same-text-tag t
+(defcustom mime-ignore-same-text-tag t
   "*Ignore preceding text content-type tag that is same with new one.
-If non-nil, the text tag is not inserted unless something different.")
+If non-nil, the text tag is not inserted unless something different."
+  :group 'mime-edit
+  :type 'boolean)
 
-(defvar mime-auto-hide-body t
-  "*Hide non-textual body encoded in base64 after insertion if non-nil.")
+(defcustom mime-auto-hide-body t
+  "*Hide non-textual body encoded in base64 after insertion if non-nil."
+  :group 'mime-edit
+  :type 'boolean)
 
-(defvar mime-edit-voice-recorder
+(defcustom mime-edit-voice-recorder
   (function mime-edit-voice-recorder-for-sun)
-  "*Function to record a voice message and encode it.")
+  "*Function to record a voice message and encode it."
+  :group 'mime-edit
+  :type 'function)
 
-(defvar mime-edit-mode-hook nil
-  "*Hook called when enter MIME mode.")
+(defcustom mime-edit-mode-hook nil
+  "*Hook called when enter MIME mode."
+  :group 'mime-edit
+  :type 'hook)
 
-(defvar mime-edit-translate-hook nil
+(defcustom mime-edit-translate-hook nil
   "*Hook called before translating into a MIME compliant message.
 To insert a signature file automatically, call the function
-`mime-edit-insert-signature' from this hook.")
+`mime-edit-insert-signature' from this hook."
+  :group 'mime-edit
+  :type 'hook)
 
-(defvar mime-edit-exit-hook nil
-  "*Hook called when exit MIME mode.")
+(defcustom mime-edit-exit-hook nil
+  "*Hook called when exit MIME mode."
+  :group 'mime-edit
+  :type 'hook)
 
 (defvar mime-content-types
   '(("text"
@@ -438,17 +458,23 @@ Each elements are regexp of field-name.")
 ;;; @@ about message splitting
 ;;;
 
-(defvar mime-edit-split-message t
-  "*Split large message if it is non-nil.")
+(defcustom mime-edit-split-message t
+  "*Split large message if it is non-nil."
+  :group 'mime-edit
+  :type 'boolean)
 
-(defvar mime-edit-message-default-max-lines 1000
-  "*Default maximum lines of a message.")
+(defcustom mime-edit-message-default-max-lines 1000
+  "*Default maximum lines of a message."
+  :group 'mime-edit
+  :type 'integer)
 
-(defvar mime-edit-message-max-lines-alist
+(defcustom mime-edit-message-max-lines-alist
   '((news-reply-mode . 500))
   "Alist of major-mode vs maximum lines of a message.
 If it is not specified for a major-mode,
-`mime-edit-message-default-max-lines' is used.")
+`mime-edit-message-default-max-lines' is used."
+  :group 'mime-edit
+  :type 'list)
 
 (defconst mime-edit-split-ignored-field-regexp
   "\\(^Content-\\|^Subject:\\|^Mime-Version:\\)")
@@ -519,19 +545,25 @@ If it is not specified for a major-mode,
   "*If non-nil, insert X-Emacs header field.")
 
 (defvar mime-edit-x-emacs-value
-  (if running-xemacs
-      (concat emacs-version
-             (if (featurep 'mule)
-                 " with mule"
-               " without mule"))
+  (if (featurep 'xemacs)
+      (concat emacs-version (if (featurep 'mule)
+                               " with mule"
+                             " without mule"))
     (let ((ver (if (string-match "\\.[0-9]+$" emacs-version)
                   (substring emacs-version 0 (match-beginning 0))
                 emacs-version)))
       (if (featurep 'mule)
-         (if (featurep 'meadow)
-             (concat "Emacs " ver ", MULE " mule-version ", " (Meadow-version))
-           (concat "Emacs " ver ", MULE " mule-version))
-       ver))))
+         (concat "Emacs " ver
+                 (if enable-multibyte-characters
+                     (concat ", MULE " mule-version)
+                   " (with raw setting)")
+                 (if (featurep 'meadow)
+                     (concat ", " (Meadow-version))
+                   ))
+       ver)))
+  "Body of X-Emacs field.
+If variable `mime-edit-insert-x-emacs-field' is not nil, it is
+inserted into message header.")
 
 \f
 ;;; @ constants
@@ -663,7 +695,7 @@ Tspecials means any character that matches with it in header must be quoted.")
                                  ))
                               mime-edit-menu-list)))
                )))
-       
+
        ;; modified by Steven L. Baur <steve@miranova.com>
        ;;      1995/12/6 (c.f. [tm-en:209])
        (or (boundp 'mime-edit-popup-menu-for-xemacs)
@@ -863,20 +895,20 @@ User customizable variables (not documented all of them):
   (if mime-edit-mode-flag
       (error "You are already editing a MIME message.")
     (setq mime-edit-mode-flag t)
-    
+
     ;; Set transfer level into mode line
     ;;
     (setq mime-transfer-level-string
          (mime-encoding-name mime-transfer-level 'not-omit))
     (force-mode-line-update)
-    
+
     ;; Define menu for XEmacs.
     (if running-xemacs
        (mime-edit-define-menu-for-xemacs)
       )
-    
+
     (enable-invisible)
-    
+
     ;; I don't care about saving these.
     (setq paragraph-start
          (regexp-or mime-edit-single-part-tag-regexp
@@ -946,12 +978,12 @@ Charset is automatically obtained from the `charsets-mime-charset-alist'."
              (insert "\n")
              (forward-char -1)
              ))
-       (if (and (member (second ret) '("enriched" "richtext"))
+       (if (and (member (cadr ret) '("enriched" "richtext"))
                 (fboundp 'enriched-mode)
                 )
            (enriched-mode t)
          (if (boundp 'enriched-mode)
-             (enriched-mode nil)
+             (enriched-mode -1)
            ))))))
 
 (defun mime-edit-insert-file (file &optional verbose)
@@ -1171,7 +1203,7 @@ Optional argument ENCODING specifies an encoding method such as base64."
            (t
             (goto-char (point-max))
             ))
-      ;; Then search for the beginning. 
+      ;; Then search for the beginning.
       (re-search-backward mime-edit-end-tag-regexp nil t)
       (or (looking-at mime-edit-beginning-tag-regexp)
          ;; Restore previous point.
@@ -1989,18 +2021,19 @@ Content-Transfer-Encoding: 7bit
              (save-restriction
                (narrow-to-region beg (mime-edit-content-end))
                (goto-char beg)
-               (if (re-search-forward "^From " nil t)
-                   (unless encoding
-                     (if (memq charset '(iso-2022-jp
-                                         iso-2022-jp-2
-                                         iso-2022-int-1
-                                         x-ctext))
-                         (while (progn
-                                  (replace-match "\e(BFrom ")
-                                  (re-search-forward "^From " nil t)
-                                  ))
-                       (setq encoding "quoted-printable")
-                       ))))
+               (let (case-fold-search)
+                 (if (re-search-forward "^From " nil t)
+                     (unless encoding
+                       (if (memq charset '(iso-2022-jp
+                                           iso-2022-jp-2
+                                           iso-2022-int-1
+                                           x-ctext))
+                           (while (progn
+                                    (replace-match "\e(BFrom ")
+                                    (re-search-forward "^From " nil t)
+                                    ))
+                         (setq encoding "quoted-printable")
+                         )))))
              ;; canonicalize line break code
              (or (member encoding '(nil "7bit" "8bit" "quoted-printable"))
                  (save-restriction
@@ -2109,7 +2142,7 @@ and insert data encoded as ENCODING."
 ;;; @ multipart enclosure
 ;;;
 
-(defun mime-edit-enclose-region (type beg end)
+(defun mime-edit-enclose-region-internal (type beg end)
   (save-excursion
     (goto-char beg)
     (let ((current (point)))
@@ -2128,40 +2161,40 @@ and insert data encoded as ENCODING."
 
 (defun mime-edit-enclose-quote-region (beg end)
   (interactive "*r")
-  (mime-edit-enclose-region "quote" beg end)
+  (mime-edit-enclose-region-internal 'quote beg end)
   )
 
 (defun mime-edit-enclose-mixed-region (beg end)
   (interactive "*r")
-  (mime-edit-enclose-region "mixed" beg end)
+  (mime-edit-enclose-region-internal 'mixed beg end)
   )
 
 (defun mime-edit-enclose-parallel-region (beg end)
   (interactive "*r")
-  (mime-edit-enclose-region "parallel" beg end)
+  (mime-edit-enclose-region-internal 'parallel beg end)
   )
 
 (defun mime-edit-enclose-digest-region (beg end)
   (interactive "*r")
-  (mime-edit-enclose-region "digest" beg end)
+  (mime-edit-enclose-region-internal 'digest beg end)
   )
 
 (defun mime-edit-enclose-alternative-region (beg end)
   (interactive "*r")
-  (mime-edit-enclose-region "alternative" beg end)
+  (mime-edit-enclose-region-internal 'alternative beg end)
   )
 
 (defun mime-edit-enclose-signed-region (beg end)
   (interactive "*r")
   (if mime-edit-signing-type
-      (mime-edit-enclose-region "signed" beg end)
+      (mime-edit-enclose-region-internal 'signed beg end)
     (message "Please specify signing type.")
     ))
 
 (defun mime-edit-enclose-encrypted-region (beg end)
   (interactive "*r")
   (if mime-edit-signing-type
-      (mime-edit-enclose-region "encrypted" beg end)
+      (mime-edit-enclose-region-internal 'encrypted beg end)
     (message "Please specify encrypting type.")
     ))
 
@@ -2180,7 +2213,7 @@ and insert data encoded as ENCODING."
 (defun mime-edit-set-split (arg)
   (interactive
    (list
-    (y-or-n-p "Do you want to enable split?")
+    (y-or-n-p "Do you want to enable split? ")
     ))
   (setq mime-edit-split-message arg)
   (if arg
@@ -2225,7 +2258,7 @@ Optional TRANSFER-LEVEL is a number of transfer-level, 7 or 8."
 (defun mime-edit-set-sign (arg)
   (interactive
    (list
-    (y-or-n-p "Do you want to sign?")
+    (y-or-n-p "Do you want to sign? ")
     ))
   (if arg
       (if mime-edit-signing-type
@@ -2244,7 +2277,7 @@ Optional TRANSFER-LEVEL is a number of transfer-level, 7 or 8."
 (defun mime-edit-set-encrypt (arg)
   (interactive
    (list
-    (y-or-n-p "Do you want to encrypt?")
+    (y-or-n-p "Do you want to encrypt? ")
     ))
   (if arg
       (if mime-edit-encrypting-type
@@ -2306,7 +2339,7 @@ Content-Type: message/partial; id=%s; number=%d; total=%d\n%s\n"
            (or (cdr (assq major-mode mime-edit-message-max-lines-alist))
                mime-edit-message-default-max-lines))
       )
-  (let* ((mime-edit-draft-file-name 
+  (let* ((mime-edit-draft-file-name
          (or (buffer-file-name)
              (make-temp-name
               (expand-file-name "mime-draft" mime-temp-directory))))
@@ -2437,7 +2470,7 @@ Content-Type: message/partial; id=%s; number=%d; total=%d\n%s\n"
     (setq mail-header-separator separator)
     (make-local-variable 'mime-edit-buffer)
     (setq mime-edit-buffer the-buf)
-    
+
     (run-hooks 'mime-edit-translate-hook)
     (mime-edit-translate-buffer)
     (goto-char (point-min))