Merge from emacs-23; up to 2010-06-11T18:51:00Z!juri@jurta.org.
[bpt/emacs.git] / lisp / net / newst-reader.el
dissimilarity index 63%
index bed8b8f..1fbba29 100644 (file)
-;;; newst-reader.el --- Generic RSS reader functions.
-
-;; Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008
-;;   Free Software Foundation, Inc.
-
-;; Author:      Ulf Jasper <ulf.jasper@web.de>
-;; Filename:    newst-reader.el
-;; URL:         http://www.nongnu.org/newsticker
-;; Time-stamp:  "15. Juni 2008, 09:42:01 (ulf)"
-
-;; ======================================================================
-
-;; This file is part of GNU Emacs.
-
-;; 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 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
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
-
-;; ======================================================================
-;;; Commentary:
-
-;; See newsticker.el
-
-;; ======================================================================
-;;; Code:
-
-(require 'newsticker-backend "newst-backend")
-
-;; ======================================================================
-;;; Customization
-;; ======================================================================
-(defun newsticker--set-customvar-formatting (symbol value)
-  "Set newsticker-variable SYMBOL value to VALUE.
-Calls all actions which are necessary in order to make the new
-value effective."
-  (if (or (not (boundp symbol))
-          (equal (symbol-value symbol) value))
-      (set symbol value)
-    ;; something must have changed
-    (set symbol value)
-    (when (fboundp 'newsticker--forget-preformatted)
-      (newsticker--forget-preformatted))))
-
-;; ======================================================================
-;; reader
-(defgroup newsticker-reader nil
-  "Settings for the feed reader."
-  :group 'newsticker)
-
-(defcustom newsticker-frontend
-  'newsticker-treeview
-  "Newsticker frontend for reading news.
-This must be one of the functions `newsticker-plainview' or
-`newsticker-treeview'."
-  :type '(choice :tag "Frontend"
-                 (const :tag "Single buffer (plainview)" newsticker-plainview)
-                 (const :tag "Tree view (treeview)" newsticker-treeview))
-  :group 'newsticker-reader)
-
-;; image related things
-(defcustom newsticker-enable-logo-manipulations
-  t
-  "If non-nil newsticker manipulates logo images.
-This enables the following image properties: heuristic mask for all
-logos, and laplace-conversion for images without new items."
-  :type 'boolean
-  :group 'newsticker-reader)
-
-(defcustom newsticker-justification
-  'left
-  "How to fill item descriptions.
-If non-nil newsticker calls `fill-region' to wrap long lines in
-item descriptions.  However, if an item description contains HTML
-text and `newsticker-html-renderer' is non-nil, filling is not
-done."
-  :type '(choice :tag "Justification"
-                 (const :tag "No filling" nil)
-                 (const :tag "Left"       left)
-                 (const :tag "Right"      right)
-                 (const :tag "Center"     center)
-                 (const :tag "Full"       full))
-  :set 'newsticker--set-customvar-formatting
-  :group 'newsticker-reader)
-
-(defcustom newsticker-use-full-width
-  t
-  "Decides whether to use the full window width when filling.
-If non-nil newsticker sets `fill-column' so that the whole
-window is used when filling.  See also `newsticker-justification'."
-  :type 'boolean
-  :set 'newsticker--set-customvar-formatting
-  :group 'newsticker-reader)
-
-(defcustom newsticker-html-renderer
-  nil
-  "Function for rendering HTML contents.
-If non-nil, newsticker.el will call this function whenever it finds
-HTML-like tags in item descriptions.  Possible functions are, for
-example, `w3m-region', `w3-region', and (if you have htmlr.el installed)
-`newsticker-htmlr-render'.
-
-In order to make sure that the HTML renderer is loaded when you
-run newsticker, you should add one of the following statements to
-your .emacs.  If you use w3m,
-
-  (autoload 'w3m-region \"w3m\"
-    \"Render region in current buffer and replace with result.\" t)
-
-  (autoload 'w3m-toggle-inline-image \"w3m\"
-    \"Toggle the visibility of an image under point.\" t)
-
-or, if you use w3,
-
-  (require 'w3-auto)
-
-or, if you use htmlr
-
-  (require 'htmlr)"
-  :type '(choice :tag "Function"
-                 (const :tag "None" nil)
-                 (const :tag "w3" w3-region)
-                 (const :tag "w3m" w3m-region)
-                 (const :tag "htmlr" newsticker-htmlr-render))
-  :set 'newsticker--set-customvar-formatting
-  :group 'newsticker-reader)
-
-(defcustom newsticker-date-format
-  "(%A, %H:%M)"
-  "Format for the date part in item and feed lines.
-See `format-time-string' for a list of valid specifiers."
-  :type 'string
-  :set 'newsticker--set-customvar-formatting
-  :group 'newsticker-reader)
-
-(defgroup newsticker-faces nil
-  "Settings for the faces of the feed reader."
-  :group 'newsticker-reader)
-
-(defface newsticker-feed-face
-  '((((class color) (background dark))
-     (:family "helvetica" :bold t :height 1.2 :foreground "misty rose"))
-    (((class color) (background light))
-     (:family "helvetica" :bold t :height 1.2 :foreground "black")))
-  "Face for news feeds."
-  :group 'newsticker-faces)
-
-(defface newsticker-extra-face
-  '((((class color) (background dark))
-     (:italic t :foreground "gray50" :height 0.8))
-    (((class color) (background light))
-     (:italic t :foreground "gray50" :height 0.8)))
-  "Face for newsticker dates."
-  :group 'newsticker-faces)
-
-(defface newsticker-enclosure-face
-  '((((class color) (background dark))
-     (:bold t :background "orange"))
-    (((class color) (background light))
-     (:bold t :background "orange")))
-  "Face for enclosed elements."
-  :group 'newsticker-faces)
-
-;; ======================================================================
-;;; Utility functions
-;; ======================================================================
-(defun newsticker--insert-enclosure (item keymap)
-  "Insert enclosure element of a news ITEM into the current buffer.
-KEYMAP will be applied."
-  (let ((enclosure (newsticker--enclosure item))
-        (beg (point)))
-    (when enclosure
-      (let ((url (cdr (assoc 'url enclosure)))
-            (length (string-to-number (or (cdr (assoc 'length enclosure))
-                                          "-1")))
-            (type (cdr (assoc 'type enclosure))))
-        (cond ((> length 1048576)
-               (insert (format "Enclosed file (%s, %1.2f MBytes)" type
-                               (/ length 1048576))))
-              ((> length 1024)
-               (insert (format "Enclosed file (%s, %1.2f KBytes)" type
-                               (/ length 1024))))
-              ((> length 0)
-               (insert (format "Enclosed file (%s, %1.2f Bytes)" type
-                               length)))
-              (t
-               (insert (format "Enclosed file (%s, unknown size)" type))))
-        (add-text-properties beg (point)
-                             (list 'mouse-face 'highlight
-                                   'nt-link url
-                                   'help-echo (format
-                                               "mouse-2: visit (%s)" url)
-                                   'keymap keymap
-                                   'nt-face 'enclosure
-                                   'nt-type 'desc))
-        (insert "\n")))))
-
-(defun newsticker--print-extra-elements (item keymap)
-  "Insert extra-elements of ITEM in a pretty form into the current buffer.
-KEYMAP is applied."
-  (let ((ignored-elements '(items link title description content
-                                  content:encoded dc:subject
-                                  dc:date entry item guid pubDate
-                                  published updated
-                                  enclosure))
-        (left-column-width 1))
-    (mapc (lambda (extra-element)
-            (when (listp extra-element) ;; take care of broken xml
-                                        ;; data, 2007-05-25
-              (unless (memq (car extra-element) ignored-elements)
-                (setq left-column-width (max left-column-width
-                                             (length (symbol-name
-                                                      (car extra-element))))))))
-          (newsticker--extra item))
-    (mapc (lambda (extra-element)
-            (when (listp extra-element) ;; take care of broken xml
-                                        ;; data, 2007-05-25
-              (unless (memq (car extra-element) ignored-elements)
-                (newsticker--do-print-extra-element extra-element
-                                                    left-column-width
-                                                    keymap))))
-          (newsticker--extra item))))
-
-(defun newsticker--do-print-extra-element (extra-element width keymap)
-  "Actually print an EXTRA-ELEMENT using the given WIDTH.
-KEYMAP is applied."
-  (let ((name (symbol-name (car extra-element))))
-    (insert (format "%s: " name))
-    (insert (make-string (- width (length name)) ? )))
-  (let (;;(attributes (cadr extra-element)) ;FIXME!!!!
-        (contents (cddr extra-element)))
-    (cond ((listp contents)
-           (mapc (lambda (i)
-                   (if (and (stringp i)
-                            (string-match "^http://.*" i))
-                       (let ((pos (point)))
-                         (insert i " ") ; avoid self-reference from the
-                                        ; nt-link thing
-                         (add-text-properties
-                          pos (point)
-                          (list 'mouse-face 'highlight
-                                'nt-link i
-                                'help-echo
-                                (format "mouse-2: visit (%s)" i)
-                                'keymap keymap)))
-                         (insert (format "%s" i))))
-                 contents))
-          (t
-           (insert (format "%s" contents))))
-    (insert "\n")))
-
-(defun newsticker--image-read (feed-name-symbol disabled)
-  "Read the cached image for FEED-NAME-SYMBOL from disk.
-If DISABLED is non-nil the image will be converted to a disabled look
-\(unless `newsticker-enable-logo-manipulations' is not t\).
-Return the image."
-  (let ((image-name (concat newsticker-imagecache-dirname "/"
-                            (symbol-name feed-name-symbol)))
-        (img nil))
-    (when (file-exists-p image-name)
-      (condition-case error-data
-          (setq img (create-image
-                     image-name nil nil
-                     :conversion (and newsticker-enable-logo-manipulations
-                                      disabled
-                                      'disabled)
-                     :mask (and newsticker-enable-logo-manipulations
-                                'heuristic)
-                     :ascent 70))
-        (error
-         (message "Error: cannot create image for %s: %s"
-                  feed-name-symbol error-data))))
-    img))
-
-;; the functions we need for retrieval and display
-;;;###autoload
-(defun newsticker-show-news ()
-  "Start reading news.  You may want to bind this to a key."
-  (interactive)
-  (newsticker-start t) ;; will start only if not running
-  (funcall newsticker-frontend))
-
-;; ======================================================================
-;;; Toolbar
-;; ======================================================================
-(defconst newsticker--next-item-image
-  (and (fboundp 'image-type-available-p)
-       (image-type-available-p 'xpm)
-       (create-image "/* XPM */
-static char * next_xpm[] = {
-\"24 24 42 1\",
-\"     c None\",
-\".    c #000000\",
-\"+    c #7EB6DE\",
-\"@    c #82BBE2\",
-\"#    c #85BEE4\",
-\"$    c #88C1E7\",
-\"%    c #8AC3E8\",
-\"&    c #87C1E6\",
-\"*    c #8AC4E9\",
-\"=    c #8CC6EA\",
-\"-    c #8CC6EB\",
-\";    c #88C2E7\",
-\">    c #8BC5E9\",
-\",    c #8DC7EB\",
-\"'    c #87C0E6\",
-\")    c #8AC4E8\",
-\"!    c #8BC5EA\",
-\"~    c #8BC4E9\",
-\"{    c #88C1E6\",
-\"]    c #89C3E8\",
-\"^    c #86BFE5\",
-\"/    c #83BBE2\",
-\"(    c #82BBE1\",
-\"_    c #86C0E5\",
-\":    c #87C0E5\",
-\"<    c #83BCE2\",
-\"[    c #81B9E0\",
-\"}    c #81BAE1\",
-\"|    c #78B0D9\",
-\"1    c #7BB3DB\",
-\"2    c #7DB5DD\",
-\"3    c #7DB6DD\",
-\"4    c #72A9D4\",
-\"5    c #75ACD6\",
-\"6    c #76AED7\",
-\"7    c #77AFD8\",
-\"8    c #6BA1CD\",
-\"9    c #6EA4CF\",
-\"0    c #6FA6D1\",
-\"a    c #6298C6\",
-\"b    c #659BC8\",
-\"c    c #5C91C0\",
-\"                        \",
-\"                        \",
-\"       .                \",
-\"       ..               \",
-\"       .+.              \",
-\"       .@#.             \",
-\"       .#$%.            \",
-\"       .&*=-.           \",
-\"       .;>,,,.          \",
-\"       .;>,,,=.         \",
-\"       .')!==~;.        \",
-\"       .#{]*%;^/.       \",
-\"       .(#_':#<.        \",
-\"       .+[@</}.         \",
-\"       .|1232.          \",
-\"       .4567.           \",
-\"       .890.            \",
-\"       .ab.             \",
-\"       .c.              \",
-\"       ..               \",
-\"       .                \",
-\"                        \",
-\"                        \",
-\"                        \"};
-"
-                     'xpm t))
-  "Image for the next item button.")
-
-(defconst newsticker--previous-item-image
-  (and (fboundp 'image-type-available-p)
-       (image-type-available-p 'xpm)
-       (create-image "/* XPM */
-static char * previous_xpm[] = {
-\"24 24 39 1\",
-\"     c None\",
-\".    c #000000\",
-\"+    c #7BB3DB\",
-\"@    c #83BCE2\",
-\"#    c #7FB8DF\",
-\"$    c #89C2E7\",
-\"%    c #86BFE5\",
-\"&    c #83BBE2\",
-\"*    c #8CC6EA\",
-\"=    c #8BC4E9\",
-\"-    c #88C2E7\",
-\";    c #85BEE4\",
-\">    c #8DC7EB\",
-\",    c #89C3E8\",
-\"'    c #8AC4E8\",
-\")    c #8BC5EA\",
-\"!    c #88C1E6\",
-\"~    c #8AC4E9\",
-\"{    c #8AC3E8\",
-\"]    c #86C0E5\",
-\"^    c #87C0E6\",
-\"/    c #87C0E5\",
-\"(    c #82BBE2\",
-\"_    c #81BAE1\",
-\":    c #7FB7DF\",
-\"<    c #7DB6DD\",
-\"[    c #7DB5DD\",
-\"}    c #7CB4DC\",
-\"|    c #79B1DA\",
-\"1    c #76ADD7\",
-\"2    c #77AFD8\",
-\"3    c #73AAD4\",
-\"4    c #70A7D1\",
-\"5    c #6EA5D0\",
-\"6    c #6CA2CE\",
-\"7    c #689ECB\",
-\"8    c #6399C7\",
-\"9    c #6095C4\",
-\"0    c #5C90C0\",
-\"                        \",
-\"                        \",
-\"                .       \",
-\"               ..       \",
-\"              .+.       \",
-\"             .@#.       \",
-\"            .$%&.       \",
-\"           .*=-;.       \",
-\"          .>>*,%.       \",
-\"         .>>>*,%.       \",
-\"        .')**=-;.       \",
-\"       .;!,~{-%&.       \",
-\"        .;]^/;@#.       \",
-\"         .(@&_:+.       \",
-\"          .<[}|1.       \",
-\"           .2134.       \",
-\"            .567.       \",
-\"             .89.       \",
-\"              .0.       \",
-\"               ..       \",
-\"                .       \",
-\"                        \",
-\"                        \",
-\"                        \"};
-"
-                     'xpm t))
-  "Image for the previous item button.")
-
-(defconst newsticker--previous-feed-image
-  (and (fboundp 'image-type-available-p)
-       (image-type-available-p 'xpm)
-       (create-image "/* XPM */
-static char * prev_feed_xpm[] = {
-\"24 24 52 1\",
-\"     c None\",
-\".    c #000000\",
-\"+    c #70A7D2\",
-\"@    c #75ADD6\",
-\"#    c #71A8D3\",
-\"$    c #79B1DA\",
-\"%    c #7BB3DB\",
-\"&    c #7DB5DD\",
-\"*    c #83BBE2\",
-\"=    c #7EB6DE\",
-\"-    c #78B0D9\",
-\";    c #7FB7DE\",
-\">    c #88C2E7\",
-\",    c #85BEE4\",
-\"'    c #80B9E0\",
-\")    c #80B8DF\",
-\"!    c #8CC6EA\",
-\"~    c #89C3E8\",
-\"{    c #86BFE5\",
-\"]    c #81BAE1\",
-\"^    c #7CB4DC\",
-\"/    c #7FB8DF\",
-\"(    c #8DC7EB\",
-\"_    c #7BB3DC\",
-\":    c #7EB7DE\",
-\"<    c #8BC4E9\",
-\"[    c #8AC4E9\",
-\"}    c #8AC3E8\",
-\"|    c #87C0E6\",
-\"1    c #87C0E5\",
-\"2    c #83BCE2\",
-\"3    c #75ACD6\",
-\"4    c #7FB7DF\",
-\"5    c #77AED8\",
-\"6    c #71A8D2\",
-\"7    c #70A7D1\",
-\"8    c #76ADD7\",
-\"9    c #6CA2CE\",
-\"0    c #699FCC\",
-\"a    c #73AAD4\",
-\"b    c #6BA1CD\",
-\"c    c #669CC9\",
-\"d    c #6298C5\",
-\"e    c #689ECB\",
-\"f    c #6499C7\",
-\"g    c #6095C3\",
-\"h    c #5C91C0\",
-\"i    c #5E93C2\",
-\"j    c #5B90C0\",
-\"k    c #588CBC\",
-\"l    c #578CBC\",
-\"m    c #5589BA\",
-\"                        \",
-\"                        \",
-\"     ...          .     \",
-\"     .+.         ..     \",
-\"     .@.        .#.     \",
-\"     .$.       .%@.     \",
-\"     .&.      .*=-.     \",
-\"     .;.     .>,'%.     \",
-\"     .).    .!~{]^.     \",
-\"     ./.   .(!~{]_.     \",
-\"     .:.  .!!<>,'%.     \",
-\"     .&. .~[}>{*=-.     \",
-\"     .$.  .|1,2/%@.     \",
-\"     .3.   .*]4%56.     \",
-\"     .7.    .^$8#9.     \",
-\"     .0.     .a7bc.     \",
-\"     .d.      .efg.     \",
-\"     .h.       .ij.     \",
-\"     .k.        .l.     \",
-\"     .m.         ..     \",
-\"     ...          .     \",
-\"                        \",
-\"                        \",
-\"                        \"};
-"
-                     'xpm t))
-  "Image for the previous feed button.")
-
-(defconst newsticker--next-feed-image
-  (and (fboundp 'image-type-available-p)
-       (image-type-available-p 'xpm)
-       (create-image "/* XPM */
-static char * next_feed_xpm[] = {
-\"24 24 57 1\",
-\"     c None\",
-\".    c #000000\",
-\"+    c #6CA2CE\",
-\"@    c #75ADD6\",
-\"#    c #71A8D3\",
-\"$    c #79B1DA\",
-\"%    c #7EB7DE\",
-\"&    c #7DB5DD\",
-\"*    c #81BAE1\",
-\"=    c #85BEE4\",
-\"-    c #78B0D9\",
-\";    c #7FB7DE\",
-\">    c #83BCE3\",
-\",    c #87C1E6\",
-\"'    c #8AC4E9\",
-\")    c #7BB3DB\",
-\"!    c #80B8DF\",
-\"~    c #88C2E7\",
-\"{    c #8BC5E9\",
-\"]    c #8DC7EB\",
-\"^    c #7CB4DC\",
-\"/    c #7FB8DF\",
-\"(    c #84BDE3\",
-\"_    c #7BB3DC\",
-\":    c #83BCE2\",
-\"<    c #87C0E6\",
-\"[    c #8AC4E8\",
-\"}    c #8BC5EA\",
-\"|    c #8CC6EA\",
-\"1    c #88C1E6\",
-\"2    c #89C3E8\",
-\"3    c #8AC3E8\",
-\"4    c #7EB6DE\",
-\"5    c #82BBE1\",
-\"6    c #86C0E5\",
-\"7    c #87C0E5\",
-\"8    c #75ACD6\",
-\"9    c #7AB2DA\",
-\"0    c #81B9E0\",
-\"a    c #82BBE2\",
-\"b    c #71A8D2\",
-\"c    c #70A7D1\",
-\"d    c #74ACD6\",
-\"e    c #699FCC\",
-\"f    c #6EA5D0\",
-\"g    c #72A9D4\",
-\"h    c #669CC9\",
-\"i    c #6298C5\",
-\"j    c #679DCA\",
-\"k    c #6BA1CD\",
-\"l    c #6095C3\",
-\"m    c #5C91C0\",
-\"n    c #5F94C2\",
-\"o    c #5B90C0\",
-\"p    c #588CBC\",
-\"q    c #578CBC\",
-\"r    c #5589BA\",
-\"                        \",
-\"                        \",
-\"     .          ...     \",
-\"     ..         .+.     \",
-\"     .@.        .#.     \",
-\"     .$%.       .@.     \",
-\"     .&*=.      .-.     \",
-\"     .;>,'.     .).     \",
-\"     .!=~{].    .^.     \",
-\"     ./(~{]].   ._.     \",
-\"     .%:<[}||.  .).     \",
-\"     .&*=12'3~. .-.     \",
-\"     .$45=6<7.  .@.     \",
-\"     .8940a:.   .b.     \",
-\"     .cd-)&.    .+.     \",
-\"     .efg8.     .h.     \",
-\"     .ijk.      .l.     \",
-\"     .mn.       .o.     \",
-\"     .p.        .q.     \",
-\"     ..         .r.     \",
-\"     .          ...     \",
-\"                        \",
-\"                        \",
-\"                        \"};
-"
-                     'xpm t))
-  "Image for the next feed button.")
-
-(defconst newsticker--mark-read-image
-  (and (fboundp 'image-type-available-p)
-       (image-type-available-p 'xpm)
-       (create-image "/* XPM */
-static char * mark_read_xpm[] = {
-\"24 24 44 1\",
-\"     c None\",
-\".    c #C20000\",
-\"+    c #BE0000\",
-\"@    c #C70000\",
-\"#    c #CE0000\",
-\"$    c #C90000\",
-\"%    c #BD0000\",
-\"&    c #CB0000\",
-\"*    c #D10000\",
-\"=    c #D70000\",
-\"-    c #D30000\",
-\";    c #CD0000\",
-\">    c #C60000\",
-\",    c #D40000\",
-\"'    c #DA0000\",
-\")    c #DE0000\",
-\"!    c #DB0000\",
-\"~    c #D60000\",
-\"{    c #D00000\",
-\"]    c #DC0000\",
-\"^    c #E00000\",
-\"/    c #E40000\",
-\"(    c #E10000\",
-\"_    c #DD0000\",
-\":    c #D80000\",
-\"<    c #E50000\",
-\"[    c #E70000\",
-\"}    c #E60000\",
-\"|    c #E20000\",
-\"1    c #E90000\",
-\"2    c #E80000\",
-\"3    c #E30000\",
-\"4    c #DF0000\",
-\"5    c #D90000\",
-\"6    c #CC0000\",
-\"7    c #C10000\",
-\"8    c #C30000\",
-\"9    c #BF0000\",
-\"0    c #B90000\",
-\"a    c #BC0000\",
-\"b    c #BB0000\",
-\"c    c #B80000\",
-\"d    c #B50000\",
-\"e    c #B70000\",
-\"                        \",
-\"                        \",
-\"                        \",
-\"    .              +    \",
-\"   +@#            $.%   \",
-\"    &*=          -;>    \",
-\"     ,')        !~{     \",
-\"      ]^/      (_:      \",
-\"       (<[    }|)       \",
-\"        <[1  2<|        \",
-\"         }222[<         \",
-\"          }}}<          \",
-\"          333|          \",
-\"         _4^4)]         \",
-\"        ~:'  5=-        \",
-\"       6{-    *#$       \",
-\"      7>$      @89      \",
-\"     0a+        %bc     \",
-\"    ddc          edd    \",
-\"   ddd            ddd   \",
-\"    d              d    \",
-\"                        \",
-\"                        \",
-\"                        \"};
-"
-                    'xpm t))
-   "Image for the mark read button.")
-
-(defconst newsticker--mark-immortal-image
-  (and (fboundp 'image-type-available-p)
-       (image-type-available-p 'xpm)
-       (create-image "/* XPM */
-static char * mark_immortal_xpm[] = {
-\"24 24 93 2\",
-\"     c None\",
-\".    c #171717\",
-\"+    c #030303\",
-\"@    c #000000\",
-\"#    c #181818\",
-\"$    c #090909\",
-\"%    c #FFC960\",
-\"&    c #FFCB61\",
-\"*    c #FFCB62\",
-\"=    c #FFC961\",
-\"-    c #FFC75F\",
-\";    c #FFC65E\",
-\">    c #FFCA61\",
-\",    c #FFCD63\",
-\"'    c #FFCF65\",
-\")    c #FFD065\",
-\"!    c #FFCE64\",
-\"~    c #FFC35C\",
-\"{    c #FFC45D\",
-\"]    c #FFD166\",
-\"^    c #FFD267\",
-\"/    c #FFD368\",
-\"(    c #FFD167\",
-\"_    c #FFC05A\",
-\":    c #010101\",
-\"<    c #040404\",
-\"[    c #FFCC62\",
-\"}    c #FFD569\",
-\"|    c #FFD56A\",
-\"1    c #FFC860\",
-\"2    c #FFC25B\",
-\"3    c #FFBB56\",
-\"4    c #020202\",
-\"5    c #060606\",
-\"6    c #FFC15B\",
-\"7    c #FFC85F\",
-\"8    c #FFD469\",
-\"9    c #FFD66A\",
-\"0    c #FFBC57\",
-\"a    c #1B1B1B\",
-\"b    c #070707\",
-\"c    c #FFBA55\",
-\"d    c #FFB451\",
-\"e    c #FFB954\",
-\"f    c #FFB350\",
-\"g    c #FFB652\",
-\"h    c #FFBE58\",
-\"i    c #FFCD64\",
-\"j    c #FFD066\",
-\"k    c #FFC059\",
-\"l    c #FFB14E\",
-\"m    c #0B0B0B\",
-\"n    c #FFBB55\",
-\"o    c #FFC15A\",
-\"p    c #FFB552\",
-\"q    c #FFAD4B\",
-\"r    c #080808\",
-\"s    c #FFAF4C\",
-\"t    c #FFB853\",
-\"u    c #FFA948\",
-\"v    c #050505\",
-\"w    c #FFB04E\",
-\"x    c #FFB753\",
-\"y    c #FFBC56\",
-\"z    c #FFC55D\",
-\"A    c #FFC55E\",
-\"B    c #FFC45C\",
-\"C    c #FFBD57\",
-\"D    c #FFB854\",
-\"E    c #FFB34F\",
-\"F    c #FFAB4A\",
-\"G    c #FFA545\",
-\"H    c #FFAA49\",
-\"I    c #FFB04D\",
-\"J    c #FFB551\",
-\"K    c #FFBF58\",
-\"L    c #FFB24F\",
-\"M    c #FFAC4A\",
-\"N    c #FFA646\",
-\"O    c #FFA344\",
-\"P    c #FFA848\",
-\"Q    c #FFB14F\",
-\"R    c #FFAF4D\",
-\"S    c #FFA546\",
-\"T    c #FFA243\",
-\"U    c #FFA445\",
-\"V    c #FFAE4C\",
-\"W    c #FFA444\",
-\"X    c #FFA142\",
-\"Y    c #FF9F41\",
-\"Z    c #0A0A0A\",
-\"`    c #FF9E40\",
-\" .   c #FF9F40\",
-\"                                                \",
-\"                                                \",
-\"                                                \",
-\"                  . + @ @ + #                   \",
-\"              $ @ % & * * = - + +               \",
-\"            @ ; > , ' ) ' ! * - ~ @             \",
-\"          @ { > ! ] ^ / / ( ' * ; _ :           \",
-\"        < _ ; [ ) / } | } / ] , 1 2 3 4         \",
-\"        5 6 7 , ] 8 9 9 9 } ^ ! = ~ 0 a         \",
-\"      b c 6 - , ] 8 9 9 9 } ^ ! % ~ 0 d 5       \",
-\"      : e _ ; * ) / 8 } } / ] , 1 2 3 f 5       \",
-\"      : g h { = i j ^ / ^ ] ! * ; k e l m       \",
-\"      : f n o ; > , ' ) ' ! * - 2 0 p q r       \",
-\"      : s g 0 6 ; % > * * = - ~ h t l u r       \",
-\"      v u w x y k ~ z A z B o C D E F G b       \",
-\"        5 H I J e 0 h K h C c x L M N .         \",
-\"        4 O P q Q d g x g J L R H S T <         \",
-\"          @ T U P F q V q M H N W X +           \",
-\"            @ Y T O W G G W O X Y @             \",
-\"              4 Z ` Y Y Y  .` 4 4               \",
-\"                  5 : : @ @ Z                   \",
-\"                                                \",
-\"                                                \",
-\"                                                \"};
-"
-                     'xpm t))
-  "Image for the mark immortal button.")
-
-(defconst newsticker--narrow-image
-  (and (fboundp 'image-type-available-p)
-       (image-type-available-p 'xpm)
-       (create-image "/* XPM */
-static char * narrow_xpm[] = {
-\"24 24 48 1\",
-\"     c None\",
-\".    c #000000\",
-\"+    c #969696\",
-\"@    c #9E9E9E\",
-\"#    c #A4A4A4\",
-\"$    c #AAAAAA\",
-\"%    c #AEAEAE\",
-\"&    c #B1B1B1\",
-\"*    c #B3B3B3\",
-\"=    c #B4B4B4\",
-\"-    c #B2B2B2\",
-\";    c #AFAFAF\",
-\">    c #ABABAB\",
-\",    c #A6A6A6\",
-\"'    c #A0A0A0\",
-\")    c #989898\",
-\"!    c #909090\",
-\"~    c #73AAD4\",
-\"{    c #7AB2DA\",
-\"]    c #7FB8DF\",
-\"^    c #84BDE3\",
-\"/    c #88C2E7\",
-\"(    c #8BC5E9\",
-\"_    c #8DC7EB\",
-\":    c #8CC6EA\",
-\"<    c #89C3E8\",
-\"[    c #86BFE5\",
-\"}    c #81BAE1\",
-\"|    c #7BB3DC\",
-\"1    c #75ACD6\",
-\"2    c #6DA4CF\",
-\"3    c #979797\",
-\"4    c #A3A3A3\",
-\"5    c #A8A8A8\",
-\"6    c #ADADAD\",
-\"7    c #ACACAC\",
-\"8    c #A9A9A9\",
-\"9    c #A5A5A5\",
-\"0    c #9A9A9A\",
-\"a    c #929292\",
-\"b    c #8C8C8C\",
-\"c    c #808080\",
-\"d    c #818181\",
-\"e    c #838383\",
-\"f    c #848484\",
-\"g    c #858585\",
-\"h    c #868686\",
-\"i    c #828282\",
-\"                        \",
-\"                        \",
-\"                        \",
-\"   ..................   \",
-\"   .+@#$%&*=*-;>,')!.   \",
-\"   ..................   \",
-\"                        \",
-\"                        \",
-\"   ..................   \",
-\"   .~{]^/(___:<[}|12.   \",
-\"   ..................   \",
-\"                        \",
-\"                        \",
-\"   ..................   \",
-\"   .!3@45>666789'0ab.   \",
-\"   ..................   \",
-\"                        \",
-\"                        \",
-\"   ..................   \",
-\"   .cccdefghhgficccc.   \",
-\"   ..................   \",
-\"                        \",
-\"                        \",
-\"                        \"};
-"
-                     'xpm t))
-  "Image for the narrow image button.")
-
-(defconst newsticker--get-all-image
-  (and (fboundp 'image-type-available-p)
-       (image-type-available-p 'xpm)
-       (create-image "/* XPM */
-static char * get_all_xpm[] = {
-\"24 24 70 1\",
-\"     c None\",
-\".    c #000000\",
-\"+    c #F3DA00\",
-\"@    c #F5DF00\",
-\"#    c #F7E300\",
-\"$    c #F9E700\",
-\"%    c #FAEA00\",
-\"&    c #FBEC00\",
-\"*    c #FBED00\",
-\"=    c #FCEE00\",
-\"-    c #FAEB00\",
-\";    c #F9E800\",
-\">    c #F8E500\",
-\",    c #F6E000\",
-\"'    c #F4DB00\",
-\")    c #F1D500\",
-\"!    c #EFD000\",
-\"~    c #B7CA00\",
-\"{    c #BFD100\",
-\"]    c #C5D700\",
-\"^    c #CBDB00\",
-\"/    c #CFDF00\",
-\"(    c #D2E200\",
-\"_    c #D4E400\",
-\":    c #D3E300\",
-\"<    c #D0E000\",
-\"[    c #CCDD00\",
-\"}    c #C7D800\",
-\"|    c #C1D300\",
-\"1    c #BACC00\",
-\"2    c #B1C500\",
-\"3    c #A8BC00\",
-\"4    c #20A900\",
-\"5    c #22AF00\",
-\"6    c #24B500\",
-\"7    c #26B900\",
-\"8    c #27BC00\",
-\"9    c #27BE00\",
-\"0    c #28BF00\",
-\"a    c #27BD00\",
-\"b    c #26BA00\",
-\"c    c #25B600\",
-\"d    c #23B100\",
-\"e    c #21AB00\",
-\"f    c #1FA400\",
-\"g    c #1C9B00\",
-\"h    c #21AA00\",
-\"i    c #24B300\",
-\"j    c #25B800\",
-\"k    c #25B700\",
-\"l    c #24B400\",
-\"m    c #23B000\",
-\"n    c #1FA500\",
-\"o    c #1D9E00\",
-\"p    c #20A800\",
-\"q    c #21AC00\",
-\"r    c #23B200\",
-\"s    c #22AD00\",
-\"t    c #1D9F00\",
-\"u    c #20A700\",
-\"v    c #1EA100\",
-\"w    c #1C9C00\",
-\"x    c #1DA000\",
-\"y    c #1B9800\",
-\"z    c #1A9600\",
-\"A    c #1A9700\",
-\"B    c #1A9500\",
-\"C    c #199200\",
-\"D    c #189100\",
-\"E    c #178C00\",
-\"                        \",
-\"                        \",
-\"                        \",
-\"                        \",
-\"   ...................  \",
-\"   .+@#$%&*=*&-;>,')!.  \",
-\"   ...................  \",
-\"                        \",
-\"   ...................  \",
-\"   .~{]^/(___:<[}|123.  \",
-\"   ...................  \",
-\"                        \",
-\"   ...................  \",
-\"    .45678909abcdefg.   \",
-\"     .h5icj7jklmeno.    \",
-\"      .pq5drrmshft.     \",
-\"       .fu4h4pnvw.      \",
-\"        .oxvxtwy.       \",
-\"         .zAAzB.        \",
-\"          .CCD.         \",
-\"           .E.          \",
-\"            .           \",
-\"                        \",
-\"                        \"};
-"
-                     'xpm t))
-  "Image for the get all image button.")
-
-(defconst newsticker--update-image
-  (and (fboundp 'image-type-available-p)
-       (image-type-available-p 'xpm)
-       (create-image "/* XPM */
-static char * update_xpm[] = {
-\"24 24 37 1\",
-\"     c None\",
-\".    c #076D00\",
-\"+    c #0A8600\",
-\"@    c #0A8800\",
-\"#    c #098400\",
-\"$    c #087200\",
-\"%    c #087900\",
-\"&    c #098500\",
-\"*    c #098100\",
-\"=    c #087600\",
-\"-    c #097E00\",
-\";    c #097F00\",
-\">    c #0A8700\",
-\",    c #0A8C00\",
-\"'    c #097C00\",
-\")    c #098300\",
-\"!    c #0A8900\",
-\"~    c #0A8E00\",
-\"{    c #0B9200\",
-\"]    c #087700\",
-\"^    c #076E00\",
-\"/    c #076C00\",
-\"(    c #076B00\",
-\"_    c #076A00\",
-\":    c #076900\",
-\"<    c #076800\",
-\"[    c #066700\",
-\"}    c #066500\",
-\"|    c #066400\",
-\"1    c #066300\",
-\"2    c #066600\",
-\"3    c #066200\",
-\"4    c #076700\",
-\"5    c #065E00\",
-\"6    c #066100\",
-\"7    c #065F00\",
-\"8    c #066000\",
-\"                        \",
-\"                        \",
-\"                        \",
-\"    .    +@@@+#         \",
-\"    $% &@      +*       \",
-\"    =-#          ;      \",
-\"    %*>,          '     \",
-\"    ')!~{          =    \",
-\"                   ]$   \",
-\"   ^                ^   \",
-\"   .                .   \",
-\"   /                (   \",
-\"   _                :   \",
-\"   <                [   \",
-\"   }                |   \",
-\"   [[                   \",
-\"    1          $.:23    \",
-\"     3          4}35    \",
-\"      6          655    \",
-\"       76      85 55    \",
-\"        5555555    5    \",
-\"                        \",
-\"                        \",
-\"                        \"};
-"
-                     'xpm t))
-   "Image for the update button.")
-
-(defconst newsticker--browse-image
-  (and (fboundp 'image-type-available-p)
-       (image-type-available-p 'xpm)
-       (create-image "/* XPM */
-static char * visit_xpm[] = {
-\"24 24 39 1\",
-\"     c None\",
-\".    c #000000\",
-\"+    c #FFFFFF\",
-\"@    c #00E63D\",
-\"#    c #00E83E\",
-\"$    c #00E73D\",
-\"%    c #00E93E\",
-\"&    c #00E63C\",
-\"*    c #00E53C\",
-\"=    c #00E23B\",
-\"-    c #00E33B\",
-\";    c #00E83D\",
-\">    c #00E13A\",
-\",    c #00DD38\",
-\"'    c #00DE38\",
-\")    c #00E23A\",
-\"!    c #00E43C\",
-\"~    c #00DF39\",
-\"{    c #00DB37\",
-\"]    c #00D634\",
-\"^    c #00D734\",
-\"/    c #00E039\",
-\"(    c #00DC37\",
-\"_    c #00D835\",
-\":    c #00D332\",
-\"<    c #00CD2F\",
-\"[    c #00DB36\",
-\"}    c #00D433\",
-\"|    c #00CF30\",
-\"1    c #00DA36\",
-\"2    c #00D936\",
-\"3    c #00D533\",
-\"4    c #00D131\",
-\"5    c #00CE2F\",
-\"6    c #00CC2F\",
-\"7    c #00CA2D\",
-\"8    c #00C62B\",
-\"9    c #00C52A\",
-\"0    c #00BE27\",
-\"                        \",
-\"                        \",
-\"            .           \",
-\"           .+.          \",
-\"          .+++.         \",
-\"         .++.++.        \",
-\"        .++.@.++.       \",
-\"       .++.##$.++.      \",
-\"      .++.%%%#&.++.     \",
-\"     .++.$%%%#*=.++.    \",
-\"    .++.-@;##$*>,.++.   \",
-\"   .++.')!&@@*=~{].++.  \",
-\"  .++.^{~>---)/(_:<.++. \",
-\"   .++.^[,~/~'(_}|.++.  \",
-\"    .++.]_1[12^:|.++.   \",
-\"     .++.:}33:45.++.    \",
-\"      .++.<5567.++.     \",
-\"       .++.889.++.      \",
-\"        .++.0.++.       \",
-\"         .++.++.        \",
-\"          .+++.         \",
-\"           .+.          \",
-\"            .           \",
-\"                        \"};
-"
-                     'xpm t))
-  "Image for the browse button.")
-
-(provide 'newsticker-reader)
-
-;; arch-tag: c604b701-bdf1-4fc1-8d05-5fabd1939533
-;;; newst-reader.el ends here
+;;; newst-reader.el --- Generic RSS reader functions.
+
+;; Copyright (C) 2003-2011  Free Software Foundation, Inc.
+
+;; Author:      Ulf Jasper <ulf.jasper@web.de>
+;; Filename:    newst-reader.el
+;; URL:         http://www.nongnu.org/newsticker
+;; Time-stamp:  "13. Mai 2011, 20:55:24 (ulf)"
+;; Package:     newsticker
+
+;; ======================================================================
+
+;; This file is part of GNU Emacs.
+
+;; 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 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
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
+
+;; ======================================================================
+;;; Commentary:
+
+;; See newsticker.el
+
+;; ======================================================================
+;;; Code:
+
+(require 'newst-backend)
+
+;; ======================================================================
+;;; Customization
+;; ======================================================================
+(defun newsticker--set-customvar-formatting (symbol value)
+  "Set newsticker-variable SYMBOL value to VALUE.
+Calls all actions which are necessary in order to make the new
+value effective."
+  (if (or (not (boundp symbol))
+          (equal (symbol-value symbol) value))
+      (set symbol value)
+    ;; something must have changed
+    (set symbol value)
+    (when (fboundp 'newsticker--forget-preformatted)
+      (newsticker--forget-preformatted))))
+
+;; ======================================================================
+;; reader
+(defgroup newsticker-reader nil
+  "Settings for the feed reader."
+  :group 'newsticker)
+
+(defcustom newsticker-frontend
+  'newsticker-treeview
+  "Newsticker frontend for reading news.
+This must be one of the functions `newsticker-plainview' or
+`newsticker-treeview'."
+  :type '(choice :tag "Frontend"
+                 (const :tag "Single buffer (plainview)" newsticker-plainview)
+                 (const :tag "Tree view (treeview)" newsticker-treeview))
+  :group 'newsticker-reader)
+
+;; image related things
+(defcustom newsticker-enable-logo-manipulations
+  t
+  "If non-nil newsticker manipulates logo images.
+This enables the following image properties: heuristic mask for all
+logos, and laplace-conversion for images without new items."
+  :type 'boolean
+  :group 'newsticker-reader)
+
+(defcustom newsticker-justification
+  'left
+  "How to fill item descriptions.
+If non-nil newsticker calls `fill-region' to wrap long lines in
+item descriptions.  However, if an item description contains HTML
+text and `newsticker-html-renderer' is non-nil, filling is not
+done."
+  :type '(choice :tag "Justification"
+                 (const :tag "No filling" nil)
+                 (const :tag "Left"       left)
+                 (const :tag "Right"      right)
+                 (const :tag "Center"     center)
+                 (const :tag "Full"       full))
+  :set 'newsticker--set-customvar-formatting
+  :group 'newsticker-reader)
+
+(defcustom newsticker-use-full-width
+  t
+  "Decides whether to use the full window width when filling.
+If non-nil newsticker sets `fill-column' so that the whole
+window is used when filling.  See also `newsticker-justification'."
+  :type 'boolean
+  :set 'newsticker--set-customvar-formatting
+  :group 'newsticker-reader)
+
+(defcustom newsticker-html-renderer
+  nil
+  "Function for rendering HTML contents.
+If non-nil, newsticker.el will call this function whenever it finds
+HTML-like tags in item descriptions.  Possible functions are, for
+example, `w3m-region', `w3-region', and (if you have htmlr.el installed)
+`newsticker-htmlr-render'.
+
+In order to make sure that the HTML renderer is loaded when you
+run newsticker, you should add one of the following statements to
+your .emacs.  If you use w3m,
+
+  (autoload 'w3m-region \"w3m\"
+    \"Render region in current buffer and replace with result.\" t)
+
+  (autoload 'w3m-toggle-inline-image \"w3m\"
+    \"Toggle the visibility of an image under point.\" t)
+
+or, if you use w3,
+
+  (require 'w3-auto)
+
+or, if you use htmlr
+
+  (require 'htmlr)"
+  :type '(choice :tag "Function"
+                 (const :tag "None" nil)
+                 (const :tag "w3" w3-region)
+                 (const :tag "w3m" w3m-region)
+                 (const :tag "htmlr" newsticker-htmlr-render))
+  :set 'newsticker--set-customvar-formatting
+  :group 'newsticker-reader)
+
+(defcustom newsticker-date-format
+  "(%A, %H:%M)"
+  "Format for the date part in item and feed lines.
+See `format-time-string' for a list of valid specifiers."
+  :type 'string
+  :set 'newsticker--set-customvar-formatting
+  :group 'newsticker-reader)
+
+(defgroup newsticker-faces nil
+  "Settings for the faces of the feed reader."
+  :group 'newsticker-reader)
+
+(defface newsticker-feed-face
+  '((((class color) (background dark))
+     (:family "sans" :bold t :height 1.2 :foreground "white"))
+    (((class color) (background light))
+     (:family "sans" :bold t :height 1.2 :foreground "black")))
+  "Face for news feeds."
+  :group 'newsticker-faces)
+
+(defface newsticker-extra-face
+  '((((class color) (background dark))
+     (:italic t :foreground "gray50" :height 0.8))
+    (((class color) (background light))
+     (:italic t :foreground "gray50" :height 0.8)))
+  "Face for newsticker dates."
+  :group 'newsticker-faces)
+
+(defface newsticker-enclosure-face
+  '((((class color) (background dark))
+     (:bold t :background "orange"))
+    (((class color) (background light))
+     (:bold t :background "orange")))
+  "Face for enclosed elements."
+  :group 'newsticker-faces)
+
+;; ======================================================================
+;;; Utility functions
+;; ======================================================================
+(defun newsticker--insert-enclosure (item keymap)
+  "Insert enclosure element of a news ITEM into the current buffer.
+KEYMAP will be applied."
+  (let ((enclosure (newsticker--enclosure item))
+        (beg (point)))
+    (when enclosure
+      (let ((url (cdr (assoc 'url enclosure)))
+            (length (string-to-number (or (cdr (assoc 'length enclosure))
+                                          "-1")))
+            (type (cdr (assoc 'type enclosure))))
+        (cond ((> length 1048576)
+               (insert (format "Enclosed file (%s, %1.2f MBytes)" type
+                               (/ length 1048576))))
+              ((> length 1024)
+               (insert (format "Enclosed file (%s, %1.2f KBytes)" type
+                               (/ length 1024))))
+              ((> length 0)
+               (insert (format "Enclosed file (%s, %1.2f Bytes)" type
+                               length)))
+              (t
+               (insert (format "Enclosed file (%s, unknown size)" type))))
+        (add-text-properties beg (point)
+                             (list 'mouse-face 'highlight
+                                   'nt-link url
+                                   'help-echo (format
+                                               "mouse-2: visit (%s)" url)
+                                   'keymap keymap
+                                   'nt-face 'enclosure
+                                   'nt-type 'desc))
+        (insert "\n")))))
+
+(defun newsticker--print-extra-elements (item keymap)
+  "Insert extra-elements of ITEM in a pretty form into the current buffer.
+KEYMAP is applied."
+  (let ((ignored-elements '(items link title description content
+                                  content:encoded dc:subject
+                                  dc:date entry item guid pubDate
+                                  published updated
+                                  enclosure))
+        (left-column-width 1))
+    (mapc (lambda (extra-element)
+            (when (listp extra-element) ;; take care of broken xml
+                                        ;; data, 2007-05-25
+              (unless (memq (car extra-element) ignored-elements)
+                (setq left-column-width (max left-column-width
+                                             (length (symbol-name
+                                                      (car extra-element))))))))
+          (newsticker--extra item))
+    (mapc (lambda (extra-element)
+            (when (listp extra-element) ;; take care of broken xml
+                                        ;; data, 2007-05-25
+              (unless (memq (car extra-element) ignored-elements)
+                (newsticker--do-print-extra-element extra-element
+                                                    left-column-width
+                                                    keymap))))
+          (newsticker--extra item))))
+
+(defun newsticker--do-print-extra-element (extra-element width keymap)
+  "Actually print an EXTRA-ELEMENT using the given WIDTH.
+KEYMAP is applied."
+  (let ((name (symbol-name (car extra-element))))
+    (insert (format "%s: " name))
+    (insert (make-string (- width (length name)) ? )))
+  (let (;;(attributes (cadr extra-element)) ;FIXME!!!!
+        (contents (cddr extra-element)))
+    (cond ((listp contents)
+           (mapc (lambda (i)
+                   (if (and (stringp i)
+                            (string-match "^http://.*" i))
+                       (let ((pos (point)))
+                         (insert i " ") ; avoid self-reference from the
+                                        ; nt-link thing
+                         (add-text-properties
+                          pos (point)
+                          (list 'mouse-face 'highlight
+                                'nt-link i
+                                'help-echo
+                                (format "mouse-2: visit (%s)" i)
+                                'keymap keymap)))
+                         (insert (format "%s" i))))
+                 contents))
+          (t
+           (insert (format "%s" contents))))
+    (insert "\n")))
+
+(defun newsticker--image-read (feed-name-symbol disabled)
+  "Read the cached image for FEED-NAME-SYMBOL from disk.
+If DISABLED is non-nil the image will be converted to a disabled look
+\(unless `newsticker-enable-logo-manipulations' is not t\).
+Return the image."
+  (let ((image-name (concat (newsticker--images-dir)
+                            (symbol-name feed-name-symbol)))
+        (img nil))
+    (when (file-exists-p image-name)
+      (condition-case error-data
+          (setq img (create-image
+                     image-name nil nil
+                     :conversion (and newsticker-enable-logo-manipulations
+                                      disabled
+                                      'disabled)
+                     :mask (and newsticker-enable-logo-manipulations
+                                'heuristic)
+                     :ascent 70))
+        (error
+         (message "Error: cannot create image for %s: %s"
+                  feed-name-symbol error-data))))
+    img))
+
+;; the functions we need for retrieval and display
+;;;###autoload
+(defun newsticker-show-news ()
+  "Start reading news.  You may want to bind this to a key."
+  (interactive)
+  (newsticker-start t) ;; will start only if not running
+  (funcall newsticker-frontend))
+
+;; ======================================================================
+;;; Toolbar
+;; ======================================================================
+
+(defun newsticker-browse-url-item (feed item)
+  "Convert FEED ITEM to html and call `browse-url' on result."
+  (interactive)
+  (let ((t-file (make-temp-file "newsticker")))
+    (with-temp-file t-file
+      (insert "<?xml version=\"1.0\" encoding=\"utf-8\"?>
+               <!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"
+               \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">
+               <html xmlns=\"http://www.w3.org/1999/xhtml\">
+               <body>")
+      (insert "<h1>" feed ": " (newsticker--title item) "</h1>")
+      (insert (format-time-string newsticker-date-format
+                                  (newsticker--time item)))
+      (insert "<br/>")
+      (insert (or (newsticker--desc item) "[No Description]"))
+      (when (newsticker--enclosure item)
+        (insert "<br/><hr/><i>")
+        (newsticker--insert-enclosure item nil)
+        (insert "</i>"))
+      (when (newsticker--extra item)
+        (insert "<br/><hr/><tt>")
+        (newsticker--print-extra-elements item nil)
+        (insert "</tt>"))
+      (insert "</body></html>"))
+    (browse-url t-file)))
+
+(provide 'newst-reader)
+
+;;; newst-reader.el ends here