(mm-uu-type-alist): Improve `LaTeX'.
[gnus] / lisp / mm-uu.el
index dc881b7..2877863 100644 (file)
@@ -1,7 +1,7 @@
 ;;; mm-uu.el --- Return uu stuff as mm handles
 
 ;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-;;   2005 Free Software Foundation, Inc.
+;;   2005, 2006 Free Software Foundation, Inc.
 
 ;; Author: Shenghuo Zhu <zsh@cs.rochester.edu>
 ;; Keywords: postscript uudecode binhex shar forward gnatsweb pgp
@@ -97,18 +97,18 @@ This can be either \"inline\" or \"attachment\".")
   :group 'gnus-article-mime)
 
 (defvar mm-uu-type-alist
-  `((postscript
+  '((postscript
      "^%!PS-"
      "^%%EOF$"
      mm-uu-postscript-extract
      nil)
-    (uu
+    (uu ;; Maybe we should have a more strict test here.
      "^begin[ \t]+0?[0-7][0-7][0-7][ \t]+"
      "^end[ \t]*$"
      mm-uu-uu-extract
      mm-uu-uu-filename)
     (binhex
-     "^:...............................................................$"
+     "^:.\\{63,63\\}$"
      ":$"
      mm-uu-binhex-extract
      nil
@@ -165,9 +165,12 @@ This can be either \"inline\" or \"attachment\".")
      nil
      mm-uu-diff-test)
     (message-marks
-     ,(concat "^" (regexp-quote message-mark-insert-begin))
-     ,(concat "^" (regexp-quote message-mark-insert-end))
-     (lambda () (mm-uu-verbatim-marks-extract 0 -1 1 -2))
+     ;; Text enclosed with tags similar to `message-mark-insert-begin' and
+     ;; `message-mark-insert-end'.  Don't use those variables to avoid
+     ;; dependency on `message.el'.
+     "^-+[8<>]*-\\{9,\\}[a-z ]+-\\{9,\\}[a-z ]+-\\{9,\\}[8<>]*-+$"
+     "^-+[8<>]*-\\{9,\\}[a-z ]+-\\{9,\\}[a-z ]+-\\{9,\\}[8<>]*-+$"
+     (lambda () (mm-uu-verbatim-marks-extract 0 -1 1 -1))
      nil)
     ;; Omitting [a-z8<] leads to false positives (bogus signature separators
     ;; and mailing list banners).
@@ -184,7 +187,7 @@ This can be either \"inline\" or \"attachment\".")
      (lambda () (mm-uu-verbatim-marks-extract 0 0 1 -1))
      nil)
     (LaTeX
-     "^\\\\documentclass"
+     "^\\([\\\\%][^\n]+\n\\)*\\\\documentclass.*[[{%]"
      "^\\\\end{document}"
      mm-uu-latex-extract
      nil
@@ -234,8 +237,8 @@ To disable dissecting shar codes, for instance, add
 (defcustom mm-uu-hide-markers
   (< 16 (or (and (fboundp 'defined-colors)
                 (length (defined-colors)))
-           (and (fboundp (device-color-cells))
-                (length (device-color-cells)))
+           (and (fboundp 'device-color-cells)
+                (device-color-cells))
            0))
   "If non-nil, hide verbatim markers.
 The value should be nil on displays where the face
@@ -367,7 +370,7 @@ apply the face `mm-uu-extract'."
 
 (defun mm-uu-emacs-sources-extract ()
   (mm-make-handle (mm-uu-copy-to-buffer start-point end-point)
-                 '("application/emacs-lisp")
+                 '("application/emacs-lisp" (charset . gnus-decoded))
                  nil nil
                  (list mm-dissect-disposition
                        (cons 'filename file-name))))
@@ -383,7 +386,7 @@ apply the face `mm-uu-extract'."
 
 (defun mm-uu-diff-extract ()
   (mm-make-handle (mm-uu-copy-to-buffer start-point end-point)
-                 '("text/x-patch")))
+                 '("text/x-patch" (charset . gnus-decoded))))
 
 (defun mm-uu-diff-test ()
   (and gnus-newsgroup-name
@@ -615,24 +618,67 @@ value of `mm-uu-text-plain-type'."
        (setq result (cons "multipart/mixed" (nreverse result))))
       result)))
 
-(defun mm-uu-dissect-text-parts (handle)
-  "Dissect text parts and put uu handles into HANDLE."
-  (let ((buffer (mm-handle-buffer handle))
-       type children)
+;;;###autoload
+(defun mm-uu-dissect-text-parts (handle &optional decoded)
+  "Dissect text parts and put uu handles into HANDLE.
+Assume text has been decoded if DECODED is non-nil."
+  (let ((buffer (mm-handle-buffer handle)))
     (cond ((stringp buffer)
-          (mapc 'mm-uu-dissect-text-parts (cdr handle)))
+          (dolist (elem (cdr handle))
+            (mm-uu-dissect-text-parts elem decoded)))
          ((bufferp buffer)
-          (when (and (setq type (mm-handle-media-type handle))
-                     (stringp type)
-                     (string-match "\\`text/" type)
-                     (with-current-buffer buffer
-                       (setq children
-                             (mm-uu-dissect t (mm-handle-type handle)))))
-            (kill-buffer buffer)
-            (setcar handle (car children))
-            (setcdr handle (cdr children))))
+          (let ((type (mm-handle-media-type handle))
+                (case-fold-search t) ;; string-match
+                children charset encoding)
+            (when (and
+                   (stringp type)
+                   ;; Mutt still uses application/pgp even though
+                   ;; it has already been withdrawn.
+                   (string-match "\\`text/\\|\\`application/pgp\\'" type)
+                   (setq
+                    children
+                    (with-current-buffer buffer
+                      (cond
+                       ((or decoded
+                            (eq (setq charset (mail-content-type-get
+                                               (mm-handle-type handle)
+                                               'charset))
+                                'gnus-decoded))
+                        (setq decoded t)
+                        (mm-uu-dissect
+                         t (cons type '((charset . gnus-decoded)))))
+                       (charset
+                        (setq decoded t)
+                        (mm-with-multibyte-buffer
+                          (insert (mm-decode-string (mm-get-part handle)
+                                                    charset))
+                          (mm-uu-dissect
+                           t (cons type '((charset . gnus-decoded))))))
+                       ((setq encoding (mm-handle-encoding handle))
+                        (setq decoded nil)
+                        ;; Inherit the multibyteness of the `buffer'.
+                        (with-temp-buffer
+                          (insert-buffer-substring buffer)
+                          (mm-decode-content-transfer-encoding
+                           encoding type)
+                          (mm-uu-dissect t (list type))))
+                       (t
+                        (setq decoded nil)
+                        (mm-uu-dissect t (list type)))))))
+              ;; Ignore it if a given part is dissected into a single
+              ;; part of which the type is the same as the given one.
+              (if (and (<= (length children) 2)
+                       (string-equal (mm-handle-media-type (cadr children))
+                                     type))
+                  (kill-buffer (mm-handle-buffer (cadr children)))
+                (kill-buffer buffer)
+                (setcdr handle (cdr children))
+                (setcar handle (car children)) ;; "multipart/mixed"
+                (dolist (elem (cdr children))
+                  (mm-uu-dissect-text-parts elem decoded))))))
          (t
-          (mapc 'mm-uu-dissect-text-parts handle)))))
+          (dolist (elem handle)
+            (mm-uu-dissect-text-parts elem decoded))))))
 
 (provide 'mm-uu)