Bind RET and TAB on images for better UX.
[gnus] / lisp / gnus-uu.el
index aaf6472..35120ea 100644 (file)
@@ -1,7 +1,7 @@
 ;;; gnus-uu.el --- extract (uu)encoded files in Gnus
 
 ;; Copyright (C) 1985, 1986, 1987, 1993, 1994, 1995, 1996, 1997, 1998,
-;;   2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+;;   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
 ;; Created: 2 Oct 1993
@@ -9,10 +9,10 @@
 
 ;; This file is part of GNU Emacs.
 
-;; GNU Emacs is free software; you can redistribute it and/or modify
+;; GNU Emacs is free software: you can redistribute it and/or modify
 ;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 2, or (at your option)
-;; any later version.
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
 
 ;; GNU Emacs is distributed in the hope that it will be useful,
 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -20,9 +20,7 @@
 ;; GNU General Public License for more details.
 
 ;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-;; Boston, MA 02110-1301, USA.
+;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
 
 ;;; Commentary:
 
@@ -35,6 +33,7 @@
 (require 'message)
 (require 'gnus-msg)
 (require 'mm-decode)
+(require 'yenc)
 
 (defgroup gnus-extract nil
   "Extracting encoded files."
@@ -75,7 +74,7 @@
     ("\\.\\(tar\\|arj\\|zip\\|zoo\\|arc\\|gz\\|Z\\|lzh\\|ar\\|lha\\)$"
      "gnus-uu-archive"))
   "*Default actions to be taken when the user asks to view a file.
-To change the behaviour, you can either edit this variable or set
+To change the behavior, you can either edit this variable or set
 `gnus-uu-user-view-rules' to something useful.
 
 For example:
@@ -95,7 +94,7 @@ at that point in the command string.  If there's no \"%s\" in the
 command string, the file name will be appended to the command string
 before executing.
 
-There are several user variables to tailor the behaviour of gnus-uu to
+There are several user variables to tailor the behavior of gnus-uu to
 your needs.  First we have `gnus-uu-user-view-rules', which is the
 variable gnus-uu first consults when trying to decide how to view a
 file.  If this variable contains no matches, gnus-uu examines the
@@ -346,6 +345,7 @@ didn't work, and overwrite existing files.  Otherwise, ask each time."
 (defvar gnus-uu-file-name nil)
 (defvar gnus-uu-uudecode-process nil)
 (defvar gnus-uu-binhex-article-name nil)
+(defvar gnus-uu-yenc-article-name nil)
 
 (defvar gnus-uu-work-dir nil)
 
@@ -393,7 +393,7 @@ didn't work, and overwrite existing files.  Otherwise, ask each time."
    (list current-prefix-arg
         (read-file-name
          (if gnus-uu-save-separate-articles
-             "Save articles is dir: "
+             "Save articles in dir: "
            "Save articles in file: ")
          gnus-uu-default-dir
          gnus-uu-default-dir)))
@@ -412,6 +412,17 @@ didn't work, and overwrite existing files.  Otherwise, ask each time."
        (mm-make-temp-file (expand-file-name "binhex" gnus-uu-work-dir)))
   (gnus-uu-decode-with-method 'gnus-uu-binhex-article n dir))
 
+(defun gnus-uu-decode-yenc (n dir)
+  "Decode the yEnc-encoded current article."
+  (interactive
+   (list current-prefix-arg
+        (file-name-as-directory
+         (read-file-name "yEnc decode and save in dir: "
+                         gnus-uu-default-dir
+                         gnus-uu-default-dir))))
+  (setq gnus-uu-yenc-article-name nil)
+  (gnus-uu-decode-with-method 'gnus-uu-yenc-article n dir nil t))
+
 (defun gnus-uu-decode-uu-view (&optional n)
   "Uudecodes and views the current article."
   (interactive "P")
@@ -481,22 +492,25 @@ didn't work, and overwrite existing files.  Otherwise, ask each time."
     (if (and n (not (numberp n)))
        (setq message-forward-as-mime (not message-forward-as-mime)
              n nil))
-    (let ((gnus-article-reply (gnus-summary-work-articles n))
-         gnus-newsgroup-processable)
+    (let ((gnus-article-reply (gnus-summary-work-articles n)))
       (when (and (not n)
                 (= (length gnus-article-reply) 1))
        ;; The case where neither a number of articles nor a region is
        ;; specified.
        (gnus-summary-top-thread)
        (setq gnus-article-reply (nreverse (gnus-uu-find-articles-matching))))
-      ;; Specify articles to be forwarded.  Note that they should be
-      ;; reversed; see `gnus-uu-get-list-of-articles'.
-      (setq gnus-newsgroup-processable (reverse gnus-article-reply))
       (gnus-setup-message 'forward
        (setq gnus-uu-digest-from-subject nil)
        (setq gnus-uu-digest-buffer
              (gnus-get-buffer-create " *gnus-uu-forward*"))
-       (gnus-uu-decode-save n file)
+       ;; Specify articles to be forwarded.  Note that they should be
+       ;; reversed; see `gnus-uu-get-list-of-articles'.
+       (let ((gnus-newsgroup-processable (reverse gnus-article-reply)))
+         (gnus-uu-decode-save n file)
+         (setq gnus-article-reply gnus-newsgroup-processable))
+       ;; Restore the value of `gnus-newsgroup-processable' to which
+       ;; it should be set when it is not `let'-bound.
+       (setq gnus-newsgroup-processable (reverse gnus-article-reply))
        (switch-to-buffer gnus-uu-digest-buffer)
        (let ((fs gnus-uu-digest-from-subject))
          (when fs
@@ -1013,6 +1027,39 @@ When called interactively, prompt for REGEXP."
        (cons gnus-uu-binhex-article-name state)
       state)))
 
+;; yEnc
+
+(defun gnus-uu-yenc-article (buffer in-state)
+  (save-excursion
+    (set-buffer gnus-original-article-buffer)
+    (widen)
+    (let ((file-name (yenc-extract-filename))
+         state start-char)
+      (when (not file-name)
+       (setq state (list 'wrong-type)))
+
+      (if (memq 'wrong-type state)
+         ()
+       (when (yenc-first-part-p)
+         (setq gnus-uu-yenc-article-name
+               (expand-file-name file-name gnus-uu-work-dir))
+         (push 'begin state))
+       (when (yenc-last-part-p)
+         (push 'end state))
+       (unless state
+         (push 'middle state))
+       (mm-with-unibyte-buffer
+         (insert-buffer-substring gnus-original-article-buffer)
+         (yenc-decode-region (point-min) (point-max))
+         (when (and (member 'begin state)
+                    (file-exists-p gnus-uu-yenc-article-name))
+           (delete-file gnus-uu-yenc-article-name))
+         (mm-append-to-file (point-min) (point-max)
+                            gnus-uu-yenc-article-name)))
+      (if (memq 'begin state)
+         (cons file-name state)
+       state))))
+
 ;; PostScript
 
 (defun gnus-uu-decode-postscript-article (process-buffer in-state)
@@ -1103,7 +1150,7 @@ When called interactively, prompt for REGEXP."
                                nil t)
            (replace-match "\\1[0-9]+\\2[0-9]+" t nil nil nil))))
 
-    (goto-char 1)
+    (goto-char (point-min))
     (while (re-search-forward "[ \t]+" nil t)
       (replace-match "[ \t]+" t t))
 
@@ -1204,7 +1251,7 @@ When called interactively, prompt for REGEXP."
             (format "%06d"
                     (string-to-number (buffer-substring
                                     (match-beginning 0) (match-end 0)))))))
-       (setq string (buffer-substring 1 (point-max)))
+       (setq string (buffer-substring (point-min) (point-max)))
        (setcar (car string-list) string)
        (setq string-list (cdr string-list))))
     out-list))
@@ -1441,7 +1488,7 @@ When called interactively, prompt for REGEXP."
       (when gnus-uu-kill-carriage-return
        (save-excursion
          (while (search-forward "\r" nil t)
-           (delete-backward-char 1))))
+           (delete-char -1))))
 
       (while (or (re-search-forward gnus-uu-begin-string nil t)
                 (re-search-forward gnus-uu-body-line nil t))
@@ -2123,5 +2170,4 @@ If no file has been included, the user will be asked for a file."
 
 (provide 'gnus-uu)
 
-;;; arch-tag: 05312384-0a83-4720-9a58-b3160b888853
 ;;; gnus-uu.el ends here