tm 7.38.
[elisp/tm.git] / gnus / tm-sgnus.el
index 14d10ca..ed7c0b6 100644 (file)
@@ -1,14 +1,33 @@
 ;;;
-;;; tm-sgnus.el --- tm-gnus module for September GNUS
+;;; tm-sgnus.el --- tm-gnus module for September Gnus
 ;;;
 ;;; Copyright (C) 1995 Free Software Foundation, Inc.
 ;;; Copyright (C) 1995 MORIOKA Tomohiko
 ;;;
 ;;; Author: MORIOKA Tomohiko <morioka@jaist.ac.jp>
+;;;         MURATA Masahiro <murata@sol.cs.ritsumei.ac.jp>
+;;; Maintainer: MORIOKA Tomohiko <morioka@jaist.ac.jp>
+;;; Created: 1995/09/24
+;;; Version: $Revision: 7.28 $
 ;;; Keywords: news, MIME, multimedia, multilingual, encoded-word
 ;;;
 ;;; This file is part of tm (Tools for MIME).
 ;;;
+;;; This program 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.
+;;;
+;;; This program is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+;;; General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with This program.  If not, write to the Free Software
+;;; Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+;;;
+;;; Code:
 
 (require 'tl-str)
 (require 'tl-list)
 (require 'gnus)
 (require 'tm-gd5)
 
+(eval-when-compile (require 'cl))
+
 
 ;;; @ version
 ;;;
 
 (defconst tm-gnus/RCS-ID
-  "$Id: tm-sgnus.el,v 7.18 1995/11/19 08:29:23 morioka Exp $")
+  "$Id: tm-sgnus.el,v 7.28 1995/12/22 07:50:17 morioka Exp $")
 
 (defconst tm-gnus/version
   (concat (get-version-string tm-gnus/RCS-ID) " for September"))
@@ -65,26 +86,32 @@ This variable is set to `gnus-show-mime'.")
 
 (defun tm-gnus/summary-toggle-header (&optional arg)
   (interactive "P")
-  (if (and gnus-show-mime
-          (or (not gnus-strict-mime)
-              (save-excursion
-                (set-buffer gnus-article-buffer)
-                (gnus-fetch-field "Mime-Version")
-                )))
-      (let ((mime-viewer/ignored-field-regexp
-            (if (save-excursion
-                  (set-buffer gnus-article-buffer)
-                  (some-element
-                   (lambda (field)
-                     (rfc822/get-field-body field)
-                     )
-                   mime-viewer/ignored-field-list))
-                mime-viewer/ignored-field-regexp
-              "^:$")))
-       (gnus-summary-select-article t t)
-       )
-    (gnus-summary-toggle-header arg)
-    ))
+  (if tm-gnus/automatic-mime-preview
+      (save-excursion
+       (set-buffer gnus-article-buffer)
+       (let* ((buffer-read-only nil)
+              (inhibit-point-motion-hooks t) 
+              (hidden (text-property-any 
+                       (goto-char (point-min)) (search-forward "\n\n")
+                       'invisible t))
+              e)
+         (goto-char (point-min))
+         (when (search-forward "\n\n" nil t)
+           (delete-region (point-min) (1- (point))))
+         (goto-char (point-min))
+         (save-excursion 
+           (set-buffer gnus-original-article-buffer)
+           (goto-char (point-min))
+           (setq e (1- (or (search-forward "\n\n" nil t) (point-max)))))
+         (insert-buffer-substring gnus-original-article-buffer 1 e)
+         (if (or (not hidden) (and (numberp arg) (< arg 0)))
+             (tm-gnus/content-header-filter)
+           (mime/decode-message-header))
+         (let ((gnus-inhibit-hiding t))
+           (run-hooks 'gnus-article-display-hook))
+         ))
+    (gnus-summary-toggle-header arg))
+  )
 
 (define-key gnus-summary-mode-map "v" (function tm-gnus/view-message))
 (define-key gnus-summary-mode-map
@@ -97,11 +124,14 @@ This variable is set to `gnus-show-mime'.")
 ;;;
 
 (defun mime-viewer/quitting-method-for-sgnus ()
-  (mime-viewer/kill-buffer)
+  (if (not gnus-show-mime)
+      (mime-viewer/kill-buffer))
   (delete-other-windows)
   (gnus-article-show-summary)
-  (gnus-summary-display-article (gnus-summary-article-number))
-  )
+  (if (or (not gnus-show-mime)
+         (null gnus-have-all-headers))
+      (gnus-summary-select-article nil t)
+    ))
 
 (call-after-loaded
  'tm-view
@@ -109,12 +139,19 @@ This variable is set to `gnus-show-mime'.")
    (set-alist 'mime-viewer/quitting-method-alist
              'gnus-original-article-mode
              (function mime-viewer/quitting-method-for-sgnus))
+   (set-alist 'mime-viewer/show-summary-method
+             'gnus-original-article-mode
+             (function mime-viewer/quitting-method-for-sgnus))
    ))
 
 
 ;;; @ for tm-partial
 ;;;
 
+(defun tm-gnus/partial-preview-function ()
+  (tm-gnus/view-message (gnus-summary-article-number))
+  )
+
 (call-after-loaded
  'tm-partial
  (lambda ()
@@ -126,9 +163,7 @@ This variable is set to `gnus-show-mime'.")
                ))
    (set-alist 'tm-partial/preview-article-method-alist
              'gnus-original-article-mode
-             '(lambda ()
-                (tm-gnus/view-message (gnus-summary-article-number))
-                ))
+             'tm-gnus/partial-preview-function)
    ))
 
 
@@ -171,6 +206,57 @@ This variable is set to `gnus-show-mime'.")
       (tm::gnus-article-hide-headers-if-wanted)
       ))
 
+(defun tm-gnus/preview-cut-header ()
+  (save-restriction
+    (let ((ignored mime-viewer/ignored-field-regexp)
+         (visible mime-viewer/visible-field-regexp)
+         want-list beg)
+      (goto-char (point-min))
+      (narrow-to-region 
+       (point) 
+       (progn (search-forward "\n\n" nil t) (forward-line -1) (point)))
+      (goto-char (point-min))
+      (while (re-search-forward "^[^ \t]*:" nil t)
+       (beginning-of-line)
+       ;; We add the headers we want to keep to a list and delete
+       ;; them from the buffer.
+       (if (or (and visible (looking-at visible))
+               (and ignored (not (looking-at ignored))))
+           (progn
+             (push (buffer-substring
+                    (setq beg (point))
+                    (progn 
+                      (forward-line 1)
+                      ;; Be sure to get multi-line headers...
+                      (re-search-forward "^[^ \t]*:" nil t)
+                      (beginning-of-line) 
+                      (point)))
+                   want-list)
+             (delete-region beg (point)))
+         (forward-line 1)))
+      ;; Sort the headers that we want to display.
+      (setq want-list (sort want-list 'gnus-article-header-less))
+      (goto-char (point-min))
+      (while want-list
+       (insert (pop want-list)))
+      (add-text-properties 
+       (point) (point-max)
+       (nconc (list 'gnus-type 'headers) gnus-hidden-properties))
+      )))
+
+(defun tm-gnus/content-header-filter ()
+  (tm-gnus/preview-cut-header)
+  (mime/decode-message-header)
+  )
+
+
+;;; @ set up
+;;;
+
+(set-alist 'mime-viewer/content-header-filter-alist
+          'gnus-original-article-mode
+          (function tm-gnus/content-header-filter))
+
 
 ;;; @ for BBDB
 ;;;