Synch to No Gnus 200502190123.
authoryamaoka <yamaoka>
Sat, 19 Feb 2005 01:24:05 +0000 (01:24 +0000)
committeryamaoka <yamaoka>
Sat, 19 Feb 2005 01:24:05 +0000 (01:24 +0000)
lisp/ChangeLog
lisp/mml.el
lisp/rfc2047.el

index bdc63a6..b6a85d4 100644 (file)
@@ -1,3 +1,18 @@
+2005-02-19  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus-msg.el (gnus-copy-article-buffer): Quote decoded words
+       containing special characters.
+
+       * gnus-sum.el (gnus-summary-edit-article): Ditto.
+
+       * mml.el (mime-to-mml): Ditto.
+
+       * rfc2047.el (rfc2047-encode-parameter): Use ietf-drums-tspecials.
+       (rfc2047-quote-decoded-words-containing-tspecials): New variable.
+       (rfc2047-decode-region): Quote decoded words containing special
+       characters when rfc2047-quote-decoded-words-containing-tspecials
+       is non-nil.
+
 2005-02-15  Simon Josefsson  <jas@extundo.com>
 
        * nnimap.el (nnimap-debug): Doc fix.
index fa6b2e9..89cc301 100644 (file)
@@ -714,7 +714,8 @@ If HANDLES is non-nil, use it instead reparsing the buffer."
   ;; First decode the head.
   (save-restriction
     (message-narrow-to-head)
-    (mail-decode-encoded-word-region (point-min) (point-max)))
+    (let ((rfc2047-quote-decoded-words-containing-tspecials t))
+      (mail-decode-encoded-word-region (point-min) (point-max))))
   (unless handles
     (setq handles (mm-dissect-buffer t)))
   (goto-char (point-min))
index c3afdc4..d45987f 100644 (file)
@@ -1,6 +1,6 @@
 ;;; rfc2047.el --- functions for encoding and decoding rfc2047 messages
 
-;; Copyright (C) 1998, 1999, 2000, 2002, 2003, 2004
+;; Copyright (C) 1998, 1999, 2000, 2002, 2003, 2004, 2005
 ;;        Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
@@ -35,6 +35,7 @@
 
 (require 'qp)
 (require 'mm-util)
+(require 'ietf-drums)
 ;; Fixme: Avoid this (used for mail-parse-charset) mm dependence on gnus.
 (require 'mail-prsvr)
 (require 'base64)
@@ -766,8 +767,7 @@ it, put the following line in your ~/.gnus.el file:
   (let* ((rfc2047-encoding-type 'mime)
         (rfc2047-encode-max-chars nil)
         (string (rfc2047-encode-string value)))
-    (if (string-match "[][()<>@,;:\\\"/?=]" ;; tspecials
-                     string)
+    (if (string-match (concat "[" ietf-drums-tspecials "]") string)
        (format "%s=%S" param string)
       (concat param "=" string))))
 
@@ -780,6 +780,9 @@ it, put the following line in your ~/.gnus.el file:
     "=\\?\\([^][\000-\040()<>@,\;:*\\\"/?.=]+\\)\\(?:\\*[^?]+\\)?\
 \\?\\(B\\|Q\\)\\?\\([!->@-~ ]*\\)\\?="))
 
+(defvar rfc2047-quote-decoded-words-containing-tspecials nil
+  "If non-nil, quote decoded words containing special characters.")
+
 ;; Fixme: This should decode in place, not cons intermediate strings.
 ;; Also check whether it needs to worry about delimiting fields like
 ;; encoding.
@@ -814,14 +817,66 @@ it, put the following line in your ~/.gnus.el file:
          (insert (rfc2047-parse-and-decode
                   (prog1
                       (match-string 0)
-                    (delete-region (match-beginning 0) (match-end 0)))))
-         ;; Remove newlines between decoded words, though such things
-         ;; essentially must not be there.
+                    (delete-region e (match-end 0)))))
+         (while (looking-at rfc2047-encoded-word-regexp)
+           (insert (rfc2047-parse-and-decode
+                    (prog1
+                        (match-string 0)
+                      (delete-region (point) (match-end 0))))))
          (save-restriction
            (narrow-to-region e (point))
            (goto-char e)
+           ;; Remove newlines between decoded words, though such
+           ;; things essentially must not be there.
            (while (re-search-forward "[\n\r]+" nil t)
              (replace-match " "))
+           ;; Quote decoded words if there are special characters
+           ;; which might violate RFC2822.
+           (when (and rfc2047-quote-decoded-words-containing-tspecials
+                      (let ((regexp (car (rassq
+                                          'address-mime
+                                          rfc2047-header-encoding-alist))))
+                        (when regexp
+                          (save-restriction
+                            (widen)
+                            (beginning-of-line)
+                            (while (and (memq (char-after) '(?  ?\t))
+                                        (zerop (forward-line -1))))
+                            (looking-at regexp)))))
+             (let (quoted)
+               (goto-char e)
+               (skip-chars-forward " \t")
+               (setq start (point))
+               (setq quoted (eq (char-after) ?\"))
+               (goto-char (point-max))
+               (skip-chars-backward " \t")
+               (if (setq quoted (and quoted
+                                     (> (point) (1+ start))
+                                     (eq (char-before) ?\")))
+                   (progn
+                     (backward-char)
+                     (setq start (1+ start)
+                           end (point-marker)))
+                 (setq end (point-marker)))
+               (goto-char start)
+               (while (search-forward "\"" end t)
+                 (when (prog2
+                           (backward-char)
+                           (zerop (% (skip-chars-backward "\\\\") 2))
+                         (goto-char (match-beginning 0)))
+                   (insert "\\"))
+                 (forward-char))
+               (when (and (not quoted)
+                          (progn
+                            (goto-char start)
+                            (re-search-forward
+                             (concat "[" ietf-drums-tspecials "]")
+                             end t)))
+                 (goto-char start)
+                 (insert "\"")
+                 (goto-char end)
+                 (insert "\""))
+               (set-marker end nil)))
            (goto-char (point-max)))
          (when (and (mm-multibyte-p)
                     mail-parse-charset