86f6b6ba0e34ab0faf20545c4a60d95583f1fc7b
[elisp/tm.git] / gnus / tm-sgnus.el
1 ;;;
2 ;;; tm-sgnus.el --- MIME extender for Gnus 5.2
3 ;;;
4 ;;; Copyright (C) 1995 Free Software Foundation, Inc.
5 ;;; Copyright (C) 1995,1996 MORIOKA Tomohiko
6 ;;;
7 ;;; Author: MORIOKA Tomohiko <morioka@jaist.ac.jp>
8 ;;; Maintainer: MORIOKA Tomohiko <morioka@jaist.ac.jp>
9 ;;;         and KOBAYASHI Shuhei <shuhei-k@jaist.ac.jp>
10 ;;; Created: 1995/09/24
11 ;;; Version: $Revision: 7.68 $
12 ;;; Keywords: news, MIME, multimedia, multilingual, encoded-word
13 ;;;
14 ;;; This file is part of tm (Tools for MIME).
15 ;;;
16 ;;; This program is free software; you can redistribute it and/or
17 ;;; modify it under the terms of the GNU General Public License as
18 ;;; published by the Free Software Foundation; either version 2, or
19 ;;; (at your option) any later version.
20 ;;;
21 ;;; This program is distributed in the hope that it will be useful,
22 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
23 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
24 ;;; General Public License for more details.
25 ;;;
26 ;;; You should have received a copy of the GNU General Public License
27 ;;; along with This program.  If not, write to the Free Software
28 ;;; Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
29 ;;;
30 ;;; Code:
31
32 (require 'tl-str)
33 (require 'tl-list)
34 (require 'tl-misc)
35 (require 'tm-view)
36 (require 'gnus)
37
38 (eval-when-compile (require 'cl))
39
40
41 ;;; @ version
42 ;;;
43
44 (defconst tm-gnus/RCS-ID
45   "$Id: tm-sgnus.el,v 7.68 1996/06/07 15:28:40 morioka Exp $")
46
47 (defconst tm-gnus/version
48   (concat (get-version-string tm-gnus/RCS-ID) " for September"))
49
50
51 ;;; @ variables
52 ;;;
53
54 (defvar tm-gnus/automatic-mime-preview t
55   "*If non-nil, show MIME processed article.
56 This variable is set to `gnus-show-mime'.")
57
58 (setq gnus-show-mime tm-gnus/automatic-mime-preview)
59
60
61 ;;; @ command functions
62 ;;;
63
64 (defun tm-gnus/view-message (arg)
65   "MIME decode and play this message."
66   (interactive "P")
67   (let ((gnus-break-pages nil))
68     (gnus-summary-select-article t t)
69     )
70   (pop-to-buffer gnus-original-article-buffer t)
71   (let (buffer-read-only)
72     (if (text-property-any (point-min) (point-max) 'invisible t)
73         (remove-text-properties (point-min) (point-max)
74                                 gnus-hidden-properties)
75       ))
76   (mime/viewer-mode nil nil nil gnus-original-article-buffer
77                     gnus-article-buffer)
78   )
79
80 (defun tm-gnus/summary-scroll-down ()
81   "Scroll down one line current article."
82   (interactive)
83   (gnus-summary-scroll-up -1)
84   )
85
86 (defun tm-gnus/summary-toggle-header (&optional arg)
87   (interactive "P")
88   (if tm-gnus/automatic-mime-preview
89       (let* ((hidden
90               (save-excursion
91                 (set-buffer gnus-article-buffer)
92                 (text-property-any 
93                  (goto-char (point-min)) (search-forward "\n\n")
94                  'invisible t)
95                 ))
96              (mime-viewer/redisplay t)
97              )
98         (gnus-summary-select-article hidden t)
99         )
100     (gnus-summary-toggle-header arg))
101   )
102
103 (define-key gnus-summary-mode-map "v" (function tm-gnus/view-message))
104 (define-key gnus-summary-mode-map
105   "\e\r" (function tm-gnus/summary-scroll-down))
106 (substitute-key-definition
107  'gnus-summary-toggle-header
108  'tm-gnus/summary-toggle-header gnus-summary-mode-map)
109
110
111 ;;; @ for tm-view
112 ;;;
113
114 (defun tm-gnus/content-header-filter ()
115   (goto-char (point-min))
116   (mime-preview/cut-header)
117   (mime-charset-decode-region (point-min)(point-max)
118                               mime/default-coding-system)
119   (mime/decode-message-header)
120   )
121
122 (set-alist 'mime-viewer/content-header-filter-alist
123            'gnus-original-article-mode
124            (function tm-gnus/content-header-filter))
125
126 (set-alist 'mime-viewer/code-converter-alist
127            'gnus-original-article-mode
128            (function mime-charset-decode-region))
129
130 (defun mime-viewer/quitting-method-for-sgnus ()
131   (if (not gnus-show-mime)
132       (mime-viewer/kill-buffer))
133   (delete-other-windows)
134   (gnus-article-show-summary)
135   (if (or (not gnus-show-mime)
136           (null gnus-have-all-headers))
137       (gnus-summary-select-article nil t)
138     ))
139
140 (set-alist 'mime-viewer/quitting-method-alist
141            'gnus-original-article-mode
142            (function mime-viewer/quitting-method-for-sgnus))
143 (set-alist 'mime-viewer/show-summary-method
144            'gnus-original-article-mode
145            (function mime-viewer/quitting-method-for-sgnus))
146
147
148 ;;; @ for tm-edit
149 ;;;
150
151 ;; suggested by OKABE Yasuo <okabe@kudpc.kyoto-u.ac.jp>
152 ;;      1995/11/08 (c.f. [tm ML:1067])
153 (defun tm-gnus/insert-article (&optional message)
154   (interactive)
155   (let ((message-cite-function 'mime-editor/inserted-message-filter)
156         (message-reply-buffer gnus-original-article-buffer)
157         )
158     (message-yank-original nil)
159     ))
160
161 ;;; modified by Steven L. Baur <steve@miranova.com>
162 ;;;     1995/12/6 (c.f. [tm-en:209])
163 (defun mime-editor/attach-to-news-reply-menu ()
164   "Arrange to attach MIME editor's popup menu to VM's"
165   (if (boundp 'news-reply-menu)
166       (progn
167         (setq news-reply-menu (append news-reply-menu
168                                       '("---")
169                                       mime-editor/popup-menu-for-xemacs))
170         (remove-hook 'news-setup-hook
171                      'mime-editor/attach-to-news-reply-menu)
172         )))
173
174 (call-after-loaded
175  'tm-edit
176  (function
177   (lambda ()
178     (set-alist
179      'mime-editor/message-inserter-alist
180      'message-mode (function tm-gnus/insert-article))
181     (if (string-match "XEmacs\\|Lucid" emacs-version)
182         (add-hook 'news-setup-hook 'mime-editor/attach-to-news-reply-menu)
183       )
184     )))
185
186
187 ;;; @ for tm-partial
188 ;;;
189
190 (defun tm-gnus/partial-preview-function ()
191   (tm-gnus/view-message (gnus-summary-article-number))
192   )
193
194 (call-after-loaded
195  'tm-partial
196  (lambda ()
197    (set-atype 'mime/content-decoding-condition
198               '((type . "message/partial")
199                 (method . mime-article/grab-message/partials)
200                 (major-mode . gnus-original-article-mode)
201                 (summary-buffer-exp . gnus-summary-buffer)
202                 ))
203    (set-alist 'tm-partial/preview-article-method-alist
204               'gnus-original-article-mode
205               'tm-gnus/partial-preview-function)
206    ))
207
208
209 ;;; @ article filter
210 ;;;
211
212 (defun tm-gnus/article-reset-variable ()
213   (setq tm-gnus/automatic-mime-preview nil)
214   )
215
216 (add-hook 'gnus-article-prepare-hook 'tm-gnus/article-reset-variable)
217
218 (defun tm-gnus/preview-article ()
219   (make-local-variable 'tm:mother-button-dispatcher)
220   (setq tm:mother-button-dispatcher
221         (function gnus-article-push-button))
222   (let ((mime-viewer/ignored-field-regexp "^:$")
223         (mime/default-coding-system
224          (save-excursion
225            (set-buffer gnus-summary-buffer)
226            mime/default-coding-system)))
227     (mime/viewer-mode nil nil nil gnus-original-article-buffer
228                       gnus-article-buffer)
229     )
230   (setq tm-gnus/automatic-mime-preview t)
231   (run-hooks 'tm-gnus/article-prepare-hook)
232   )
233
234 (setq gnus-show-mime-method (function tm-gnus/preview-article))
235
236 (defun tm-gnus/article-decode-encoded-word ()
237   (character-decode-region (point-min)(point-max)
238                            (save-excursion
239                              (set-buffer gnus-summary-buffer)
240                              mime/default-coding-system))
241   (mime/decode-message-header)
242   (run-hooks 'tm-gnus/article-prepare-hook)
243   )
244
245 (setq gnus-decode-encoded-word-method
246       (function tm-gnus/article-decode-encoded-word))
247
248
249 ;;; @ for MULE
250 ;;;
251
252 (defvar gnus-newsgroup-default-coding-system-alist nil)
253
254 (defun gnus-set-newsgroup-default-coding-system (ng cs)
255   "Define CS as default coding system for newsgroup NG."
256   (set-alist 'gnus-newsgroup-default-coding-system-alist
257              (concat "^" (regexp-quote ng) "\\($\\|\\.\\)")
258              cs))
259
260 (cond
261  ((featurep 'mule)
262   (cond ((boundp 'MULE)
263          (define-service-coding-system gnus-nntp-service nil *noconv*)
264          (if (and (boundp 'nntp-server-process)
265                   (processp nntp-server-process)
266                   )
267              (set-process-coding-system nntp-server-process *noconv* *noconv*)
268            )
269          )
270         (running-xemacs-20
271          (if (and (boundp 'nntp-server-process)
272                   (processp nntp-server-process)
273                   )
274              (set-process-input-coding-system nntp-server-process 'noconv)
275            )
276          ))
277   (call-after-loaded
278    'nnheader
279    (lambda ()
280      (defun nnheader-find-file-noselect (filename &optional nowarn rawfile)
281        (let ((file-coding-system-for-read *noconv*))
282          (find-file-noselect filename nowarn rawfile)
283          ))
284      (defun nnheader-insert-file-contents-literally
285        (filename &optional visit beg end replace)
286        (let ((file-coding-system-for-read *noconv*))
287          (insert-file-contents-literally filename visit beg end replace)
288          ))
289      ))
290   ;; Please use Gnus 5.2.10 or later if you use Mule.
291   (call-after-loaded
292    'nnmail
293    (lambda ()
294      (defun nnmail-find-file (file)
295        "Insert FILE in server buffer safely. [tm-sgnus.el]"
296        (set-buffer nntp-server-buffer)
297        (erase-buffer)
298        (let ((format-alist nil)
299              (after-insert-file-functions   ; for jam-code-guess
300               (if (memq 'jam-code-guess-after-insert-file-function
301                         after-insert-file-functions)
302                   '(jam-code-guess-after-insert-file-function)))
303              (file-coding-system-for-read *noconv*))
304          (condition-case ()
305              (progn (insert-file-contents file) t)
306            (file-error nil))))
307      ))
308   (defun tm-gnus/prepare-save-mail-function ()
309     (setq file-coding-system *noconv*)
310     )
311   (add-hook 'nnmail-prepare-save-mail-hook
312             'tm-gnus/prepare-save-mail-function)
313   
314   (gnus-set-newsgroup-default-coding-system "alt.chinese.text"      *hz*)
315   (gnus-set-newsgroup-default-coding-system "alt.chinese.text.big5" *big5*)
316   (gnus-set-newsgroup-default-coding-system "han"    *euc-kr*)
317   (and (boundp '*koi8*)
318        (gnus-set-newsgroup-default-coding-system "relcom" *koi8*))
319   ))
320
321
322 ;;; @ summary filter
323 ;;;
324
325 (defun tm-gnus/decode-summary-from-and-subjects ()
326   (let ((rest gnus-newsgroup-default-coding-system-alist)
327         cell)
328     (catch 'tag
329       (while (setq cell (car rest))
330         (if (string-match (car cell) gnus-newsgroup-name)
331             (throw 'tag
332                    (progn
333                      (make-local-variable 'mime/default-coding-system)
334                      (setq mime/default-coding-system (cdr cell))
335                      )))
336         (setq rest (cdr rest))
337         )))
338   (mapcar
339    (lambda (header)
340      (let ((from (or (mail-header-from header) ""))
341            (subj (or (mail-header-subject header) ""))
342            (method (car gnus-current-select-method))
343            )
344        (if (eq method 'nntp)
345            (progn
346              (setq from
347                    (character-decode-string from mime/default-coding-system))
348              (setq subj
349                    (character-decode-string subj mime/default-coding-system))
350              ))
351        (mail-header-set-from
352         header (mime-eword/decode-string from))
353        (mail-header-set-subject
354         header (mime-eword/decode-string subj))
355        ))
356    gnus-newsgroup-headers))
357      
358 (or (boundp 'nnheader-encoded-words-decoding)
359     (add-hook 'gnus-select-group-hook
360               'tm-gnus/decode-summary-from-and-subjects)
361     )
362
363
364 ;;; @ for BBDB
365 ;;;
366
367 (call-after-loaded
368  'bbdb
369  (lambda ()
370    (require 'tm-bbdb)
371    ))
372
373 (autoload 'tm-bbdb/update-record "tm-bbdb")
374
375 (defun tm-gnus/bbdb-setup ()
376   (if (memq 'bbdb/gnus-update-record gnus-article-prepare-hook)
377       (progn
378         (remove-hook 'gnus-article-prepare-hook 'bbdb/gnus-update-record)
379         (add-hook 'gnus-article-display-hook 'tm-bbdb/update-record)
380         )))
381
382 (add-hook 'gnus-startup-hook 'tm-gnus/bbdb-setup t)
383
384 (tm-gnus/bbdb-setup)
385
386
387 ;;; @ end
388 ;;;
389
390 (provide 'tm-sgnus)
391
392 ;;; tm-sgnus.el ends here