Test.
[gnus] / lisp / rfc2047.el
index 3aa36fd..530059e 100644 (file)
@@ -93,7 +93,7 @@ Valid encodings are nil, `Q' and `B'.")
   '(("\\(Resent-\\)?\\(From\\|Cc\\|To\\|Bcc\\|Reply-To\\|Sender\\):"
      . "-A-Za-z0-9!*+/" )
     ;; = (\075), _ (\137), ? (\077) are used in the encoded word.
-    ;; Avoid using 8bit characters. Some versions of Emacs has bug!
+    ;; Avoid using 8bit characters.
     ;; Equivalent to "^\000-\007\011\013\015-\037\200-\377=_?"
     ("." . "\010\012\014\040-\074\076\100-\136\140-\177"))
   "Alist of header regexps and valid Q characters.")
@@ -127,15 +127,26 @@ Should be called narrowed to the head of the message."
        (save-restriction
          (rfc2047-narrow-to-field)
          (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)))
+             (prog1
+               (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))
+                 nil)
+               ;; No encoding necessary, but folding is nice
+               (rfc2047-fold-region
+                (save-excursion
+                  (goto-char (point-min))
+                  (skip-chars-forward "^:")
+                  (when (looking-at ": ")
+                    (forward-char 2))
+                  (point))
+                (point-max)))
            ;; We found something that may perhaps be encoded.
            (setq method nil
                  alist rfc2047-header-encoding-alist)
@@ -157,18 +168,29 @@ Should be called narrowed to the head of the message."
                       mail-parse-charset)
                  (mm-encode-coding-region (point-min) (point-max)
                                           mail-parse-charset)))
+            ;; We get this when CC'ing messsages to newsgroups with
+            ;; 8-bit names.  The group name mail copy just get
+            ;; unconditionally encoded.  Previously, it would ask
+            ;; whether to encode, which was quite confusing for the
+            ;; user.  If the new behaviour is wrong, tell me. I have
+            ;; left the old code commented out below.
+            ;; -- Per Abrahamsen <abraham@dina.kvl.dk> Date: 2001-10-07.
             ((null method)
-             (and (delq 'ascii
-                        (mm-find-charset-region (point-min)
-                                                (point-max)))
-                  (if (or (message-options-get
-                           'rfc2047-encode-message-header-encode-any)
-                          (message-options-set
-                           'rfc2047-encode-message-header-encode-any
-                           (y-or-n-p
-                            "Some texts are not encoded. Encode anyway?")))
-                      (rfc2047-encode-region (point-min) (point-max))
-                    (error "Cannot send unencoded text."))))
+             (when (delq 'ascii 
+                         (mm-find-charset-region (point-min) (point-max)))
+               (rfc2047-encode-region (point-min) (point-max))))
+;;;         ((null method)
+;;;          (and (delq 'ascii
+;;;                     (mm-find-charset-region (point-min)
+;;;                                             (point-max)))
+;;;               (if (or (message-options-get
+;;;                        'rfc2047-encode-message-header-encode-any)
+;;;                       (message-options-set
+;;;                        'rfc2047-encode-message-header-encode-any
+;;;                        (y-or-n-p
+;;;                         "Some texts are not encoded. Encode anyway?")))
+;;;                   (rfc2047-encode-region (point-min) (point-max))
+;;;                 (error "Cannot send unencoded text"))))
             ((mm-coding-system-p method)
              (if (and (featurep 'mule)
                       (if (boundp 'default-enable-multibyte-characters)
@@ -178,9 +200,14 @@ Should be called narrowed to the head of the message."
             (t)))
          (goto-char (point-max)))))))
 
+;; Fixme: This, and the require below may not be the Right Thing, but
+;; should be safe just before release.  -- fx 2001-02-08
+(eval-when-compile (defvar message-posting-charset))
+
 (defun rfc2047-encodable-p ()
   "Return non-nil if any characters in current buffer need encoding in headers.
 The buffer may be narrowed."
+  (require 'message)                   ; for message-posting-charset
   (let ((charsets
         (mapcar
          'mm-mime-charset
@@ -248,7 +275,7 @@ The buffer may be narrowed."
     result))
 
 (defun rfc2047-encode-region (b e &optional word-chars)
-  "Encode all encodable words in region."
+  "Encode all encodable words in region B to E."
   (let ((words (rfc2047-dissect-region b e word-chars)) word)
     (save-restriction
       (narrow-to-region b e)
@@ -312,7 +339,7 @@ The buffer may be narrowed."
        (forward-line 1)))))
 
 (defun rfc2047-fold-region (b e)
-  "Fold long lines in the region."
+  "Fold long lines in region B to E."
   (save-restriction
     (narrow-to-region b e)
     (goto-char (point-min))
@@ -326,13 +353,13 @@ The buffer may be narrowed."
          (goto-char (or break qword-break))
          (setq break nil
                qword-break nil)
-         (if (looking-at " \t")
+         (if (looking-at "[ \t]")
              (insert "\n")
            (insert "\n "))
          (setq bol (1- (point)))
          ;; Don't break before the first non-LWSP characters.
          (skip-chars-forward " \t")
-         (forward-char 1))
+         (unless (eobp) (forward-char 1)))
        (cond
         ((eq (char-after) ?\n)
          (forward-char 1)
@@ -360,16 +387,16 @@ The buffer may be narrowed."
        (goto-char (or break qword-break))
        (setq break nil
              qword-break nil)
-         (if (looking-at " \t")
+         (if (looking-at "[ \t]")
              (insert "\n")
            (insert "\n "))
        (setq bol (1- (point)))
        ;; Don't break before the first non-LWSP characters.
        (skip-chars-forward " \t")
-       (forward-char 1)))))
+       (unless (eobp) (forward-char 1))))))
 
 (defun rfc2047-unfold-region (b e)
-  "Unfold lines in the region."
+  "Unfold lines in region B to E."
   (save-restriction
     (narrow-to-region b e)
     (goto-char (point-min))
@@ -386,7 +413,7 @@ The buffer may be narrowed."
            (progn
              (goto-char eol)
              (delete-region eol (progn
-                                  (skip-chars-forward "[ \t\n\r]+")
+                                  (skip-chars-forward " \t\n\r")
                                   (1- (point)))))
          (setq bol (gnus-point-at-bol)))
        (setq eol (gnus-point-at-eol))
@@ -413,7 +440,9 @@ The buffer may be narrowed."
                   (gnus-point-at-bol))))
        (while alist
          (when (looking-at (caar alist))
-           (quoted-printable-encode-region b e nil (cdar alist))
+           (mm-with-unibyte-current-buffer-mule4
+             (quoted-printable-encode-region
+              (point-min) (point-max) nil (cdar alist)))
            (subst-char-in-region (point-min) (point-max) ?  ?_)
            (setq alist nil))
          (pop alist))