changeset 95677:737dc8db789e

Initial check-in.
author Ulf Jasper <ulf.jasper@web.de>
date Sun, 08 Jun 2008 15:35:57 +0000
parents 57b32cda96c9
children 86fd39c6039a
files lisp/net/newsticker-reader.el
diffstat 1 files changed, 1118 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/net/newsticker-reader.el	Sun Jun 08 15:35:57 2008 +0000
@@ -0,0 +1,1118 @@
+;;; newsticker-reader.el --- Generic RSS reader functions.
+
+;; Copyright (C) 2008 Free Software Foundation, Inc.
+
+;; This file is part of GNU Emacs.
+
+;; Author:      Ulf Jasper <ulf.jasper@web.de>
+;; Filename:    newsticker-reader.el
+;; URL:         http://www.nongnu.org/newsticker
+;; Time-stamp:  "7. Juni 2008, 15:34:08 (ulf)"
+;; CVS-Version: $Id: newsticker-reader.el,v 1.5 2008/05/04 18:21:08 u11 Exp $
+
+;; ======================================================================
+
+;; 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)
+
+;; ======================================================================
+;;; 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)
+
+;; ======================================================================
+;;; 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
+  (if (fboundp 'create-image)
+      (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
+  (if (fboundp 'create-image)
+      (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
+  (if (fboundp 'create-image)
+      (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
+  (if (fboundp 'create-image)
+      (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
+  (if (fboundp 'create-image)
+      (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 next feed button."))
+
+(defconst newsticker--mark-immortal-image
+  (if (fboundp 'create-image)
+      (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 next feed button."))
+
+(defconst newsticker--narrow-image
+  (if (fboundp 'create-image)
+      (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 next feed button."))
+
+(defconst newsticker--get-all-image
+  (if (fboundp 'create-image)
+      (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 next feed button."))
+
+(defconst newsticker--update-image
+  (if (fboundp 'create-image)
+      (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
+  (if (fboundp 'create-image)
+      (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)
+;;; newsticker-reader.el ends here