Update copyright year to 2016
[gnus] / lisp / nnrss.el
index 9a02c26..c17a13c 100644 (file)
@@ -1,7 +1,6 @@
 ;;; nnrss.el --- interfacing with RSS
 
-;; Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007,
-;;   2008, 2009, 2010  Free Software Foundation, Inc.
+;; Copyright (C) 2001-2016 Free Software Foundation, Inc.
 
 ;; Author: Shenghuo Zhu <zsh@cs.rochester.edu>
 ;; Keywords: RSS
 
 ;;; Code:
 
-;; For Emacs <22.2 and XEmacs.
-(eval-and-compile
-  (unless (fboundp 'declare-function) (defmacro declare-function (&rest r))))
-
 (eval-when-compile (require 'cl))
 
 (require 'gnus)
@@ -364,12 +359,13 @@ for decoding when the cdr that the data specify is not available.")
 
 (deffoo nnrss-retrieve-groups (groups &optional server)
   (dolist (group groups)
+    (setq group (nnrss-decode-group-name group))
     (nnrss-possibly-change-group group server)
     (nnrss-check-group group server))
   (with-current-buffer nntp-server-buffer
     (erase-buffer)
     (dolist (group groups)
-      (let ((elem (assoc group nnrss-server-data)))
+      (let ((elem (assoc (gnus-group-decoded-name group) nnrss-server-data)))
        (insert (format "%S %s 1 y\n" group (or (cadr elem) 0)))))
     'active))
 
@@ -398,8 +394,8 @@ otherwise return nil."
                                         nnrss-compatible-encoding-alist)))))
     (mm-coding-system-p 'utf-8)))
 
-(declare-function w3-parse-buffer "ext:w3-parse" (&optional buff))
-
+(declare-function libxml-parse-html-region "xml.c"
+                 (start end &optional base-url discard-comments))
 (defun nnrss-fetch (url &optional local)
   "Fetch URL and put it in a the expected Lisp structure."
   (mm-with-unibyte-buffer
@@ -426,22 +422,14 @@ otherwise return nil."
                  (mm-enable-multibyte))))
       (goto-char (point-min))
 
-      ;; Because xml-parse-region can't deal with anything that isn't
-      ;; xml and w3-parse-buffer can't deal with some xml, we have to
-      ;; parse with xml-parse-region first and, if that fails, parse
-      ;; with w3-parse-buffer.  Yuck.  Eventually, someone should find out
-      ;; why w3-parse-buffer fails to parse some well-formed xml and
-      ;; fix it.
-
       (condition-case err1
          (setq xmlform (xml-parse-region (point-min) (point-max)))
        (error
         (condition-case err2
-            (setq htmlform (caddar (w3-parse-buffer
-                                    (current-buffer))))
+            (setq htmlform (libxml-parse-html-region (point-min) (point-max)))
           (error
            (message "\
-nnrss: %s: Not valid XML %s and w3-parse doesn't work %s"
+nnrss: %s: Not valid XML %s and libxml-parse-html-region doesn't work %s"
                     url err1 err2)))))
       (if htmlform
          htmlform
@@ -599,7 +587,7 @@ which RSS 2.0 allows."
 (defun nnrss-no-cache (url)
   "")
 
-(defun nnrss-insert-w3 (url)
+(defun nnrss-insert (url)
   (mm-with-unibyte-current-buffer
     (condition-case err
        (mm-url-insert url)
@@ -614,8 +602,6 @@ which RSS 2.0 allows."
        (mm-url-decode-entities-nbsp)
        (buffer-string))))
 
-(defalias 'nnrss-insert 'nnrss-insert-w3)
-
 (defun nnrss-mime-encode-string (string)
   (mm-with-multibyte-buffer
     (insert string)
@@ -880,8 +866,7 @@ Careful with this on large documents!"
 
 (defun nnrss-extract-hrefs (data)
   "Recursively extract hrefs from a page's source.
-DATA should be the output of `xml-parse-region' or
-`w3-parse-buffer'."
+DATA should be the output of `xml-parse-region'."
   (mapcar (lambda (ahref)
            (cdr (assoc 'href (cadr ahref))))
          (nnrss-find-el 'a data)))
@@ -933,30 +918,30 @@ whether they are `offsite' or `onsite'."
      rss-offsite-in rdf-offsite-in xml-offsite-in)))
 
 (defun nnrss-discover-feed (url)
-  "Given a page, find an RSS feed using Mark Pilgrim's
-`ultra-liberal rss locator'."
-
+  "Given a page, find an RSS feed.
+Use Mark Pilgrim's `ultra-liberal rss locator'."
   (let ((parsed-page (nnrss-fetch url)))
-
-;;    1. if this url is the rss, use it.
+    ;;    1. if this url is the rss, use it.
     (if (nnrss-rss-p parsed-page)
        (let ((rss-ns (nnrss-get-namespace-prefix parsed-page "http://purl.org/rss/1.0/")))
          (nnrss-rss-title-description rss-ns parsed-page url))
 
-;;    2. look for the <link rel="alternate"
-;;    type="application/rss+xml" and use that if it is there.
+      ;;    2. look for the <link rel="alternate"
+      ;;    type="application/rss+xml" and use that if it is there.
       (let ((links (nnrss-get-rsslinks parsed-page)))
        (if links
            (let* ((xml (nnrss-fetch
                         (cdr (assoc 'href (cadar links)))))
-                  (rss-ns (nnrss-get-namespace-prefix xml "http://purl.org/rss/1.0/")))
-             (nnrss-rss-title-description rss-ns xml (cdr (assoc 'href (cadar links)))))
-
-;;    3. look for links on the site in the following order:
-;;       - onsite links ending in .rss, .rdf, or .xml
-;;       - onsite links containing any of the above
-;;       - offsite links ending in .rss, .rdf, or .xml
-;;       - offsite links containing any of the above
+                  (rss-ns (nnrss-get-namespace-prefix
+                           xml "http://purl.org/rss/1.0/")))
+             (nnrss-rss-title-description
+              rss-ns xml (cdr (assoc 'href (cadar links)))))
+
+         ;;    3. look for links on the site in the following order:
+         ;;       - onsite links ending in .rss, .rdf, or .xml
+         ;;       - onsite links containing any of the above
+         ;;       - offsite links ending in .rss, .rdf, or .xml
+         ;;       - offsite links containing any of the above
          (let* ((base-uri (progn (string-match ".*://[^/]+/?" url)
                                  (match-string 0 url)))
                 (hrefs (nnrss-order-hrefs
@@ -969,9 +954,9 @@ whether they are `offsite' or `onsite'."
                      (setq rss-link (nnrss-rss-title-description
                                      rss-ns href-data (car hrefs))))
                  (setq hrefs (cdr hrefs)))))
-           (if rss-link rss-link
-
-;;    4. check syndic8
+           (if rss-link
+               rss-link
+             ;;    4. check syndic8
              (nnrss-find-rss-via-syndic8 url))))))))
 
 (defun nnrss-find-rss-via-syndic8 (url)