X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=mime-edit.el;h=1aa3c2f558d7a10dbdf0e80ee4c8c0b807270099;hb=25f1c1069ac400f71152d3ea6bc3ed53ed703d22;hp=43b7e27b9a5b525a3321a19039d6cbced5b18be5;hpb=359afa10ca36fb648d7410f8e05f84774d1888f0;p=elisp%2Fsemi.git diff --git a/mime-edit.el b/mime-edit.el index 43b7e27..1aa3c2f 100644 --- a/mime-edit.el +++ b/mime-edit.el @@ -112,7 +112,6 @@ (require 'mail-utils) (require 'mel) (require 'mime-view) -(require 'eword-encode) (require 'signature) (require 'alist) @@ -121,9 +120,10 @@ ;;; (defconst mime-edit-version-string - `,(concat "SEMI " - (mapconcat #'number-to-string (cdr semi-version) ".") - " - \"" (car semi-version) "\"")) + `,(concat (car mime-user-interface-version) " " + (mapconcat #'number-to-string + (cddr mime-user-interface-version) ".") + " - \"" (cadr mime-user-interface-version) "\"")) ;;; @ variables @@ -184,18 +184,11 @@ To insert a signature file automatically, call the function ("plain" ;;("charset" "" "ISO-2022-JP" "US-ASCII" "ISO-8859-1" "ISO-8859-8") ) - ("richtext" - ;;("charset" "" "ISO-2022-JP" "US-ASCII" "ISO-8859-1" "ISO-8859-8") - ) - ("enriched" - ;;("charset" "" "ISO-2022-JP" "US-ASCII" "ISO-8859-1" "ISO-8859-8") - ) - ("x-latex" - ;;("charset" "" "ISO-2022-JP" "US-ASCII" "ISO-8859-1" "ISO-8859-8") - ) - ("html" - ;;("charset" "" "ISO-2022-JP" "US-ASCII" "ISO-8859-1" "ISO-8859-8") - ) + ("enriched") + ("html") + ("css") ; rfc2318 + ("xml") ; rfc2376 + ("x-latex") ("x-rot13-47-48") ) ("message" @@ -214,9 +207,13 @@ To insert a signature file automatically, call the function ("tftp" ("site") ("name")) ("afs" ("site") ("name")) ("local-file" ("site") ("name")) - ("mail-server" ("server" "ftpmail@nic.karrn.ad.jp")) + ("mail-server" + ("server" "ftpmail@nic.karrn.ad.jp") + ("subject")) + ("url" ("url")) )) ("rfc822") + ("news") ) ("application" ("octet-stream" ("type" "" "tar" "shar")) @@ -237,11 +234,17 @@ To insert a signature file automatically, call the function ) "*Alist of content-type, subtype, parameters and its values.") -(defvar mime-file-types - '(("\\.rtf$" - "text" "richtext" nil +(defcustom mime-file-types + '(("\\.txt$" + "text" "plain" nil nil - nil nil) + "inline" (("filename" . file)) + ) + ("\\.pln$" + "text" "plain" nil + nil + "inline" (("filename" . file)) + ) ("\\.html$" "text" "html" nil nil @@ -362,15 +365,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 @@ -390,10 +434,11 @@ If encoding is nil, it is determined from its contents.") (iso-2022-jp 7 "base64") (iso-2022-kr 7 "base64") (euc-kr 8 "base64") - (cn-gb2312 8 "quoted-printable") + (cn-gb2312 8 "base64") + (gb2312 8 "base64") (cn-big5 8 "base64") - (gb2312 8 "quoted-printable") (big5 8 "base64") + (shift_jis 8 "base64") (iso-2022-jp-2 7 "base64") (iso-2022-int-1 7 "base64") )) @@ -413,23 +458,6 @@ If encoding is nil, it is determined from its contents.") "A string formatted version of mime-transfer-level") (make-variable-buffer-local 'mime-transfer-level-string) -(defun mime-make-charset-default-encoding-alist (transfer-level) - (mapcar (function - (lambda (charset-type) - (let ((charset (car charset-type)) - (type (nth 1 charset-type)) - (encoding (nth 2 charset-type)) - ) - (if (<= type transfer-level) - (cons charset (mime-encoding-name type)) - (cons charset encoding) - )))) - mime-charset-type-list)) - -(defvar mime-edit-charset-default-encoding-alist - (mime-make-charset-default-encoding-alist mime-transfer-level)) -(make-variable-buffer-local 'mime-edit-charset-default-encoding-alist) - ;;; @@ about message inserting ;;; @@ -472,26 +500,19 @@ If it is not specified for a major-mode, :type 'list) (defconst mime-edit-split-ignored-field-regexp - "\\(^Content-\\|^Subject:\\|^Mime-Version:\\)") + "\\(^Content-\\|^Subject:\\|^Mime-Version:\\|Message-Id:\\)") -(defvar mime-edit-split-blind-field-regexp - "\\(^[BDFbdf]cc:\\|^cc:[ \t]*$\\)") +(defcustom mime-edit-split-blind-field-regexp + "\\(^[BDFbdf]cc:\\|^cc:[ \t]*$\\)" + "*Regular expression to match field-name to be ignored when split sending." + :group 'mime-edit + :type 'regexp) (defvar mime-edit-split-message-sender-alist nil) (defvar mime-edit-news-reply-mode-server-running nil) -;;; @@ about PGP -;;; - -(defvar mime-edit-signing-type 'pgp-elkins - "*PGP signing type (pgp-elkins, pgp-kazu or nil).") - -(defvar mime-edit-encrypting-type 'pgp-elkins - "*PGP encrypting type (pgp-elkins, pgp-kazu or nil).") - - ;;; @@ about tag ;;; @@ -536,28 +557,54 @@ If it is not specified for a major-mode, ;;; @@ optional header fields ;;; -(defvar mime-edit-insert-x-emacs-field t - "*If non-nil, insert X-Emacs header field.") - -(defvar mime-edit-x-emacs-value - (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) - (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 +(defvar mime-edit-insert-user-agent-field t + "*If non-nil, insert User-Agent header field.") + +(defvar mime-edit-user-agent-value + (concat (car mime-user-interface-version) + "/" + (mapconcat #'number-to-string + (cddr mime-user-interface-version) ".") + " (" + (cadr mime-user-interface-version) + ") " + (car mime-library-version) + "/" + (mapconcat #'number-to-string + (cddr mime-library-version) ".") + " (" + (cadr mime-library-version) + ") " + (if (featurep 'xemacs) + (concat "XEmacs" + (if (string-match "\\s +\\\"" emacs-version) + (concat "/" + (substring emacs-version 0 + (match-beginning 0)) + " (" xemacs-codename ")") + " (" emacs-version ")") + (if (featurep 'mule) " MULE")) + (let ((ver (if (string-match "\\.[0-9]+$" emacs-version) + (substring emacs-version 0 (match-beginning 0)) + emacs-version))) + (if (featurep 'mule) + (if (boundp 'enable-multibyte-characters) + (concat "Emacs/" ver + (if enable-multibyte-characters + (concat " MULE/" mule-version) + " (with unibyte mode)") + (if (featurep 'meadow) + (let ((mver (Meadow-version))) + (if (string-match "^Meadow-" mver) + (concat " Meadow/" + (substring mver + (match-end 0))) + )))) + (concat "MULE/" mule-version + " (based on Emacs " ver ")")) + ver)))) + "Body of User-Agent field. +If variable `mime-edit-insert-user-agent-field' is not nil, it is inserted into message header.") @@ -583,65 +630,59 @@ Tspecials means any character that matches with it in header must be quoted.") (defvar mime-edit-mode-flag nil) (make-variable-buffer-local 'mime-edit-mode-flag) +(defvar mime-edit-mode-entity-prefix "\C-c\C-x" + "Keymap prefix for MIME-Edit mode commands to insert entity or set status.") +(defvar mime-edit-mode-entity-map (make-sparse-keymap) + "Keymap for MIME-Edit mode commands to insert entity or set status.") + +(define-key mime-edit-mode-entity-map "\C-t" 'mime-edit-insert-text) +(define-key mime-edit-mode-entity-map "\C-i" 'mime-edit-insert-file) +(define-key mime-edit-mode-entity-map "\C-e" 'mime-edit-insert-external) +(define-key mime-edit-mode-entity-map "\C-v" 'mime-edit-insert-voice) +(define-key mime-edit-mode-entity-map "\C-y" 'mime-edit-insert-message) +(define-key mime-edit-mode-entity-map "\C-m" 'mime-edit-insert-mail) +(define-key mime-edit-mode-entity-map "\C-w" 'mime-edit-insert-signature) +(define-key mime-edit-mode-entity-map "\C-s" 'mime-edit-insert-signature) +(define-key mime-edit-mode-entity-map "\C-k" 'mime-edit-insert-key) +(define-key mime-edit-mode-entity-map "t" 'mime-edit-insert-tag) + +(define-key mime-edit-mode-entity-map "7" 'mime-edit-set-transfer-level-7bit) +(define-key mime-edit-mode-entity-map "8" 'mime-edit-set-transfer-level-8bit) +(define-key mime-edit-mode-entity-map "/" 'mime-edit-set-split) +(define-key mime-edit-mode-entity-map "s" 'mime-edit-set-sign) +(define-key mime-edit-mode-entity-map "v" 'mime-edit-set-sign) +(define-key mime-edit-mode-entity-map "e" 'mime-edit-set-encrypt) +(define-key mime-edit-mode-entity-map "h" 'mime-edit-set-encrypt) +(define-key mime-edit-mode-entity-map "p" 'mime-edit-preview-message) +(define-key mime-edit-mode-entity-map "\C-z" 'mime-edit-exit) +(define-key mime-edit-mode-entity-map "?" 'mime-edit-help) + +(defvar mime-edit-mode-enclosure-prefix "\C-c\C-m" + "Keymap prefix for MIME-Edit mode commands about enclosure.") +(defvar mime-edit-mode-enclosure-map (make-sparse-keymap) + "Keymap for MIME-Edit mode commands about enclosure.") + +(define-key mime-edit-mode-enclosure-map + "\C-a" 'mime-edit-enclose-alternative-region) +(define-key mime-edit-mode-enclosure-map + "\C-p" 'mime-edit-enclose-parallel-region) +(define-key mime-edit-mode-enclosure-map + "\C-m" 'mime-edit-enclose-mixed-region) +(define-key mime-edit-mode-enclosure-map + "\C-d" 'mime-edit-enclose-digest-region) +(define-key mime-edit-mode-enclosure-map + "\C-s" 'mime-edit-enclose-pgp-signed-region) +(define-key mime-edit-mode-enclosure-map + "\C-e" 'mime-edit-enclose-pgp-encrypted-region) +(define-key mime-edit-mode-enclosure-map + "\C-q" 'mime-edit-enclose-quote-region) + (defvar mime-edit-mode-map (make-sparse-keymap) "Keymap for MIME-Edit mode commands.") - -(define-key mime-edit-mode-map - "\C-c\C-x\C-t" 'mime-edit-insert-text) -(define-key mime-edit-mode-map - "\C-c\C-x\C-i" 'mime-edit-insert-file) (define-key mime-edit-mode-map - "\C-c\C-x\C-e" 'mime-edit-insert-external) + mime-edit-mode-entity-prefix mime-edit-mode-entity-map) (define-key mime-edit-mode-map - "\C-c\C-x\C-v" 'mime-edit-insert-voice) -(define-key mime-edit-mode-map - "\C-c\C-x\C-y" 'mime-edit-insert-message) -(define-key mime-edit-mode-map - "\C-c\C-x\C-m" 'mime-edit-insert-mail) -(define-key mime-edit-mode-map - "\C-c\C-x\C-w" 'mime-edit-insert-signature) -(define-key mime-edit-mode-map - "\C-c\C-x\C-s" 'mime-edit-insert-signature) -(define-key mime-edit-mode-map - "\C-c\C-x\C-k" 'mime-edit-insert-key) -(define-key mime-edit-mode-map - "\C-c\C-xt" 'mime-edit-insert-tag) - -(define-key mime-edit-mode-map - "\C-c\C-m\C-a" 'mime-edit-enclose-alternative-region) -(define-key mime-edit-mode-map - "\C-c\C-m\C-p" 'mime-edit-enclose-parallel-region) -(define-key mime-edit-mode-map - "\C-c\C-m\C-m" 'mime-edit-enclose-mixed-region) -(define-key mime-edit-mode-map - "\C-c\C-m\C-d" 'mime-edit-enclose-digest-region) -(define-key mime-edit-mode-map - "\C-c\C-m\C-s" 'mime-edit-enclose-signed-region) -(define-key mime-edit-mode-map - "\C-c\C-m\C-e" 'mime-edit-enclose-encrypted-region) -(define-key mime-edit-mode-map - "\C-c\C-m\C-q" 'mime-edit-enclose-quote-region) - -(define-key mime-edit-mode-map - "\C-c\C-x7" 'mime-edit-set-transfer-level-7bit) -(define-key mime-edit-mode-map - "\C-c\C-x8" 'mime-edit-set-transfer-level-8bit) -(define-key mime-edit-mode-map - "\C-c\C-x/" 'mime-edit-set-split) -(define-key mime-edit-mode-map - "\C-c\C-xs" 'mime-edit-set-sign) -(define-key mime-edit-mode-map - "\C-c\C-xv" 'mime-edit-set-sign) -(define-key mime-edit-mode-map - "\C-c\C-xe" 'mime-edit-set-encrypt) -(define-key mime-edit-mode-map - "\C-c\C-xh" 'mime-edit-set-encrypt) -(define-key mime-edit-mode-map - "\C-c\C-x\C-p" 'mime-edit-preview-message) -(define-key mime-edit-mode-map - "\C-c\C-x\C-z" 'mime-edit-exit) -(define-key mime-edit-mode-map - "\C-c\C-x?" 'mime-edit-help) + mime-edit-mode-enclosure-prefix mime-edit-mode-enclosure-map) (defconst mime-edit-menu-title "MIME-Edit") @@ -660,8 +701,8 @@ Tspecials means any character that matches with it in header must be quoted.") (parallel "Enclose as parallel" mime-edit-enclose-parallel-region) (mixed "Enclose as serial" mime-edit-enclose-mixed-region) (digest "Enclose as digest" mime-edit-enclose-digest-region) - (signed "Enclose as signed" mime-edit-enclose-signed-region) - (encrypted "Enclose as encrypted" mime-edit-enclose-encrypted-region) + (signed "Enclose as signed" mime-edit-enclose-pgp-signed-region) + (encrypted "Enclose as encrypted" mime-edit-enclose-pgp-encrypted-region) (quote "Verbatim region" mime-edit-enclose-quote-region) (key "Insert Public Key" mime-edit-insert-key) (split "About split" mime-edit-set-split) @@ -676,7 +717,7 @@ Tspecials means any character that matches with it in header must be quoted.") ;; modified by Pekka Marjola ;; 1995/9/5 (c.f. [tm-en:69]) (defun mime-edit-define-menu-for-xemacs () - "Define menu for Emacs 19." + "Define menu for XEmacs." (cond ((featurep 'menubar) (make-local-variable 'current-menubar) (set-buffer-menubar current-menubar) @@ -722,6 +763,8 @@ Tspecials means any character that matches with it in header must be quoted.") ;;; @ functions ;;; +(defvar mime-edit-touched-flag nil) + ;;;###autoload (defun mime-edit-mode () "MIME minor mode for editing the tagged MIME message. @@ -777,24 +820,27 @@ Following commands are available in addition to major mode commands: \\[mime-edit-insert-tag] insert a new MIME tag. \[make enclosure (maybe multipart)\] -\\[mime-edit-enclose-alternative-region] enclose as multipart/alternative. -\\[mime-edit-enclose-parallel-region] enclose as multipart/parallel. -\\[mime-edit-enclose-mixed-region] enclose as multipart/mixed. -\\[mime-edit-enclose-digest-region] enclose as multipart/digest. -\\[mime-edit-enclose-signed-region] enclose as PGP signed. -\\[mime-edit-enclose-encrypted-region] enclose as PGP encrypted. -\\[mime-edit-enclose-quote-region] enclose as verbose mode (to avoid to expand tags) +\\[mime-edit-enclose-alternative-region] enclose as multipart/alternative. +\\[mime-edit-enclose-parallel-region] enclose as multipart/parallel. +\\[mime-edit-enclose-mixed-region] enclose as multipart/mixed. +\\[mime-edit-enclose-digest-region] enclose as multipart/digest. +\\[mime-edit-enclose-pgp-signed-region] enclose as PGP signed. +\\[mime-edit-enclose-pgp-encrypted-region] enclose as PGP encrypted. +\\[mime-edit-enclose-quote-region] enclose as verbose mode + (to avoid to expand tags) \[other commands\] \\[mime-edit-set-transfer-level-7bit] set transfer-level as 7. \\[mime-edit-set-transfer-level-8bit] set transfer-level as 8. -\\[mime-edit-set-split] set message splitting mode. -\\[mime-edit-set-sign] set PGP-sign mode. -\\[mime-edit-set-encrypt] set PGP-encryption mode. -\\[mime-edit-preview-message] preview editing MIME message. -\\[mime-edit-exit] exit and translate into a MIME compliant message. -\\[mime-edit-help] show this help. -\\[mime-edit-maybe-translate] exit and translate if in MIME mode, then split. +\\[mime-edit-set-split] set message splitting mode. +\\[mime-edit-set-sign] set PGP-sign mode. +\\[mime-edit-set-encrypt] set PGP-encryption mode. +\\[mime-edit-preview-message] preview editing MIME message. +\\[mime-edit-exit] exit and translate into a MIME + compliant message. +\\[mime-edit-help] show this help. +\\[mime-edit-maybe-translate] exit and translate if in MIME mode, + then split. Additional commands are available in some major modes: C-c C-c exit, translate and run the original command. @@ -857,8 +903,7 @@ User customizable variables (not documented all of them): (interactive) (if mime-edit-mode-flag (mime-edit-exit) - (if (and (boundp 'mime-edit-touched-flag) - mime-edit-touched-flag) + (if mime-edit-touched-flag (mime-edit-again) (make-local-variable 'mime-edit-touched-flag) (setq mime-edit-touched-flag t) @@ -960,26 +1005,26 @@ 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 -1) - )))))) + (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")) + (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." @@ -1080,8 +1125,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) @@ -1527,21 +1573,17 @@ Parameter must be '(PROMPT CHOICE1 (CHOISE2 ...))." (let ((bb (match-beginning 0)) (be (match-end 0)) (type (buffer-substring (match-beginning 1)(match-end 1))) - end-exp eb ee) + end-exp eb) (setq end-exp (format "--}-<<%s>>\n" type)) (widen) (if (re-search-forward end-exp nil t) - (progn - (setq eb (match-beginning 0)) - (setq ee (match-end 0)) - ) + (setq eb (match-beginning 0)) (setq eb (point-max)) - (setq ee (point-max)) ) (narrow-to-region be eb) (goto-char be) (if (re-search-forward mime-edit-multipart-beginning-regexp nil t) - (let (ret) + (progn (narrow-to-region (match-beginning 0)(point-max)) (mime-edit-find-inmost) ) @@ -1574,21 +1616,18 @@ Parameter must be '(PROMPT CHOICE1 (CHOISE2 ...))." (cond ((string-equal type "quote") (mime-edit-enquote-region bb eb) ) - ((string-equal type "signed") - (cond ((eq mime-edit-signing-type 'pgp-elkins) - (mime-edit-sign-pgp-elkins bb eb boundary) - ) - ((eq mime-edit-signing-type 'pgp-kazu) - (mime-edit-sign-pgp-kazu bb eb boundary) - )) + ((string-equal type "pgp-signed") + (mime-edit-sign-pgp-mime bb eb boundary) + ) + ((string-equal type "pgp-encrypted") + (mime-edit-encrypt-pgp-mime bb eb boundary) + ) + ((string-equal type "kazu-signed") + (mime-edit-sign-pgp-kazu bb eb boundary) + ) + ((string-equal type "kazu-encrypted") + (mime-edit-encrypt-pgp-kazu bb eb boundary) ) - ((string-equal type "encrypted") - (cond ((eq mime-edit-encrypting-type 'pgp-elkins) - (mime-edit-encrypt-pgp-elkins bb eb boundary) - ) - ((eq mime-edit-encrypting-type 'pgp-kazu) - (mime-edit-encrypt-pgp-kazu bb eb boundary) - ))) (t (setq boundary (nth 2 (mime-edit-translate-region bb eb @@ -1622,7 +1661,7 @@ Parameter must be '(PROMPT CHOICE1 (CHOISE2 ...))." (replace-match (concat "-" (substring tag 2))) ))))) -(defun mime-edit-sign-pgp-elkins (beg end boundary) +(defun mime-edit-sign-pgp-mime (beg end boundary) (save-excursion (save-restriction (narrow-to-region beg end) @@ -1630,9 +1669,7 @@ Parameter must be '(PROMPT CHOICE1 (CHOISE2 ...))." (mime-edit-translate-region beg end boundary)) (ctype (car ret)) (encoding (nth 1 ret)) - (parts (nth 3 ret)) - (pgp-boundary (concat "pgp-sign-" boundary)) - ) + (pgp-boundary (concat "pgp-sign-" boundary))) (goto-char beg) (insert (format "Content-Type: %s\n" ctype)) (if encoding @@ -1680,7 +1717,7 @@ Parameter must be '(PROMPT CHOICE1 (CHOISE2 ...))." (vector from recipients header) )) -(defun mime-edit-encrypt-pgp-elkins (beg end boundary) +(defun mime-edit-encrypt-pgp-mime (beg end boundary) (save-excursion (save-restriction (let (from recipients header) @@ -1694,9 +1731,7 @@ Parameter must be '(PROMPT CHOICE1 (CHOISE2 ...))." (mime-edit-translate-region beg end boundary)) (ctype (car ret)) (encoding (nth 1 ret)) - (parts (nth 3 ret)) - (pgp-boundary (concat "pgp-" boundary)) - ) + (pgp-boundary (concat "pgp-" boundary))) (goto-char beg) (insert header) (insert (format "Content-Type: %s\n" ctype)) @@ -1731,9 +1766,7 @@ Content-Transfer-Encoding: 7bit (let* ((ret (mime-edit-translate-region beg end boundary)) (ctype (car ret)) - (encoding (nth 1 ret)) - (parts (nth 3 ret)) - ) + (encoding (nth 1 ret))) (goto-char beg) (insert (format "Content-Type: %s\n" ctype)) (if encoding @@ -1753,10 +1786,9 @@ Content-Transfer-Encoding: 7bit (defun mime-edit-encrypt-pgp-kazu (beg end boundary) (save-excursion - (let (from recipients header) + (let (recipients header) (let ((ret (mime-edit-make-encrypt-recipient-header))) - (setq from (aref ret 0) - recipients (aref ret 1) + (setq recipients (aref ret 1) header (aref ret 2)) ) (save-restriction @@ -1764,9 +1796,7 @@ Content-Transfer-Encoding: 7bit (let* ((ret (mime-edit-translate-region beg end boundary)) (ctype (car ret)) - (encoding (nth 1 ret)) - (parts (nth 3 ret)) - ) + (encoding (nth 1 ret))) (goto-char beg) (insert header) (insert (format "Content-Type: %s\n" ctype)) @@ -1836,10 +1866,10 @@ Content-Transfer-Encoding: 7bit (let ((contype (car ret)) ;Content-Type (encoding (nth 1 ret)) ;Content-Transfer-Encoding ) - ;; Insert X-Emacs field - (and mime-edit-insert-x-emacs-field - (or (mail-position-on-field "X-Emacs") - (insert mime-edit-x-emacs-value) + ;; Insert User-Agent field + (and mime-edit-insert-user-agent-field + (or (mail-position-on-field "User-Agent") + (insert mime-edit-user-agent-value) )) ;; Make primary MIME headers. (or (mail-position-on-field "MIME-Version") @@ -1861,17 +1891,15 @@ Content-Transfer-Encoding: 7bit (insert encoding))) )))) -(defun mime-edit-translate-single-part-tag (&optional prefix) +(defun mime-edit-translate-single-part-tag (boundary &optional prefix) "Translate single-part-tag to MIME header." (if (re-search-forward mime-edit-single-part-tag-regexp nil t) (let* ((beg (match-beginning 0)) (end (match-end 0)) - (tag (buffer-substring beg end)) - ) + (tag (buffer-substring beg end))) (delete-region beg end) (let ((contype (mime-edit-get-contype tag)) - (encoding (mime-edit-get-encoding tag)) - ) + (encoding (mime-edit-get-encoding tag))) (insert (concat prefix "--" boundary "\n")) (save-restriction (narrow-to-region (point)(point)) @@ -1916,9 +1944,8 @@ Content-Transfer-Encoding: 7bit (t ;; It's a multipart message. (goto-char (point-min)) - (and (mime-edit-translate-single-part-tag) - (while (mime-edit-translate-single-part-tag "\n")) - ) + (and (mime-edit-translate-single-part-tag boundary) + (while (mime-edit-translate-single-part-tag boundary "\n"))) ;; Define Content-Type as "multipart/mixed". (setq contype (concat "multipart/mixed;\n boundary=\"" boundary "\"")) @@ -2004,12 +2031,17 @@ Content-Transfer-Encoding: 7bit ;; Define encoding and encode text if necessary. (or encoding ;Encoding is not specified. (let* ((encoding - (cdr - (assq charset - mime-edit-charset-default-encoding-alist) - )) - (beg (mime-edit-content-beginning)) - ) + (let (bits conv) + (let ((ret (cdr (assq charset mime-charset-type-list)))) + (if ret + (setq bits (car ret) + conv (nth 1 ret)) + (setq bits 8 + conv "quoted-printable"))) + (if (<= bits mime-transfer-level) + (mime-encoding-name bits) + conv))) + (beg (mime-edit-content-beginning))) (encode-mime-charset-region beg (mime-edit-content-end) charset) ;; Protect "From " in beginning of line @@ -2034,11 +2066,8 @@ Content-Transfer-Encoding: 7bit (save-restriction (narrow-to-region beg (mime-edit-content-end)) (goto-char beg) - (while (re-search-forward "\\([^\r]\\)\n" nil t) - (replace-match - (concat (buffer-substring (match-beginning 0) - (match-end 1)) "\r\n")) - ))) + (while (re-search-forward "\\(\\=\\|[^\r]\\)\n" nil t) + (replace-match "\\1\r\n")))) (goto-char beg) (mime-encode-region beg (mime-edit-content-end) encoding) (mime-edit-define-encoding encoding) @@ -2051,9 +2080,7 @@ Content-Transfer-Encoding: 7bit ;; encoded. (let* ((encoding "base64") ;Encode in BASE64 by default. (beg (mime-edit-content-beginning)) - (end (mime-edit-content-end)) - (body (buffer-substring beg end)) - ) + (end (mime-edit-content-end))) (mime-encode-region beg end encoding) (mime-edit-define-encoding encoding)) (forward-line 1) @@ -2140,19 +2167,18 @@ and insert data encoded as ENCODING." (defun mime-edit-enclose-region-internal (type beg end) (save-excursion (goto-char beg) - (let ((current (point))) - (save-restriction - (narrow-to-region beg end) - (insert (format "--<<%s>>-{\n" type)) - (goto-char (point-max)) - (insert (format "--}-<<%s>>\n" type)) - (goto-char (point-max)) + (save-restriction + (narrow-to-region beg end) + (insert (format "--<<%s>>-{\n" type)) + (goto-char (point-max)) + (insert (format "--}-<<%s>>\n" type)) + (goto-char (point-max)) + ) + (or (looking-at mime-edit-beginning-tag-regexp) + (eobp) + (insert (mime-make-text-tag) "\n") ) - (or (looking-at mime-edit-beginning-tag-regexp) - (eobp) - (insert (mime-make-text-tag) "\n") - ) - ))) + )) (defun mime-edit-enclose-quote-region (beg end) (interactive "*r") @@ -2179,19 +2205,25 @@ and insert data encoded as ENCODING." (mime-edit-enclose-region-internal 'alternative beg end) ) -(defun mime-edit-enclose-signed-region (beg end) +(defun mime-edit-enclose-pgp-signed-region (beg end) (interactive "*r") - (if mime-edit-signing-type - (mime-edit-enclose-region-internal 'signed beg end) - (message "Please specify signing type.") - )) + (mime-edit-enclose-region-internal 'pgp-signed beg end) + ) -(defun mime-edit-enclose-encrypted-region (beg end) +(defun mime-edit-enclose-pgp-encrypted-region (beg end) (interactive "*r") - (if mime-edit-signing-type - (mime-edit-enclose-region-internal 'encrypted beg end) - (message "Please specify encrypting type.") - )) + (mime-edit-enclose-region-internal 'pgp-encrypted beg end) + ) + +(defun mime-edit-enclose-kazu-signed-region (beg end) + (interactive "*r") + (mime-edit-enclose-region-internal 'kazu-signed beg end) + ) + +(defun mime-edit-enclose-kazu-encrypted-region (beg end) + (interactive "*r") + (mime-edit-enclose-region-internal 'kazu-encrypted beg end) + ) (defun mime-edit-insert-key (&optional arg) "Insert a pgp public key." @@ -2227,8 +2259,6 @@ Optional TRANSFER-LEVEL is a number of transfer-level, 7 or 8." (setq mime-transfer-level 8) (setq mime-transfer-level 7) )) - (setq mime-edit-charset-default-encoding-alist - (mime-make-charset-default-encoding-alist mime-transfer-level)) (message (format "Current transfer-level is %d bit" mime-transfer-level)) (setq mime-transfer-level-string @@ -2250,18 +2280,18 @@ Optional TRANSFER-LEVEL is a number of transfer-level, 7 or 8." ;;; @ pgp ;;; +(defvar mime-edit-pgp-processing nil) +(make-variable-buffer-local 'mime-edit-pgp-processing) + (defun mime-edit-set-sign (arg) (interactive (list (y-or-n-p "Do you want to sign? ") )) (if arg - (if mime-edit-signing-type - (progn - (setq mime-edit-pgp-processing 'sign) - (message "This message will be signed.") - ) - (message "Please specify signing type.") + (progn + (setq mime-edit-pgp-processing 'sign) + (message "This message will be signed.") ) (if (eq mime-edit-pgp-processing 'sign) (setq mime-edit-pgp-processing nil) @@ -2275,12 +2305,9 @@ Optional TRANSFER-LEVEL is a number of transfer-level, 7 or 8." (y-or-n-p "Do you want to encrypt? ") )) (if arg - (if mime-edit-encrypting-type - (progn - (setq mime-edit-pgp-processing 'encrypt) - (message "This message will be encrypt.") - ) - (message "Please specify encrypting type.") + (progn + (setq mime-edit-pgp-processing 'encrypt) + (message "This message will be encrypt.") ) (if (eq mime-edit-pgp-processing 'encrypt) (setq mime-edit-pgp-processing nil) @@ -2288,9 +2315,6 @@ Optional TRANSFER-LEVEL is a number of transfer-level, 7 or 8." (message "This message will not be encrypt.") )) -(defvar mime-edit-pgp-processing nil) -(make-variable-buffer-local 'mime-edit-pgp-processing) - (defun mime-edit-pgp-enclose-buffer () (let ((beg (save-excursion (goto-char (point-min)) @@ -2301,10 +2325,10 @@ Optional TRANSFER-LEVEL is a number of transfer-level, 7 or 8." ) (if beg (cond ((eq mime-edit-pgp-processing 'sign) - (mime-edit-enclose-signed-region beg end) + (mime-edit-enclose-pgp-signed-region beg end) ) ((eq mime-edit-pgp-processing 'encrypt) - (mime-edit-enclose-encrypted-region beg end) + (mime-edit-enclose-pgp-encrypted-region beg end) )) ))) @@ -2473,24 +2497,23 @@ Content-Type: message/partial; id=%s; number=%d; total=%d\n%s\n" (concat "^" (regexp-quote separator) "$")) (replace-match "") ) - (mime-view-mode) + (mime-view-buffer) )) (defun mime-edit-quitting-method () "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 @@ -2498,7 +2521,7 @@ Content-Type: message/partial; id=%s; number=%d; total=%d\n%s\n" (defvar mime-edit-again-ignored-field-regexp (concat "^\\(" "Content-.*\\|Mime-Version" - (if mime-edit-insert-x-emacs-field "\\|X-Emacs") + (if mime-edit-insert-user-agent-field "\\|User-Agent") "\\):") "Regexp for deleted header fields when `mime-edit-again' is called.") @@ -2507,10 +2530,9 @@ Content-Type: message/partial; id=%s; number=%d; total=%d\n%s\n" (goto-char (point-min)) (let ((ctl (mime-read-Content-Type))) (if ctl - (let ((type (car ctl)) - (stype (car (cdr ctl))) - (params (cdr (cdr ctl))) - ) + (let ((type (mime-content-type-primary-type ctl)) + (stype (mime-content-type-subtype ctl)) + (params (mime-content-type-parameters ctl))) (cond ((and (eq type 'application)(eq stype 'pgp-signature)) (delete-region (point-min)(point-max))