;;; rfc2047.el --- Functions for encoding and decoding rfc2047 messages
-;; Copyright (C) 1998-2000 Free Software Foundation, Inc.
+;; Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; MORIOKA Tomohiko <morioka@jaist.ac.jp>
1) nil, in which case no encoding is done;
2) `mime', in which case the header will be encoded according to RFC2047;
-3) a charset, in which case it will be encoded as that charse;
+3) a charset, in which case it will be encoded as that charset;
4) `default', in which case the field will be encoded as the rest
of the article.")
(defvar rfc2047-q-encoding-alist
'(("\\(From\\|Cc\\|To\\|Bcc\||Reply-To\\):" . "-A-Za-z0-9!*+/=_")
- ("." . "^\000-\007\013\015-\037\200-\377=_?"))
+ ("." . "^\000-\007\011\013\015-\037\200-\377=_?"))
"Alist of header regexps and valid Q characters.")
;;;
(while (not (eobp))
(save-restriction
(rfc2047-narrow-to-field)
- (when (rfc2047-encodable-p)
+ (if (not (rfc2047-encodable-p))
+ (if (and (eq (mm-body-7-or-8) '8bit)
+ (mm-multibyte-p)
+ (mm-coding-system-p
+ (car message-posting-charset)))
+ ;; 8 bit must be decoded.
+ ;; Is message-posting-charset a coding system?
+ (mm-encode-coding-region
+ (point-min) (point-max)
+ (car message-posting-charset)))
;; We found something that may perhaps be encoded.
(while (setq elem (pop alist))
(when (or (and (stringp (car elem))
(rfc2047-fold-region (point-min) (point-max)))
;; Hm.
(t)))
- (goto-char (point-max)))))
- (when mail-parse-charset
- (encode-coding-region
- (point-min) (point-max) mail-parse-charset))))
+ (goto-char (point-max)))))))
(defun rfc2047-encodable-p (&optional header)
"Say whether the current (narrowed) buffer contains characters that need encoding in headers."
(while (not (eobp))
(cond
((not state)
- (if (memq (char-after) blank-list)
- (setq state 'blank)
- (setq state 'word)
- (if (not (eq (setq cs (mm-charset-after)) 'ascii))
- (setq current cs)))
+ (setq state 'word)
+ (if (not (eq (setq cs (mm-charset-after)) 'ascii))
+ (setq current cs))
(setq b (point)))
((eq state 'blank)
(cond
((memq (char-after) blank-list))
(t
(setq state 'word)
+ (unless b
+ (setq b (point)))
(if (not (eq (setq cs (mm-charset-after)) 'ascii))
(setq current cs)))))
((eq state 'word)
(setq current nil))
((memq (char-after) blank-list)
(setq state 'blank)
- (push (list b (point) current) words)
- (setq current nil)
- (setq b (point)))
+ (if (not current)
+ (setq b nil)
+ (push (list b (point) current) words)
+ (setq b (point))
+ (setq current nil)))
((or (eq (setq cs (mm-charset-after)) 'ascii)
(if current
(eq current cs)
(if (equal (nth 2 word) current)
(setq beg (nth 0 word))
(when current
- (rfc2047-encode beg end current))
+ (if (and (eq beg (nth 1 word)) (nth 2 word))
+ (progn
+ ;; There might be a bug in Emacs Mule.
+ ;; A space must be inserted before encoding.
+ (goto-char beg)
+ (insert " ")
+ (rfc2047-encode (1+ beg) (1+ end) current))
+ (rfc2047-encode beg end current)))
(setq current (nth 2 word)
beg (nth 0 word)
end (nth 1 word))))
(goto-char (min (point-max) (+ 15 (point))))
(unless (eobp)
(insert "\n"))))
- (mm-encode-coding-region (point-min) (point-max) mime-charset)
+ (if (and (mm-multibyte-p)
+ (mm-coding-system-p mime-charset))
+ (mm-encode-coding-region (point-min) (point-max) mime-charset))
(funcall (cdr (assq encoding rfc2047-encoding-function-alist))
(point-min) (point-max))
(goto-char (point-min))
((and (not break)
(looking-at "=\\?"))
(setq break (point)))
- ((and (looking-at "\\?=")
+ ((and break
+ (looking-at "\\?=")
(> (- (point) (save-excursion (beginning-of-line) (point))) 76))
(goto-char break)
(setq break nil)