;; 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.63 $
+;; Version: $Revision: 0.88 $
;; Keywords: MIME, multimedia, multilingual, mail, news
;; This file is part of SEMI (SEMI is Emacs MIME Interfaces).
;; composed in the tagged MIME format are automatically translated
;; into a MIME compliant message when exiting the mode.
-;; Mule (a multilingual extension to Emacs 18 and 19) has a capability
-;; of handling multilingual text in limited ISO-2022 manner that is
-;; based on early experiences in Japanese Internet community and
-;; resulted in RFC 1468 (ISO-2022-JP charset for MIME). In order to
-;; enable multilingual capability in single text message in MIME,
-;; charset of multilingual text written in Mule is declared as either
-;; `ISO-2022-JP-2' [RFC 1554]. Mule is required for reading the such
-;; messages.
+;; Mule (multilingual feature of Emacs 20 and multilingual extension
+;; for XEmacs 20) has a capability of handling multilingual text in
+;; limited ISO-2022 manner that is based on early experiences in
+;; Japanese Internet community and resulted in RFC 1468 (ISO-2022-JP
+;; charset for MIME). In order to enable multilingual capability in
+;; single text message in MIME, charset of multilingual text written
+;; in Mule is declared as either `ISO-2022-JP-2' [RFC 1554]. Mule is
+;; required for reading the such messages.
;; This MIME composer can work with Mail mode, mh-e letter Mode, and
;; News mode. First of all, you need the following autoload
;; definition to load mime-edit-mode automatically:
;;
-;; (autoload 'mime-edit-mode "mime-edit"
+;; (autoload 'turn-on-mime-edit "mime-edit"
;; "Minor mode for editing MIME message." t)
;;
;; In case of Mail mode (includes VM mode), you need the following
;; hook definition:
;;
-;; (add-hook 'mail-mode-hook 'mime-edit-mode)
+;; (add-hook 'mail-mode-hook 'turn-on-mime-edit)
;; (add-hook 'mail-send-hook 'mime-edit-maybe-translate)
;;
;; In case of MH-E, you need the following hook definition:
;; (add-hook 'mh-letter-mode-hook
;; (function
;; (lambda ()
-;; (mime-edit-mode)
+;; (turn-on-mime-edit)
;; (make-local-variable 'mail-header-separator)
;; (setq mail-header-separator "--------")
;; ))))
;;
;; In case of News mode, you need the following hook definition:
;;
-;; (add-hook 'news-reply-mode-hook 'mime-edit-mode)
+;; (add-hook 'news-reply-mode-hook 'turn-on-mime-edit)
;; (add-hook 'news-inews-hook 'mime-edit-maybe-translate)
;;
;; In case of Emacs 19, it is possible to emphasize the message tags
;;;
(defconst mime-edit-RCS-ID
- "$Id: mime-edit.el,v 0.63 1997-03-06 19:24:46 morioka Exp $")
+ "$Id: mime-edit.el,v 0.88 1997-09-05 07:10:59 morioka Exp $")
-(defconst mime-edit-version (get-version-string mime-edit-RCS-ID))
+(defconst mime-edit-version `,(get-version-string mime-edit-RCS-ID))
(defconst mime-edit-version-name
- (concat "SEMI MIME-Edit " mime-edit-version))
+ `,(concat "SEMI MIME-Edit " mime-edit-version
+ " \"" semi-version-name "\""))
;;; @ variables
(defvar mime-edit-voice-recorder
(function mime-edit-voice-recorder-for-sun)
- "*Function to record a voice message and encode it. [mime-edit.el]")
+ "*Function to record a voice message and encode it.")
(defvar mime-edit-mode-hook nil
"*Hook called when enter MIME mode.")
("html"
;;("charset" "" "ISO-2022-JP" "US-ASCII" "ISO-8859-1" "ISO-8859-8")
)
- ("x-rot13-47")
+ ("x-rot13-47-48")
)
("message"
("external-body"
("image"
("gif")
("jpeg")
+ ("png")
("tiff")
("x-pic")
("x-mag")
"base64"
"inline" (("filename" . file))
)
+ ("\\.png$"
+ "image" "png" nil
+ "base64"
+ "inline" (("filename" . file))
+ )
("\\.tiff$"
"image" "tiff" nil
"base64"
(iso-2022-jp 7 "base64")
(iso-2022-kr 7 "base64")
(euc-kr 8 "base64")
+ (cn-gb2312 8 "quoted-printable")
+ (cn-big5 8 "base64")
(gb2312 8 "quoted-printable")
(big5 8 "base64")
(iso-2022-jp-2 7 "base64")
"Xref" "X-UIDL" "X-Filter" "X-Gnus-.*" "X-VM-.*")
"Delete these fields from original message when it is inserted
as message/rfc822 part.
-Each elements are regexp of field-name. [mime-edit.el]")
+Each elements are regexp of field-name.")
(defvar mime-edit-yank-ignored-field-regexp
(concat "^"
;;;
(defvar mime-edit-split-message t
- "*Split large message if it is non-nil. [mime-edit.el]")
+ "*Split large message if it is non-nil.")
(defvar mime-edit-message-default-max-lines 1000
- "*Default maximum lines of a message. [mime-edit.el]")
+ "*Default maximum lines of a message.")
(defvar 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.el]")
+`mime-edit-message-default-max-lines' is used.")
(defconst mime-edit-split-ignored-field-regexp
"\\(^Content-\\|^Subject:\\|^Mime-Version:\\)")
;;;
(defvar mime-edit-signing-type 'pgp-elkins
- "*PGP signing type (pgp-elkins, pgp-kazu or nil). [mime-edit.el]")
+ "*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). [mime-edit.el]")
+ "*PGP encrypting type (pgp-elkins, pgp-kazu or nil).")
;;; @@ about tag
(defvar mime-edit-mode-flag nil)
(make-variable-buffer-local 'mime-edit-mode-flag)
-(defvar mime-edit-prefix "\C-c\C-x"
- "*Keymap prefix for MIME-Edit commands.")
-
-(defvar mime-edit-map (make-sparse-keymap)
- "Keymap for MIME commands.")
-
-(define-key mime-edit-map "\C-t" 'mime-edit-insert-text)
-(define-key mime-edit-map "\C-i" 'mime-edit-insert-file)
-(define-key mime-edit-map "\C-e" 'mime-edit-insert-external)
-(define-key mime-edit-map "\C-v" 'mime-edit-insert-voice)
-(define-key mime-edit-map "\C-y" 'mime-edit-insert-message)
-(define-key mime-edit-map "\C-m" 'mime-edit-insert-mail)
-(define-key mime-edit-map "\C-w" 'mime-edit-insert-signature)
-(define-key mime-edit-map "\C-s" 'mime-edit-insert-signature)
-(define-key mime-edit-map "\C-k" 'mime-edit-insert-key)
-(define-key mime-edit-map "t" 'mime-edit-insert-tag)
-(define-key mime-edit-map "a" 'mime-edit-enclose-alternative-region)
-(define-key mime-edit-map "p" 'mime-edit-enclose-parallel-region)
-(define-key mime-edit-map "m" 'mime-edit-enclose-mixed-region)
-(define-key mime-edit-map "d" 'mime-edit-enclose-digest-region)
-(define-key mime-edit-map "s" 'mime-edit-enclose-signed-region)
-(define-key mime-edit-map "e" 'mime-edit-enclose-encrypted-region)
-(define-key mime-edit-map "q" 'mime-edit-enclose-quote-region)
-(define-key mime-edit-map "7" 'mime-edit-set-transfer-level-7bit)
-(define-key mime-edit-map "8" 'mime-edit-set-transfer-level-8bit)
-(define-key mime-edit-map "/" 'mime-edit-set-split)
-(define-key mime-edit-map "v" 'mime-edit-set-sign)
-(define-key mime-edit-map "h" 'mime-edit-set-encrypt)
-(define-key mime-edit-map "\C-p" 'mime-edit-preview-message)
-(define-key mime-edit-map "\C-z" 'mime-edit-exit)
-(define-key mime-edit-map "?" 'mime-edit-help)
-
-(defun mime-edit-toggle-mode ()
- (interactive)
- (if mime-edit-mode-flag
- (mime-edit-exit 'nomime)
- (mime-edit-mode)
- ))
-
-(cond (running-xemacs
- (defconst mime-edit-minor-mime-map nil "Keymap for MIME commands.")
- (or mime-edit-minor-mime-map
- (progn
- (setq mime-edit-minor-mime-map
- (make-sparse-keymap 'mime-edit-minor-mime-map))
- (define-key
- mime-edit-minor-mime-map mime-edit-prefix mime-edit-map)
- ))
- (add-minor-mode 'mime-edit-mode-flag
- '((" MIME-Edit " mime-transfer-level-string))
- mime-edit-minor-mime-map
- nil
- 'mime-edit-toggle-mode)
- )
- (t
- (set-alist 'minor-mode-alist
- 'mime-edit-mode-flag
- '((" MIME-Edit " mime-transfer-level-string))))
- )
+(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)
+(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)
(defconst mime-edit-menu-title "MIME-Edit")
)
"MIME-edit menubar entry.")
-(defun mime-edit-define-menu-for-emacs19 ()
- "Define menu for Emacs 19."
- (define-key (current-local-map) [menu-bar mime-edit]
- (cons mime-edit-menu-title
- (make-sparse-keymap mime-edit-menu-title)))
- (mapcar (function
- (lambda (item)
- (define-key (current-local-map)
- (vector 'menu-bar 'mime-edit (car item))
- (cons (nth 1 item)(nth 2 item))
+(cond (running-xemacs
+ ;; modified by Pekka Marjola <pema@iki.fi>
+ ;; 1995/9/5 (c.f. [tm-en:69])
+ (defun mime-edit-define-menu-for-xemacs ()
+ "Define menu for Emacs 19."
+ (cond ((featurep 'menubar)
+ (make-local-variable 'current-menubar)
+ (set-buffer-menubar current-menubar)
+ (add-submenu
+ nil
+ (cons mime-edit-menu-title
+ (mapcar (function
+ (lambda (item)
+ (vector (nth 1 item)(nth 2 item)
+ mime-edit-mode-flag)
+ ))
+ 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)
+ (setq mime-edit-popup-menu-for-xemacs
+ (append '("MIME Commands" "---")
+ (mapcar (function (lambda (item)
+ (vector (nth 1 item)
+ (nth 2 item)
+ t)))
+ mime-edit-menu-list)))
+ )
+ )
+ ((>= emacs-major-version 19)
+ (define-key mime-edit-mode-map [menu-bar mime-edit]
+ (cons mime-edit-menu-title
+ (make-sparse-keymap mime-edit-menu-title)))
+ (mapcar (function
+ (lambda (item)
+ (define-key mime-edit-mode-map
+ (vector 'menu-bar 'mime-edit (car item))
+ (cons (nth 1 item)(nth 2 item))
+ )
+ ))
+ (reverse mime-edit-menu-list)
)
- ))
- (reverse mime-edit-menu-list)
- ))
-
-;;; modified by Pekka Marjola <pema@iki.fi>
-;;; 1995/9/5 (c.f. [tm-en:69])
-(defun mime-edit-define-menu-for-xemacs ()
- "Define menu for Emacs 19."
- (cond ((featurep 'menubar)
- (make-local-variable 'current-menubar)
- (set-buffer-menubar current-menubar)
- (add-submenu nil
- (cons mime-edit-menu-title
- (mapcar (function
- (lambda (item)
- (vector (nth 1 item)(nth 2 item)
- mime-edit-mode-flag)
- ))
- mime-edit-menu-list)))
- )))
-
-;;; modified by Steven L. Baur <steve@miranova.com>
-;;; 1995/12/6 (c.f. [tm-en:209])
-(if (and running-xemacs (not (boundp 'mime-edit-popup-menu-for-xemacs)))
- (setq mime-edit-popup-menu-for-xemacs
- (append '("MIME Commands" "---")
- (mapcar (function (lambda (item)
- (vector (nth 1 item)
- (nth 2 item)
- t)))
- mime-edit-menu-list)))
- )
-;;; end
-
-(defvar mime-edit-mode-old-local-map nil) ; buffer local variable
+ ))
;;; @ functions
--[[text/plain; charset=ISO-2022-JP][7bit]]
The tag specifies the MIME content type, subtype, optional parameters
-and transfer encoding of the message following the tag. Messages
-without any tag are treated as `text/plain' by default. Charset and
+and transfer encoding of the message following the tag. Messages
+without any tag are treated as `text/plain' by default. Charset and
transfer encoding are automatically defined unless explicitly
-specified. Binary messages such as audio and image are usually hidden.
-The messages in the tagged MIME format are automatically translated
-into a MIME compliant message when exiting this mode.
+specified. Binary messages such as audio and image are usually
+hidden. The messages in the tagged MIME format are automatically
+translated into a MIME compliant message when exiting this mode.
-Available charsets depend on Emacs version being used. The following
+Available charsets depend on Emacs version being used. The following
lists the available charsets of each emacs.
-EMACS 18: US-ASCII is only available.
-NEmacs: US-ASCII and ISO-2022-JP are available.
-EMACS 19: US-ASCII and ISO-8859-1 (or other charset) are available.
-XEmacs 19: US-ASCII and ISO-8859-1 (or other charset) are available.
-Mule: US-ASCII, ISO-8859-* (except for ISO-8859-5), KOI8-R,
- ISO-2022-JP, ISO-2022-JP-2, ISO-2022-KR, BIG5 and
- ISO-2022-INT-1 are available.
+Without mule: US-ASCII and ISO-8859-1 (or other charset) are available.
+With mule: US-ASCII, ISO-8859-* (except for ISO-8859-5), KOI8-R,
+ ISO-2022-JP, ISO-2022-JP-2, EUC-KR, CN-GB-2312,
+ CN-BIG5 and ISO-2022-INT-1 are available.
ISO-2022-JP-2 and ISO-2022-INT-1 charsets used in mule is expected to
-be used to represent multilingual text in intermixed manner. Any
+be used to represent multilingual text in intermixed manner. Any
languages that has no registered charset are represented as either
ISO-2022-JP-2 or ISO-2022-INT-1 in mule.
-If you want to use non-ISO-8859-1 charset in EMACS 19 or XEmacs 19,
-please set variable `default-mime-charset'. This variable must be
-symbol of which name is a MIME charset.
+If you want to use non-ISO-8859-1 charset in Emacs 19 or XEmacs
+without mule, please set variable `default-mime-charset'. This
+variable must be symbol of which name is a MIME charset.
If you want to add more charsets in mule, please set variable
-`charsets-mime-charset-alist'. This variable must be alist of which
-key is list of leading-char/charset and value is symbol of MIME
-charset. (leading-char is a term of MULE 1.* and 2.*. charset is a
-term of XEmacs/mule, mule merged EMACS and MULE 3.*) If name of
-coding-system is different as MIME charset, please set variable
-`mime-charset-coding-system-alist'. This variable must be alist of
+`charsets-mime-charset-alist'. This variable must be alist of which
+key is list of charset and value is symbol of MIME charset. If name
+of coding-system is different as MIME charset, please set variable
+`mime-charset-coding-system-alist'. This variable must be alist of
which key is MIME charset and value is coding-system.
Following commands are available in addition to major mode commands:
non-nil."
(interactive)
(if mime-edit-mode-flag
+ (mime-edit-exit)
+ (if (and (boundp 'mime-edit-touched-flag)
+ mime-edit-touched-flag)
+ (mime-edit-again)
+ (make-local-variable 'mime-edit-touched-flag)
+ (setq mime-edit-touched-flag t)
+ (turn-on-mime-edit)
+ )))
+
+
+(cond (running-xemacs
+ (add-minor-mode 'mime-edit-mode-flag
+ '((" MIME-Edit " mime-transfer-level-string))
+ mime-edit-mode-map
+ nil
+ 'mime-edit-mode)
+ )
+ (t
+ (set-alist 'minor-mode-alist
+ 'mime-edit-mode-flag
+ '((" MIME-Edit " mime-transfer-level-string)))
+ (set-alist 'minor-mode-map-alist
+ 'mime-edit-mode-flag
+ mime-edit-mode-map)
+ ))
+
+
+;;;###autoload
+(defun turn-on-mime-edit ()
+ "Unconditionally turn on MIME-Edit mode."
+ (interactive)
+ (if mime-edit-mode-flag
(error "You are already editing a MIME message.")
(setq mime-edit-mode-flag t)
- ;; Remember old key bindings.
- (if running-xemacs
- (use-local-map (or (current-local-map) (make-sparse-keymap)))
- (make-local-variable 'mime-edit-mode-old-local-map)
- (setq mime-edit-mode-old-local-map (current-local-map))
- ;; Add MIME commands to current local map.
- (use-local-map (copy-keymap (or (current-local-map)
- (make-sparse-keymap))))
- )
- (if (not (lookup-key (current-local-map) mime-edit-prefix))
- (define-key (current-local-map) mime-edit-prefix mime-edit-map))
-
+
;; 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. Menus for other emacs implementations are
- ;; welcome.
- (cond (running-xemacs
- (mime-edit-define-menu-for-xemacs))
- ((>= emacs-major-version 19)
- (mime-edit-define-menu-for-emacs19)
- ))
- ;; end
+ ;; Define menu for XEmacs.
+ (if running-xemacs
+ (mime-edit-define-menu-for-xemacs)
+ )
(enable-invisible)
))
;;;###autoload
-(defalias 'edit-mime 'mime-edit-mode) ; for convenience
-(defalias 'mime-mode 'mime-edit-mode) ; for convenience
+(defalias 'edit-mime 'turn-on-mime-edit) ; for convenience
+
(defun mime-edit-exit (&optional nomime no-error)
"Translate the tagged MIME message into a MIME compliant message.
(mime-edit-translate-buffer)))
;; Restore previous state.
(setq mime-edit-mode-flag nil)
- (cond (running-xemacs
- (if (featurep 'menubar)
- (delete-menu-item (list mime-edit-menu-title))))
- (t
- (use-local-map mime-edit-mode-old-local-map)))
-
+ (if (and running-xemacs
+ (featurep 'menubar))
+ (delete-menu-item (list mime-edit-menu-title))
+ )
(end-of-invisible)
(set-buffer-modified-p (buffer-modified-p))
(run-hooks 'mime-edit-exit-hook)
(defun mime-edit-goto-tag ()
"Search for the beginning of the tagged MIME message."
- (let ((current (point)) multipart)
+ (let ((current (point)))
(if (looking-at mime-edit-tag-regexp)
t
;; At first, go to the end.
(defun mime-edit-content-end ()
"Return the point of the end of content."
(save-excursion
- (let ((beg (point)))
- (if (mime-edit-goto-tag)
- (let ((top (point)))
- (goto-char (match-end 0))
- (if (invisible-p (point))
- (next-visible-point (point))
- ;; Move to the end of this text.
- (if (re-search-forward mime-edit-tag-regexp nil 'move)
- ;; Don't forget a multiline tag.
- (goto-char (match-beginning 0))
- )
- (point)
- ))
- ;; Assume the message begins with text/plain.
- (goto-char (mime-edit-content-beginning))
- (if (re-search-forward mime-edit-tag-regexp nil 'move)
- ;; Don't forget a multiline tag.
- (goto-char (match-beginning 0)))
- (point))
- )))
+ (if (mime-edit-goto-tag)
+ (progn
+ (goto-char (match-end 0))
+ (if (invisible-p (point))
+ (next-visible-point (point))
+ ;; Move to the end of this text.
+ (if (re-search-forward mime-edit-tag-regexp nil 'move)
+ ;; Don't forget a multiline tag.
+ (goto-char (match-beginning 0))
+ )
+ (point)
+ ))
+ ;; Assume the message begins with text/plain.
+ (goto-char (mime-edit-content-beginning))
+ (if (re-search-forward mime-edit-tag-regexp nil 'move)
+ ;; Don't forget a multiline tag.
+ (goto-char (match-beginning 0)))
+ (point))
+ ))
(defun mime-edit-define-charset (charset)
"Set charset of current tag to CHARSET."
))
(defun mime-prompt-for-encoding (default)
- "Ask for Content-Transfer-Encoding. [mime-edit.el]"
+ "Ask for Content-Transfer-Encoding."
(let (encoding)
(while (string=
(setq encoding
(insert (format "Content-Transfer-Encoding: %s\n" encoding))
)
(insert "\n")
- (or (funcall (pgp-function 'mime-sign)
- (point-min)(point-max) nil nil pgp-boundary)
+ (or (as-binary-process
+ (funcall (pgp-function 'mime-sign)
+ (point-min)(point-max) nil nil pgp-boundary))
(throw 'mime-edit-error 'pgp-error)
)
))))
))))
(defun mime-edit-translate-single-part-tag (&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))
)
(delete-region beg end)
- (setq contype (mime-edit-get-contype tag))
- (setq encoding (mime-edit-get-encoding tag))
- (insert (concat prefix "--" boundary "\n"))
- (save-restriction
- (narrow-to-region (point)(point))
- (insert "Content-Type: " contype "\n")
- (if encoding
- (insert "Content-Transfer-Encoding: " encoding "\n"))
- (eword-encode-header)
- )
+ (let ((contype (mime-edit-get-contype tag))
+ (encoding (mime-edit-get-encoding tag))
+ )
+ (insert (concat prefix "--" boundary "\n"))
+ (save-restriction
+ (narrow-to-region (point)(point))
+ (insert "Content-Type: " contype "\n")
+ (if encoding
+ (insert "Content-Transfer-Encoding: " encoding "\n"))
+ (eword-encode-header)
+ ))
t)))
(defun mime-edit-translate-region (beg end &optional boundary multipart)
(intern (downcase charset))
(mime-edit-choose-charset)))
(mime-edit-define-charset charset)
- (cond ((string-equal contype "text/x-rot13-47")
+ (cond ((string-equal contype "text/x-rot13-47-48")
(save-excursion
(forward-line)
- (set-mark (point))
- (goto-char (mime-edit-content-end))
- (tm:caesar-region)
+ (mule-caesar-region (point) (mime-edit-content-end))
))
((string-equal contype "text/enriched")
(save-excursion
)
(encode-mime-charset-region beg (mime-edit-content-end)
charset)
+ ;; Protect "From " in beginning of line
+ (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")
+ ))))
+ ;; canonicalize line break code
+ (or (member encoding '(nil "7bit" "8bit" "quoted-printable"))
+ (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"))
+ )))
+ (goto-char beg)
(mime-encode-region beg (mime-edit-content-end) encoding)
(mime-edit-define-encoding encoding)
))
(defun mime-edit-voice-recorder-for-sun (encoding)
"Record voice in a buffer using Sun audio device,
-and insert data encoded as ENCODING. [mime-edit.el]"
+and insert data encoded as ENCODING."
(message "Start the recording on %s. Type C-g to finish the recording..."
(system-name))
(mime-insert-encoded-file "/dev/audio" encoding)
(defvar mime-edit-buffer nil) ; buffer local variable
(defun mime-edit-preview-message ()
- "preview editing MIME message. [mime-edit.el]"
+ "preview editing MIME message."
(interactive)
(let* ((str (buffer-string))
(separator mail-header-separator)
))
(defun mime-edit-quitting-method ()
- (let ((temp mime::preview/article-buffer)
+ "Quitting method for mime-view."
+ (let ((temp mime-raw-buffer)
buf)
(mime-view-kill-buffer)
(set-buffer temp)
;;; @ edit again
;;;
-(defun mime-editor::edit-again (code-conversion)
+(defvar mime-edit-again-ignored-field-regexp
+ (concat "^\\(" "Content-.*\\|Mime-Version"
+ (if mime-edit-insert-x-emacs-field "\\|X-Emacs")
+ "\\):")
+ "Regexp for deleted header fields when `mime-edit-again' is called.")
+
+(defun mime-edit-decode-buffer (not-decode-text)
(save-excursion
(goto-char (point-min))
- (let ((ctl (mime/Content-Type)))
+ (let ((ctl (mime-read-Content-Type)))
(if ctl
- (let ((ctype (car ctl))
- (params (cdr ctl))
- type stype)
- (if (string-match "/" ctype)
- (progn
- (setq type (substring ctype 0 (match-beginning 0)))
- (setq stype (substring ctype (match-end 0)))
- )
- (setq type ctype)
- )
+ (let ((type (car ctl))
+ (stype (car (cdr ctl)))
+ (params (cdr (cdr ctl)))
+ )
(cond
- ((string= ctype "application/pgp-signature")
+ ((and (eq type 'application)(eq stype 'pgp-signature))
(delete-region (point-min)(point-max))
)
- ((string= type "multipart")
+ ((eq type 'multipart)
(let* ((boundary (cdr (assoc "boundary" params)))
(boundary-pat
(concat "\n--" (regexp-quote boundary) "[ \t]*\n"))
)
(save-restriction
(narrow-to-region beg end)
- (mime-editor::edit-again code-conversion)
+ (mime-edit-decode-buffer not-decode-text)
(goto-char (point-max))
))))
))
)))
))
(t
- (let* (charset
+ (let* ((ctype (format "%s/%s" type stype))
+ charset
(pstr
(let ((bytes (+ 14 (length ctype))))
(mapconcat (function
(lambda (attr)
- (if (string-equal (car attr) "charset")
+ (if (string= (car attr) "charset")
(progn
(setq charset (cdr attr))
"")
(eliminate-top-spaces
(std11-unfold-string
(buffer-substring hbeg end))))
- (if (or charset (string-equal type "text"))
+ (if (or charset (eq type 'text))
(progn
(delete-region beg (1+ end))
(goto-char (point-min))
(setq encoded t
encoding nil)
)))))))
- (if (or code-conversion encoded)
+ (if (or encoded (not not-decode-text))
(decode-mime-charset-region
(point-min)(point-max)
(or charset default-mime-charset))
(insert
(concat "\n"
(mime-create-tag
- (concat type "/" stype pstr) encoding)))
+ (format "%s/%s%s" type stype pstr)
+ encoding)))
)
(delete-region (point-min) he)
(insert
(mime-create-tag
- (concat type "/" stype pstr) encoding))
+ (format "%s/%s%s" type stype pstr)
+ encoding))
))
))))
- (if code-conversion
+ (or not-decode-text
(decode-mime-charset-region (point-min) (point-max)
default-mime-charset)
- )
+ )
))))
-(defun mime-edit-again (&optional code-conversion no-separator no-mode)
+(defun mime-edit-again (&optional not-decode-text no-separator not-turn-on)
"Convert current buffer to MIME-Edit buffer and turn on MIME-Edit mode.
Content-Type and Content-Transfer-Encoding header fields will be
converted to MIME-Edit tags."
(interactive)
- (mime-editor::edit-again code-conversion)
+ (goto-char (point-min))
+ (if (search-forward
+ (concat "\n" (regexp-quote mail-header-separator) "\n")
+ nil t)
+ (replace-match "\n\n")
+ )
+ (mime-edit-decode-buffer not-decode-text)
(goto-char (point-min))
(save-restriction
- (narrow-to-region
- (point-min)
- (if (re-search-forward
- (concat "^\\(" (regexp-quote mail-header-separator) "\\)?$")
- nil t)
- (match-end 0)
- (point-max)
- ))
+ (std11-narrow-to-header)
(goto-char (point-min))
- (while (re-search-forward
- "^\\(Content-.*\\|Mime-Version\\):" nil t)
+ (while (re-search-forward mime-edit-again-ignored-field-regexp nil t)
(delete-region (match-beginning 0) (1+ (std11-field-end)))
))
(or no-separator
(and (re-search-forward "^$")
(replace-match mail-header-separator)
))
- (or no-mode
- (mime-edit-mode)
+ (or not-turn-on
+ (turn-on-mime-edit)
))