Mercurial > hg > xemacs-beta
comparison lisp/gnus/nnkiboze.el @ 16:0293115a14e9 r19-15b91
Import from CVS: tag r19-15b91
author | cvs |
---|---|
date | Mon, 13 Aug 2007 08:49:20 +0200 |
parents | 376386a54a3c |
children | d95e72db5c07 |
comparison
equal
deleted
inserted
replaced
15:ad457d5f7d04 | 16:0293115a14e9 |
---|---|
1 ;;; nnkiboze.el --- select virtual news access for Gnus | 1 ;;; nnkiboze.el --- select virtual news access for Gnus |
2 ;; Copyright (C) 1995,96 Free Software Foundation, Inc. | 2 ;; Copyright (C) 1995,96,97 Free Software Foundation, Inc. |
3 | 3 |
4 ;; Author: Lars Magne Ingebrigtsen <larsi@ifi.uio.no> | 4 ;; Author: Lars Magne Ingebrigtsen <larsi@ifi.uio.no> |
5 ;; Keywords: news | 5 ;; Keywords: news |
6 | 6 |
7 ;; This file is part of GNU Emacs. | 7 ;; This file is part of GNU Emacs. |
22 ;; Boston, MA 02111-1307, USA. | 22 ;; Boston, MA 02111-1307, USA. |
23 | 23 |
24 ;;; Commentary: | 24 ;;; Commentary: |
25 | 25 |
26 ;; The other access methods (nntp, nnspool, etc) are general news | 26 ;; The other access methods (nntp, nnspool, etc) are general news |
27 ;; access methods. This module relies on Gnus and can not be used | 27 ;; access methods. This module relies on Gnus and can't be used |
28 ;; separately. | 28 ;; separately. |
29 | 29 |
30 ;;; Code: | 30 ;;; Code: |
31 | 31 |
32 (require 'nntp) | 32 (require 'nntp) |
35 (require 'gnus-score) | 35 (require 'gnus-score) |
36 (require 'nnoo) | 36 (require 'nnoo) |
37 (eval-when-compile (require 'cl)) | 37 (eval-when-compile (require 'cl)) |
38 | 38 |
39 (nnoo-declare nnkiboze) | 39 (nnoo-declare nnkiboze) |
40 (defvoo nnkiboze-directory gnus-directory | 40 (defvoo nnkiboze-directory (nnheader-concat gnus-directory "kiboze/") |
41 "nnkiboze will put its files in this directory.") | 41 "nnkiboze will put its files in this directory.") |
42 | 42 |
43 (defvoo nnkiboze-level 9 | 43 (defvoo nnkiboze-level 9 |
44 "*The maximum level to be searched for articles.") | 44 "The maximum level to be searched for articles.") |
45 | 45 |
46 (defvoo nnkiboze-remove-read-articles t | 46 (defvoo nnkiboze-remove-read-articles t |
47 "*If non-nil, nnkiboze will remove read articles from the kiboze group.") | 47 "If non-nil, nnkiboze will remove read articles from the kiboze group.") |
48 | |
49 (defvoo nnkiboze-ephemeral nil | |
50 "If non-nil, don't store any data anywhere.") | |
51 | |
52 (defvoo nnkiboze-scores nil | |
53 "Score rules for generating the nnkiboze group.") | |
54 | |
55 (defvoo nnkiboze-regexp nil | |
56 "Regexp for matching component groups.") | |
48 | 57 |
49 | 58 |
50 | 59 |
51 (defconst nnkiboze-version "nnkiboze 1.0" | 60 (defconst nnkiboze-version "nnkiboze 1.0") |
52 "Version numbers of this version of nnkiboze.") | |
53 | 61 |
54 (defvoo nnkiboze-current-group nil) | 62 (defvoo nnkiboze-current-group nil) |
55 (defvoo nnkiboze-current-score-group "") | |
56 (defvoo nnkiboze-status-string "") | 63 (defvoo nnkiboze-status-string "") |
57 | 64 |
65 (defvoo nnkiboze-headers nil) | |
66 | |
58 | 67 |
59 | 68 |
60 ;;; Interface functions. | 69 ;;; Interface functions. |
61 | 70 |
62 (nnoo-define-basics nnkiboze) | 71 (nnoo-define-basics nnkiboze) |
63 | 72 |
64 (deffoo nnkiboze-retrieve-headers (articles &optional group server fetch-old) | 73 (deffoo nnkiboze-retrieve-headers (articles &optional group server fetch-old) |
65 (nnkiboze-possibly-change-newsgroups group) | 74 (nnkiboze-possibly-change-group group) |
66 (if gnus-nov-is-evil | 75 (unless gnus-nov-is-evil |
67 nil | |
68 (if (stringp (car articles)) | 76 (if (stringp (car articles)) |
69 'headers | 77 'headers |
70 (let ((first (car articles)) | 78 (let ((nov (nnkiboze-nov-file-name))) |
71 (last (progn (while (cdr articles) (setq articles (cdr articles))) | 79 (when (file-exists-p nov) |
72 (car articles))) | 80 (save-excursion |
73 (nov (nnkiboze-nov-file-name))) | 81 (set-buffer nntp-server-buffer) |
74 (if (file-exists-p nov) | 82 (erase-buffer) |
75 (save-excursion | 83 (nnheader-insert-file-contents nov) |
76 (set-buffer nntp-server-buffer) | 84 (nnheader-nov-delete-outside-range |
77 (erase-buffer) | 85 (car articles) (car (last articles))) |
78 (insert-file-contents nov) | 86 'nov)))))) |
79 (goto-char (point-min)) | |
80 (while (and (not (eobp)) (< first (read (current-buffer)))) | |
81 (forward-line 1)) | |
82 (beginning-of-line) | |
83 (if (not (eobp)) (delete-region 1 (point))) | |
84 (while (and (not (eobp)) (>= last (read (current-buffer)))) | |
85 (forward-line 1)) | |
86 (beginning-of-line) | |
87 (if (not (eobp)) (delete-region (point) (point-max))) | |
88 'nov)))))) | |
89 | |
90 (deffoo nnkiboze-open-server (newsgroups &optional something) | |
91 (gnus-make-directory nnkiboze-directory) | |
92 (nnheader-init-server-buffer)) | |
93 | |
94 (deffoo nnkiboze-server-opened (&optional server) | |
95 (and nntp-server-buffer | |
96 (get-buffer nntp-server-buffer))) | |
97 | 87 |
98 (deffoo nnkiboze-request-article (article &optional newsgroup server buffer) | 88 (deffoo nnkiboze-request-article (article &optional newsgroup server buffer) |
99 (nnkiboze-possibly-change-newsgroups newsgroup) | 89 (nnkiboze-possibly-change-group newsgroup) |
100 (if (not (numberp article)) | 90 (if (not (numberp article)) |
101 ;; This is a real kludge. It might not work at times, but it | 91 ;; This is a real kludge. It might not work at times, but it |
102 ;; does no harm I think. The only alternative is to offer no | 92 ;; does no harm I think. The only alternative is to offer no |
103 ;; article fetching by message-id at all. | 93 ;; article fetching by message-id at all. |
104 (nntp-request-article article newsgroup gnus-nntp-server buffer) | 94 (nntp-request-article article newsgroup gnus-nntp-server buffer) |
105 (let* ((header (gnus-summary-article-header article)) | 95 (let* ((header (gnus-summary-article-header article)) |
106 (xref (mail-header-xref header)) | 96 (xref (mail-header-xref header))) |
107 igroup iarticle) | 97 (unless xref |
108 (or xref (error "nnkiboze: No xref")) | 98 (error "nnkiboze: No xref")) |
109 (or (string-match " \\([^ ]+\\):\\([0-9]+\\)" xref) | 99 (unless (string-match " \\([^ ]+\\):\\([0-9]+\\)" xref) |
110 (error "nnkiboze: Malformed xref")) | 100 (error "nnkiboze: Malformed xref")) |
111 (setq igroup (substring xref (match-beginning 1) (match-end 1))) | 101 (gnus-request-article (string-to-int (match-string 2 xref)) |
112 (setq iarticle (string-to-int | 102 (match-string 1 xref) |
113 (substring xref (match-beginning 2) (match-end 2)))) | 103 buffer)))) |
114 (and (gnus-request-group igroup t) | 104 |
115 (gnus-request-article iarticle igroup buffer))))) | 105 (deffoo nnkiboze-request-scan (&optional group server) |
106 (nnkiboze-generate-group (concat "nnkiboze:" group))) | |
116 | 107 |
117 (deffoo nnkiboze-request-group (group &optional server dont-check) | 108 (deffoo nnkiboze-request-group (group &optional server dont-check) |
118 "Make GROUP the current newsgroup." | 109 "Make GROUP the current newsgroup." |
119 (nnkiboze-possibly-change-newsgroups group) | 110 (nnkiboze-possibly-change-group group) |
120 (if dont-check | 111 (if dont-check |
121 () | 112 t |
122 (let ((nov-file (nnkiboze-nov-file-name)) | 113 (let ((nov-file (nnkiboze-nov-file-name)) |
123 beg end total) | 114 beg end total) |
124 (save-excursion | 115 (save-excursion |
125 (set-buffer nntp-server-buffer) | 116 (set-buffer nntp-server-buffer) |
126 (erase-buffer) | 117 (erase-buffer) |
127 (if (not (file-exists-p nov-file)) | 118 (if (not (file-exists-p nov-file)) |
128 (insert (format "211 0 0 0 %s\n" group)) | 119 (nnheader-report 'nnkiboze "Can't select group %s" group) |
129 (insert-file-contents nov-file) | 120 (nnheader-insert-file-contents nov-file) |
130 (if (zerop (buffer-size)) | 121 (if (zerop (buffer-size)) |
131 (insert (format "211 0 0 0 %s\n" group)) | 122 (nnheader-insert "211 0 0 0 %s\n" group) |
132 (goto-char (point-min)) | 123 (goto-char (point-min)) |
133 (and (looking-at "[0-9]+") (setq beg (read (current-buffer)))) | 124 (when (looking-at "[0-9]+") |
125 (setq beg (read (current-buffer)))) | |
134 (goto-char (point-max)) | 126 (goto-char (point-max)) |
135 (and (re-search-backward "^[0-9]" nil t) | 127 (when (re-search-backward "^[0-9]" nil t) |
136 (setq end (read (current-buffer)))) | 128 (setq end (read (current-buffer)))) |
137 (setq total (count-lines (point-min) (point-max))) | 129 (setq total (count-lines (point-min) (point-max))) |
138 (erase-buffer) | 130 (nnheader-insert "211 %d %d %d %s\n" total beg end group))))))) |
139 (insert (format "211 %d %d %d %s\n" total beg end group))))))) | |
140 t) | |
141 | 131 |
142 (deffoo nnkiboze-close-group (group &optional server) | 132 (deffoo nnkiboze-close-group (group &optional server) |
143 (nnkiboze-possibly-change-newsgroups group) | 133 (nnkiboze-possibly-change-group group) |
144 ;; Remove NOV lines of articles that are marked as read. | 134 ;; Remove NOV lines of articles that are marked as read. |
145 (when (and (file-exists-p (nnkiboze-nov-file-name)) | 135 (when (and (file-exists-p (nnkiboze-nov-file-name)) |
146 nnkiboze-remove-read-articles | 136 nnkiboze-remove-read-articles) |
147 (eq major-mode 'gnus-summary-mode)) | 137 (nnheader-temp-write (nnkiboze-nov-file-name) |
148 (save-excursion | 138 (let ((cur (current-buffer))) |
149 (let ((unreads gnus-newsgroup-unreads) | 139 (nnheader-insert-file-contents (nnkiboze-nov-file-name)) |
150 (unselected gnus-newsgroup-unselected) | 140 (goto-char (point-min)) |
151 (version-control 'never)) | 141 (while (not (eobp)) |
152 (set-buffer (get-buffer-create "*nnkiboze work*")) | 142 (if (not (gnus-article-read-p (read cur))) |
153 (buffer-disable-undo (current-buffer)) | 143 (forward-line 1) |
154 (erase-buffer) | 144 (gnus-delete-line)))))) |
155 (let ((cur (current-buffer)) | 145 (setq nnkiboze-current-group nil)) |
156 article) | 146 |
157 (insert-file-contents (nnkiboze-nov-file-name)) | 147 (deffoo nnkiboze-open-server (server &optional defs) |
158 (goto-char (point-min)) | 148 (unless (assq 'nnkiboze-regexp defs) |
159 (while (looking-at "[0-9]+") | 149 (push `(nnkiboze-regexp ,server) |
160 (if (or (memq (setq article (read cur)) unreads) | 150 defs)) |
161 (memq article unselected)) | 151 (nnoo-change-server 'nnkiboze server defs)) |
162 (forward-line 1) | |
163 (delete-region (progn (beginning-of-line) (point)) | |
164 (progn (forward-line 1) (point))))) | |
165 (write-file (nnkiboze-nov-file-name)) | |
166 (kill-buffer (current-buffer))))) | |
167 (setq nnkiboze-current-group nil))) | |
168 | |
169 (deffoo nnkiboze-request-list (&optional server) | |
170 (nnheader-report 'nnkiboze "LIST is not implemented.")) | |
171 | |
172 (deffoo nnkiboze-request-newgroups (date &optional server) | |
173 "List new groups." | |
174 (nnheader-report 'nnkiboze "NEWGROUPS is not supported.")) | |
175 | |
176 (deffoo nnkiboze-request-list-newsgroups (&optional server) | |
177 (nnheader-report 'nnkiboze "LIST NEWSGROUPS is not implemented.")) | |
178 | 152 |
179 (deffoo nnkiboze-request-delete-group (group &optional force server) | 153 (deffoo nnkiboze-request-delete-group (group &optional force server) |
180 (nnkiboze-possibly-change-newsgroups group) | 154 (nnkiboze-possibly-change-group group) |
181 (when force | 155 (when force |
182 (let ((files (list (nnkiboze-nov-file-name) | 156 (let ((files (list (nnkiboze-nov-file-name) |
183 (concat nnkiboze-directory group ".newsrc") | 157 (concat nnkiboze-directory group ".newsrc") |
184 (nnkiboze-score-file group)))) | 158 (nnkiboze-score-file group)))) |
185 (while files | 159 (while files |
187 (file-writable-p (car files)) | 161 (file-writable-p (car files)) |
188 (delete-file (car files))) | 162 (delete-file (car files))) |
189 (setq files (cdr files))))) | 163 (setq files (cdr files))))) |
190 (setq nnkiboze-current-group nil)) | 164 (setq nnkiboze-current-group nil)) |
191 | 165 |
166 (nnoo-define-skeleton nnkiboze) | |
167 | |
192 | 168 |
193 ;;; Internal functions. | 169 ;;; Internal functions. |
194 | 170 |
195 (defun nnkiboze-possibly-change-newsgroups (group) | 171 (defun nnkiboze-possibly-change-group (group) |
196 (setq nnkiboze-current-group group)) | 172 (setq nnkiboze-current-group group)) |
197 | 173 |
198 (defun nnkiboze-prefixed-name (group) | 174 (defun nnkiboze-prefixed-name (group) |
199 (gnus-group-prefixed-name group '(nnkiboze ""))) | 175 (gnus-group-prefixed-name group '(nnkiboze ""))) |
200 | 176 |
207 (gnus-use-dribble-file nil) | 183 (gnus-use-dribble-file nil) |
208 (gnus-read-active-file t) | 184 (gnus-read-active-file t) |
209 (gnus-expert-user t)) | 185 (gnus-expert-user t)) |
210 (gnus)) | 186 (gnus)) |
211 (let* ((gnus-newsrc-alist (gnus-copy-sequence gnus-newsrc-alist)) | 187 (let* ((gnus-newsrc-alist (gnus-copy-sequence gnus-newsrc-alist)) |
212 (newsrc gnus-newsrc-alist) | 188 (newsrc (cdr gnus-newsrc-alist)) |
213 gnus-newsrc-hashtb) | 189 gnus-newsrc-hashtb info) |
214 (gnus-make-hashtable-from-newsrc-alist) | 190 (gnus-make-hashtable-from-newsrc-alist) |
215 ;; We have copied all the newsrc alist info over to local copies | 191 ;; We have copied all the newsrc alist info over to local copies |
216 ;; so that we can mess all we want with these lists. | 192 ;; so that we can mess all we want with these lists. |
217 (while newsrc | 193 (while (setq info (pop newsrc)) |
218 (if (string-match "nnkiboze" (caar newsrc)) | 194 (when (string-match "nnkiboze" (gnus-info-group info)) |
219 ;; For each kiboze group, we call this function to generate | 195 ;; For each kiboze group, we call this function to generate |
220 ;; it. | 196 ;; it. |
221 (nnkiboze-generate-group (caar newsrc))) | 197 (nnkiboze-generate-group (gnus-info-group info)))))) |
222 (setq newsrc (cdr newsrc))))) | |
223 | 198 |
224 (defun nnkiboze-score-file (group) | 199 (defun nnkiboze-score-file (group) |
225 (list (expand-file-name | 200 (list (expand-file-name |
226 (concat (file-name-as-directory gnus-kill-files-directory) | 201 (concat (file-name-as-directory gnus-kill-files-directory) |
227 (nnheader-translate-file-chars | 202 (nnheader-translate-file-chars |
228 (concat nnkiboze-current-score-group | 203 (concat (nnkiboze-prefixed-name nnkiboze-current-group) |
229 "." gnus-score-file-suffix)))))) | 204 "." gnus-score-file-suffix)))))) |
230 | 205 |
231 (defun nnkiboze-generate-group (group) | 206 (defun nnkiboze-generate-group (group) |
232 (let* ((info (nth 2 (gnus-gethash group gnus-newsrc-hashtb))) | 207 (let* ((info (nth 2 (gnus-gethash group gnus-newsrc-hashtb))) |
233 (newsrc-file (concat nnkiboze-directory group ".newsrc")) | 208 (newsrc-file (concat nnkiboze-directory group ".newsrc")) |
234 (nov-file (concat nnkiboze-directory group ".nov")) | 209 (nov-file (concat nnkiboze-directory group ".nov")) |
235 (regexp (nth 1 (nth 4 info))) | 210 method nnkiboze-newsrc gname newsrc active |
211 ginfo lowest glevel orig-info nov-buffer | |
212 ;; Bind various things to nil to make group entry faster. | |
236 (gnus-expert-user t) | 213 (gnus-expert-user t) |
237 (gnus-large-newsgroup nil) | 214 (gnus-large-newsgroup nil) |
238 (version-control 'never) | |
239 (gnus-score-find-score-files-function 'nnkiboze-score-file) | 215 (gnus-score-find-score-files-function 'nnkiboze-score-file) |
216 (gnus-verbose (min gnus-verbose 3)) | |
240 gnus-select-group-hook gnus-summary-prepare-hook | 217 gnus-select-group-hook gnus-summary-prepare-hook |
241 gnus-thread-sort-functions gnus-show-threads | 218 gnus-thread-sort-functions gnus-show-threads |
242 gnus-visual | 219 gnus-visual gnus-suppress-duplicates) |
243 method nnkiboze-newsrc nov-buffer gname newsrc active | 220 (unless info |
244 ginfo lowest glevel) | 221 (error "No such group: %s" group)) |
245 (setq nnkiboze-current-score-group group) | |
246 (or info (error "No such group: %s" group)) | |
247 ;; Load the kiboze newsrc file for this group. | 222 ;; Load the kiboze newsrc file for this group. |
248 (and (file-exists-p newsrc-file) (load newsrc-file)) | 223 (when (file-exists-p newsrc-file) |
249 ;; We also load the nov file for this group. | 224 (load newsrc-file)) |
250 (save-excursion | 225 (nnheader-temp-write nov-file |
251 (set-buffer (setq nov-buffer (find-file-noselect nov-file))) | 226 (insert-file-contents nov-file) |
252 (buffer-disable-undo (current-buffer))) | 227 (setq nov-buffer (current-buffer)) |
253 ;; Go through the active hashtb and add new all groups that match the | 228 ;; Go through the active hashtb and add new all groups that match the |
254 ;; kiboze regexp. | 229 ;; kiboze regexp. |
255 (mapatoms | 230 (mapatoms |
256 (lambda (group) | 231 (lambda (group) |
257 (and (string-match regexp (setq gname (symbol-name group))) ; Match | 232 (and (string-match nnkiboze-regexp |
258 (not (assoc gname nnkiboze-newsrc)) ; It isn't registered | 233 (setq gname (symbol-name group))) ; Match |
259 (numberp (car (symbol-value group))) ; It is active | 234 (not (assoc gname nnkiboze-newsrc)) ; It isn't registered |
260 (or (> nnkiboze-level 7) | 235 (numberp (car (symbol-value group))) ; It is active |
261 (and (setq glevel (nth 1 (nth 2 (gnus-gethash | 236 (or (> nnkiboze-level 7) |
262 gname gnus-newsrc-hashtb)))) | 237 (and (setq glevel (nth 1 (nth 2 (gnus-gethash |
263 (>= nnkiboze-level glevel))) | 238 gname gnus-newsrc-hashtb)))) |
264 (not (string-match "^nnkiboze:" gname)) ; Exclude kibozes | 239 (>= nnkiboze-level glevel))) |
265 (setq nnkiboze-newsrc | 240 (not (string-match "^nnkiboze:" gname)) ; Exclude kibozes |
266 (cons (cons gname (1- (car (symbol-value group)))) | 241 (push (cons gname (1- (car (symbol-value group)))) |
267 nnkiboze-newsrc)))) | 242 nnkiboze-newsrc))) |
268 gnus-active-hashtb) | 243 gnus-active-hashtb) |
269 ;; `newsrc' is set to the list of groups that possibly are | 244 ;; `newsrc' is set to the list of groups that possibly are |
270 ;; component groups to this kiboze group. This list has elements | 245 ;; component groups to this kiboze group. This list has elements |
271 ;; on the form `(GROUP . NUMBER)', where NUMBER is the highest | 246 ;; on the form `(GROUP . NUMBER)', where NUMBER is the highest |
272 ;; number that has been kibozed in GROUP in this kiboze group. | 247 ;; number that has been kibozed in GROUP in this kiboze group. |
273 (setq newsrc nnkiboze-newsrc) | 248 (setq newsrc nnkiboze-newsrc) |
274 (while newsrc | 249 (while newsrc |
275 (if (not (setq active (gnus-gethash | 250 (if (not (setq active (gnus-gethash |
276 (caar newsrc) gnus-active-hashtb))) | 251 (caar newsrc) gnus-active-hashtb))) |
277 ;; This group isn't active after all, so we remove it from | 252 ;; This group isn't active after all, so we remove it from |
278 ;; the list of component groups. | 253 ;; the list of component groups. |
279 (setq nnkiboze-newsrc (delq (car newsrc) nnkiboze-newsrc)) | 254 (setq nnkiboze-newsrc (delq (car newsrc) nnkiboze-newsrc)) |
280 (setq lowest (cdar newsrc)) | 255 (setq lowest (cdar newsrc)) |
281 ;; Ok, we have a valid component group, so we jump to it. | 256 ;; Ok, we have a valid component group, so we jump to it. |
282 (switch-to-buffer gnus-group-buffer) | 257 (switch-to-buffer gnus-group-buffer) |
283 (gnus-group-jump-to-group (caar newsrc)) | 258 (gnus-group-jump-to-group (caar newsrc)) |
284 ;; We set all list of article marks to nil. Since we operate | 259 (gnus-message 3 "nnkiboze: Checking %s..." (caar newsrc)) |
285 ;; on copies of the real lists, we can destroy anything we | 260 (setq ginfo (gnus-get-info (gnus-group-group-name)) |
286 ;; want here. | 261 orig-info (gnus-copy-sequence ginfo)) |
287 (and (setq ginfo (nth 2 (gnus-gethash (gnus-group-group-name) | 262 (unwind-protect |
288 gnus-newsrc-hashtb))) | 263 (progn |
289 (nth 3 ginfo) | 264 ;; We set all list of article marks to nil. Since we operate |
290 (setcar (nthcdr 3 ginfo) nil)) | 265 ;; on copies of the real lists, we can destroy anything we |
291 ;; We set the list of read articles to be what we expect for | 266 ;; want here. |
292 ;; this kiboze group -- either nil or `(1 . LOWEST)'. | 267 (when (nth 3 ginfo) |
293 (and ginfo (setcar (nthcdr 2 ginfo) | 268 (setcar (nthcdr 3 ginfo) nil)) |
294 (and (not (= lowest 1)) (cons 1 lowest)))) | 269 ;; We set the list of read articles to be what we expect for |
295 (if (not (and (or (not ginfo) | 270 ;; this kiboze group -- either nil or `(1 . LOWEST)'. |
296 (> (length (gnus-list-of-unread-articles | 271 (when ginfo |
297 (car ginfo))) 0)) | 272 (setcar (nthcdr 2 ginfo) |
298 (progn | 273 (and (not (= lowest 1)) (cons 1 lowest)))) |
299 (gnus-group-select-group nil) | 274 (when (and (or (not ginfo) |
300 (eq major-mode 'gnus-summary-mode)))) | 275 (> (length (gnus-list-of-unread-articles |
301 () ; No unread articles, or we couldn't enter this group. | 276 (car ginfo))) |
302 ;; We are now in the group where we want to be. | 277 0)) |
303 (setq method (gnus-find-method-for-group gnus-newsgroup-name)) | 278 (progn |
304 (and (eq method gnus-select-method) (setq method nil)) | 279 (gnus-group-select-group nil) |
305 ;; We go through the list of scored articles. | 280 (eq major-mode 'gnus-summary-mode))) |
306 (while gnus-newsgroup-scored | 281 ;; We are now in the group where we want to be. |
307 (if (> (caar gnus-newsgroup-scored) lowest) | 282 (setq method (gnus-find-method-for-group |
308 ;; If it has a good score, then we enter this article | 283 gnus-newsgroup-name)) |
309 ;; into the kiboze group. | 284 (when (eq method gnus-select-method) |
310 (nnkiboze-enter-nov | 285 (setq method nil)) |
311 nov-buffer | 286 ;; We go through the list of scored articles. |
312 (gnus-summary-article-header | 287 (while gnus-newsgroup-scored |
313 (caar gnus-newsgroup-scored)) | 288 (when (> (caar gnus-newsgroup-scored) lowest) |
314 (if method | 289 ;; If it has a good score, then we enter this article |
315 (gnus-group-prefixed-name gnus-newsgroup-name method) | 290 ;; into the kiboze group. |
316 gnus-newsgroup-name))) | 291 (nnkiboze-enter-nov |
317 (setq gnus-newsgroup-scored (cdr gnus-newsgroup-scored))) | 292 nov-buffer |
318 ;; That's it. We exit this group. | 293 (gnus-summary-article-header |
319 (gnus-summary-exit-no-update))) | 294 (caar gnus-newsgroup-scored)) |
320 (setcdr (car newsrc) (car active)) | 295 gnus-newsgroup-name)) |
321 (setq newsrc (cdr newsrc))) | 296 (setq gnus-newsgroup-scored (cdr gnus-newsgroup-scored))) |
322 ;; We save the nov file. | 297 ;; That's it. We exit this group. |
323 (set-buffer nov-buffer) | 298 (gnus-summary-exit-no-update))) |
324 (save-buffer) | 299 ;; Restore the proper info. |
325 (kill-buffer (current-buffer)) | 300 (when ginfo |
301 (setcdr ginfo (cdr orig-info))))) | |
302 (setcdr (car newsrc) (car active)) | |
303 (gnus-message 3 "nnkiboze: Checking %s...done" (caar newsrc)) | |
304 (setq newsrc (cdr newsrc)))) | |
326 ;; We save the kiboze newsrc for this group. | 305 ;; We save the kiboze newsrc for this group. |
327 (set-buffer (get-buffer-create "*nnkiboze work*")) | 306 (nnheader-temp-write newsrc-file |
328 (buffer-disable-undo (current-buffer)) | 307 (insert "(setq nnkiboze-newsrc '") |
329 (erase-buffer) | 308 (gnus-prin1 nnkiboze-newsrc) |
330 (insert "(setq nnkiboze-newsrc '" (prin1-to-string nnkiboze-newsrc) | 309 (insert ")\n")) |
331 ")\n") | 310 t)) |
332 (write-file newsrc-file) | |
333 (kill-buffer (current-buffer)) | |
334 (switch-to-buffer gnus-group-buffer) | |
335 (gnus-group-list-groups 5 nil))) | |
336 | 311 |
337 (defun nnkiboze-enter-nov (buffer header group) | 312 (defun nnkiboze-enter-nov (buffer header group) |
338 (save-excursion | 313 (save-excursion |
339 (set-buffer buffer) | 314 (set-buffer buffer) |
340 (goto-char (point-max)) | 315 (goto-char (point-max)) |
316 (debug) | |
341 (let ((xref (mail-header-xref header)) | 317 (let ((xref (mail-header-xref header)) |
342 (prefix (gnus-group-real-prefix group)) | 318 (prefix (gnus-group-real-prefix group)) |
319 (oheader (copy-sequence header)) | |
343 (first t) | 320 (first t) |
344 article) | 321 article) |
345 (if (zerop (forward-line -1)) | 322 (if (zerop (forward-line -1)) |
346 (progn | 323 (progn |
347 (setq article (1+ (read (current-buffer)))) | 324 (setq article (1+ (read (current-buffer)))) |
348 (forward-line 1)) | 325 (forward-line 1)) |
349 (setq article 1)) | 326 (setq article 1)) |
350 (insert (int-to-string article) "\t" | 327 (mail-header-set-number oheader article) |
351 (or (mail-header-subject header) "") "\t" | 328 (nnheader-insert-nov oheader) |
352 (or (mail-header-from header) "") "\t" | 329 (search-backward "\t" nil t 2) |
353 (or (mail-header-date header) "") "\t" | 330 (if (re-search-forward " [^ ]+:[0-9]+" nil t) |
354 (or (mail-header-id header) "") "\t" | 331 (goto-char (match-beginning 0)) |
355 (or (mail-header-references header) "") "\t" | 332 (forward-char 1)) |
356 (int-to-string (or (mail-header-chars header) 0)) "\t" | 333 ;; The first Xref has to be the group this article |
357 (int-to-string (or (mail-header-lines header) 0)) "\t") | 334 ;; really came for - this is the article nnkiboze |
358 (if (or (not xref) (equal "" xref)) | 335 ;; will request when it is asked for the article. |
359 (insert "Xref: " (system-name) " " group ":" | 336 (insert group ":" |
360 (int-to-string (mail-header-number header)) | 337 (int-to-string (mail-header-number header)) " ") |
361 "\t\n") | 338 (while (re-search-forward " [^ ]+:[0-9]+" nil t) |
362 (insert (mail-header-xref header) "\t\n") | 339 (goto-char (1+ (match-beginning 0))) |
363 (search-backward "\t" nil t) | 340 (insert prefix))))) |
364 (search-backward "\t" nil t) | |
365 (while (re-search-forward | |
366 "[^ ]+:[0-9]+" | |
367 (save-excursion (end-of-line) (point)) t) | |
368 (if first | |
369 ;; The first xref has to be the group this article | |
370 ;; really came for - this is the article nnkiboze | |
371 ;; will request when it is asked for the article. | |
372 (save-excursion | |
373 (goto-char (match-beginning 0)) | |
374 (insert prefix group ":" | |
375 (int-to-string (mail-header-number header)) " ") | |
376 (setq first nil))) | |
377 (save-excursion | |
378 (goto-char (match-beginning 0)) | |
379 (insert prefix))))))) | |
380 | 341 |
381 (defun nnkiboze-nov-file-name () | 342 (defun nnkiboze-nov-file-name () |
382 (concat (file-name-as-directory nnkiboze-directory) | 343 (concat (file-name-as-directory nnkiboze-directory) |
383 (nnheader-translate-file-chars | 344 (nnheader-translate-file-chars |
384 (concat (nnkiboze-prefixed-name nnkiboze-current-group) ".nov")))) | 345 (concat (nnkiboze-prefixed-name nnkiboze-current-group) ".nov")))) |