Ma Gnus v0.10 is begun
[gnus] / lisp / gnus-art.el
index 2fa8fdf..6f32655 100644 (file)
@@ -1,6 +1,6 @@
 ;;; gnus-art.el --- article mode commands for Gnus
 
-;; Copyright (C) 1996-2013 Free Software Foundation, Inc.
+;; Copyright (C) 1996-2014 Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
 ;; Keywords: news
@@ -2666,7 +2666,7 @@ If READ-CHARSET, ask for a coding system."
                            (string-match "quoted-printable" type))))
        (article-goto-body)
        (quoted-printable-decode-region
-        (point) (point-max) (mm-charset-to-coding-system charset))))))
+        (point) (point-max) (mm-charset-to-coding-system charset nil t))))))
 
 (defun article-de-base64-unreadable (&optional force read-charset)
   "Translate a base64 article.
@@ -2697,7 +2697,8 @@ If READ-CHARSET, ask for a coding system."
          (narrow-to-region (point) (point-max))
          (base64-decode-region (point-min) (point-max))
          (mm-decode-coding-region
-          (point-min) (point-max) (mm-charset-to-coding-system charset)))))))
+          (point-min) (point-max)
+          (mm-charset-to-coding-system charset nil t)))))))
 
 (eval-when-compile
   (require 'rfc1843))
@@ -2795,6 +2796,9 @@ Return file name."
        (dolist (handle handles)
          (cond
           ((not (listp handle)))
+          ;; Exclude broken handles that `gnus-summary-enter-digest-group'
+          ;; may create.
+          ((not (or (bufferp (car handle)) (stringp (car handle)))))
           ((equal (mm-handle-media-supertype handle) "multipart")
            (when (setq file (gnus-article-browse-html-save-cid-content
                              cid handle directory))
@@ -2802,11 +2806,12 @@ Return file name."
           ((equal (concat "<" cid ">") (mm-handle-id handle))
            (setq file
                  (expand-file-name
-                   (or (mm-handle-filename handle)
-                       (concat
-                        (make-temp-name "cid")
-                        (car (rassoc (car (mm-handle-type handle)) mailcap-mime-extensions))))
-                   directory))
+                  (or (mm-handle-filename handle)
+                      (concat
+                       (make-temp-name "cid")
+                       (car (rassoc (car (mm-handle-type handle))
+                                    mailcap-mime-extensions))))
+                  directory))
            (mm-save-part-to-file handle file)
            (throw 'found file))))))))
 
@@ -2892,6 +2897,13 @@ message header will be added to the bodies of the \"text/html\" parts."
                                          ((match-beginning 3) "&amp;")
                                          (t "<br>\n"))))
                   (goto-char (point-min))
+                  (while (re-search-forward "^[\t ]+" nil t)
+                    (dotimes (i (prog1
+                                    (current-column)
+                                  (delete-region (match-beginning 0)
+                                                 (match-end 0))))
+                      (insert "&nbsp;")))
+                  (goto-char (point-min))
                   (insert "<div align=\"left\">\n")
                   (goto-char (point-max))
                   (insert "</div>\n<hr>\n")
@@ -2909,7 +2921,7 @@ message header will be added to the bodies of the \"text/html\" parts."
                     (cond ((= (length hcharset) 1)
                            (setq hcharset (car hcharset)
                                  coding (mm-charset-to-coding-system
-                                         hcharset)))
+                                         hcharset nil t)))
                           ((> (length hcharset) 1)
                            (setq hcharset 'utf-8
                                  coding hcharset)))
@@ -2917,7 +2929,8 @@ message header will be added to the bodies of the \"text/html\" parts."
                         (if charset
                             (progn
                               (setq body
-                                    (mm-charset-to-coding-system charset))
+                                    (mm-charset-to-coding-system charset
+                                                                 nil t))
                               (if (eq coding body)
                                   (setq eheader (mm-encode-coding-string
                                                  (buffer-string) coding)
@@ -3684,7 +3697,7 @@ function and want to see what the date was before converting."
        (walk-windows
         (lambda (w)
           (set-buffer (window-buffer w))
-          (when (eq major-mode 'gnus-article-mode)
+          (when (derived-mode-p 'gnus-article-mode)
             (let ((old-line (count-lines (point-min) (point)))
                   (old-column (- (point) (line-beginning-position)))
                   (window-start (window-start w))
@@ -4383,7 +4396,6 @@ If variable `gnus-use-long-file-name' is non-nil, it is
   [?\S-\ ] gnus-article-goto-prev-page
   "\177" gnus-article-goto-prev-page
   [delete] gnus-article-goto-prev-page
-  [backspace] gnus-article-goto-prev-page
   "\C-c^" gnus-article-refer-article
   "h" gnus-article-show-summary
   "s" gnus-article-show-summary
@@ -4456,7 +4468,7 @@ If variable `gnus-use-long-file-name' is non-nil, it is
 (defvar bookmark-make-record-function)
 (defvar shr-put-image-function)
 
-(defun gnus-article-mode ()
+(define-derived-mode gnus-article-mode fundamental-mode "Article"
   "Major mode for displaying an article.
 
 All normal editing commands are switched off.
@@ -4471,13 +4483,8 @@ commands:
 \\[gnus-article-mail]\t Send a reply to the address near point
 \\[gnus-article-describe-briefly]\t Describe the current mode briefly
 \\[gnus-info-find-node]\t Go to the Gnus info node"
-  (interactive)
-  (kill-all-local-variables)
   (gnus-simplify-mode-line)
-  (setq mode-name "Article")
-  (setq major-mode 'gnus-article-mode)
   (make-local-variable 'minor-mode-alist)
-  (use-local-map gnus-article-mode-map)
   (when (gnus-visual-p 'article-menu 'menu)
     (gnus-article-make-menu-bar)
     (when gnus-summary-tool-bar-map
@@ -4505,9 +4512,7 @@ commands:
   (buffer-disable-undo)
   (setq buffer-read-only t
        show-trailing-whitespace nil)
-  (set-syntax-table gnus-article-mode-syntax-table)
-  (mm-enable-multibyte)
-  (gnus-run-mode-hooks 'gnus-article-mode-hook))
+  (mm-enable-multibyte))
 
 (defun gnus-article-setup-buffer ()
   "Initialize the article buffer."
@@ -4545,20 +4550,22 @@ commands:
                         nil)
                     (error "Action aborted"))
                 t)))
-       (with-current-buffer name
-         (set (make-local-variable 'gnus-article-edit-mode) nil)
-         (gnus-article-stop-animations)
-         (when gnus-article-mime-handles
-           (mm-destroy-parts gnus-article-mime-handles)
-           (setq gnus-article-mime-handles nil))
-         ;; Set it to nil in article-buffer!
-         (setq gnus-article-mime-handle-alist nil)
-         (buffer-disable-undo)
-         (setq buffer-read-only t)
-         (unless (eq major-mode 'gnus-article-mode)
-           (gnus-article-mode))
-         (setq truncate-lines gnus-article-truncate-lines)
-         (current-buffer))
+       (let ((summary gnus-summary-buffer))
+         (with-current-buffer name
+           (set (make-local-variable 'gnus-article-edit-mode) nil)
+           (gnus-article-stop-animations)
+           (when gnus-article-mime-handles
+             (mm-destroy-parts gnus-article-mime-handles)
+             (setq gnus-article-mime-handles nil))
+           ;; Set it to nil in article-buffer!
+           (setq gnus-article-mime-handle-alist nil)
+           (buffer-disable-undo)
+           (setq buffer-read-only t)
+           (unless (derived-mode-p 'gnus-article-mode)
+             (gnus-article-mode))
+           (set (make-local-variable 'gnus-summary-buffer) summary)
+           (setq truncate-lines gnus-article-truncate-lines)
+           (current-buffer)))
       (let ((summary gnus-summary-buffer))
        (with-current-buffer (gnus-get-buffer-create name)
          (gnus-article-mode)
@@ -4604,7 +4611,7 @@ If ARTICLE is an id, HEADER should be the article headers.
 If ALL-HEADERS is non-nil, no headers are hidden."
   (save-excursion
     ;; Make sure we start in a summary buffer.
-    (unless (eq major-mode 'gnus-summary-mode)
+    (unless (derived-mode-p 'gnus-summary-mode)
       (set-buffer gnus-summary-buffer))
     (setq gnus-summary-buffer (current-buffer))
     (let* ((gnus-article (if header (mail-header-number header) article))
@@ -4715,7 +4722,7 @@ If ALL-HEADERS is non-nil, no headers are hidden."
   (let ((gnus-article-buffer (current-buffer))
        buffer-read-only
        (inhibit-read-only t))
-    (unless (eq major-mode 'gnus-article-mode)
+    (unless (derived-mode-p 'gnus-article-mode)
       (gnus-article-mode))
     (setq buffer-read-only nil
          gnus-article-wash-types nil
@@ -4777,7 +4784,7 @@ If a prefix ARG is given, ask for a name for this sticky article buffer."
             "*"))
       (if (and (gnus-buffer-live-p new-art-buf-name)
               (with-current-buffer new-art-buf-name
-                (eq major-mode 'gnus-sticky-article-mode)))
+                (derived-mode-p 'gnus-sticky-article-mode)))
          (switch-to-buffer new-art-buf-name)
        (setq new-art-buf-name (rename-buffer new-art-buf-name t)))
       (gnus-sticky-article-mode))
@@ -4793,7 +4800,7 @@ If none is given, assume the current buffer and kill it if it has
   (unless buffer
     (setq buffer (current-buffer)))
   (with-current-buffer buffer
-    (when (eq major-mode 'gnus-sticky-article-mode)
+    (when (derived-mode-p 'gnus-sticky-article-mode)
       (gnus-kill-buffer buffer))))
 
 (defun gnus-kill-sticky-article-buffers (arg)
@@ -4802,11 +4809,11 @@ If a prefix ARG is given, ask for confirmation."
   (interactive "P")
   (dolist (buf (gnus-buffers))
     (with-current-buffer buf
-      (when (eq major-mode 'gnus-sticky-article-mode)
-       (if (not arg)
-           (gnus-kill-buffer buf)
-         (when (yes-or-no-p (concat "Kill buffer " (buffer-name buf) "? "))
-           (gnus-kill-buffer buf)))))))
+      (when (derived-mode-p 'gnus-sticky-article-mode)
+       (if (not arg)
+           (gnus-kill-buffer buf)
+         (when (yes-or-no-p (concat "Kill buffer " (buffer-name buf) "? "))
+           (gnus-kill-buffer buf)))))))
 
 ;;;
 ;;; Gnus MIME viewing functions
@@ -4894,7 +4901,7 @@ General format specifiers can also be used.  See Info node
 (defmacro gnus-bind-safe-url-regexp (&rest body)
   "Bind `mm-w3m-safe-url-regexp' according to `gnus-safe-html-newsgroups'."
   `(let ((mm-w3m-safe-url-regexp
-         (let ((group (if (and (eq major-mode 'gnus-article-mode)
+         (let ((group (if (and (derived-mode-p 'gnus-article-mode)
                                (gnus-buffer-live-p
                                 gnus-article-current-summary))
                           (with-current-buffer gnus-article-current-summary
@@ -5243,7 +5250,8 @@ are decompressed."
       (switch-to-buffer (generate-new-buffer filename))
       (if (or coding-system
              (and charset
-                  (setq coding-system (mm-charset-to-coding-system charset))
+                  (setq coding-system (mm-charset-to-coding-system
+                                       charset nil t))
                   (not (eq coding-system 'ascii))))
          (progn
            (mm-enable-multibyte)
@@ -6478,7 +6486,7 @@ not have a face in `gnus-article-boring-faces'."
 
 (defun gnus-article-check-buffer ()
   "Beep if not in an article buffer."
-  (unless (equal major-mode 'gnus-article-mode)
+  (unless (derived-mode-p 'gnus-article-mode)
     (error "Command invoked outside of a Gnus article buffer")))
 
 (defun gnus-article-read-summary-keys (&optional arg key not-restore-window)
@@ -6593,7 +6601,7 @@ not have a face in `gnus-article-boring-faces'."
                           new-sum-point
                           (window-live-p win)
                           (with-current-buffer (window-buffer win)
-                            (eq major-mode 'gnus-summary-mode)))
+                            (derived-mode-p 'gnus-summary-mode)))
                  (set-window-point win new-sum-point)
                  (set-window-start win new-sum-start)
                  (set-window-hscroll win new-sum-hscroll))))