* nnmairix.el: Remove old documentation in the commentary block.
[gnus] / lisp / nnultimate.el
index baaf17c..945b249 100644 (file)
@@ -1,15 +1,17 @@
-;;; nnultimate.el --- interfacing with the Ultimate Bulletin Board system -*- coding: iso-latin-1 -*-
-;; Copyright (C) 1999, 2000 Free Software Foundation, Inc.
+;;; nnultimate.el --- interfacing with the Ultimate Bulletin Board system
+
+;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004,
+;;   2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
 ;; Keywords: news
 
 ;; This file is part of GNU Emacs.
 
-;; GNU Emacs is free software; you can redistribute it and/or modify
+;; GNU Emacs is free software: you can redistribute it and/or modify
 ;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 2, or (at your option)
-;; any later version.
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
 
 ;; GNU Emacs is distributed in the hope that it will be useful,
 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -17,9 +19,7 @@
 ;; GNU General Public License for more details.
 
 ;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
+;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
 
 ;;; Commentary:
 
 (require 'gnus)
 (require 'nnmail)
 (require 'mm-util)
-(eval-when-compile
-  (ignore-errors
-    (require 'nnweb)))
-;; Report failure to find w3 at load time if appropriate.
-(eval '(require 'nnweb))
+(require 'mm-url)
+(require 'nnweb)
+(require 'parse-time)
+(autoload 'w3-parse-buffer "w3-parse")
 
 (nnoo-declare nnultimate)
 
@@ -56,7 +55,7 @@
 (defvoo nnultimate-groups nil)
 (defvoo nnultimate-headers nil)
 (defvoo nnultimate-articles nil)
-(defvar nnultimate-table-regexp 
+(defvar nnultimate-table-regexp
   "postings.*editpost\\|forumdisplay\\|Forum[0-9]+/HTML\\|getbio")
 
 ;;; Interface functions
            "postings.*editpost\\|forumdisplay\\|getbio")
           headers article subject score from date lines parent point
           contents tinfo fetchers map elem a href garticles topic old-max
-          inc datel table string current-page total-contents pages
+          inc datel table current-page total-contents pages
           farticles forum-contents parse furl-fetched mmap farticle)
       (setq map mapping)
       (while (and (setq article (car articles))
                  map)
+       ;; Skip past the articles in the map until we reach the
+       ;; article we're looking for.
        (while (and map
                    (or (> article (caar map))
                        (< (cadar map) (caar map))))
              (setq subject (nth 2 (assq (car elem) topics)))
              (setq href (nth 3 (assq (car elem) topics)))
              (if (= current-page 1)
-                 (nnweb-insert href)
+                 (mm-url-insert href)
                (string-match "\\.html$" href)
-               (nnweb-insert (concat (substring href 0 (match-beginning 0))
+               (mm-url-insert (concat (substring href 0 (match-beginning 0))
                                      "-" (number-to-string current-page)
                                      (match-string 0 href))))
              (goto-char (point-min))
              (setq contents
                    (ignore-errors (w3-parse-buffer (current-buffer))))
              (setq table (nnultimate-find-forum-table contents))
-             (setq string (mapconcat 'identity (nnweb-text table) ""))
-             (when (string-match "topic is \\([0-9]\\) pages" string)
-               (setq pages (string-to-number (match-string 1 string)))
-               (setcdr table nil)
-               (setq table (nnultimate-find-forum-table contents)))
+             (goto-char (point-min))
+             (when (re-search-forward "topic is \\([0-9]+\\) pages" nil t)
+               (setq pages (string-to-number (match-string 1))))
              (setq contents (cdr (nth 2 (car (nth 2 table)))))
              (setq total-contents (nconc total-contents contents))
              (incf current-page))
-           ;;(setq total-contents (nreverse total-contents))
-           (dolist (art (cdr elem))
-             (if (not (nth (1- (cdr art)) total-contents))
-                 ()                    ;(debug)
-               (push (list (car art)
-                           (nth (1- (cdr art)) total-contents)
-                           subject)
-                     nnultimate-articles)))))
+           (when t
+             (let ((i 0))
+               (dolist (co total-contents)
+                 (push (list (or (nnultimate-topic-article-to-article
+                                  group (car elem) (incf i))
+                                 1)
+                             co subject)
+                       nnultimate-articles))))
+           (when nil
+             (dolist (art (cdr elem))
+               (when (nth (1- (cdr art)) total-contents)
+                 (push (list (car art)
+                             (nth (1- (cdr art)) total-contents)
+                             subject)
+                       nnultimate-articles))))))
        (setq nnultimate-articles
              (sort nnultimate-articles 'car-less-than-car))
        ;; Now we have all the articles, conveniently in an alist
              (setq date (substring (car datel) (match-end 0))
                    datel nil))
            (pop datel))
-         (setq date (delete "" (split-string date "[- \n\t\r \81 \81 \81 ]")))
-         (if (or (member "AM" date)
-                 (member "PM" date))
-             (setq date (format "%s %s %s %s"
-                                (car (rassq (string-to-number (nth 0 date))
-                                            parse-time-months))
-                                (nth 1 date) (nth 2 date) (nth 3 date)))
-           (setq date (format "%s %s %s %s"
-                              (car (rassq (string-to-number (nth 1 date))
-                                          parse-time-months))
-                              (nth 0 date) (nth 2 date) (nth 3 date))))
+         (when date
+           (setq date (delete "" (split-string date "[-, \n\t\r    ]")))
+           (setq date
+                 (if (or (member "AM" date)
+                         (member "PM" date))
+                     (format
+                      "%s %s %s %s"
+                      (nth 1 date)
+                      (if (and (>= (length (nth 0 date)) 3)
+                               (assoc (downcase
+                                       (substring (nth 0 date) 0 3))
+                                      parse-time-months))
+                          (substring (nth 0 date) 0 3)
+                        (car (rassq (string-to-number (nth 0 date))
+                                    parse-time-months)))
+                      (nth 2 date) (nth 3 date))
+                   (format "%s %s %s %s"
+                           (car (rassq (string-to-number (nth 1 date))
+                                       parse-time-months))
+                           (nth 0 date) (nth 2 date) (nth 3 date)))))
          (push
           (cons
            article
             from (or date "")
             (concat "<" (number-to-string sid) "%"
                     (number-to-string article)
-                    "@ultimate>")
+                    "@ultimate." server ">")
             "" 0
             (/ (length (mapconcat
                         'identity
              (nnheader-insert-nov (cdr header))))))
       'nov)))
 
+(defun nnultimate-topic-article-to-article (group topic article)
+  (catch 'found
+    (dolist (elem (nth 5 (assoc group nnultimate-groups)))
+      (when (and (= topic (nth 2 elem))
+                (>= article (nth 3 elem))
+                (< article (+ (- (nth 1 elem) (nth 0 elem)) 1
+                              (nth 3 elem))))
+       (throw 'found
+              (+ (nth 0 elem) (- article (nth 3 elem))))))))
+
 (deffoo nnultimate-request-group (group &optional server dont-check)
   (nnultimate-possibly-change-server nil server)
   (when (not nnultimate-groups)
 (deffoo nnultimate-request-list (&optional server)
   (nnultimate-possibly-change-server nil server)
   (mm-with-unibyte-buffer
-    (nnweb-insert
+    (mm-url-insert
      (if (string-match "/$" nnultimate-address)
         (concat nnultimate-address "Ultimate.cgi")
        nnultimate-address))
     (mm-with-unibyte-buffer
       (while furls
        (erase-buffer)
-       (nnweb-insert (pop furls))
+       (mm-url-insert (pop furls))
        (goto-char (point-min))
        (setq parse (w3-parse-buffer (current-buffer)))
        (setq contents
        nnultimate-groups-alist)
   (with-temp-file (expand-file-name "groups" nnultimate-directory)
     (prin1 nnultimate-groups-alist (current-buffer))))
-    
+
 (defun nnultimate-init (server)
   "Initialize buffers and such."
   (unless (file-exists-p nnultimate-directory)
 ;; coding: iso-8859-1
 ;; End:
 
+;; arch-tag: ab6bfc45-8fe1-4647-9c78-41050eb152b8
 ;;; nnultimate.el ends here