update.
[elisp/semi.git] / mime-edit.el
index 3d66be7..c4f69d2 100644 (file)
@@ -1,16 +1,15 @@
 ;;; mime-edit.el --- Simple MIME Composer for GNU Emacs
 
-;; Copyright (C) 1993,1994,1995,1996,1997 Free Software Foundation, Inc.
+;; Copyright (C) 1993,1994,1995,1996,1997,1998 Free Software Foundation, Inc.
 
 ;; Author: UMEDA Masanobu <umerin@mse.kyutech.ac.jp>
 ;;         MORIOKA Tomohiko <morioka@jaist.ac.jp>
 ;; 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.95 $
 ;; Keywords: MIME, multimedia, multilingual, mail, news
 
-;; This file is part of SEMI (SEMI is Emacs MIME Interfaces).
+;; This file is part of SEMI (Sophisticated Emacs MIME Interfaces).
 
 ;; This program is free software; you can redistribute it and/or
 ;; modify it under the terms of the GNU General Public License as
@@ -92,7 +91,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]]
 ;;; @ version
 ;;;
 
-(defconst mime-edit-RCS-ID
-  "$Id: mime-edit.el,v 0.95 1997-11-04 14:55:16 morioka Exp $")
-
-(defconst mime-edit-version `,(get-version-string mime-edit-RCS-ID))
-
-(defconst mime-edit-version-name
-  `,(concat "SEMI MIME-Edit " mime-edit-version
-           " - \"" semi-version-name "\""))
+(defconst mime-edit-version-string
+  `,(concat (car mime-module-version) " "
+           (mapconcat #'number-to-string (cddr mime-module-version) ".")
+           " - \"" (cadr mime-module-version) "\""))
 
 
 ;;; @ variables
@@ -242,8 +237,18 @@ To insert a signature file automatically, call the function
     )
   "*Alist of content-type, subtype, parameters and its values.")
 
-(defvar mime-file-types
-  '(("\\.rtf$"
+(defcustom mime-file-types
+  '(("\\.txt$"
+     "text"    "plain"         nil
+     nil
+     "inline"          (("filename" . file))
+     )
+    ("\\.pln$"
+     "text"    "plain"         nil
+     nil
+     "inline"          (("filename" . file))
+     )
+    ("\\.rtf$"
      "text"    "richtext"      nil
      nil
      nil               nil)
@@ -367,15 +372,56 @@ To insert a signature file automatically, call the function
      "attachment"      (("filename" . file))
      )
     ("\\.signature"
-     "text"    "plain"         nil     nil)
+     "text"    "plain"         nil     nil     nil     nil)
     (".*"
      "application" "octet-stream" nil
      nil
-     "attachment"      (("filename" . file))
-     )
+     "attachment"      (("filename" . file)))
     )
   "*Alist of file name, types, parameters, and default encoding.
-If encoding is nil, it is determined from its contents.")
+If encoding is nil, it is determined from its contents."
+  :type `(repeat
+         (list regexp
+               ;; primary-type
+               (choice :tag "Primary-Type"
+                       ,@(nconc (mapcar (lambda (cell)
+                                          (list 'item (car cell))
+                                          )
+                                        mime-content-types)
+                                '(string)))
+               ;; subtype
+               (choice :tag "Sub-Type"
+                       ,@(nconc
+                          (apply #'nconc
+                                 (mapcar (lambda (cell)
+                                           (mapcar (lambda (cell)
+                                                     (list 'item (car cell))
+                                                     )
+                                                   (cdr cell)))
+                                         mime-content-types))
+                          '(string)))
+               ;; parameters
+               (repeat :tag "Parameters of Content-Type field"
+                       (cons string (choice string symbol)))
+               ;; content-transfer-encoding
+               (choice :tag "Encoding"
+                       ,@(cons
+                          '(const nil)
+                          (mapcar (lambda (cell)
+                                    (list 'item (car cell))
+                                    )
+                                  mime-file-encoding-method-alist)))
+               ;; disposition-type
+               (choice :tag "Disposition-Type"
+                       (item nil)
+                       (item "inline")
+                       (item "attachment")
+                       string)
+               ;; parameters
+               (repeat :tag "Parameters of Content-Disposition field"
+                       (cons string (choice string symbol)))
+               ))
+  :group 'mime-edit)
 
 
 ;;; @@ about charset, encoding and transfer-level
@@ -574,11 +620,11 @@ inserted into message header.")
 Tspecials means any character that matches with it in header must be quoted.")
 
 (defconst mime-edit-mime-version-value
-  (concat "1.0 (generated by " mime-edit-version-name ")")
+  (concat "1.0 (generated by " mime-edit-version-string ")")
   "MIME version number.")
 
 (defconst mime-edit-mime-version-field-for-message/partial
-  (concat "MIME-Version: 1.0 (split by " mime-edit-version-name ")\n")
+  (concat "MIME-Version: 1.0 (split by " mime-edit-version-string ")\n")
   "MIME version field for message/partial.")
 
 
@@ -695,7 +741,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)
@@ -895,20 +941,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
@@ -965,26 +1011,27 @@ just return to previous mode."
     (princ (documentation 'mime-edit-mode))
     (print-help-return-message)))
 
-(defun mime-edit-insert-text ()
+(defun mime-edit-insert-text (&optional subtype)
   "Insert a text message.
-Charset is automatically obtained from the `charsets-mime-charset-alist'."
+Charset is automatically obtained from the `charsets-mime-charset-alist'.
+If optional argument SUBTYPE is not nil, text/SUBTYPE tag is inserted."
   (interactive)
-  (let ((ret (mime-edit-insert-tag "text" nil nil)))
-  (if ret
-      (progn
-       (if (looking-at mime-edit-single-part-tag-regexp)
-           (progn
-             ;; Make a space between the following message.
-             (insert "\n")
-             (forward-char -1)
-             ))
-       (if (and (member (cadr ret) '("enriched" "richtext"))
-                (fboundp 'enriched-mode)
-                )
-           (enriched-mode t)
-         (if (boundp 'enriched-mode)
-             (enriched-mode nil)
-           ))))))
+  (let ((ret (mime-edit-insert-tag "text" subtype nil)))
+    (when ret
+      (if (looking-at mime-edit-single-part-tag-regexp)
+         (progn
+           ;; Make a space between the following message.
+           (insert "\n")
+           (forward-char -1)
+           ))
+      (if (and (member (cadr ret) '("enriched" "richtext"))
+              (fboundp 'enriched-mode)
+              )
+         (enriched-mode t)
+       (if (boundp 'enriched-mode)
+           (enriched-mode -1)
+         ))
+      )))
 
 (defun mime-edit-insert-file (file &optional verbose)
   "Insert a message from a file."
@@ -1085,8 +1132,9 @@ Charset is automatically obtained from the `charsets-mime-charset-alist'."
   (let ((signature-insert-hook
          (function
           (lambda ()
-            (apply (function mime-edit-insert-tag)
-                   (mime-find-file-type signature-file-name))
+           (let ((items (mime-find-file-type signature-file-name)))
+             (apply (function mime-edit-insert-tag)
+                    (car items) (cadr items) (list (caddr items))))
             )))
         )
     (insert-signature arg)
@@ -1203,7 +1251,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.
@@ -2021,18 +2069,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
@@ -2141,7 +2190,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)))
@@ -2160,40 +2209,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.")
     ))
 
@@ -2212,7 +2261,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
@@ -2257,7 +2306,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
@@ -2276,7 +2325,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
@@ -2338,7 +2387,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))))
@@ -2469,7 +2518,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))
@@ -2484,17 +2533,16 @@ Content-Type: message/partial; id=%s; number=%d; total=%d\n%s\n"
   "Quitting method for mime-view."
   (let ((temp mime-raw-buffer)
        buf)
-    (mime-view-kill-buffer)
+    (mime-preview-kill-buffer)
     (set-buffer temp)
     (setq buf mime-edit-buffer)
     (kill-buffer temp)
     (switch-to-buffer buf)
     ))
 
-(set-alist 'mime-view-quitting-method-alist
+(set-alist 'mime-preview-quitting-method-alist
           'mime-temp-message-mode
-          (function mime-edit-quitting-method)
-          )
+          #'mime-edit-quitting-method)
 
 
 ;;; @ edit again