(semi-modules-to-compile): Add `mime-mac' if running with Mac OS X.
[elisp/semi.git] / mime-edit.el
index 13c0c84..9c42e2b 100644 (file)
@@ -24,8 +24,8 @@
 
 ;; You should have received a copy of the GNU General Public License
 ;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
 
 ;;; Commentary:
 
@@ -205,6 +205,7 @@ To insert a signature file automatically, call the function
      ("enriched")
      ("html")
      ("css") ; rfc2318
+     ("csv") ; rfc4180
      ("xml") ; rfc2376
      ("x-latex")
      ;; ("x-rot13-47-48")
@@ -234,23 +235,76 @@ To insert a signature file automatically, call the function
      ("news")
      )
     ("application"
+     ("javascript")
+     ("msword")
      ("octet-stream" ("type" "" "tar" "shar"))
      ("postscript")
+     ("pdf")
+     ("rtf")
+     ("zip")
+     ("x-shockwave-flash")
+     ("x-7z-compressed")
+
+                                        ; OpenOffice
+     ("vnd.oasis.opendocument.text")
+     ("vnd.oasis.opendocument.spreadsheet")
+     ("vnd.oasis.opendocument.graphics")
+     ("vnd.oasis.opendocument.chart")
+     ("vnd.oasis.opendocument.formula")
+     ("vnd.oasis.opendocument.text-master")
+     ("vnd.oasis.opendocument.presentation")
+     ("vnd.oasis.opendocument.text-template")
+     ("vnd.oasis.opendocument.spreadsheet-template")
+     ("vnd.oasis.opendocument.presentation-template")
+     ("vnd.oasis.opendocument.graphics-template")
+
+     ("msword")
+     ("vnd.ms-excel")
      ("vnd.ms-powerpoint")
+                                        ; Microsoft Office (OpenXML)
+     ("vnd.ms-excel.addin.macroEnabled.12")
+     ("vnd.ms-excel.sheet.binary.macroEnabled.12")
+     ("vnd.ms-excel.sheet.macroEnabled.12")
+     ("vnd.ms-excel.template.macroEnabled.12")
+     ("vnd.ms-powerpoint.addin.macroEnabled.12")
+     ("vnd.ms-powerpoint.presentation.macroEnabled.12")
+     ("vnd.ms-powerpoint.slideshow.macroEnabled.12")
+     ("vnd.ms-powerpoint.template.macroEnabled.12")
+     ("vnd.ms-word.document.macroEnabled.12")
+     ("vnd.ms-word.template.macroEnabled.12")
+     ("vnd.openxmlformats-officedocument.presentationml.presentation")
+     ("vnd.openxmlformats-officedocument.presentationml.slideshow")
+     ("vnd.openxmlformats-officedocument.presentationml.template")
+     ("vnd.openxmlformats-officedocument.spreadsheetml.sheet")
+     ("vnd.openxmlformats-officedocument.spreadsheetml.template")
+     ("vnd.openxmlformats-officedocument.wordprocessingml.document")
+     ("vnd.openxmlformats-officedocument.wordprocessingml.template")
+     ("vnd.ms-xpsdocument")
+                                        ; Microsoft Project
+     ("vnd.ms-project")
      ("x-kiss" ("x-cnf")))
     ("image"
+     ("bmp")
      ("gif")
      ("jpeg")
      ("png")
+     ("svg+xml")
      ("tiff")
      ("x-pic")
      ("x-mag")
      ("x-xwd")
-     ("x-xbm")
-     )
-    ("audio" ("basic"))
-    ("video" ("mpeg"))
-    )
+     ("x-xbm"))
+    ("audio"
+     ("basic")
+     ("mpeg")
+     ("ogg")
+     ("vorbis"))
+    ("video"
+     ("mpeg")
+     ("ogg")
+     ("mp4")
+     ("quicktime")
+     ("x-flv")))
   "*Alist of content-type, subtype, parameters and its values.")
 
 (defcustom mime-file-types
@@ -284,12 +338,30 @@ To insert a signature file automatically, call the function
 
     ;; Text or translated text
 
-    ("\\.txt$"
+    ("\\.txt$\\|\\.pln$"
      "text"    "plain"         nil
      nil
      "inline"          (("filename" . file))
      )
 
+    ("\\.css$"
+     "text"    "css"           nil
+     nil
+     "inline"          (("filename" . file))
+     )
+
+    ("\\.csv$"
+     "text"    "csv"           nil
+     nil
+     "inline"          (("filename" . file))
+     )
+
+    ("\\.tex$\\|\\.latex$"
+     "text"    "x-latex"       nil
+     nil
+     "inline"          (("filename" . file))
+     )
+
      ;; .rc : procmail modules pm-xxxx.rc
      ;; *rc : other resource files
 
@@ -314,27 +386,200 @@ To insert a signature file automatically, call the function
      "text"    "plain"         nil     nil     nil     nil)
 
 
-    ;;  Octect binary text
+    ("\\.js$"
+     "application"     "javascript" nil
+     nil
+     "inline"  (("filename" . file))
+     )
 
+    
+    ;; Microsoft Project
+    ("\\.mpp$"
+     "application" "vnd.ms-project" nil
+     "base64"
+     "attachment" (("filename" . file))
+     )
+    
+    
+    ;; Microsoft Office (none-OpenXML)
+    
+    ("\\.rtf$"                         ; Rich text format
+     "application" "rtf" nil
+     "base64"
+     "attachment" (("filename" . file))
+     )
     ("\\.doc$"                         ;MS Word
      "application" "msword" nil
      "base64"
      "attachment" (("filename" . file))
      )
+    ("\\.xls$"                         ; MS Excel
+     "application" "vnd.ms-excel" nil
+     "base64"
+     "attachment" (("filename" . file))
+     )
     ("\\.ppt$"                         ; MS Power Point
      "application" "vnd.ms-powerpoint" nil
      "base64"
      "attachment" (("filename" . file))
      )
 
-    ("\\.pln$"
-     "text"    "plain"         nil
-     nil
-     "inline"          (("filename" . file))
+    
+    ;; Microsoft Office (OpenXML)
+    
+                                        ; MS Word
+    ("\\.docm$"
+     "application" "vnd.ms-word.document.macroEnabled.12" nil
+     "base64"
+     "attachment" (("filename" . file))
+     )
+    ("\\.docx$"
+     "application" "vnd.openxmlformats-officedocument.wordprocessingml.document" nil
+     "base64"
+     "attachment" (("filename" . file))
+     )
+    ("\\.dotm$"
+     "application" "vnd.ms-word.template.macroEnabled.12" nil
+     "base64"
+     "attachment" (("filename" . file))
+     )
+    ("\\.dotx$"
+     "application" "vnd.openxmlformats-officedocument.wordprocessingml.template" nil
+     "base64"
+     "attachment" (("filename" . file))
+     )
+    
+                                        ; MS Power Point
+    ("\\.potm$"
+     "application" "vnd.ms-powerpoint.template.macroEnabled.12" nil
+     "base64"
+     "attachment" (("filename" . file))
+     )
+    ("\\.potx$"
+     "application" "vnd.openxmlformats-officedocument.presentationml.template" nil
+     "base64"
+     "attachment" (("filename" . file))
+     )
+    ("\\.ppam$"
+     "application" "vnd.ms-powerpoint.addin.macroEnabled.12" nil
+     "base64"
+     "attachment" (("filename" . file))
+     )
+    ("\\.ppsm$"
+     "application" "vnd.ms-powerpoint.slideshow.macroEnabled.12" nil
+     "base64"
+     "attachment" (("filename" . file))
+     )
+    ("\\.ppsx$"
+     "application" "vnd.openxmlformats-officedocument.presentationml.slideshow" nil
+     "base64"
+     "attachment" (("filename" . file))
+     )
+    ("\\.pptm$"
+     "application" "vnd.ms-powerpoint.presentation.macroEnabled.12" nil
+     "base64"
+     "attachment" (("filename" . file))
+     )
+    ("\\.pptx$"
+     "application" "vnd.openxmlformats-officedocument.presentationml.presentation" nil
+     "base64"
+     "attachment" (("filename" . file))
+     )
+    
+                                        ; MS Excel
+    ("\\.xlam$"
+     "application" "vnd.ms-excel.addin.macroEnabled.12" nil
+     "base64"
+     "attachment" (("filename" . file))
+     )
+    ("\\.xlsb$"
+     "application" "vnd.ms-excel.sheet.binary.macroEnabled.12" nil
+     "base64"
+     "attachment" (("filename" . file))
+     )
+    ("\\.xlsm$"
+     "application" "vnd.ms-excel.sheet.macroEnabled.12" nil
+     "base64"
+     "attachment" (("filename" . file))
+     )
+    ("\\.xlsx$"
+     "application" "vnd.openxmlformats-officedocument.spreadsheetml.sheet" nil
+     "base64"
+     "attachment" (("filename" . file))
+     )
+    ("\\.xltm$"
+     "application" "vnd.ms-excel.template.macroEnabled.12" nil
+     "base64"
+     "attachment" (("filename" . file))
+     )
+    ("\\.xltx$"
+     "application" "vnd.openxmlformats-officedocument.spreadsheetml.template" nil
+     "base64"
+     "attachment" (("filename" . file))
      )
+    
+    
+    ;; Open Office
+    ("\\.odt$"
+     "application" "vnd.oasis.opendocument.text" nil
+     "base64"
+     "attachment" (("filename" . file))
+     )
+    ("\\.ods$"
+     "application" "vnd.oasis.opendocument.spreadsheet" nil
+     "base64"
+     "attachment" (("filename" . file))
+     )
+    ("\\.odg$"
+     "application" "vnd.oasis.opendocument.graphics" nil
+     "base64"
+     "attachment" (("filename" . file))
+     )
+    ("\\.odf$"
+     "application" "vnd.oasis.opendocument.formula" nil
+     "base64"
+     "attachment" (("filename" . file))
+     )
+    ("\\.odm$"
+     "application" "vnd.oasis.opendocument.text-master" nil
+     "base64"
+     "attachment" (("filename" . file))
+     )
+    ("\\.odp$"
+     "application" "vnd.oasis.opendocument.presentation" nil
+     "base64"
+     "attachment" (("filename" . file))
+     )
+    ("\\.ott$"
+     "application" "vnd.oasis.opendocument.text-template" nil
+     "base64"
+     "attachment" (("filename" . file))
+     )
+    ("\\.ots$"
+     "application" "vnd.oasis.opendocument.spreadsheet-template" nil
+     "base64"
+     "attachment" (("filename" . file))
+     )
+    ("\\.otp$"
+     "application" "vnd.oasis.opendocument.presentation-template" nil
+     "base64"
+     "attachment" (("filename" . file))
+     )
+    ("\\.otg$"
+     "application" "vnd.oasis.opendocument.graphics-template" nil
+     "base64"
+     "attachment" (("filename" . file))
+     )
+    
+       ;; Postscript and PDF
     ("\\.ps$"
      "application" "postscript"        nil
-     "quoted-printable"
+     "base64"
+     "attachment"      (("filename" . file))
+     )
+    ("\\.pdf$"
+     "application" "pdf"       nil
+     "base64"
      "attachment"      (("filename" . file))
      )
 
@@ -355,6 +600,16 @@ To insert a signature file automatically, call the function
      "base64"
      "inline"          (("filename" . file))
      )
+    ("\\.bmp$"
+     "image"   "bmp"           nil
+     "base64"
+     "inline"          (("filename" . file))
+     )
+    ("\\.svg$"
+     "image"   "svg+xml"   nil
+     "base64"
+     "inline"          (("filename" . file))
+     )
     ("\\.tiff$"
      "image"   "tiff"          nil
      "base64"
@@ -380,16 +635,58 @@ To insert a signature file automatically, call the function
      "base64"
      "inline"          (("filename" . file))
      )
-    ("\\.au$"
+
+       ;; Audio and video
+
+    ("\\.au$\\|\\.snd$"
      "audio"   "basic"         nil
      "base64"
      "attachment"              (("filename" . file))
      )
-    ("\\.mpg$"
+    ("\\.mp[234]\\|\\.m4[abp]$"
+     "audio"   "mpeg"          nil
+     "base64"
+     "attachment"              (("filename" . file))
+     )
+    ("\\.ogg$"
+     "audio"   "ogg"           nil
+     "base64"
+     "attachment"              (("filename" . file))
+     )
+    ("\\.ogg$"
+     "audio"   "vorbis"                nil
+     "base64"
+     "attachment"              (("filename" . file))
+     )
+    ("\\.mpg\\|\\.mpeg$"
      "video"   "mpeg"          nil
      "base64"
      "attachment"      (("filename" . file))
      )
+    ("\\.mp4\\|\\.m4v$"
+     "video"   "mp4"           nil
+     "base64"
+     "attachment"      (("filename" . file))
+     )
+    ("\\.qt$\\|\\.mov$"
+     "video"   "quicktime"             nil
+     "base64"
+     "attachment"      (("filename" . file))
+     )
+    ("\\.flv$"
+     "video"   "x-flv"         nil
+     "base64"
+     "attachment"      (("filename" . file))
+     )
+    ("\\.swf$"
+     "application"     "x-shockwave-flash"             nil
+     "base64"
+     "attachment"      (("filename" . file))
+     )
+
+
+       ;; Compressed files
+
     ("\\.tar\\.gz$"
      "application" "octet-stream" (("type" . "tar+gzip"))
      "base64"
@@ -430,6 +727,11 @@ To insert a signature file automatically, call the function
      "base64"
      "attachment"      (("filename" . file))
      )
+    ("\\.7z$"
+     "application" "x-7z-compressed" nil
+     "base64"
+     "attachment"      (("filename" . file))
+     )
 
     ;; Rest
 
@@ -498,6 +800,7 @@ If encoding is nil, it is determined from its contents."
     (iso-8859-7                8 "quoted-printable")
     (iso-8859-8                8 "quoted-printable")
     (iso-8859-9                8 "quoted-printable")
+    (iso-8859-14       8 "quoted-printable")
     (iso-8859-15       8 "quoted-printable")
     (iso-2022-jp       7 "base64")
     (iso-2022-jp-3     7 "base64")
@@ -724,7 +1027,7 @@ Tspecials means any character that matches with it in header must be quoted.")
   (concat "MIME-Version:"
          (mime-encode-field-body
           (concat " 1.0 (split by " mime-edit-version ")\n")
-          "MIME-Version:"))
+          "MIME-Version"))
   "MIME version field for message/partial.")
 
 
@@ -1053,10 +1356,11 @@ User customizable variables (not documented all of them):
 
     (enable-invisible)
 
-    ;; I don't care about saving these.
+    (make-local-variable 'paragraph-start)
     (setq paragraph-start
          (regexp-or mime-edit-single-part-tag-regexp
                     paragraph-start))
+    (make-local-variable 'paragraph-separate)
     (setq paragraph-separate
          (regexp-or mime-edit-single-part-tag-regexp
                     paragraph-separate))
@@ -1142,13 +1446,10 @@ If optional argument SUBTYPE is not nil, text/SUBTYPE tag is inserted."
          (disposition-type (nth 4 guess))
          (disposition-params (nth 5 guess))
          )
-    (if verbose
-       (setq type    (mime-prompt-for-type type)
-             subtype (mime-prompt-for-subtype type subtype)
-             ))
     (if (or (interactive-p) verbose)
-       (setq encoding (mime-prompt-for-encoding encoding))
-      )
+       (setq type (mime-prompt-for-type type)
+             subtype (mime-prompt-for-subtype type subtype)
+             encoding (mime-prompt-for-encoding encoding)))
     (if (or (consp parameters) (stringp disposition-type))
        (let ((rest parameters) cell attribute value)
          (setq parameters "")
@@ -1719,6 +2020,7 @@ Parameter must be '(PROMPT CHOICE1 (CHOICE2...))."
                    )
                (delete-region beg end)
                (or (looking-at mime-edit-beginning-tag-regexp)
+                   (looking-at mime-edit-multipart-end-regexp)
                    (eobp)
                    (insert (concat (mime-make-text-tag) "\n"))
                    )))
@@ -1778,6 +2080,13 @@ Parameter must be '(PROMPT CHOICE1 (CHOICE2...))."
 
 (defvar mime-edit-pgp-user-id nil)
 
+(defun mime-edit-delete-trailing-whitespace ()
+  (save-match-data
+    (save-excursion
+      (goto-char (point-min))
+      (while (re-search-forward "[ \t]+$" nil t)
+       (delete-region (match-beginning 0) (match-end 0))))))
+
 (defun mime-edit-sign-pgp-mime (beg end boundary)
   (save-excursion
     (save-restriction
@@ -1789,6 +2098,7 @@ Parameter must be '(PROMPT CHOICE1 (CHOICE2...))."
             (encoding (nth 1 ret))
             (pgp-boundary (concat "pgp-sign-" boundary))
             micalg)
+       (mime-edit-delete-trailing-whitespace) ; RFC3156
        (goto-char beg)
        (insert (format "Content-Type: %s\n" ctype))
        (if encoding
@@ -1799,7 +2109,8 @@ Parameter must be '(PROMPT CHOICE1 (CHOICE2...))."
                   (or mime-edit-pgp-user-id
                       (if from 
                           (nth 1 (std11-extract-address-components from))
-                        pgg-default-user-id))))
+                        pgg-default-user-id)))
+                 (pgg-text-mode t))
              (pgg-sign-region (point-min)(point-max)))
            (throw 'mime-edit-error 'pgp-error)
            )
@@ -1890,7 +2201,8 @@ Content-Transfer-Encoding: 7bit
                     (or mime-edit-pgp-user-id
                         (if from 
                             (nth 1 (std11-extract-address-components from))
-                          pgg-default-user-id))))                   
+                          pgg-default-user-id)))
+                   (pgg-text-mode t))
                (pgg-encrypt-region 
                 (point-min) (point-max) 
                 (mapcar (lambda (recipient)
@@ -1909,6 +2221,7 @@ Content-Transfer-Encoding: 7bit
 --%s
 Content-Type: application/pgp-encrypted
 
+Version: 1
 --%s
 Content-Type: application/octet-stream
 Content-Transfer-Encoding: 7bit
@@ -2301,7 +2614,13 @@ Content-Description: S/MIME Encrypted Message][base64]]\n")
                    (narrow-to-region beg (mime-edit-content-end))
                    (goto-char beg)
                    (while (re-search-forward "\\(\\=\\|[^\r]\\)\n" nil t)
-                     (replace-match "\\1\r\n"))))
+                     ;; In a certain period, `replace-match' with "\\N"
+                     ;; converted 8-bit characters into multibyte string,
+                     ;; but it has been fixed at 2004-01-15.
+                     ;;(replace-match "\\1\r\n"))))
+                     (backward-char 1)
+                     (insert "\r")
+                     (forward-char 1))))
              (goto-char beg)
              (mime-encode-region beg (mime-edit-content-end)
                                  (or encoding "7bit"))
@@ -2558,11 +2877,11 @@ Optional TRANSFER-LEVEL is a number of transfer-level, 7 or 8."
            (setq mime-edit-pgp-processing 
                  (nconc mime-edit-pgp-processing 
                         (copy-sequence '(encrypt)))))
-       (message "This message will be encrypt.")
+       (message "This message will be encrypted.")
        )
     (setq mime-edit-pgp-processing
          (delq 'encrypt mime-edit-pgp-processing))
-    (message "This message will not be encrypt.")
+    (message "This message will not be encrypted.")
     ))
 
 (defun mime-edit-pgp-enclose-buffer ()
@@ -2572,20 +2891,13 @@ Optional TRANSFER-LEVEL is a number of transfer-level, 7 or 8."
                   (match-end 0)
                 )))
        )
-    (if beg
-       (dolist (pgp-processing mime-edit-pgp-processing)
-         (case pgp-processing
-           (sign
-            (mime-edit-enclose-pgp-signed-region 
-             beg (point-max))
-            )
-           (encrypt
-            (mime-edit-enclose-pgp-encrypted-region 
-             beg (point-max))
-            )))
+    (when beg
+      (if (memq 'sign mime-edit-pgp-processing)
+         (mime-edit-enclose-pgp-signed-region beg (point-max)))
+      (if (memq 'encrypt mime-edit-pgp-processing)
+         (mime-edit-enclose-pgp-encrypted-region beg (point-max)))
       )))
 
-
 ;;; @ split
 ;;;
 
@@ -2611,10 +2923,10 @@ 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* ((separator mail-header-separator)
-        (id (concat "\""
-                    (replace-space-with-underline (current-time-string))
-                    "@" (system-name) "\"")))
+  (let ((separator mail-header-separator)
+       (id (concat "\""
+                   (replace-space-with-underline (current-time-string))
+                   "@" (system-name) "\"")))
     (run-hooks 'mime-edit-before-split-hook)
     (let ((the-buf (current-buffer))
          (copy-buf (get-buffer-create " *Original Message*"))
@@ -2713,6 +3025,7 @@ Content-Type: message/partial; id=%s; number=%d; total=%d\n%s\n"
 ;;;
 
 (defvar mime-edit-buffer nil) ; buffer local variable
+(defvar mime-edit-temp-message-buffer nil) ; buffer local variable
 
 (defun mime-edit-preview-message ()
   "preview editing MIME message."