Importing Pterodactyl Gnus v0.96.
[elisp/gnus.git-] / lisp / nnweb.el
index 748b3d2..97c7cd0 100644 (file)
@@ -1,7 +1,7 @@
 ;;; nnweb.el --- retrieving articles via web search engines
-;; Copyright (C) 1996,97 Free Software Foundation, Inc.
+;; Copyright (C) 1996,97,98,99 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.
 (require 'message)
 (require 'gnus-util)
 (require 'gnus)
-(require 'w3)
-(require 'url)
 (require 'nnmail)
-(ignore-errors
-  (require 'w3-forms))
+(require 'mm-util)
+(eval-when-compile
+  (ignore-errors
+    (require 'w3)
+    (require 'url)
+    (require 'w3-forms)))
+;; Report failure to find w3 at load time if appropriate.
+(eval '(progn
+        (require 'w3)
+        (require 'url)
+        (require 'w3-forms)))
 
 (nnoo-declare nnweb)
 
   "Where nnweb will save its files.")
 
 (defvoo nnweb-type 'dejanews
-  "What search engine type is being used.")
+  "What search engine type is being used.
+Valid types include `dejanews', `dejanewsold', `reference',
+and `altavista'.")
 
 (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)
@@ -73,7 +88,7 @@
 (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-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 t)
+  (nnweb-write-active)
   (gnus-delete-file (nnweb-overview-file group))
   t)
 
 (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
+    (with-temp-buffer
       (nnheader-insert-file-contents (nnweb-overview-file group))
       (goto-char (point-min))
       (let (header)
 
 (defun nnweb-write-overview (group)
   "Write the overview file for GROUP."
-  (nnheader-temp-write (nnweb-overview-file group)
+  (with-temp-file (nnweb-overview-file group)
     (let ((articles nnweb-articles))
       (while articles
        (nnheader-insert-nov (cadr (pop articles)))))))
 
 (defun nnweb-write-active ()
   "Save the active file."
-  (nnheader-temp-write (nnheader-concat nnweb-directory "active")
+  (with-temp-file (nnheader-concat nnweb-directory "active")
     (prin1 `(setq nnweb-group-alist ',nnweb-group-alist) (current-buffer))))
 
 (defun nnweb-read-active ()
            (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.
      ("defaultOp" . "AND")
      ("svcclass" . "dncurrent")
      ("maxhits" . "100")
-     ("format" . "verbose")
+     ("format" . "verbose2")
      ("threaded" . "0")
-     ("showsort" . "score")
+     ("showsort" . "date")
      ("agesign" . "1")
      ("ageweight" . "1")))
   t)
      ("defaultOp" . "AND")
      ("svcclass" . "dnold")
      ("maxhits" . "100")
-     ("format" . "verbose")
+     ("format" . "verbose2")
      ("threaded" . "0")
-     ("showsort" . "score")
+     ("showsort" . "date")
      ("agesign" . "1")
      ("ageweight" . "1")))
   t)