+Thu Sep 26 22:13:00 1996 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * nnweb.el (nnweb-altavista-wash-article): Didn't remove all
+ markup.
+
+ * gnus-nocem.el (gnus-nocem-check-article): Fix security hole.
+
+Thu Sep 26 20:23:11 1996 Lars Magne Ingebrigtsen <larsi@ylfing.ifi.uio.no>
+
+ * gnus-group.el (gnus-group-make-group): Accept an ARGS param.
+
+ * nnheader.el (nnheader-concat): Accept many file names.
+
+Thu Sep 26 19:53:09 1996 Kurt Swanson <kurt@dna.lth.se>
+
+ * gnus-art.el (gnus-header-content-face): Buggy color names.
+
+Thu Sep 26 14:57:38 1996 Lars Magne Ingebrigtsen <lars@eyesore.no>
+
+ * nnmail.el (nnmail-save-active): Rewrite.
+ (nnmail-generate-active): New function.
+
+ * gnus-util.el (gnus-delete-assq): New macro.
+ (gnus-delete-assoc): Ditto.
+
+Wed Sep 25 23:44:40 1996 Lars Magne Ingebrigtsen <lars@eyesore.no>
+
+ * gnus-sum.el (gnus-get-newsgroup-headers-xover): Just use one
+ single condition-case.
+
+Wed Sep 25 21:15:59 1996 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * gnus.el: Red Gnus v0.42 is released.
+
Wed Sep 25 19:40:34 1996 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
* gnus-art.el (gnus-header-newsgroups-face): Yucky on light
"^Gnus-Warning:" "^Resent-")
"All headers that do not match this regexp will be hidden.
This variable can also be a list of regexp of headers to remain visible.
-If this variable is non-nil, `article-ignored-headers' will be ignored."
+If this variable is non-nil, `gnus-article-ignored-headers' will be ignored."
:type '(repeat string) ;Leave monster regexp to lisp.
:group 'article)
(defface gnus-header-from-face
'((((class color)
(background dark))
- (:foreground "light-blue" :bold t :italic t))
+ (:foreground "light blue" :bold t :italic t))
(((class color)
(background light))
(:foreground "MidnightBlue" :bold t :italic t))
(defface gnus-header-content-face
'((((class color)
(background dark))
- (:foreground "foerestgreen" :italic t))
+ (:foreground "forest green" :italic t))
(((class color)
(background light))
(:foreground "DarkGreen" :italic t))
["Add the help group" gnus-group-make-help-group t]
["Add the archive group" gnus-group-make-archive-group t]
["Make a doc group" gnus-group-make-doc-group t]
+ ["Make a web group" gnus-group-make-web-group t]
["Make a kiboze group" gnus-group-make-kiboze-group t]
["Make a virtual group" gnus-group-make-empty-virtual t]
["Add a group to a virtual" gnus-group-add-to-virtual t]
(unless (gnus-check-server method)
(error "Unable to contact server: %s" (gnus-status-message method)))
(when activate
+ (gnus-activate-group group 'scan t)
(unless (gnus-request-group group)
(error "Couldn't request group: %s"
- (nnheader-get-report (car method))))
- (gnus-activate-group group nil t))
+ (nnheader-get-report (car method)))))
(if request-only
group
(condition-case ()
(interactive)
(gnus-enter-server-buffer))
-(defun gnus-group-make-group (name &optional method address)
+(defun gnus-group-make-group (name &optional method address args)
"Add a new newsgroup.
The user will be prompted for a NAME, for a select METHOD, and an
ADDRESS."
(require backend))
(gnus-check-server meth)
(and (gnus-check-backend-function 'request-create-group nname)
- (gnus-request-create-group nname))
+ (gnus-request-create-group nname nil args))
t))
(defun gnus-group-delete-group (group &optional force)
'gnus-group-web-search-history))
(method
`(nnweb ,group (nnweb-search ,search)
- (nnweb-type ,(intern type)))))
+ (nnweb-type ,(intern type))
+ (nnweb-ephemeral-p t))))
(if solid
- (gnus-group-make-group group method)
+ (gnus-group-make-group group "nnweb" "" `(,(intern type) ,search))
(gnus-group-read-ephemeral-group
group method t
(cons (current-buffer)
(funcall (gnus-get-function method 'request-restore-buffer)
article (gnus-group-real-name group) (nth 1 method))))
-(defun gnus-request-create-group (group &optional method)
+(defun gnus-request-create-group (group &optional method args)
(when (stringp method)
(setq method (gnus-server-to-method method)))
(let ((method (or method (gnus-find-method-for-group group))))
(funcall (gnus-get-function method 'request-create-group)
- (gnus-group-real-name group) (nth 1 method))))
+ (gnus-group-real-name group) (nth 1 method) args)))
(defun gnus-request-delete-group (group &optional force)
(let ((method (gnus-find-method-for-group group)))
(nnmail-days-to-time gnus-nocem-expiry-wait)))
(gnus-request-article-this-buffer (mail-header-number header) group)
(goto-char (point-min))
+ (when (re-search-forward "-----BEGIN PGP MESSAGE-----" nil t)
+ (delete-region (point-min) (match-beginning 0)))
+ (when (re-search-forward "-----END PGP MESSAGE-----\n?" nil t)
+ (delete-region (match-end 0) (point-max)))
+ (goto-char (point-min))
;; The article has to have proper NoCeM headers.
(when (and (setq b (search-forward "\n@@BEGIN NCM HEADERS\n" nil t))
(setq e (search-forward "\n@@BEGIN NCM BODY\n" nil t)))
(defmacro gnus-nov-field ()
'(buffer-substring (point) (if (gnus-nov-skip-field) (1- (point)) eol)))
-;; Goes through the xover lines and returns a list of vectors
-(defun gnus-get-newsgroup-headers-xover (sequence &optional
- force-new dependencies)
- "Parse the news overview data in the server buffer, and return a
-list of headers that match SEQUENCE (see `nntp-retrieve-headers')."
- ;; Get the Xref when the users reads the articles since most/some
- ;; NNTP servers do not include Xrefs when using XOVER.
- (setq gnus-article-internal-prepare-hook '(gnus-article-get-xrefs))
- (let ((cur nntp-server-buffer)
- (dependencies (or dependencies gnus-newsgroup-dependencies))
- number headers header)
- (save-excursion
- (set-buffer nntp-server-buffer)
- ;; Allow the user to mangle the headers before parsing them.
- (run-hooks 'gnus-parse-headers-hook)
- (goto-char (point-min))
- (while (and sequence (not (eobp)))
- (setq number (read cur))
- (while (and sequence (< (car sequence) number))
- (setq sequence (cdr sequence)))
- (and sequence
- (eq number (car sequence))
- (progn
- (setq sequence (cdr sequence))
- (if (setq header
- (inline (gnus-nov-parse-line
- number dependencies force-new)))
- (setq headers (cons header headers)))))
- (forward-line 1))
- (setq headers (nreverse headers)))
- headers))
-
;; This function has to be called with point after the article number
;; on the beginning of the line.
(defun gnus-nov-parse-line (number dependencies &optional force-new)
(narrow-to-region (point) eol)
(or (eobp) (forward-char))
- (condition-case nil
- (setq header
- (vector
- number ; number
- (gnus-nov-field) ; subject
- (gnus-nov-field) ; from
- (gnus-nov-field) ; date
- (setq id (or (gnus-nov-field)
- (concat "none+"
- (int-to-string
- (setq none (1+ none)))))) ; id
- (progn
- (save-excursion
- (let ((beg (point)))
- (search-forward "\t" eol)
- (if (search-backward ">" beg t)
- (setq ref
- (buffer-substring
- (1+ (point))
- (search-backward "<" beg t)))
- (setq ref nil))))
- (gnus-nov-field)) ; refs
- (gnus-nov-read-integer) ; chars
- (gnus-nov-read-integer) ; lines
- (if (= (following-char) ?\n)
- nil
- (gnus-nov-field)) ; misc
- ))
- (error (progn
- (gnus-error 4 "Strange nov line")
- (setq header nil)
- (goto-char eol))))
+ (setq header
+ (vector
+ number ; number
+ (gnus-nov-field) ; subject
+ (gnus-nov-field) ; from
+ (gnus-nov-field) ; date
+ (setq id (or (gnus-nov-field)
+ (concat "none+"
+ (int-to-string
+ (setq none (1+ none)))))) ; id
+ (progn
+ (save-excursion
+ (let ((beg (point)))
+ (search-forward "\t" eol)
+ (if (search-backward ">" beg t)
+ (setq ref
+ (buffer-substring
+ (1+ (point))
+ (search-backward "<" beg t)))
+ (setq ref nil))))
+ (gnus-nov-field)) ; refs
+ (gnus-nov-read-integer) ; chars
+ (gnus-nov-read-integer) ; lines
+ (if (= (following-char) ?\n)
+ nil
+ (gnus-nov-field)) ; misc
+ ))
(widen)
;; We build the thread tree.
- (when header
- (when (equal id ref)
- ;; This article refers back to itself. Naughty, naughty.
- (setq ref nil))
- (if (boundp (setq id-dep (intern id dependencies)))
- (if (and (car (symbol-value id-dep))
- (not force-new))
- ;; An article with this Message-ID has already been seen,
- ;; so we ignore this one, except we add any additional
- ;; Xrefs (in case the two articles came from different
- ;; servers.
- (progn
- (mail-header-set-xref
- (car (symbol-value id-dep))
- (concat (or (mail-header-xref
- (car (symbol-value id-dep))) "")
- (or (mail-header-xref header) "")))
- (setq header nil))
- (setcar (symbol-value id-dep) header))
- (set id-dep (list header))))
- (when header
- (if (boundp (setq ref-dep (intern (or ref "none") dependencies)))
- (setcdr (symbol-value ref-dep)
- (nconc (cdr (symbol-value ref-dep))
- (list (symbol-value id-dep))))
- (set ref-dep (list nil (symbol-value id-dep)))))
+ (when (equal id ref)
+ ;; This article refers back to itself. Naughty, naughty.
+ (setq ref nil))
+ (if (boundp (setq id-dep (intern id dependencies)))
+ (if (and (car (symbol-value id-dep))
+ (not force-new))
+ ;; An article with this Message-ID has already been seen,
+ ;; so we ignore this one, except we add any additional
+ ;; Xrefs (in case the two articles came from different
+ ;; servers.
+ (progn
+ (mail-header-set-xref
+ (car (symbol-value id-dep))
+ (concat (or (mail-header-xref
+ (car (symbol-value id-dep))) "")
+ (or (mail-header-xref header) "")))
+ (setq header nil))
+ (setcar (symbol-value id-dep) header))
+ (set id-dep (list header)))
+ (if (boundp (setq ref-dep (intern (or ref "none") dependencies)))
+ (setcdr (symbol-value ref-dep)
+ (nconc (cdr (symbol-value ref-dep))
+ (list (symbol-value id-dep))))
+ (set ref-dep (list nil (symbol-value id-dep))))
header))
+;; Goes through the xover lines and returns a list of vectors
+(defun gnus-get-newsgroup-headers-xover (sequence &optional
+ force-new dependencies)
+ "Parse the news overview data in the server buffer, and return a
+list of headers that match SEQUENCE (see `nntp-retrieve-headers')."
+ ;; Get the Xref when the users reads the articles since most/some
+ ;; NNTP servers do not include Xrefs when using XOVER.
+ (setq gnus-article-internal-prepare-hook '(gnus-article-get-xrefs))
+ (let ((cur nntp-server-buffer)
+ (dependencies (or dependencies gnus-newsgroup-dependencies))
+ number headers header)
+ (save-excursion
+ (set-buffer nntp-server-buffer)
+ ;; Allow the user to mangle the headers before parsing them.
+ (run-hooks 'gnus-parse-headers-hook)
+ (goto-char (point-min))
+ (while (not (eobp))
+ (condition-case ()
+ (while (and sequence (not (eobp)))
+ (setq number (read cur))
+ (while (and sequence
+ (< (car sequence) number))
+ (setq sequence (cdr sequence)))
+ (and sequence
+ (eq number (car sequence))
+ (progn
+ (setq sequence (cdr sequence))
+ (push (inline (gnus-nov-parse-line
+ number dependencies force-new))
+ headers)))
+ (forward-line 1))
+ (error
+ (progn
+ (gnus-error 4 "Strange nov line")
+ (forward-line 1)))))
+ (nreverse headers))))
+
(defun gnus-article-get-xrefs ()
"Fill in the Xref value in `gnus-current-headers', if necessary.
This is meant to be called in `gnus-article-internal-prepare-hook'."
(t gnus-reffed-article-number))
(current-buffer))
(insert " Article retrieved.\n"))
- ;(when (and header
- ; (memq (mail-header-number header) gnus-newsgroup-sparse))
- ; (setcar (gnus-id-to-thread id) nil))
(if (not (setq header (car (gnus-get-newsgroup-headers))))
() ; Malformed head.
(unless (memq (mail-header-number header) gnus-newsgroup-sparse)
(when (not (file-exists-p directory))
(make-directory directory t))
t)
-
+
+(defmacro gnus-delete-assq (key list)
+ `(let ((listval (eval ,list)))
+ (setq ,list (delq (assq ,key listval) listval))))
+
+(defmacro gnus-delete-assoc (key list)
+ `(let ((listval ,list))
+ (setq ,list (delq (assoc ,key listval) listval))))
+
+(defun gnus-delete-file (file)
+ "Delete FILE if it exists."
+ (when (file-exists-p file)
+ (delete-file file)))
+
(provide 'gnus-util)
;;; gnus-util.el ends here
"Score and kill file handling."
:group 'gnus )
-(defconst gnus-version-number "0.42"
+(defconst gnus-version-number "0.43"
"Version number for this version of Gnus.")
(defconst gnus-version (format "Red Gnus v%s" gnus-version-number)
(deffoo nnbabyl-close-group (group &optional server)
t)
-(deffoo nnbabyl-request-create-group (group &optional server)
+(deffoo nnbabyl-request-create-group (group &optional server args)
(nnmail-activate 'nnbabyl)
(unless (assoc group nnbabyl-group-alist)
(setq nnbabyl-group-alist (cons (list group (cons 1 0))
; get new mail from somewhere -- maybe this is not needed?
; --> todo
-(deffoo nndb-request-create-group (group &optional server)
+(deffoo nndb-request-create-group (group &optional server args)
"Creates a group if it doesn't exist yet."
(nntp-send-command "^[23].*\n" "MKGROUP" group))
(deffoo nndraft-close-group (group &optional server)
t)
-(deffoo nndraft-request-create-group (group &optional server)
+(deffoo nndraft-request-create-group (group &optional server args)
(if (file-exists-p nndraft-directory)
(if (file-directory-p nndraft-directory)
t
nnfolder-current-buffer nil)
t)
-(deffoo nnfolder-request-create-group (group &optional server)
+(deffoo nnfolder-request-create-group (group &optional server args)
(nnfolder-possibly-change-group nil server)
(nnmail-activate 'nnfolder)
(when group
(goto-char (point-min))
(delete-char 1)))))
+(defmacro nnheader-nov-skip-field ()
+ '(search-forward "\t" eol 'move))
+
+(defmacro nnheader-nov-field ()
+ '(buffer-substring (point) (if (nnheader-nov-skip-field) (1- (point)) eol)))
+
+(defmacro nnheader-nov-read-integer ()
+ '(prog1
+ (if (= (following-char) ?\t)
+ 0
+ (let ((num (condition-case nil (read (current-buffer)) (error nil))))
+ (if (numberp num) num 0)))
+ (or (eobp) (forward-char 1))))
+
+(defvar nnheader-none-counter 0)
+
+(defun nnheader-parse-nov ()
+ (let ((eol (gnus-point-at-eol)))
+ (vector
+ (nnheader-nov-read-integer) ; number
+ (nnheader-nov-field) ; subject
+ (nnheader-nov-field) ; from
+ (nnheader-nov-field) ; date
+ (or (nnheader-nov-field)
+ (concat "none+"
+ (int-to-string
+ (incf nnheader-none-counter)))) ; id
+ (nnheader-nov-field) ; refs
+ (nnheader-nov-read-integer) ; chars
+ (nnheader-nov-read-integer) ; lines
+ (if (= (following-char) ?\n)
+ nil
+ (nnheader-nov-field)) ; misc
+ )))
+
(defun nnheader-insert-nov (header)
(princ (mail-header-number header) (current-buffer))
(insert
(or (and (symbolp form) (fboundp form))
(and (listp form) (eq (car form) 'lambda))))
-(defun nnheader-concat (dir file)
+(defun nnheader-concat (dir &rest files)
"Concat DIR as directory to FILE."
- (concat (file-name-as-directory dir) file))
+ (apply 'concat (file-name-as-directory dir) files))
(defun nnheader-ms-strip-cr ()
"Strip ^M from the end of all lines."
(defun nnmail-save-active (group-assoc file-name)
"Save GROUP-ASSOC in ACTIVE-FILE."
(when file-name
- (let (group)
- (save-excursion
- (set-buffer (get-buffer-create " *nnmail active*"))
- (buffer-disable-undo (current-buffer))
- (erase-buffer)
- (while group-assoc
- (setq group (pop group-assoc))
- (insert (format "%s %d %d y\n" (car group) (cdadr group)
- (caadr group))))
- (unless (file-exists-p (file-name-directory file-name))
- (make-directory (file-name-directory file-name) t))
- (nnmail-write-region
- 1 (point-max) (expand-file-name file-name) nil 'nomesg)
- (kill-buffer (current-buffer))))))
+ (nnheader-temp-write file-name
+ (nnmail-generate-active group-assoc))))
+
+(defun nnmail-generate-active (alist)
+ "Generate an active file from group-alist ALIST."
+ (erase-buffer)
+ (let (group)
+ (while (setq group (pop alist))
+ (insert (format "%s %d %d y\n" (car group) (cdadr group)
+ (caadr group))))))
(defun nnmail-get-split-group (file group)
"Find out whether this FILE is to be split into GROUP only.
t)
(error nil))))
-(deffoo nnmh-request-create-group (group &optional server)
+(deffoo nnmh-request-create-group (group &optional server args)
(nnmail-activate 'nnmh)
(unless (assoc group nnmh-group-alist)
(let (active)
(setq nnml-article-file-alist nil)
t)
-(deffoo nnml-request-create-group (group &optional server)
+(deffoo nnml-request-create-group (group &optional server args)
(nnmail-activate 'nnml)
- (or (assoc group nnml-group-alist)
- (let (active)
- (setq nnml-group-alist (cons (list group (setq active (cons 1 0)))
- nnml-group-alist))
- (nnml-possibly-create-directory group)
- (nnml-possibly-change-directory group server)
- (let ((articles
- (nnheader-directory-articles nnml-current-directory )))
- (and articles
- (progn
- (setcar active (apply 'min articles))
- (setcdr active (apply 'max articles)))))
- (nnmail-save-active nnml-group-alist nnml-active-file)))
+ (unless (assoc group nnml-group-alist)
+ (let (active)
+ (push (list group (setq active (cons 1 0)))
+ nnml-group-alist)
+ (nnml-possibly-create-directory group)
+ (nnml-possibly-change-directory group server)
+ (let ((articles (nnheader-directory-articles nnml-current-directory)))
+ (when articles
+ (setcar active (apply 'min articles))
+ (setcdr active (apply 'max articles))))
+ (nnmail-save-active nnml-group-alist nnml-active-file)))
t)
(deffoo nnml-request-list (&optional server)
(nnoo-declare nnweb)
+(defvoo nnweb-directory (nnheader-concat gnus-directory "nnweb/")
+ "Where nnweb will save its files.")
+
(defvoo nnweb-type 'dejanews
"What search engine type is being used.")
(defvoo nnweb-max-hits 100
"Maximum number of hits to display.")
+(defvoo nnweb-ephemeral-p nil
+ "Whether this nnweb server is ephemeral.")
+
;;; Internal variables
(defvoo nnweb-articles nil)
(defvoo nnweb-buffer nil)
+(defvoo nnweb-group-alist nil)
+(defvoo nnweb-group nil)
+(defvoo nnweb-hashtb nil)
;;; Interface functions
(nnoo-define-basics nnweb)
(deffoo nnweb-retrieve-headers (articles &optional group server fetch-old)
- (nnweb-possibly-change-server server)
+ (nnweb-possibly-change-server group server)
(save-excursion
(set-buffer nntp-server-buffer)
(erase-buffer)
(nnheader-insert-nov header)))
'nov)))
+(deffoo nnweb-request-scan (&optional group server)
+ (nnweb-possibly-change-server group server)
+ (funcall (nnweb-definition 'map))
+ (unless nnweb-ephemeral-p
+ (nnweb-write-active)
+ (nnweb-write-overview group)))
+
(deffoo nnweb-request-group (group &optional server dont-check)
- (nnweb-possibly-change-server server)
- (when (or (not dont-check)
- (not nnweb-articles))
- (funcall (nnweb-definition 'map)))
+ (nnweb-possibly-change-server nil server)
+ (when (and (not (equal group nnweb-group))
+ (not nnweb-ephemeral-p))
+ (let ((info (assoc group nnweb-group-alist)))
+ (setq nnweb-group group)
+ (setq nnweb-type (nth 2 info))
+ (setq nnweb-search (nth 3 info))
+ (unless dont-check
+ (nnweb-read-overview group))))
(cond
((not nnweb-articles)
(nnheader-report 'nnweb "No matching articles"))
(t
- (nnheader-report 'nnweb "Opened group %s" group)
- (nnheader-insert
- "211 %d %d %d %s\n" (length nnweb-articles)
- (caar nnweb-articles) (caar (last nnweb-articles))
- group))))
+ (let ((active (if nnweb-ephemeral-p
+ (cons (caar nnweb-articles)
+ (caar (last nnweb-articles)))
+ (cadr (assoc group nnweb-group-alist)))))
+ (nnheader-report 'nnweb "Opened group %s" group)
+ (nnheader-insert
+ "211 %d %d %d %s\n" (length nnweb-articles)
+ (car active) (cdr active) group)))))
(deffoo nnweb-close-group (group &optional server)
- (nnweb-possibly-change-server server)
+ (nnweb-possibly-change-server group server)
(when (gnus-buffer-live-p nnweb-buffer)
(save-excursion
(set-buffer nnweb-buffer)
t)
(deffoo nnweb-request-article (article &optional group server buffer)
- (nnweb-possibly-change-server server)
+ (nnweb-possibly-change-server group server)
(save-excursion
(set-buffer (or buffer nntp-server-buffer))
(let ((url (caddr (assq article nnweb-articles))))
(kill-buffer nnweb-buffer)))
(nnoo-close-server 'nnweb server))
+(deffoo nnweb-request-list (&optional server)
+ (nnweb-possibly-change-server nil server)
+ (save-excursion
+ (set-buffer nntp-server-buffer)
+ (nnmail-generate-active nnweb-group-alist)
+ t))
+
(deffoo nnweb-request-update-info (group info &optional server)
- (nnweb-possibly-change-server server)
- (setcar (cddr info) nil))
+ (nnweb-possibly-change-server group server)
+ ;;(setcar (cddr info) nil)
+ )
(deffoo nnweb-asynchronous-p ()
t)
+(deffoo nnweb-request-create-group (group &optional server args)
+ (nnweb-possibly-change-server nil server)
+ (nnweb-request-delete-group group)
+ (push `(,group ,(cons 1 0) ,@args) nnweb-group-alist)
+ (nnweb-write-active)
+ t)
+
+(deffoo nnweb-request-delete-group (group &optional force server)
+ (nnweb-possibly-change-server group server)
+ (gnus-delete-assoc group nnweb-group-alist)
+ (gnus-delete-file (nnweb-overview-file group))
+ t)
+
(nnoo-define-skeleton nnweb)
;;; Internal functions
+(defun nnweb-read-overview (group)
+ "Read the overview of GROUP and build the map."
+ (when (file-exists-p (nnweb-overview-file group))
+ (nnheader-temp-write nil
+ (insert-file-contents (nnweb-overview-file group))
+ (goto-char (point-min))
+ (setq nnweb-hashtb (gnus-make-hashtable
+ (count-lines (point-min) (point-max))))
+ (let (header)
+ (while (not (eobp))
+ (setq header (nnheader-parse-nov))
+ (forward-line 1)
+ (push (list (mail-header-number header)
+ header (mail-header-xrefs header))
+ nnweb-articles)
+ (nnweb-set-hashtb header (car nnweb-articles)))))))
+
+(defun nnweb-write-overview (group)
+ "Write the overview file for GROUP."
+ (nnheader-temp-write (nnweb-overview-file group)
+ (let ((articles nnweb-articles))
+ (while articles
+ (nnheader-insert-nov (cadr (pop articles)))))))
+
+(defun nnweb-set-hashtb (header data)
+ (gnus-sethasb (nnweb-identifier (mail-header-xrefs header))
+ data nnweb-hashtb))
+
+(defun nnweb-get-hashtb (url)
+ (gnus-gethash (nnweb-identifier url) nnweb-hashtb))
+
+(defun nnweb-identifier (ident)
+ ident)
+
+(defun nnweb-overview-file (group)
+ "Return the name of the overview file of GROUP."
+ (nnheader-concat nnweb-directory group ".overview"))
+
+(defun nnweb-write-active ()
+ "Save the active file."
+ (nnheader-temp-write (nnheader-concat nnweb-directory "active")
+ (prin1 `(setq nnweb-group-alist ',nnweb-group-alist) (current-buffer))))
+
+(defun nnweb-read-active ()
+ "Read the active file."
+ (load (nnheader-concat nnweb-directory "active") t t t))
+
(defun nnweb-definition (type)
"Return the definition of TYPE."
(let ((def (cdr (assq type (assq nnweb-type nnweb-type-definition)))))
(error "Undefined definition %s" type))
def))
-(defun nnweb-possibly-change-server (&optional server)
+(defun nnweb-possibly-change-server (&optional group server)
(nnweb-init server)
(when server
(unless (nnweb-server-opened server)
- (nnweb-open-server server))))
+ (nnweb-open-server server)))
+ (when group
+ (when (and (not nnweb-ephemeral-p)
+ (not (equal group nnweb-group)))
+ (nnweb-request-group group nil t))))
(defun nnweb-init (server)
"Initialize buffers and such."
(let ((i 0)
(more t)
(case-fold-search t)
+ (active (or (cadr (assoc nnweb-group nnweb-group-alist))
+ (cons 1 0)))
Subject Score Date Newsgroup Author
map url)
(while more
(widen)
(when (string-match "#[0-9]+/[0-9]+ *$" Subject)
(setq Subject (substring Subject 0 (match-beginning 0))))
- (push
- (list
+ (unless (nnweb-get-hashtb url)
(incf i)
- (make-full-mail-header
- i (concat "(" Newsgroup ") " Subject) Author Date
- (concat "<" (message-unique-id) "-" (int-to-string i)
- "@dejanews>")
- nil 0 (string-to-int Score) nil)
- url)
- map))
+ (push
+ (list
+ (incf (cdr active))
+ (make-full-mail-header
+ (cdr active) (concat "(" Newsgroup ") " Subject) Author Date
+ (concat "<" (message-unique-id) "-" (int-to-string i)
+ "@dejanews>")
+ nil 0 (string-to-int Score) nil)
+ url)
+ map)))
;; See whether there is a "Get next 20 hits" button here.
(if (or (not (re-search-forward
"HREF=\"\\([^\"]+\\)\">Get next" nil t))
(erase-buffer)
(url-insert-file-contents more)))
;; Return the articles in the right order.
- (setq nnweb-articles (nreverse map))))))
+ (setq nnweb-articles
+ (sort map (lambda (s1 s2) (< (car s1) (car s2)))))))))
(defun nnweb-dejanews-wash-article ()
(let ((case-fold-search t))
(let ((i 0)
(more t)
(case-fold-search t)
+ (active (or (cadr (assoc nnweb-group nnweb-group-alist))
+ (cons 1 0)))
Subject Score Date Newsgroups From Message-ID
map url)
(while more
(set (intern (match-string 1)) (match-string 2)))
(widen)
(search-forward "</pre>" nil t)
- (push
- (list
+ (unless (nnweb-get-hashtb url)
(incf i)
- (make-full-mail-header
- i (concat "(" Newsgroups ") " Subject) From Date
- Message-ID
- nil 0 (string-to-int Score) nil)
- url)
- map))
+ (push
+ (list
+ (incf (cdr active))
+ (make-full-mail-header
+ (cdr active) (concat "(" Newsgroups ") " Subject) From Date
+ Message-ID
+ nil 0 (string-to-int Score) nil)
+ url)
+ map)))
(setq more nil))
;; Return the articles in the right order.
- (setq nnweb-articles (nreverse map))))))
+ (setq nnweb-articles
+ (sort map (lambda (s1 s2) (< (car s1) (car s2)))))))))
(defun nnweb-reference-wash-article ()
(let ((case-fold-search t))
(let ((i 0)
(more t)
(case-fold-search t)
+ (active (or (cadr (assoc nnweb-group nnweb-group-alist))
+ (cons 1 0)))
subject date from id group
map url)
(while more
group (match-string 4)
id (concat "<" (match-string 5) ">")
from (match-string 6))
- (push
- (list
+ (unless (nnweb-get-hashtb url)
(incf i)
- (make-full-mail-header
- i (concat "(" group ") " subject) from date
- id nil 0 0 nil)
- url)
- map))
+ (push
+ (list
+ (incf (cdr active))
+ (make-full-mail-header
+ (cdr active) (concat "(" group ") " subject) from date
+ id nil 0 0 nil)
+ url)
+ map)))
;; See if we want more.
(when (or (not nnweb-articles)
(>= i nnweb-max-hits)
nnweb-search (incf part))))
(setq more nil)))
;; Return the articles in the right order.
- (setq nnweb-articles (nreverse map)))))))
+ (setq nnweb-articles
+ (sort map (lambda (s1 s2) (< (car s1) (car s2))))))))))
(defun nnweb-altavista-wash-article ()
(goto-char (point-min))
(let ((case-fold-search t))
- (when (re-search-forward "<H1>\\(.*\\)</H1>" nil t)
- (setq subject (match-string 1)))
(re-search-forward "^<strong>" nil t)
(delete-region (point-min) (match-beginning 0))
(goto-char (point-min))
(narrow-to-region (point) (progn (forward-line 1) (point)))
(goto-char (point-min))
(while (re-search-forward "<A.*\\?id@\\([^\"]+\\)\">[0-9]+</A>" nil t)
- (replace-match "<\\1> " t))
- (widen)
- (nnweb-remove-markup))))
+ (replace-match "<\\1> " t)))
+ (widen)
+ (nnweb-remove-markup)))
(defun nnweb-altavista-search (search &optional part)
(prog1
+++ /dev/null
-TEXI2DVI=texi2dvi
-EMACS=emacs
-MAKEINFO=$(EMACS) -batch -q -no-site-file
-INFOSWI=-l texinfmt -f texinfo-every-node-update -f texinfo-format-buffer -f save-buffer
-LATEX=latex
-DVIPS=dvips
-PERL=perl
-
-all: gnus message
-
-most: texi2latexi.elc latex latexps
-
-gnus: gnus.texi
- $(MAKEINFO) gnus.texi $(INFOSWI)
-
-message: message.texi
- $(MAKEINFO) message.texi $(INFOSWI)
-
-dvi: gnus.dvi message.dvi
-
-.texi.dvi :
- $(PERL) -n -e 'print unless (/\@iflatex/ .. /\@end iflatex/)' $< > gnustmp.texi
- $(TEXI2DVI) gnustmp.texi
-
-refcard.dvi: refcard.tex gnuslogo.refcard gnusref.tex
- $(LATEX) refcard.tex
-
-sclean:
- rm -f gnus.*.bak *.ky *.cp *.fn *.cps *.kys *.log *.aux *.dvi *.vr \
- *.tp *.toc \
- *.pg gnus.latexi *.aux *.[cgk]idx \
- gnus.ilg gnus.ind gnus.[cgk]ind gnus.idx \
- gnus.tmptexi gnus.tmplatexi gnus.tmplatexi1 texput.log *.orig *.rej \
- gnus.latexi*~*
-
-clean:
- make sclean
- rm -f *.latexi
-
-makeinfo:
- makeinfo -o gnus gnus.texi
- makeinfo -o message message.texi
-
-texi2latexi.elc:
- $(EMACS) -batch -l bytecomp -f batch-byte-recompile-directory
-
-latex: gnus.texi
- $(EMACS) -batch -q -no-site-file gnus.texi -l ./texi2latex.elc -f latexi-translate
-
-latexps:
- egrep -v "label.*Index|chapter.*Index" gnus.latexi > gnus.tmplatexi1
- $(LATEX) gnus.tmplatexi1
- splitindex
- makeindex -o gnus.kind gnus.kidx
- makeindex -o gnus.cind gnus.cidx
- makeindex -o gnus.gind gnus.gidx
- egrep -v "end{document}" gnus.tmplatexi1 > gnus.tmplatexi
- cat postamble.tex >> gnus.tmplatexi
- $(LATEX) gnus.tmplatexi
- $(LATEX) gnus.tmplatexi
- $(DVIPS) -f gnus.dvi > gnus.ps
-
-pss:
- make latex
- make latexps
-
-psout:
- make latex
- make latexboth
- make out
-
-latexboth:
- rm -f gnus-manual-a4.ps.gz gnus-manual-standard.ps.gz
- make latexps
- mv gnus.ps gnus-manual-a4.ps
- gzip gnus-manual-a4.ps
- sed 's/,a4paper//' gnus.latexi > gnus-standard.latexi
- make latexps
- mv gnus.ps gnus-manual-standard.ps
- gzip gnus-manual-standard.ps
-
-out:
- cp gnus-manual-standard.ps.gz gnus-manual-a4.ps.gz \
- /local/ftp/pub/emacs/gnus/manual
- mv gnus-manual-standard.ps.gz gnus-manual-a4.ps.gz \
- /hom/larsi/www_docs/gnus/manual
-
-veryclean:
- make clean
- rm -f gnus.dvi gnus.ps
\input texinfo @c -*-texinfo-*-
@setfilename gnus
-@settitle Red Gnus 0.42 Manual
+@settitle Red Gnus 0.43 Manual
@synindex fn cp
@synindex vr cp
@synindex pg cp
\marginpar[\hspace{2.5cm}\gnushead]{\gnushead}
}
-\newcommand{\gnuscleardoublepage}{\ifodd\count0\clearpage\thispagestyle{empty}\mbox{}\clearpage\else\clearpage\fi}
+\newcommand{\gnuscleardoublepage}{\ifodd\count0\mbox{}\clearpage\thispagestyle{empty}\mbox{}\clearpage\else\clearpage\fi}
\newcommand{\gnuspagechapter}[1]{
{\mbox{}}
@tex
@titlepage
-@title Red Gnus 0.42 Manual
+@title Red Gnus 0.43 Manual
@author by Lars Magne Ingebrigtsen
@page
@code{t} and be prompted for the password, or set
@code{nnmail-pop-password} to the password itself.
+Your Emacs has to have been configured with @samp{--use-pop} before
+compilation. This is the default, but some installations have it
+switched off.
+
When you use a mail backend, Gnus will slurp all your mail from your
inbox and plonk it down in your home directory. Gnus doesn't move any
mail if you're not using a mail backend---you have to do a lot of magic