* gnus.el (gnus-other-frame-function): New user option.
[gnus] / lisp / rfc2047.el
index 4b8cff9..1947b9e 100644 (file)
@@ -1,5 +1,5 @@
 ;;; rfc2047.el --- Functions for encoding and decoding rfc2047 messages
-;; Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+;; Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
 ;;     MORIOKA Tomohiko <morioka@jaist.ac.jp>
@@ -116,6 +116,14 @@ Valid encodings are nil, `Q' and `B'.")
        (point-max))))
   (goto-char (point-min)))
 
+(defun rfc2047-field-value ()
+  "Return the value of the field at point."
+  (save-excursion
+    (save-restriction
+      (rfc2047-narrow-to-field)
+      (re-search-forward ":[ \t\n]*" nil t)
+      (buffer-substring (point) (point-max)))))
+
 (defun rfc2047-encode-message-header ()
   "Encode the message header according to `rfc2047-header-encoding-alist'.
 Should be called narrowed to the head of the message."
@@ -136,14 +144,17 @@ Should be called narrowed to the head of the message."
                    ;; Is message-posting-charset a coding system?
                    (mm-encode-coding-region
                     (point-min) (point-max)
-                    (car message-posting-charset)))
+                    (car message-posting-charset))
+                 nil)
                ;; No encoding necessary, but folding is nice
-               (rfc2047-fold-region (save-excursion
-                                      (goto-char (point-min))
-                                      (skip-chars-forward "^:")
-                                      (and (looking-at ": ")
-                                           (forward-char 2))
-                                      (point)) (point-max)))
+               (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)
@@ -165,18 +176,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)
@@ -324,6 +346,13 @@ The buffer may be narrowed."
        (insert "?=")
        (forward-line 1)))))
 
+(defun rfc2047-fold-field ()
+  "Fold the current line."
+  (save-excursion
+    (save-restriction
+      (rfc2047-narrow-to-field)
+      (rfc2047-fold-region (point-min) (point-max)))))
+
 (defun rfc2047-fold-region (b e)
   "Fold long lines in region B to E."
   (save-restriction
@@ -331,11 +360,13 @@ The buffer may be narrowed."
     (goto-char (point-min))
     (let ((break nil)
          (qword-break nil)
+         (first t)
          (bol (save-restriction
                 (widen)
                 (gnus-point-at-bol))))
       (while (not (eobp))
-       (when (and (or break qword-break) (> (- (point) bol) 76))
+       (when (and (or break qword-break)
+                  (> (- (point) bol) 76))
          (goto-char (or break qword-break))
          (setq break nil
                qword-break nil)
@@ -345,7 +376,8 @@ The buffer may be narrowed."
          (setq bol (1- (point)))
          ;; Don't break before the first non-LWSP characters.
          (skip-chars-forward " \t")
-         (unless (eobp) (forward-char 1)))
+         (unless (eobp)
+           (forward-char 1)))
        (cond
         ((eq (char-after) ?\n)
          (forward-char 1)
@@ -359,7 +391,10 @@ The buffer may be narrowed."
          (forward-char 1))
         ((memq (char-after) '(?  ?\t))
          (skip-chars-forward " \t")
-         (setq break (1- (point))))
+         (if first
+             ;; Don't break just after the header name.
+             (setq first nil)
+           (setq break (1- (point)))))
         ((not break)
          (if (not (looking-at "=\\?[^=]"))
              (if (eq (char-after) ?=)
@@ -369,7 +404,8 @@ The buffer may be narrowed."
            (skip-chars-forward "^ \t\n\r")))
         (t
          (skip-chars-forward "^ \t\n\r"))))
-      (when (and (or break qword-break) (> (- (point) bol) 76))
+      (when (and (or break qword-break)
+                (> (- (point) bol) 76))
        (goto-char (or break qword-break))
        (setq break nil
              qword-break nil)
@@ -379,7 +415,15 @@ The buffer may be narrowed."
        (setq bol (1- (point)))
        ;; Don't break before the first non-LWSP characters.
        (skip-chars-forward " \t")
-       (unless (eobp) (forward-char 1))))))
+       (unless (eobp)
+         (forward-char 1))))))
+
+(defun rfc2047-unfold-field ()
+  "Fold the current line."
+  (save-excursion
+    (save-restriction
+      (rfc2047-narrow-to-field)
+      (rfc2047-unfold-region (point-min) (point-max)))))
 
 (defun rfc2047-unfold-region (b e)
   "Unfold lines in region B to E."
@@ -389,18 +433,15 @@ The buffer may be narrowed."
     (let ((bol (save-restriction
                 (widen)
                 (gnus-point-at-bol)))
-         (eol (gnus-point-at-eol))
-         leading)
+         (eol (gnus-point-at-eol)))
       (forward-line 1)
       (while (not (eobp))
-       (looking-at "[ \t]*")
-       (setq leading (- (match-end 0) (match-beginning 0)))
-       (if (< (- (gnus-point-at-eol) bol leading) 76)
-           (progn
-             (goto-char eol)
-             (delete-region eol (progn
-                                  (skip-chars-forward " \t\n\r")
-                                  (1- (point)))))
+       (if (and (looking-at "[ \t]")
+                (< (- (gnus-point-at-eol) bol) 76))
+           (delete-region eol (progn
+                                (goto-char eol)
+                                (skip-chars-forward "\r\n")
+                                (point)))
          (setq bol (gnus-point-at-bol)))
        (setq eol (gnus-point-at-eol))
        (forward-line 1)))))
@@ -427,7 +468,7 @@ The buffer may be narrowed."
        (while alist
          (when (looking-at (caar alist))
            (mm-with-unibyte-current-buffer-mule4
-             (quoted-printable-encode-region 
+             (quoted-printable-encode-region
               (point-min) (point-max) nil (cdar alist)))
            (subst-char-in-region (point-min) (point-max) ?  ?_)
            (setq alist nil))
@@ -478,6 +519,7 @@ The buffer may be narrowed."
                     (delete-region (match-beginning 0) (match-end 0)))))
          (when (and (mm-multibyte-p)
                     mail-parse-charset
+                    (not (eq mail-parse-charset 'us-ascii))
                     (not (eq mail-parse-charset 'gnus-decoded)))
            (mm-decode-coding-region b e mail-parse-charset))
          (setq b (point)))
@@ -485,19 +527,25 @@ The buffer may be narrowed."
                   mail-parse-charset
                   (not (eq mail-parse-charset 'us-ascii))
                   (not (eq mail-parse-charset 'gnus-decoded)))
-         (mm-decode-coding-region b (point-max) mail-parse-charset))
-       (rfc2047-unfold-region (point-min) (point-max))))))
+         (mm-decode-coding-region b (point-max) mail-parse-charset))))))
 
 (defun rfc2047-decode-string (string)
   "Decode the quoted-printable-encoded STRING and return the results."
   (let ((m (mm-multibyte-p)))
-    (with-temp-buffer
-      (when m
-       (mm-enable-multibyte))
-      (insert string)
-      (inline
-       (rfc2047-decode-region (point-min) (point-max)))
-      (buffer-string))))
+    (if (string-match "=\\?" string)
+       (with-temp-buffer
+         (when m
+           (mm-enable-multibyte))
+         (insert string)
+         (inline
+           (rfc2047-decode-region (point-min) (point-max)))
+         (buffer-string))
+      (if (and m
+              mail-parse-charset
+              (not (eq mail-parse-charset 'us-ascii))
+              (not (eq mail-parse-charset 'gnus-decoded)))
+         (mm-decode-coding-string string mail-parse-charset)
+       string))))
 
 (defun rfc2047-parse-and-decode (word)
   "Decode WORD and return it if it is an encoded word.