comparison lisp/tm/tm-gnus5.el @ 4:b82b59fe008d r19-15b3

Import from CVS: tag r19-15b3
author cvs
date Mon, 13 Aug 2007 08:46:56 +0200
parents
children
comparison
equal deleted inserted replaced
3:30df88044ec6 4:b82b59fe008d
1 ;;;
2 ;;; tm-gnus5.el --- MIME extender for Gnus 5.2 or later
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: 1.1.1.1 $
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-gnus5.el,v 1.1.1.1 1996/12/18 03:55:32 steve Exp $")
46
47 (defconst tm-gnus/version
48 (concat (get-version-string tm-gnus/RCS-ID) " for Gnus 5.2 or later"))
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 (decode-mime-charset-region (point-min)(point-max) default-mime-charset)
118 (mime/decode-message-header)
119 )
120
121 (set-alist 'mime-viewer/content-header-filter-alist
122 'gnus-original-article-mode
123 (function tm-gnus/content-header-filter))
124
125 (set-alist 'mime-viewer/code-converter-alist
126 'gnus-original-article-mode
127 (function mime-charset/decode-buffer))
128
129 (defun mime-viewer/quitting-method-for-gnus5 ()
130 (if (not gnus-show-mime)
131 (mime-viewer/kill-buffer))
132 (delete-other-windows)
133 (gnus-article-show-summary)
134 (if (or (not gnus-show-mime)
135 (null gnus-have-all-headers))
136 (gnus-summary-select-article nil t)
137 ))
138
139 (set-alist 'mime-viewer/quitting-method-alist
140 'gnus-original-article-mode
141 (function mime-viewer/quitting-method-for-gnus5))
142 (set-alist 'mime-viewer/show-summary-method
143 'gnus-original-article-mode
144 (function mime-viewer/quitting-method-for-gnus5))
145
146
147 ;;; @ for tm-edit
148 ;;;
149
150 ;; suggested by OKABE Yasuo <okabe@kudpc.kyoto-u.ac.jp>
151 ;; 1995/11/08 (c.f. [tm ML:1067])
152 (defun tm-gnus/insert-article (&optional message)
153 (interactive)
154 (let ((message-cite-function 'mime-editor/inserted-message-filter)
155 (message-reply-buffer gnus-original-article-buffer)
156 )
157 (message-yank-original nil)
158 ))
159
160 ;;; modified by Steven L. Baur <steve@miranova.com>
161 ;;; 1995/12/6 (c.f. [tm-en:209])
162 (defun mime-editor/attach-to-news-reply-menu ()
163 "Arrange to attach MIME editor's popup menu to VM's"
164 (if (boundp 'news-reply-menu)
165 (progn
166 (setq news-reply-menu (append news-reply-menu
167 '("---")
168 mime-editor/popup-menu-for-xemacs))
169 (remove-hook 'news-setup-hook
170 'mime-editor/attach-to-news-reply-menu)
171 )))
172
173 (call-after-loaded
174 'tm-edit
175 (function
176 (lambda ()
177 (set-alist 'mime-editor/message-inserter-alist
178 'message-mode (function tm-gnus/insert-article))
179 (if (string-match "XEmacs\\|Lucid" emacs-version)
180 (add-hook 'news-setup-hook 'mime-editor/attach-to-news-reply-menu)
181 )
182
183 (set-alist 'mime-editor/split-message-sender-alist
184 'message-mode
185 (lambda ()
186 (interactive)
187 (let (message-send-hook
188 message-sent-message-via)
189 (message-send)
190 )))
191 )))
192
193
194 ;;; @ for tm-partial
195 ;;;
196
197 (defun tm-gnus/partial-preview-function ()
198 (tm-gnus/view-message (gnus-summary-article-number))
199 )
200
201 (call-after-loaded
202 'tm-partial
203 (lambda ()
204 (set-atype 'mime/content-decoding-condition
205 '((type . "message/partial")
206 (method . mime-article/grab-message/partials)
207 (major-mode . gnus-original-article-mode)
208 (summary-buffer-exp . gnus-summary-buffer)
209 ))
210 (set-alist 'tm-partial/preview-article-method-alist
211 'gnus-original-article-mode
212 'tm-gnus/partial-preview-function)
213 ))
214
215
216 ;;; @ article filter
217 ;;;
218
219 (defun tm-gnus/article-reset-variable ()
220 (setq tm-gnus/automatic-mime-preview nil)
221 )
222
223 (add-hook 'gnus-article-prepare-hook 'tm-gnus/article-reset-variable)
224
225 (defun tm-gnus/preview-article ()
226 (make-local-variable 'tm:mother-button-dispatcher)
227 (setq tm:mother-button-dispatcher
228 (function gnus-article-push-button))
229 (let ((mime-viewer/ignored-field-regexp "^:$")
230 (default-mime-charset
231 (save-excursion
232 (set-buffer gnus-summary-buffer)
233 default-mime-charset))
234 )
235 (mime/viewer-mode nil nil nil gnus-original-article-buffer
236 gnus-article-buffer
237 gnus-article-mode-map)
238 )
239 (setq tm-gnus/automatic-mime-preview t)
240 (run-hooks 'tm-gnus/article-prepare-hook)
241 )
242
243 (setq gnus-show-mime-method (function tm-gnus/preview-article))
244
245 (defun tm-gnus/article-decode-encoded-word ()
246 (decode-mime-charset-region (point-min)(point-max)
247 (save-excursion
248 (set-buffer gnus-summary-buffer)
249 default-mime-charset))
250 (mime/decode-message-header)
251 (run-hooks 'tm-gnus/article-prepare-hook)
252 )
253
254 (setq gnus-decode-encoded-word-method
255 (function tm-gnus/article-decode-encoded-word))
256
257
258 ;;; @ for mule (Multilingual support)
259 ;;;
260
261 (defvar gnus-newsgroup-default-charset-alist nil)
262
263 (defun gnus-set-newsgroup-default-charset (newsgroup charset)
264 "Set CHARSET for the NEWSGROUP as default MIME charset."
265 (set-alist 'gnus-newsgroup-default-charset-alist
266 (concat "^" (regexp-quote newsgroup) "\\($\\|\\.\\)")
267 charset))
268
269 (cond
270 ((featurep 'mule)
271 (cond ((boundp 'MULE) ; for MULE 1.* and 2.*.
272 (define-service-coding-system gnus-nntp-service nil *noconv*)
273 (if (and (boundp 'nntp-server-process)
274 (processp nntp-server-process)
275 )
276 (set-process-coding-system nntp-server-process *noconv* *noconv*)
277 )
278 )
279 (running-xemacs-20 ; for XEmacs/mule.
280 (if (and (boundp 'nntp-server-process)
281 (processp nntp-server-process)
282 )
283 (set-process-input-coding-system nntp-server-process 'noconv)
284 )
285 ))
286 (call-after-loaded
287 'nnheader
288 (lambda ()
289 (defun nnheader-find-file-noselect (filename &optional nowarn rawfile)
290 (let ((file-coding-system-for-read *noconv*))
291 (find-file-noselect filename nowarn rawfile)
292 ))
293 (defun nnheader-insert-file-contents-literally
294 (filename &optional visit beg end replace)
295 (let ((file-coding-system-for-read *noconv*))
296 (insert-file-contents-literally filename visit beg end replace)
297 ))
298 ))
299 ;; Please use Gnus 5.2.10 or later if you use Mule.
300 (call-after-loaded
301 'nnmail
302 (lambda ()
303 (defun nnmail-find-file (file)
304 "Insert FILE in server buffer safely. [tm-gnus5.el]"
305 (set-buffer nntp-server-buffer)
306 (erase-buffer)
307 (let ((format-alist nil)
308 (after-insert-file-functions ; for jam-code-guess
309 (if (memq 'jam-code-guess-after-insert-file-function
310 after-insert-file-functions)
311 '(jam-code-guess-after-insert-file-function)))
312 (file-coding-system-for-read *noconv*))
313 (condition-case ()
314 (progn (insert-file-contents file) t)
315 (file-error nil))))
316 ))
317 (defun tm-gnus/prepare-save-mail-function ()
318 (setq file-coding-system *noconv*)
319 )
320 (add-hook 'nnmail-prepare-save-mail-hook
321 'tm-gnus/prepare-save-mail-function)
322
323 (gnus-set-newsgroup-default-charset "alt.chinese" 'hz)
324 (gnus-set-newsgroup-default-charset "alt.chinese.text.big5" 'big5)
325 (gnus-set-newsgroup-default-charset "tw" 'big5)
326 (gnus-set-newsgroup-default-charset "hk" 'big5)
327 (gnus-set-newsgroup-default-charset "hkstar" 'big5)
328 (gnus-set-newsgroup-default-charset "han" 'euc-kr)
329 (gnus-set-newsgroup-default-charset "relcom" 'koi8-r)
330 ))
331
332
333 ;;; @ summary filter
334 ;;;
335
336 (defun tm-gnus/decode-summary-from-and-subjects ()
337 (let ((rest gnus-newsgroup-default-charset-alist)
338 cell)
339 (catch 'tag
340 (while (setq cell (car rest))
341 (if (string-match (car cell) gnus-newsgroup-name)
342 (throw 'tag
343 (progn
344 (make-local-variable 'default-mime-charset)
345 (setq default-mime-charset (cdr cell))
346 )))
347 (setq rest (cdr rest))
348 )))
349 (mapcar
350 (lambda (header)
351 (let ((from (or (mail-header-from header) ""))
352 (subj (or (mail-header-subject header) ""))
353 (method (car gnus-current-select-method))
354 )
355 (if (eq method 'nntp)
356 (progn
357 (setq from
358 (decode-mime-charset-string from default-mime-charset))
359 (setq subj
360 (decode-mime-charset-string subj default-mime-charset))
361 ))
362 (mail-header-set-from
363 header (mime-eword/decode-string from))
364 (mail-header-set-subject
365 header (mime-eword/decode-string subj))
366 ))
367 gnus-newsgroup-headers))
368
369 (or (boundp 'nnheader-encoded-words-decoding)
370 (add-hook 'gnus-select-group-hook
371 'tm-gnus/decode-summary-from-and-subjects)
372 )
373
374
375 ;;; @ for BBDB
376 ;;;
377
378 (call-after-loaded
379 'bbdb
380 (lambda ()
381 (require 'tm-bbdb)
382 ))
383
384 (autoload 'tm-bbdb/update-record "tm-bbdb")
385
386 (defun tm-gnus/bbdb-setup ()
387 (if (memq 'bbdb/gnus-update-record gnus-article-prepare-hook)
388 (progn
389 (remove-hook 'gnus-article-prepare-hook 'bbdb/gnus-update-record)
390 (add-hook 'gnus-article-display-hook 'tm-bbdb/update-record)
391 )))
392
393 (add-hook 'gnus-startup-hook 'tm-gnus/bbdb-setup t)
394
395 (tm-gnus/bbdb-setup)
396
397
398 ;;; @ end
399 ;;;
400
401 (provide 'tm-gnus5)
402
403 ;;; tm-gnus5.el ends here