2001-06-12 11:00:00 ShengHuo ZHU <zsh@cs.rochester.edu>
[gnus] / lisp / gnus-art.el
index 5910096..28dc570 100644 (file)
@@ -2758,7 +2758,9 @@ If variable `gnus-use-long-file-name' is non-nil, it is
       (expand-file-name
        (if (gnus-use-long-file-name 'not-save)
           newsgroup
-        (expand-file-name "news" (gnus-newsgroup-directory-form newsgroup)))
+        (file-relative-name
+         (expand-file-name "news" (gnus-newsgroup-directory-form newsgroup))
+         default-directory))
        gnus-article-save-directory)))
 
 (defun gnus-sender-save-name (newsgroup headers &optional last-file)
@@ -2889,6 +2891,7 @@ If variable `gnus-use-long-file-name' is non-nil, it is
      article-strip-trailing-space
      article-strip-blank-lines
      article-strip-all-blank-lines
+     article-replace-with-quoted-text
      article-date-local
      article-date-english
      article-date-iso8601
@@ -2939,12 +2942,9 @@ If variable `gnus-use-long-file-name' is non-nil, it is
 (substitute-key-definition
  'undefined 'gnus-article-read-summary-keys gnus-article-mode-map)
 
-(eval-when-compile
-  (defvar gnus-article-commands-menu))
-
-(defvar gnus-article-post-menu nil)
-
 (defun gnus-article-make-menu-bar ()
+  (unless (boundp 'gnus-article-commands-menu)
+    (gnus-summary-make-menu-bar))
   (gnus-turn-off-edit-menu 'article)
   (unless (boundp 'gnus-article-article-menu)
     (easy-menu-define
@@ -2973,18 +2973,9 @@ If variable `gnus-use-long-file-name' is non-nil, it is
        ["Decode HZ" gnus-article-decode-HZ t]))
 
     ;; Note "Commands" menu is defined in gnus-sum.el for consistency
-    
-    (when (boundp 'gnus-summary-post-menu)
-      (cond 
-       ((not (keymapp gnus-summary-post-menu))
-       (setq gnus-article-post-menu gnus-summary-post-menu))
-       ((not gnus-article-post-menu)
-       ;; Don't share post menu.
-       (setq gnus-article-post-menu
-             (copy-keymap gnus-summary-post-menu))))
-      (define-key gnus-article-mode-map [menu-bar post]
-       (cons "Post" gnus-article-post-menu)))
 
+    ;; Note "Post" menu is defined in gnus-sum.el for consistency
+    
     (gnus-run-hooks 'gnus-article-menu-hook)))
 
 ;; Fixme: do something for the Emacs tool bar in Article mode a la
@@ -3255,7 +3246,9 @@ If ALL-HEADERS is non-nil, no headers are hidden."
 
 (defun gnus-article-mime-part-status ()
   (if gnus-article-mime-handle-alist-1
-      (format " (%d parts)" (length gnus-article-mime-handle-alist-1))
+      (if (eq 1 (length gnus-article-mime-handle-alist-1))
+         " (1 part)"
+       (format " (%d parts)" (length gnus-article-mime-handle-alist-1)))
     ""))
 
 (defvar gnus-mime-button-map
@@ -3484,7 +3477,8 @@ If ALL-HEADERS is non-nil, no headers are hidden."
        (goto-char b)))))
 
 (defun gnus-mime-view-part-as-charset (&optional handle arg)
-  "Insert the MIME part under point into the current buffer."
+  "Insert the MIME part under point into the current buffer using the
+specified charset."
   (interactive (list nil current-prefix-arg))
   (gnus-article-check-buffer)
   (let* ((handle (or handle (get-text-property (point) 'gnus-data)))
@@ -3519,7 +3513,7 @@ If ALL-HEADERS is non-nil, no headers are hidden."
 
 (defun gnus-mime-internalize-part (&optional handle)
   "View the MIME part under point with an internal viewer.
-In no internal viewer is available, use an external viewer."
+If no internal viewer is available, use an external viewer."
   (interactive)
   (gnus-article-check-buffer)
   (let* ((handle (or handle (get-text-property (point) 'gnus-data)))
@@ -4309,10 +4303,16 @@ Argument LINES specifies lines to be scrolled down."
       (save-excursion
        (set-buffer gnus-article-current-summary)
        (let (gnus-pick-mode)
-         (push (elt key 0) unread-command-events)
-         (setq key (if (featurep 'xemacs)
-                       (events-to-keys (read-key-sequence "Describe key: "))
-                     (read-key-sequence "Describe key: "))))
+         (if (featurep 'xemacs)
+             (progn
+               (push (elt key 0) unread-command-events)
+               (setq key (events-to-keys 
+                          (read-key-sequence "Describe key: "))))
+           (setq unread-command-events 
+                 (mapcar 
+                  (lambda (x) (if (>= x 128) (list 'meta (- x 128)) x))
+                  (string-to-list key)))
+           (setq key (read-key-sequence "Describe key: "))))
        (describe-key key))
     (describe-key key)))
 
@@ -4324,10 +4324,16 @@ Argument LINES specifies lines to be scrolled down."
       (save-excursion
        (set-buffer gnus-article-current-summary)
        (let (gnus-pick-mode)
-         (push (elt key 0) unread-command-events)
-         (setq key (if (featurep 'xemacs)
-                       (events-to-keys (read-key-sequence "Describe key: "))
-                     (read-key-sequence "Describe key: "))))
+         (if (featurep 'xemacs)
+             (progn
+               (push (elt key 0) unread-command-events)
+               (setq key (events-to-keys 
+                          (read-key-sequence "Describe key: "))))
+           (setq unread-command-events 
+                 (mapcar 
+                  (lambda (x) (if (>= x 128) (list 'meta (- x 128)) x))
+                  (string-to-list key)))
+           (setq key (read-key-sequence "Describe key: "))))
        (describe-key-briefly key insert))
     (describe-key-briefly key insert)))
 
@@ -4589,6 +4595,7 @@ groups."
     (set-buffer gnus-article-buffer)
     (gnus-article-edit-mode)
     (funcall start-func)
+    (set-buffer-modified-p nil)
     (gnus-configure-windows 'edit-article)
     (setq gnus-article-edit-done-function exit-func)
     (setq gnus-prev-winconf winconf)
@@ -4677,9 +4684,10 @@ groups."
   :type 'regexp)
 
 (defcustom gnus-button-alist
-  `(("<\\(url:[>\n\t ]*?\\)?news:[>\n\t ]*\\([^>\n\t ]*@[^>\n\t ]*\\)>"
-     0 t gnus-button-message-id 2)
-    ("\\bnews:\\([^>\n\t ]*@[^>)!;:,\n\t ]*\\)" 0 t gnus-button-message-id 1)
+  `(("<\\(url:[>\n\t ]*?\\)?\\(nntp\\|news\\):[>\n\t ]*\\([^>\n\t ]*@[^>\n\t ]*\\)>"
+     0 t gnus-button-handle-news 3)
+    ("\\b\\(nntp\\|news\\):\\([^>\n\t ]*@[^>)!;:,\n\t ]*\\)" 0 t
+     gnus-button-handle-news 2)
     ("\\(\\b<\\(url:[>\n\t ]*\\)?news:[>\n\t ]*\\(//\\)?\\([^>\n\t ]*\\)>\\)"
      1 t
      gnus-button-fetch-group 4)
@@ -5020,6 +5028,45 @@ specified by `gnus-button-alist'."
        (gnus-message 1 "You must define `%S' to use this button"
                      (cons fun args)))))))
 
+(defun gnus-parse-news-url (url)
+  (let (scheme server group message-id articles)
+    (with-temp-buffer
+      (insert url)
+      (goto-char (point-min))
+      (when (looking-at "\\([A-Za-z]+\\):")
+       (setq scheme (match-string 1))
+       (goto-char (match-end 0)))
+      (when (looking-at "//\\([^/]+\\)/")
+       (setq server (match-string 1))
+       (goto-char (match-end 0)))
+       
+      (cond
+       ((looking-at "\\(.*@.*\\)")
+       (setq message-id (match-string 1)))
+       ((looking-at "\\([^/]+\\)/\\([-0-9]+\\)")
+       (setq group (match-string 1)
+             articles (split-string (match-string 2) "-")))
+       ((looking-at "\\([^/]+\\)/?")
+       (setq group (match-string 1)))
+       (t
+       (error "Unknown news URL syntax"))))
+    (list scheme server group message-id articles)))
+
+(defun gnus-button-handle-news (url)
+  "Fetch a news URL."
+  (destructuring-bind (scheme server group message-id articles)
+      (gnus-parse-news-url url)
+    (cond
+     (message-id
+      (save-excursion
+       (set-buffer gnus-summary-buffer)
+       (if server
+           (let ((gnus-refer-article-method (list (list 'nntp server))))
+             (gnus-summary-refer-article message-id))
+         (gnus-summary-refer-article message-id))))
+     (group
+      (gnus-button-fetch-group url)))))
+
 (defun gnus-button-message-id (message-id)
   "Fetch MESSAGE-ID."
   (save-excursion