;; 8bit treatment gets any char except: 0x32 - 0x7f, CR, LF, TAB, BEL,
;; BS, vertical TAB, form feed, and ^_
-(defvar mm-8bit-char-regexp "[^\x20-\x7f\r\n\t\x7\x8\xb\xc\x1f]")
-
-(defvar mm-body-charset-encoding-alist
- '((us-ascii . 7bit)
- (iso-8859-1 . quoted-printable)
- (iso-8859-2 . quoted-printable)
- (iso-8859-3 . quoted-printable)
- (iso-8859-4 . quoted-printable)
- (iso-8859-5 . base64)
- (koi8-r . 8bit)
- (iso-8859-7 . quoted-printable)
- (iso-8859-8 . quoted-printable)
- (iso-8859-9 . quoted-printable)
- (iso-2022-jp . base64)
- (iso-2022-kr . base64)
- (gb2312 . base64)
- (cn-gb . base64)
- (cn-gb-2312 . base64)
- (euc-kr . 8bit)
- (iso-2022-jp-2 . base64)
- (iso-2022-int-1 . base64))
+(defvar mm-7bit-chars "\x20-\x7f\r\n\t\x7\x8\xb\xc\x1f")
+
+(defvar mm-body-charset-encoding-alist nil
"Alist of MIME charsets to encodings.
Valid encodings are `7bit', `8bit', `quoted-printable' and `base64'.")
(not (mm-coding-system-equal
charset buffer-file-coding-system)))
(while (not (eobp))
- (if (eq (char-charset (char-after)) 'ascii)
+ (if (eq (mm-charset-after) 'ascii)
(when start
(save-restriction
(narrow-to-region start (point))
(setq start nil)))
charset)))))))
-(defun mm-body-encoding (charset)
+(defun mm-body-encoding (charset &optional encoding)
"Do Content-Transfer-Encoding and return the encoding of the current buffer."
(let ((bits (mm-body-7-or-8)))
(cond
((eq charset mail-parse-charset)
bits)
(t
- (let ((encoding (or (cdr (assq charset mm-body-charset-encoding-alist))
- 'quoted-printable)))
+ (let ((encoding (or encoding
+ (cdr (assq charset mm-body-charset-encoding-alist))
+ (mm-qp-or-base64))))
(mm-encode-content-transfer-encoding encoding "text/plain")
encoding)))))
((not (featurep 'mule))
(if (save-excursion
(goto-char (point-min))
- (re-search-forward mm-8bit-char-regexp nil t))
- '8bit
- '7bit))
+ (skip-chars-forward mm-7bit-chars)
+ (eobp))
+ '7bit
+ '8bit))
(t
;; Mule version
(if (and (null (delq 'ascii
;;!!!Emacs 20.3. Sometimes.
(save-excursion
(goto-char (point-min))
- (skip-chars-forward "\0-\177")
+ (skip-chars-forward mm-7bit-chars)
(eobp)))
'7bit
'8bit))))
((eq encoding 'quoted-printable)
(quoted-printable-decode-region (point-min) (point-max)))
((eq encoding 'base64)
- (base64-decode-region (point-min) (point-max)))
+ (base64-decode-region (point-min)
+ ;; Some mailers insert whitespace
+ ;; junk at the end which
+ ;; base64-decode-region dislikes.
+ (save-excursion
+ (goto-char (point-max))
+ (skip-chars-backward "\n\t ")
+ (delete-region (point) (point-max))
+ (point))))
((memq encoding '(7bit 8bit binary))
+ ;; Do nothing.
)
((null encoding)
+ ;; Do nothing.
)
- ((eq encoding 'x-uuencode)
+ ((memq encoding '(x-uuencode x-uue))
(funcall mm-uu-decode-function (point-min) (point-max)))
((eq encoding 'x-binhex)
(funcall mm-uu-binhex-decode-function (point-min) (point-max)))
(message "Error while decoding: %s" error)
nil))
(when (and
- (memq encoding '(base64 x-uuencode x-binhex))
+ (memq encoding '(base64 x-uuencode x-uue x-binhex))
(equal type "text/plain"))
(goto-char (point-min))
(while (search-forward "\r\n" nil t)
(defun mm-decode-body (charset &optional encoding type)
"Decode the current article that has been encoded with ENCODING.
The characters in CHARSET should then be decoded."
- (setq charset (or charset mail-parse-charset))
+ (if (stringp charset)
+ (setq charset (intern (downcase charset))))
+ (if (or (not charset)
+ (eq 'gnus-all mail-parse-ignored-charsets)
+ (memq 'gnus-all mail-parse-ignored-charsets)
+ (memq charset mail-parse-ignored-charsets))
+ (setq charset mail-parse-charset))
(save-excursion
(when encoding
(mm-decode-content-transfer-encoding encoding type))
(when (featurep 'mule)
- (let (mule-charset)
- (when (and charset
- (setq mule-charset (mm-charset-to-coding-system charset))
+ (let ((mule-charset (mm-charset-to-coding-system charset)))
+ (if (and (not mule-charset)
+ (listp mail-parse-ignored-charsets)
+ (memq 'gnus-unknown mail-parse-ignored-charsets))
+ (setq mule-charset
+ (mm-charset-to-coding-system mail-parse-charset)))
+ (when (and charset mule-charset
;; buffer-file-coding-system
;;Article buffer is nil coding system
;;in XEmacs
- enable-multibyte-characters
+ (mm-multibyte-p)
(or (not (eq mule-charset 'ascii))
- (setq mule-charset mail-parse-charset)))
+ (setq mule-charset mail-parse-charset))
+ (not (eq mule-charset 'gnus-decoded)))
(mm-decode-coding-region (point-min) (point-max) mule-charset))))))
(defun mm-decode-string (string charset)
"Decode STRING with CHARSET."
- (setq charset (or charset mail-parse-charset))
+ (if (stringp charset)
+ (setq charset (intern (downcase charset))))
+ (if (or (not charset)
+ (eq 'gnus-all mail-parse-ignored-charsets)
+ (memq 'gnus-all mail-parse-ignored-charsets)
+ (memq charset mail-parse-ignored-charsets))
+ (setq charset mail-parse-charset))
(or
(when (featurep 'mule)
- (let (mule-charset)
- (when (and charset
- (setq mule-charset (mm-charset-to-coding-system charset))
- enable-multibyte-characters
+ (let ((mule-charset (mm-charset-to-coding-system charset)))
+ (if (and (not mule-charset)
+ (listp mail-parse-ignored-charsets)
+ (memq 'gnus-unknown mail-parse-ignored-charsets))
+ (setq mule-charset
+ (mm-charset-to-coding-system mail-parse-charset)))
+ (when (and charset mule-charset
+ (mm-multibyte-p)
(or (not (eq mule-charset 'ascii))
(setq mule-charset mail-parse-charset)))
(mm-decode-coding-string string mule-charset))))