aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Monnier2017-10-30 14:15:00 -0400
committerStefan Monnier2017-10-30 14:15:00 -0400
commit7f1d7234ba2ccf36995d19135c1238b97e26645e (patch)
tree2fbdbea7097cd62f9c3e02a8f54ab441cc21cb82
parent764740318f3f1029cf3d45738631cf5c459affd8 (diff)
downloademacs-7f1d7234ba2ccf36995d19135c1238b97e26645e.tar.gz
emacs-7f1d7234ba2ccf36995d19135c1238b97e26645e.zip
* lisp/net/newst-backend.el: Use lexical scoping and fix warnings
(newsticker-stop, newsticker-get-all-news) (newsticker--decode-rfc822-date, newsticker--lists-intersect-p) (newsticker--update-process-ids, newsticker--cache-read) (newsticker-opml-export, newsticker--run-auto-mark-filter) (newsticker--do-run-auto-mark-filter): Use dolist. (newsticker--insert-bytes): New function, to avoid string-to-multibyte. (newsticker--get-news-by-funcall, newsticker--get-news-by-url-callback) (newsticker--image-download-by-url-callback): Use it. (newsticker--parse-rss-0.91, newsticker--parse-rss-0.92): Remove unused var `pub-date`. (newsticker--parse-generic-feed): Remove unused var `old-item`. (newsticker--parse-generic-items): Use dolist and let rather than mapc and setq. (newsticker--image-download-by-url-callback): Simplify boolean expression.
-rw-r--r--lisp/net/newst-backend.el293
1 files changed, 138 insertions, 155 deletions
diff --git a/lisp/net/newst-backend.el b/lisp/net/newst-backend.el
index 048a7e734a6..0b3881428e2 100644
--- a/lisp/net/newst-backend.el
+++ b/lisp/net/newst-backend.el
@@ -1,4 +1,4 @@
1;;; newst-backend.el --- Retrieval backend for newsticker. 1;;; newst-backend.el --- Retrieval backend for newsticker -*- lexical-binding:t -*-
2 2
3;; Copyright (C) 2003-2017 Free Software Foundation, Inc. 3;; Copyright (C) 2003-2017 Free Software Foundation, Inc.
4 4
@@ -599,7 +599,7 @@ name/timer pair to `newsticker--retrieval-timer-list'."
599 (cons feed-name timer)))))) 599 (cons feed-name timer))))))
600 600
601;;;###autoload 601;;;###autoload
602(defun newsticker-start (&optional do-not-complain-if-running) 602(defun newsticker-start (&optional _do-not-complain-if-running)
603 "Start the newsticker. 603 "Start the newsticker.
604Start the timers for display and retrieval. If the newsticker, i.e. the 604Start the timers for display and retrieval. If the newsticker, i.e. the
605timers, are running already a warning message is printed unless 605timers, are running already a warning message is printed unless
@@ -635,9 +635,8 @@ if newsticker has been running."
635 (when (fboundp 'newsticker-stop-ticker) ; silence compiler warnings 635 (when (fboundp 'newsticker-stop-ticker) ; silence compiler warnings
636 (newsticker-stop-ticker)) 636 (newsticker-stop-ticker))
637 (when (newsticker-running-p) 637 (when (newsticker-running-p)
638 (mapc (lambda (name-and-timer) 638 (dolist (name-and-timer newsticker--retrieval-timer-list)
639 (newsticker--stop-feed (car name-and-timer))) 639 (newsticker--stop-feed (car name-and-timer)))
640 newsticker--retrieval-timer-list)
641 (setq newsticker--retrieval-timer-list nil) 640 (setq newsticker--retrieval-timer-list nil)
642 (run-hooks 'newsticker-stop-hook) 641 (run-hooks 'newsticker-stop-hook)
643 (message "Newsticker stopped!"))) 642 (message "Newsticker stopped!")))
@@ -647,9 +646,8 @@ if newsticker has been running."
647This does NOT start the retrieval timers." 646This does NOT start the retrieval timers."
648 (interactive) 647 (interactive)
649 ;; launch retrieval of news 648 ;; launch retrieval of news
650 (mapc (lambda (item) 649 (dolist (item (append newsticker-url-list-defaults newsticker-url-list))
651 (newsticker-get-news (car item))) 650 (newsticker-get-news (car item))))
652 (append newsticker-url-list-defaults newsticker-url-list)))
653 651
654(defun newsticker-save-item (feed item) 652(defun newsticker-save-item (feed item)
655 "Save FEED ITEM." 653 "Save FEED ITEM."
@@ -705,7 +703,7 @@ See `newsticker-get-news'."
705 (let ((buffername (concat " *newsticker-funcall-" feed-name "*"))) 703 (let ((buffername (concat " *newsticker-funcall-" feed-name "*")))
706 (with-current-buffer (get-buffer-create buffername) 704 (with-current-buffer (get-buffer-create buffername)
707 (erase-buffer) 705 (erase-buffer)
708 (insert (string-to-multibyte (funcall function feed-name))) 706 (newsticker--insert-bytes (funcall function feed-name))
709 (newsticker--sentinel-work nil t feed-name function 707 (newsticker--sentinel-work nil t feed-name function
710 (current-buffer))))) 708 (current-buffer)))))
711 709
@@ -726,10 +724,10 @@ STATUS is the return status as delivered by `url-retrieve', and
726FEED-NAME is the name of the feed that the news were retrieved 724FEED-NAME is the name of the feed that the news were retrieved
727from." 725from."
728 (let ((buf (get-buffer-create (concat " *newsticker-url-" feed-name "*"))) 726 (let ((buf (get-buffer-create (concat " *newsticker-url-" feed-name "*")))
729 (result (string-to-multibyte (buffer-string)))) 727 (result (buffer-string)))
730 (set-buffer buf) 728 (set-buffer buf)
731 (erase-buffer) 729 (erase-buffer)
732 (insert result) 730 (newsticker--insert-bytes result)
733 ;; remove MIME header 731 ;; remove MIME header
734 (goto-char (point-min)) 732 (goto-char (point-min))
735 (search-forward "\n\n" nil t) 733 (search-forward "\n\n" nil t)
@@ -1251,9 +1249,6 @@ For the RSS 0.91 specification see URL `http://backend.userland.com/rss091'
1251or URL `http://my.netscape.com/publish/formats/rss-spec-0.91.html'." 1249or URL `http://my.netscape.com/publish/formats/rss-spec-0.91.html'."
1252 (newsticker--debug-msg "Parsing RSS 0.91 feed %s" name) 1250 (newsticker--debug-msg "Parsing RSS 0.91 feed %s" name)
1253 (let* ((channelnode (car (xml-get-children topnode 'channel))) 1251 (let* ((channelnode (car (xml-get-children topnode 'channel)))
1254 (pub-date (newsticker--decode-rfc822-date
1255 (car (xml-node-children
1256 (car (xml-get-children channelnode 'pubDate))))))
1257 is-new-feed has-new-items) 1252 is-new-feed has-new-items)
1258 (setq is-new-feed (newsticker--parse-generic-feed 1253 (setq is-new-feed (newsticker--parse-generic-feed
1259 name time 1254 name time
@@ -1289,7 +1284,7 @@ or URL `http://my.netscape.com/publish/formats/rss-spec-0.91.html'."
1289 (car (xml-node-children 1284 (car (xml-node-children
1290 (car (xml-get-children node 'pubDate)))))) 1285 (car (xml-get-children node 'pubDate))))))
1291 ;; guid-fn 1286 ;; guid-fn
1292 (lambda (node) 1287 (lambda (_node)
1293 nil) 1288 nil)
1294 ;; extra-fn 1289 ;; extra-fn
1295 (lambda (node) 1290 (lambda (node)
@@ -1304,9 +1299,6 @@ same as in `newsticker--parse-atom-1.0'.
1304For the RSS 0.92 specification see URL `http://backend.userland.com/rss092'." 1299For the RSS 0.92 specification see URL `http://backend.userland.com/rss092'."
1305 (newsticker--debug-msg "Parsing RSS 0.92 feed %s" name) 1300 (newsticker--debug-msg "Parsing RSS 0.92 feed %s" name)
1306 (let* ((channelnode (car (xml-get-children topnode 'channel))) 1301 (let* ((channelnode (car (xml-get-children topnode 'channel)))
1307 (pub-date (newsticker--decode-rfc822-date
1308 (car (xml-node-children
1309 (car (xml-get-children channelnode 'pubDate))))))
1310 is-new-feed has-new-items) 1302 is-new-feed has-new-items)
1311 (setq is-new-feed (newsticker--parse-generic-feed 1303 (setq is-new-feed (newsticker--parse-generic-feed
1312 name time 1304 name time
@@ -1342,7 +1334,7 @@ For the RSS 0.92 specification see URL `http://backend.userland.com/rss092'."
1342 (car (xml-node-children 1334 (car (xml-node-children
1343 (car (xml-get-children node 'pubDate)))))) 1335 (car (xml-get-children node 'pubDate))))))
1344 ;; guid-fn 1336 ;; guid-fn
1345 (lambda (node) 1337 (lambda (_node)
1346 nil) 1338 nil)
1347 ;; extra-fn 1339 ;; extra-fn
1348 (lambda (node) 1340 (lambda (node)
@@ -1401,7 +1393,7 @@ For the RSS 1.0 specification see URL `http://web.resource.org/rss/1.0/spec'."
1401 (car (xml-node-children 1393 (car (xml-node-children
1402 (car (xml-get-children node 'date))))))) 1394 (car (xml-get-children node 'date)))))))
1403 ;; guid-fn 1395 ;; guid-fn
1404 (lambda (node) 1396 (lambda (_node)
1405 nil) 1397 nil)
1406 ;; extra-fn 1398 ;; extra-fn
1407 (lambda (node) 1399 (lambda (node)
@@ -1482,7 +1474,6 @@ The arguments TITLE, DESC, LINK, and EXTRA-ELEMENTS give the feed's title,
1482description, link, and extra elements resp." 1474description, link, and extra elements resp."
1483 (let ((title (or title "[untitled]")) 1475 (let ((title (or title "[untitled]"))
1484 (link (or link "")) 1476 (link (or link ""))
1485 (old-item nil)
1486 (position 0) 1477 (position 0)
1487 (something-was-added nil)) 1478 (something-was-added nil))
1488 ;; decode numeric entities 1479 ;; decode numeric entities
@@ -1518,89 +1509,89 @@ The arguments TITLE-FN, DESC-FN, LINK-FN, TIME-FN, GUID-FN, and
1518EXTRA-FN give functions for extracting title, description, link, 1509EXTRA-FN give functions for extracting title, description, link,
1519time, guid, and extra-elements resp. They are called with one 1510time, guid, and extra-elements resp. They are called with one
1520argument, which is one of the items in ITEMLIST." 1511argument, which is one of the items in ITEMLIST."
1521 (let (title desc link 1512 (let ((position 0)
1522 (old-item nil)
1523 (position 0)
1524 (something-was-added nil)) 1513 (something-was-added nil))
1525 ;; gather all items for this feed 1514 ;; gather all items for this feed
1526 (mapc (lambda (node) 1515 (dolist (node itemlist)
1527 (setq position (1+ position)) 1516 (setq position (1+ position))
1528 (setq title (or (funcall title-fn node) "[untitled]")) 1517 (let ((title (or (funcall title-fn node) "[untitled]"))
1529 (setq desc (funcall desc-fn node)) 1518 (desc (funcall desc-fn node))
1530 (setq link (or (funcall link-fn node) "")) 1519 (link (or (funcall link-fn node) "")))
1531 (setq time (or (funcall time-fn node) time)) 1520 (setq time (or (funcall time-fn node) time))
1532 ;; It happened that the title or description 1521 ;; It happened that the title or description
1533 ;; contained evil HTML code that confused the 1522 ;; contained evil HTML code that confused the
1534 ;; xml parser. Therefore: 1523 ;; xml parser. Therefore:
1535 (unless (stringp title) 1524 (unless (stringp title)
1536 (setq title (prin1-to-string title))) 1525 (setq title (prin1-to-string title)))
1537 (unless (or (stringp desc) (not desc)) 1526 (unless (or (stringp desc) (not desc))
1538 (setq desc (prin1-to-string desc))) 1527 (setq desc (prin1-to-string desc)))
1539 ;; ignore items with empty title AND empty desc 1528 ;; ignore items with empty title AND empty desc
1540 (when (or (> (length title) 0) 1529 (when (or (> (length title) 0)
1541 (> (length desc) 0)) 1530 (> (length desc) 0))
1542 ;; decode numeric entities 1531 ;; decode numeric entities
1543 (setq title (xml-substitute-numeric-entities title)) 1532 (setq title (xml-substitute-numeric-entities title))
1544 (when desc 1533 (when desc
1545 (setq desc (xml-substitute-numeric-entities desc))) 1534 (setq desc (xml-substitute-numeric-entities desc)))
1546 (setq link (xml-substitute-numeric-entities link)) 1535 (setq link (xml-substitute-numeric-entities link))
1547 ;; remove whitespace from title, desc, and link 1536 ;; remove whitespace from title, desc, and link
1548 (setq title (newsticker--remove-whitespace title)) 1537 (setq title (newsticker--remove-whitespace title))
1549 (setq desc (newsticker--remove-whitespace desc)) 1538 (setq desc (newsticker--remove-whitespace desc))
1550 (setq link (newsticker--remove-whitespace link)) 1539 (setq link (newsticker--remove-whitespace link))
1551 ;; add data to cache 1540 ;; add data to cache
1552 ;; do we have this item already? 1541 ;; do we have this item already?
1553 (let* ((guid (funcall guid-fn node))) 1542 (let ((old-item
1554 ;;(message "guid=%s" guid) 1543 (let* ((guid (funcall guid-fn node)))
1555 (setq old-item 1544 ;;(message "guid=%s" guid)
1556 (newsticker--cache-contains newsticker--cache 1545 (newsticker--cache-contains newsticker--cache
1557 (intern name) title 1546 (intern name) title
1558 desc link nil guid))) 1547 desc link nil guid)))
1559 ;; add this item, or mark it as old, or do nothing 1548 (age1 'new)
1560 (let ((age1 'new) 1549 (age2 'old)
1561 (age2 'old) 1550 (item-new-p nil))
1562 (item-new-p nil)) 1551 ;; Add this item, or mark it as old, or do nothing
1563 (if old-item 1552 (if old-item
1564 (let ((prev-age (newsticker--age old-item))) 1553 (let ((prev-age (newsticker--age old-item)))
1565 (unless newsticker-automatically-mark-items-as-old 1554 (unless newsticker-automatically-mark-items-as-old
1566 ;; Some feeds deliver items multiply, the 1555 ;; Some feeds deliver items multiply, the
1567 ;; first time we find an 'obsolete-old one in 1556 ;; first time we find an 'obsolete-old one in
1568 ;; the cache, the following times we find an 1557 ;; the cache, the following times we find an
1569 ;; 'old one 1558 ;; 'old one
1570 (if (memq prev-age '(obsolete-old old)) 1559 (if (memq prev-age '(obsolete-old old))
1571 (setq age2 'old) 1560 (setq age2 'old)
1572 (setq age2 'new))) 1561 (setq age2 'new)))
1573 (if (eq prev-age 'immortal) 1562 (if (eq prev-age 'immortal)
1574 (setq age2 'immortal)) 1563 (setq age2 'immortal))
1575 (setq time (newsticker--time old-item))) 1564 (setq time (newsticker--time old-item)))
1576 ;; item was not there 1565 ;; item was not there
1577 (setq item-new-p t) 1566 (setq item-new-p t)
1578 (setq something-was-added t)) 1567 (setq something-was-added t))
1579 (let ((extra-elements-with-guid (funcall extra-fn node))) 1568 (let ((extra-elements-with-guid (funcall extra-fn node)))
1580 (unless (assoc 'guid extra-elements-with-guid) 1569 (unless (assoc 'guid extra-elements-with-guid)
1581 (setq extra-elements-with-guid 1570 (setq extra-elements-with-guid
1582 (cons `(guid nil ,(funcall guid-fn node)) 1571 (cons `(guid nil ,(funcall guid-fn node))
1583 extra-elements-with-guid))) 1572 extra-elements-with-guid)))
1584 (setq newsticker--cache 1573 (setq newsticker--cache
1585 (newsticker--cache-add 1574 (newsticker--cache-add
1586 newsticker--cache (intern name) title desc link 1575 newsticker--cache (intern name) title desc link
1587 time age1 position extra-elements-with-guid 1576 time age1 position extra-elements-with-guid
1588 time age2))) 1577 time age2)))
1589 (when item-new-p 1578 (when item-new-p
1590 (let ((item (newsticker--cache-contains 1579 (let ((item (newsticker--cache-contains
1591 newsticker--cache (intern name) title 1580 newsticker--cache (intern name) title
1592 desc link nil))) 1581 desc link nil)))
1593 (if newsticker-auto-mark-filter-list 1582 (if newsticker-auto-mark-filter-list
1594 (newsticker--run-auto-mark-filter name item)) 1583 (newsticker--run-auto-mark-filter name item))
1595 (run-hook-with-args 1584 (run-hook-with-args
1596 'newsticker-new-item-functions name item)))))) 1585 'newsticker-new-item-functions name item)))))))
1597 itemlist)
1598 something-was-added)) 1586 something-was-added))
1599 1587
1600;; ====================================================================== 1588;; ======================================================================
1601;;; Misc 1589;;; Misc
1602;; ====================================================================== 1590;; ======================================================================
1603 1591
1592(defun newsticker--insert-bytes (bytes)
1593 (insert (decode-coding-string bytes 'binary)))
1594
1604(defun newsticker--remove-whitespace (string) 1595(defun newsticker--remove-whitespace (string)
1605 "Remove leading and trailing whitespace from STRING." 1596 "Remove leading and trailing whitespace from STRING."
1606 ;; we must have ...+ but not ...* in the regexps otherwise xemacs loops 1597 ;; we must have ...+ but not ...* in the regexps otherwise xemacs loops
@@ -1755,12 +1746,11 @@ Sat, 07 Sep 2002 00:00:01 GMT
1755 (setq minute (+ minute offset-minute))))) 1746 (setq minute (+ minute offset-minute)))))
1756 (condition-case error-data 1747 (condition-case error-data
1757 (let ((i 1)) 1748 (let ((i 1))
1758 (mapc (lambda (m) 1749 (dolist (m '("Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug"
1759 (if (string= month-name m) 1750 "Sep" "Oct" "Nov" "Dec"))
1760 (setq month i)) 1751 (if (string= month-name m)
1761 (setq i (1+ i))) 1752 (setq month i))
1762 '("Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" 1753 (setq i (1+ i)))
1763 "Sep" "Oct" "Nov" "Dec"))
1764 (encode-time second minute hour day month year t)) 1754 (encode-time second minute hour day month year t))
1765 (error 1755 (error
1766 (message "Cannot decode \"%s\": %s %s" rfc822-string 1756 (message "Cannot decode \"%s\": %s %s" rfc822-string
@@ -1771,22 +1761,19 @@ Sat, 07 Sep 2002 00:00:01 GMT
1771(defun newsticker--lists-intersect-p (list1 list2) 1761(defun newsticker--lists-intersect-p (list1 list2)
1772 "Return t if LIST1 and LIST2 share elements." 1762 "Return t if LIST1 and LIST2 share elements."
1773 (let ((result nil)) 1763 (let ((result nil))
1774 (mapc (lambda (elt) 1764 (dolist (elt list1)
1775 (if (memq elt list2) 1765 (if (memq elt list2)
1776 (setq result t))) 1766 (setq result t)))
1777 list1)
1778 result)) 1767 result))
1779 1768
1780(defun newsticker--update-process-ids () 1769(defun newsticker--update-process-ids ()
1781 "Update list of ids of active newsticker processes. 1770 "Update list of ids of active newsticker processes.
1782Checks list of active processes against list of newsticker processes." 1771Checks list of active processes against list of newsticker processes."
1783 (let ((active-procs (process-list)) 1772 (let ((new-list nil))
1784 (new-list nil)) 1773 (dolist (proc (process-list))
1785 (mapc (lambda (proc) 1774 (let ((id (process-id proc)))
1786 (let ((id (process-id proc))) 1775 (if (memq id newsticker--process-ids)
1787 (if (memq id newsticker--process-ids) 1776 (setq new-list (cons id new-list)))))
1788 (setq new-list (cons id new-list)))))
1789 active-procs)
1790 (setq newsticker--process-ids new-list)) 1777 (setq newsticker--process-ids new-list))
1791 (force-mode-line-update)) 1778 (force-mode-line-update))
1792 1779
@@ -1849,7 +1836,7 @@ Save image as FILENAME in DIRECTORY, download it from URL."
1849 (process-put proc 'nt-feed-name feed-name) 1836 (process-put proc 'nt-feed-name feed-name)
1850 (process-put proc 'nt-filename filename))))) 1837 (process-put proc 'nt-filename filename)))))
1851 1838
1852(defun newsticker--image-sentinel (process event) 1839(defun newsticker--image-sentinel (process _event)
1853 "Sentinel for image-retrieving PROCESS caused by EVENT." 1840 "Sentinel for image-retrieving PROCESS caused by EVENT."
1854 (let* ((p-status (process-status process)) 1841 (let* ((p-status (process-status process))
1855 (exit-status (process-exit-status process)) 1842 (exit-status (process-exit-status process))
@@ -1910,21 +1897,21 @@ from.
1910The image is saved in DIRECTORY as FILENAME." 1897The image is saved in DIRECTORY as FILENAME."
1911 (let ((do-save 1898 (let ((do-save
1912 (or (not status) 1899 (or (not status)
1913 (let ((status-type (car status)) 1900 ;; (let ((status-type (car status)))
1914 (status-details (cdr status))) 1901 ;; (cond ((eq status-type :redirect)
1915 (cond ((eq status-type :redirect) 1902 ;; ;; don't care about redirects
1916 ;; don't care about redirects 1903 ;; t)
1917 t) 1904 ;; ((eq status-type :error)
1918 ((eq status-type :error) 1905 ;; ;; silently ignore errors
1919 ;; silently ignore errors 1906 ;; nil)))
1920 nil)))))) 1907 (eq (car status) :redirect))))
1921 (when do-save 1908 (when do-save
1922 (let ((buf (get-buffer-create (concat " *newsticker-url-image-" feed-name "-" 1909 (let ((buf (get-buffer-create (concat " *newsticker-url-image-" feed-name "-"
1923 directory "*"))) 1910 directory "*")))
1924 (result (string-to-multibyte (buffer-string)))) 1911 (result (buffer-string)))
1925 (set-buffer buf) 1912 (set-buffer buf)
1926 (erase-buffer) 1913 (erase-buffer)
1927 (insert result) 1914 (newsticker--insert-bytes result)
1928 ;; remove MIME header 1915 ;; remove MIME header
1929 (goto-char (point-min)) 1916 (goto-char (point-min))
1930 (search-forward "\n\n") 1917 (search-forward "\n\n")
@@ -2016,7 +2003,7 @@ older than TIME."
2016 data) 2003 data)
2017 data) 2004 data)
2018 2005
2019(defun newsticker--cache-contains (data feed title desc link age 2006(defun newsticker--cache-contains (data feed title desc link _age
2020 &optional guid) 2007 &optional guid)
2021 "Check DATA whether FEED contains an item with the given properties. 2008 "Check DATA whether FEED contains an item with the given properties.
2022This function returns the contained item or nil if it is not 2009This function returns the contained item or nil if it is not
@@ -2289,9 +2276,8 @@ FEED is a symbol!"
2289 (newsticker--cache-read-version1)) 2276 (newsticker--cache-read-version1))
2290 (when (y-or-n-p (format "Delete old newsticker cache file? ")) 2277 (when (y-or-n-p (format "Delete old newsticker cache file? "))
2291 (delete-file newsticker-cache-filename))) 2278 (delete-file newsticker-cache-filename)))
2292 (mapc (lambda (f) 2279 (dolist (f (append newsticker-url-list-defaults newsticker-url-list))
2293 (newsticker--cache-read-feed (car f))) 2280 (newsticker--cache-read-feed (car f)))))
2294 (append newsticker-url-list-defaults newsticker-url-list))))
2295 2281
2296(defun newsticker--cache-read-feed (feed-name) 2282(defun newsticker--cache-read-feed (feed-name)
2297 "Read cache data for feed named FEED-NAME." 2283 "Read cache data for feed named FEED-NAME."
@@ -2358,14 +2344,13 @@ Export subscriptions to a buffer in OPML Format."
2358 " <ownerName>" (user-full-name) "</ownerName>\n" 2344 " <ownerName>" (user-full-name) "</ownerName>\n"
2359 " </head>\n" 2345 " </head>\n"
2360 " <body>\n")) 2346 " <body>\n"))
2361 (mapc (lambda (sub) 2347 (dolist (sub (append newsticker-url-list newsticker-url-list-defaults))
2362 (insert " <outline text=\"") 2348 (insert " <outline text=\"")
2363 (insert (newsticker--title sub)) 2349 (insert (newsticker--title sub))
2364 (insert "\" xmlUrl=\"") 2350 (insert "\" xmlUrl=\"")
2365 (insert (xml-escape-string (let ((url (cadr sub))) 2351 (insert (xml-escape-string (let ((url (cadr sub)))
2366 (if (stringp url) url (prin1-to-string url))))) 2352 (if (stringp url) url (prin1-to-string url)))))
2367 (insert "\"/>\n")) 2353 (insert "\"/>\n"))
2368 (append newsticker-url-list newsticker-url-list-defaults))
2369 (insert " </body>\n</opml>\n")) 2354 (insert " </body>\n</opml>\n"))
2370 (pop-to-buffer "*OPML Export*") 2355 (pop-to-buffer "*OPML Export*")
2371 (when (fboundp 'sgml-mode) 2356 (when (fboundp 'sgml-mode)
@@ -2405,28 +2390,26 @@ removed."
2405This function checks the variable `newsticker-auto-mark-filter-list' 2390This function checks the variable `newsticker-auto-mark-filter-list'
2406for an entry that matches FEED and ITEM." 2391for an entry that matches FEED and ITEM."
2407 (let ((case-fold-search t)) 2392 (let ((case-fold-search t))
2408 (mapc (lambda (filter) 2393 (dolist (filter newsticker-auto-mark-filter-list)
2409 (let ((filter-feed (car filter)) 2394 (let ((filter-feed (car filter))
2410 (pattern-list (cadr filter))) 2395 (pattern-list (cadr filter)))
2411 (when (string-match filter-feed feed) 2396 (when (string-match filter-feed feed)
2412 (newsticker--do-run-auto-mark-filter item pattern-list)))) 2397 (newsticker--do-run-auto-mark-filter item pattern-list))))))
2413 newsticker-auto-mark-filter-list)))
2414 2398
2415(defun newsticker--do-run-auto-mark-filter (item list) 2399(defun newsticker--do-run-auto-mark-filter (item list)
2416 "Actually compare ITEM against the pattern-LIST. 2400 "Actually compare ITEM against the pattern-LIST.
2417LIST must be an element of `newsticker-auto-mark-filter-list'." 2401LIST must be an element of `newsticker-auto-mark-filter-list'."
2418 (mapc (lambda (pattern) 2402 (dolist (pattern list)
2419 (let ((place (nth 1 pattern)) 2403 (let ((place (nth 1 pattern))
2420 (regexp (nth 2 pattern)) 2404 (regexp (nth 2 pattern))
2421 (title (newsticker--title item)) 2405 (title (newsticker--title item))
2422 (desc (newsticker--desc item))) 2406 (desc (newsticker--desc item)))
2423 (when (or (eq place 'title) (eq place 'all)) 2407 (when (or (eq place 'title) (eq place 'all))
2424 (when (and title (string-match regexp title)) 2408 (when (and title (string-match regexp title))
2425 (newsticker--process-auto-mark-filter-match item pattern))) 2409 (newsticker--process-auto-mark-filter-match item pattern)))
2426 (when (or (eq place 'description) (eq place 'all)) 2410 (when (or (eq place 'description) (eq place 'all))
2427 (when (and desc (string-match regexp desc)) 2411 (when (and desc (string-match regexp desc))
2428 (newsticker--process-auto-mark-filter-match item pattern))))) 2412 (newsticker--process-auto-mark-filter-match item pattern))))))
2429 list))
2430 2413
2431(defun newsticker--process-auto-mark-filter-match (item pattern) 2414(defun newsticker--process-auto-mark-filter-match (item pattern)
2432 "Process ITEM that matches an auto-mark-filter PATTERN." 2415 "Process ITEM that matches an auto-mark-filter PATTERN."
@@ -2499,7 +2482,7 @@ This function is suited for adding it to `newsticker-new-item-functions'."
2499;; ====================================================================== 2482;; ======================================================================
2500;;; Retrieve samples 2483;;; Retrieve samples
2501;; ====================================================================== 2484;; ======================================================================
2502(defun newsticker-retrieve-random-message (feed-name) 2485(defun newsticker-retrieve-random-message (_feed-name)
2503 "Return an artificial RSS string under the name FEED-NAME." 2486 "Return an artificial RSS string under the name FEED-NAME."
2504 (concat "<?xml version=\"1.0\" encoding=\"iso-8859-1\" ?><rss version=\"0.91\">" 2487 (concat "<?xml version=\"1.0\" encoding=\"iso-8859-1\" ?><rss version=\"0.91\">"
2505 "<channel>" 2488 "<channel>"