;;; nnweb.el --- retrieving articles via web search engines
-;; Copyright (C) 1996,97 Free Software Foundation, Inc.
+;; Copyright (C) 1996,97,98 Free Software Foundation, Inc.
-;; Author: Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: news
;; This file is part of GNU Emacs.
;;; Code:
+(eval-when-compile (require 'cl))
+
(require 'nnoo)
(require 'message)
(require 'gnus-util)
(defvoo nnweb-type 'dejanews
"What search engine type is being used.")
-(defvar nnweb-type-definition
+(defvoo nnweb-type-definition
'((dejanews
(article . nnweb-dejanews-wash-article)
(map . nnweb-dejanews-create-mapping)
(search . nnweb-dejanews-search)
- (address . "http://xp9.dejanews.com/dnquery.xp")
+ (address . "http://x8.dejanews.com/dnquery.xp")
+ (identifier . nnweb-dejanews-identity))
+ (dejanewsold
+ (article . nnweb-dejanews-wash-article)
+ (map . nnweb-dejanews-create-mapping)
+ (search . nnweb-dejanewsold-search)
+ (address . "http://x8.dejanews.com/dnquery.xp")
(identifier . nnweb-dejanews-identity))
(reference
(article . nnweb-reference-wash-article)
(defvoo nnweb-search nil
"Search string to feed to DejaNews.")
-(defvoo nnweb-max-hits 100
+(defvoo nnweb-max-hits 999
"Maximum number of hits to display.")
(defvoo nnweb-ephemeral-p nil
(deffoo nnweb-request-scan (&optional group server)
(nnweb-possibly-change-server group server)
+ (setq nnweb-hashtb (gnus-make-hashtable 4095))
(funcall (nnweb-definition 'map))
(unless nnweb-ephemeral-p
(nnweb-write-active)
(deffoo nnweb-close-group (group &optional server)
(nnweb-possibly-change-server group server)
- (when (buffer-live-p nnweb-buffer)
+ (when (gnus-buffer-live-p nnweb-buffer)
(save-excursion
(set-buffer nnweb-buffer)
(set-buffer-modified-p nil)
(deffoo nnweb-close-server (&optional server)
(when (and (nnweb-server-opened server)
- (buffer-live-p nnweb-buffer))
+ (gnus-buffer-live-p nnweb-buffer))
(save-excursion
(set-buffer nnweb-buffer)
(set-buffer-modified-p nil)
(deffoo nnweb-request-delete-group (group &optional force server)
(nnweb-possibly-change-server group server)
- (gnus-delete-assoc group nnweb-group-alist)
+ (gnus-pull group nnweb-group-alist)
(gnus-delete-file (nnweb-overview-file group))
t)
(nnheader-temp-write nil
(nnheader-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))
(defun nnweb-init (server)
"Initialize buffers and such."
- (unless (buffer-live-p nnweb-buffer)
+ (unless (gnus-buffer-live-p nnweb-buffer)
(setq nnweb-buffer
(save-excursion
(nnheader-set-temp-buffer
(save-excursion
(set-buffer nnweb-buffer)
(erase-buffer)
- (prog1
- (url-insert-file-contents url)
- (copy-to-buffer buf (point-min) (point-max)))))
+ (url-insert-file-contents url)
+ (copy-to-buffer buf (point-min) (point-max))
+ t))
(nnweb-url-retrieve-asynch
url 'nnweb-callback (current-buffer) nnheader-callback-function)
t)))
(defun nnweb-callback (buffer callback)
- (when (buffer-live-p url-working-buffer)
+ (when (gnus-buffer-live-p url-working-buffer)
(save-excursion
(set-buffer url-working-buffer)
(funcall (nnweb-definition 'article))
(goto-char (point-min))
(while (re-search-forward "&\\([a-z]+\\);" nil t)
(replace-match (char-to-string (or (cdr (assq (intern (match-string 1))
- w3-html-entities ))
+ w3-html-entities))
?#))
t t)))
(case-fold-search t)
(active (or (cadr (assoc nnweb-group nnweb-group-alist))
(cons 1 0)))
- Subject Score Date Newsgroup Author
+ Subject (Score "0") Date Newsgroup Author
map url)
(while more
;; Go through all the article hits on this page.
(goto-char (point-min))
(nnweb-decode-entities)
(goto-char (point-min))
- (while (re-search-forward "^ +[0-9]+\\." nil t)
+ (while (re-search-forward "^ <P>\n" nil t)
(narrow-to-region
(point)
- (cond ((re-search-forward "^ +[0-9]+\\." nil t)
+ (cond ((re-search-forward "^ <P>\n" nil t)
(match-beginning 0))
((search-forward "\n\n" nil t)
(point))
(t
(point-max))))
(goto-char (point-min))
- (when (looking-at ".*HREF=\"\\([^\"]+\\)\"")
- (setq url (match-string 1)))
- (nnweb-remove-markup)
- (goto-char (point-min))
- (while (search-forward "\t" nil t)
- (replace-match " "))
- (goto-char (point-min))
- (while (re-search-forward "^ +\\([^:]+\\): +\\(.*\\)$" nil t)
- (set (intern (match-string 1)) (match-string 2)))
+ (looking-at ".*HREF=\"\\([^\"]+\\)\"\\(.*\\)")
+ (setq url (match-string 1))
+ (let ((begin (point)))
+ (nnweb-remove-markup)
+ (goto-char begin)
+ (while (search-forward "\t" nil t)
+ (replace-match " "))
+ (goto-char begin)
+ (end-of-line)
+ (setq Subject (buffer-substring begin (point)))
+ (if (re-search-forward
+ "^ Newsgroup: \\(.*\\)\n Posted on \\([0-9/]+\\) by \\(.*\\)$" nil t)
+ (setq Newsgroup (match-string 1)
+ Date (match-string 2)
+ Author (match-string 3))))
(widen)
- (when (string-match "#[0-9]+/[0-9]+ *$" Subject)
- (setq Subject (substring Subject 0 (match-beginning 0))))
(incf i)
(unless (nnweb-get-hashtb url)
(push
(list
(incf (cdr active))
(make-full-mail-header
- (cdr active) (concat "(" Newsgroup ") " Subject) Author Date
+ (cdr active) Subject Author Date
(concat "<" (nnweb-identifier url) "@dejanews>")
nil 0 (string-to-int Score) url))
map)
(nnweb-set-hashtb (cadar map) (car map))))
;; See whether there is a "Get next 20 hits" button here.
(if (or (not (re-search-forward
- "HREF=\"\\([^\"]+\\)\">Get next" nil t))
+ "HREF=\"\\([^\"]+\\)\"[<>b]+Next result" nil t))
(>= i nnweb-max-hits))
(setq more nil)
;; Yup -- fetch it.
(url-insert-file-contents more)))
;; Return the articles in the right order.
(setq nnweb-articles
- (sort (nconc nnweb-articles map)
- (lambda (s1 s2) (< (car s1) (car s2)))))))))
+ (sort (nconc nnweb-articles map) 'car-less-than-car))))))
(defun nnweb-dejanews-wash-article ()
(let ((case-fold-search t))
(replace-match "\\1 " t)
(forward-line 1))
(when (re-search-forward "\n\n+" nil t)
- (replace-match "\n" t t))))
+ (replace-match "\n" t t))
+ (goto-char (point-min))
+ (when (search-forward "[More Headers]" nil t)
+ (replace-match "" t t))))
(defun nnweb-dejanews-search (search)
(nnweb-fetch-form
("defaultOp" . "AND")
("svcclass" . "dncurrent")
("maxhits" . "100")
- ("format" . "verbose")
+ ("format" . "verbose2")
("threaded" . "0")
- ("showsort" . "score")
+ ("showsort" . "date")
+ ("agesign" . "1")
+ ("ageweight" . "1")))
+ t)
+
+(defun nnweb-dejanewsold-search (search)
+ (nnweb-fetch-form
+ (nnweb-definition 'address)
+ `(("query" . ,search)
+ ("defaultOp" . "AND")
+ ("svcclass" . "dnold")
+ ("maxhits" . "100")
+ ("format" . "verbose2")
+ ("threaded" . "0")
+ ("showsort" . "date")
("agesign" . "1")
("ageweight" . "1")))
t)
(setq more nil))
;; Return the articles in the right order.
(setq nnweb-articles
- (sort (nconc nnweb-articles map)
- (lambda (s1 s2) (< (car s1) (car s2)))))))))
+ (sort (nconc nnweb-articles map) 'car-less-than-car))))))
(defun nnweb-reference-wash-article ()
(let ((case-fold-search t))
(set-marker body nil))))
(defun nnweb-reference-search (search)
- (prog1
- (url-insert-file-contents
- (concat
- (nnweb-definition 'address)
- "?"
- (nnweb-encode-www-form-urlencoded
- `(("search" . "advanced")
- ("querytext" . ,search)
- ("subj" . "")
- ("name" . "")
- ("login" . "")
- ("host" . "")
- ("organization" . "")
- ("groups" . "")
- ("keywords" . "")
- ("choice" . "Search")
- ("startmonth" . "Jul")
- ("startday" . "25")
- ("startyear" . "1996")
- ("endmonth" . "Aug")
- ("endday" . "24")
- ("endyear" . "1996")
- ("mode" . "Quick")
- ("verbosity" . "Verbose")
- ("ranking" . "Relevance")
- ("first" . "1")
- ("last" . "25")
- ("score" . "50")))))
- (setq buffer-file-name nil))
+ (url-insert-file-contents
+ (concat
+ (nnweb-definition 'address)
+ "?"
+ (nnweb-encode-www-form-urlencoded
+ `(("search" . "advanced")
+ ("querytext" . ,search)
+ ("subj" . "")
+ ("name" . "")
+ ("login" . "")
+ ("host" . "")
+ ("organization" . "")
+ ("groups" . "")
+ ("keywords" . "")
+ ("choice" . "Search")
+ ("startmonth" . "Jul")
+ ("startday" . "25")
+ ("startyear" . "1996")
+ ("endmonth" . "Aug")
+ ("endday" . "24")
+ ("endyear" . "1996")
+ ("mode" . "Quick")
+ ("verbosity" . "Verbose")
+ ("ranking" . "Relevance")
+ ("first" . "1")
+ ("last" . "25")
+ ("score" . "50")))))
+ (setq buffer-file-name nil)
t)
;;;
(setq more nil)))
;; Return the articles in the right order.
(setq nnweb-articles
- (sort (nconc nnweb-articles map)
- (lambda (s1 s2) (< (car s1) (car s2))))))))))
+ (sort (nconc nnweb-articles map) 'car-less-than-car)))))))
(defun nnweb-altavista-wash-article ()
(goto-char (point-min))
(nnweb-remove-markup)))
(defun nnweb-altavista-search (search &optional part)
- (prog1
- (url-insert-file-contents
- (concat
- (nnweb-definition 'address)
- "?"
- (nnweb-encode-www-form-urlencoded
- `(("pg" . "aq")
- ("what" . "news")
- ,@(when part `(("stq" . ,(int-to-string (* part 30)))))
- ("fmt" . "d")
- ("q" . ,search)
- ("r" . "")
- ("d0" . "")
- ("d1" . "")))))
- (setq buffer-file-name nil)))
+ (url-insert-file-contents
+ (concat
+ (nnweb-definition 'address)
+ "?"
+ (nnweb-encode-www-form-urlencoded
+ `(("pg" . "aq")
+ ("what" . "news")
+ ,@(when part `(("stq" . ,(int-to-string (* part 30)))))
+ ("fmt" . "d")
+ ("q" . ,search)
+ ("r" . "")
+ ("d0" . "")
+ ("d1" . "")))))
+ (setq buffer-file-name nil)
+ t)
(provide 'nnweb)