Initial check-in.
[bpt/emacs.git] / lisp / net / newsticker-reader.el
CommitLineData
2415d4c6
UJ
1;;; newsticker-reader.el --- Generic RSS reader functions.
2
3;; Copyright (C) 2008 Free Software Foundation, Inc.
4
5;; This file is part of GNU Emacs.
6
7;; Author: Ulf Jasper <ulf.jasper@web.de>
8;; Filename: newsticker-reader.el
9;; URL: http://www.nongnu.org/newsticker
10;; Time-stamp: "7. Juni 2008, 15:34:08 (ulf)"
11;; CVS-Version: $Id: newsticker-reader.el,v 1.5 2008/05/04 18:21:08 u11 Exp $
12
13;; ======================================================================
14
15;; GNU Emacs is free software: you can redistribute it and/or modify
16;; it under the terms of the GNU General Public License as published by
17;; the Free Software Foundation, either version 3 of the License, or
18;; (at your option) any later version.
19
20;; GNU Emacs is distributed in the hope that it will be useful,
21;; but WITHOUT ANY WARRANTY; without even the implied warranty of
22;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23;; GNU General Public License for more details.
24
25;; You should have received a copy of the GNU General Public License
26;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
27
28;; ======================================================================
29;;; Commentary:
30
31;; See newsticker.el
32
33;; ======================================================================
34;;; Code:
35
36(require 'newsticker-backend)
37
38;; ======================================================================
39;;; Customization
40;; ======================================================================
41(defun newsticker--set-customvar-formatting (symbol value)
42 "Set newsticker-variable SYMBOL value to VALUE.
43Calls all actions which are necessary in order to make the new
44value effective."
45 (if (or (not (boundp symbol))
46 (equal (symbol-value symbol) value))
47 (set symbol value)
48 ;; something must have changed
49 (set symbol value)
50 (when (fboundp 'newsticker--forget-preformatted)
51 (newsticker--forget-preformatted))))
52
53;; ======================================================================
54;; reader
55(defgroup newsticker-reader nil
56 "Settings for the feed reader."
57 :group 'newsticker)
58
59(defcustom newsticker-frontend
60 'newsticker-treeview
61 "Newsticker frontend for reading news.
62This must be one of the functions `newsticker-plainview' or
63`newsticker-treeview'."
64 :type '(choice :tag "Frontend"
65 (const :tag "Single buffer (plainview)" newsticker-plainview)
66 (const :tag "Tree view (treeview)" newsticker-treeview))
67 :group 'newsticker-reader)
68
69;; image related things
70(defcustom newsticker-enable-logo-manipulations
71 t
72 "If non-nil newsticker manipulates logo images.
73This enables the following image properties: heuristic mask for all
74logos, and laplace-conversion for images without new items."
75 :type 'boolean
76 :group 'newsticker-reader)
77
78(defcustom newsticker-justification
79 'left
80 "How to fill item descriptions.
81If non-nil newsticker calls `fill-region' to wrap long lines in
82item descriptions. However, if an item description contains HTML
83text and `newsticker-html-renderer' is non-nil, filling is not
84done."
85 :type '(choice :tag "Justification"
86 (const :tag "No filling" nil)
87 (const :tag "Left" left)
88 (const :tag "Right" right)
89 (const :tag "Center" center)
90 (const :tag "Full" full))
91 :set 'newsticker--set-customvar-formatting
92 :group 'newsticker-reader)
93
94(defcustom newsticker-use-full-width
95 t
96 "Decides whether to use the full window width when filling.
97If non-nil newsticker sets `fill-column' so that the whole
98window is used when filling. See also `newsticker-justification'."
99 :type 'boolean
100 :set 'newsticker--set-customvar-formatting
101 :group 'newsticker-reader)
102
103(defcustom newsticker-html-renderer
104 nil
105 "Function for rendering HTML contents.
106If non-nil, newsticker.el will call this function whenever it finds
107HTML-like tags in item descriptions. Possible functions are, for
108example, `w3m-region', `w3-region', and (if you have htmlr.el installed)
109`newsticker-htmlr-render'.
110
111In order to make sure that the HTML renderer is loaded when you
112run newsticker, you should add one of the following statements to
113your .emacs. If you use w3m,
114
115 (autoload 'w3m-region \"w3m\"
116 \"Render region in current buffer and replace with result.\" t)
117
118 (autoload 'w3m-toggle-inline-image \"w3m\"
119 \"Toggle the visibility of an image under point.\" t)
120
121or, if you use w3,
122
123 (require 'w3-auto)
124
125or, if you use htmlr
126
127 (require 'htmlr)"
128 :type '(choice :tag "Function"
129 (const :tag "None" nil)
130 (const :tag "w3" w3-region)
131 (const :tag "w3m" w3m-region)
132 (const :tag "htmlr" newsticker-htmlr-render))
133 :set 'newsticker--set-customvar-formatting
134 :group 'newsticker-reader)
135
136(defcustom newsticker-date-format
137 "(%A, %H:%M)"
138 "Format for the date part in item and feed lines.
139See `format-time-string' for a list of valid specifiers."
140 :type 'string
141 :set 'newsticker--set-customvar-formatting
142 :group 'newsticker-reader)
143
144;; ======================================================================
145;;; Utility functions
146;; ======================================================================
147(defun newsticker--insert-enclosure (item keymap)
148 "Insert enclosure element of a news ITEM into the current buffer.
149KEYMAP will be applied."
150 (let ((enclosure (newsticker--enclosure item))
151 (beg (point)))
152 (when enclosure
153 (let ((url (cdr (assoc 'url enclosure)))
154 (length (string-to-number (or (cdr (assoc 'length enclosure))
155 "-1")))
156 (type (cdr (assoc 'type enclosure))))
157 (cond ((> length 1048576)
158 (insert (format "Enclosed file (%s, %1.2f MBytes)" type
159 (/ length 1048576))))
160 ((> length 1024)
161 (insert (format "Enclosed file (%s, %1.2f KBytes)" type
162 (/ length 1024))))
163 ((> length 0)
164 (insert (format "Enclosed file (%s, %1.2f Bytes)" type
165 length)))
166 (t
167 (insert (format "Enclosed file (%s, unknown size)" type))))
168 (add-text-properties beg (point)
169 (list 'mouse-face 'highlight
170 'nt-link url
171 'help-echo (format
172 "mouse-2: visit (%s)" url)
173 'keymap keymap
174 'nt-face 'enclosure
175 'nt-type 'desc))
176 (insert "\n")))))
177
178(defun newsticker--print-extra-elements (item keymap)
179 "Insert extra-elements of ITEM in a pretty form into the current buffer.
180KEYMAP is applied."
181 (let ((ignored-elements '(items link title description content
182 content:encoded dc:subject
183 dc:date entry item guid pubDate
184 published updated
185 enclosure))
186 (left-column-width 1))
187 (mapc (lambda (extra-element)
188 (when (listp extra-element) ;; take care of broken xml
189 ;; data, 2007-05-25
190 (unless (memq (car extra-element) ignored-elements)
191 (setq left-column-width (max left-column-width
192 (length (symbol-name
193 (car extra-element))))))))
194 (newsticker--extra item))
195 (mapc (lambda (extra-element)
196 (when (listp extra-element) ;; take care of broken xml
197 ;; data, 2007-05-25
198 (unless (memq (car extra-element) ignored-elements)
199 (newsticker--do-print-extra-element extra-element
200 left-column-width
201 keymap))))
202 (newsticker--extra item))))
203
204(defun newsticker--do-print-extra-element (extra-element width keymap)
205 "Actually print an EXTRA-ELEMENT using the given WIDTH.
206KEYMAP is applied."
207 (let ((name (symbol-name (car extra-element))))
208 (insert (format "%s: " name))
209 (insert (make-string (- width (length name)) ? )))
210 (let (;;(attributes (cadr extra-element)) ;FIXME!!!!
211 (contents (cddr extra-element)))
212 (cond ((listp contents)
213 (mapc (lambda (i)
214 (if (and (stringp i)
215 (string-match "^http://.*" i))
216 (let ((pos (point)))
217 (insert i " ") ; avoid self-reference from the
218 ; nt-link thing
219 (add-text-properties
220 pos (point)
221 (list 'mouse-face 'highlight
222 'nt-link i
223 'help-echo
224 (format "mouse-2: visit (%s)" i)
225 'keymap keymap)))
226 (insert (format "%s" i))))
227 contents))
228 (t
229 (insert (format "%s" contents))))
230 (insert "\n")))
231
232(defun newsticker--image-read (feed-name-symbol disabled)
233 "Read the cached image for FEED-NAME-SYMBOL from disk.
234If DISABLED is non-nil the image will be converted to a disabled look
235\(unless `newsticker-enable-logo-manipulations' is not t\).
236Return the image."
237 (let ((image-name (concat newsticker-imagecache-dirname "/"
238 (symbol-name feed-name-symbol)))
239 (img nil))
240 (when (file-exists-p image-name)
241 (condition-case error-data
242 (setq img (create-image
243 image-name nil nil
244 :conversion (and newsticker-enable-logo-manipulations
245 disabled
246 'disabled)
247 :mask (and newsticker-enable-logo-manipulations
248 'heuristic)
249 :ascent 70))
250 (error
251 (message "Error: cannot create image for %s: %s"
252 feed-name-symbol error-data))))
253 img))
254
255;; the functions we need for retrieval and display
256;;;###autoload
257(defun newsticker-show-news ()
258 "Start reading news. You may want to bind this to a key."
259 (interactive)
260 (newsticker-start t) ;; will start only if not running
261 (funcall newsticker-frontend))
262
263;; ======================================================================
264;;; Toolbar
265;; ======================================================================
266(defconst newsticker--next-item-image
267 (if (fboundp 'create-image)
268 (create-image "/* XPM */
269static char * next_xpm[] = {
270\"24 24 42 1\",
271\" c None\",
272\". c #000000\",
273\"+ c #7EB6DE\",
274\"@ c #82BBE2\",
275\"# c #85BEE4\",
276\"$ c #88C1E7\",
277\"% c #8AC3E8\",
278\"& c #87C1E6\",
279\"* c #8AC4E9\",
280\"= c #8CC6EA\",
281\"- c #8CC6EB\",
282\"; c #88C2E7\",
283\"> c #8BC5E9\",
284\", c #8DC7EB\",
285\"' c #87C0E6\",
286\") c #8AC4E8\",
287\"! c #8BC5EA\",
288\"~ c #8BC4E9\",
289\"{ c #88C1E6\",
290\"] c #89C3E8\",
291\"^ c #86BFE5\",
292\"/ c #83BBE2\",
293\"( c #82BBE1\",
294\"_ c #86C0E5\",
295\": c #87C0E5\",
296\"< c #83BCE2\",
297\"[ c #81B9E0\",
298\"} c #81BAE1\",
299\"| c #78B0D9\",
300\"1 c #7BB3DB\",
301\"2 c #7DB5DD\",
302\"3 c #7DB6DD\",
303\"4 c #72A9D4\",
304\"5 c #75ACD6\",
305\"6 c #76AED7\",
306\"7 c #77AFD8\",
307\"8 c #6BA1CD\",
308\"9 c #6EA4CF\",
309\"0 c #6FA6D1\",
310\"a c #6298C6\",
311\"b c #659BC8\",
312\"c c #5C91C0\",
313\" \",
314\" \",
315\" . \",
316\" .. \",
317\" .+. \",
318\" .@#. \",
319\" .#$%. \",
320\" .&*=-. \",
321\" .;>,,,. \",
322\" .;>,,,=. \",
323\" .')!==~;. \",
324\" .#{]*%;^/. \",
325\" .(#_':#<. \",
326\" .+[@</}. \",
327\" .|1232. \",
328\" .4567. \",
329\" .890. \",
330\" .ab. \",
331\" .c. \",
332\" .. \",
333\" . \",
334\" \",
335\" \",
336\" \"};
337"
338 'xpm t)
339 "Image for the next item button."))
340
341(defconst newsticker--previous-item-image
342 (if (fboundp 'create-image)
343 (create-image "/* XPM */
344static char * previous_xpm[] = {
345\"24 24 39 1\",
346\" c None\",
347\". c #000000\",
348\"+ c #7BB3DB\",
349\"@ c #83BCE2\",
350\"# c #7FB8DF\",
351\"$ c #89C2E7\",
352\"% c #86BFE5\",
353\"& c #83BBE2\",
354\"* c #8CC6EA\",
355\"= c #8BC4E9\",
356\"- c #88C2E7\",
357\"; c #85BEE4\",
358\"> c #8DC7EB\",
359\", c #89C3E8\",
360\"' c #8AC4E8\",
361\") c #8BC5EA\",
362\"! c #88C1E6\",
363\"~ c #8AC4E9\",
364\"{ c #8AC3E8\",
365\"] c #86C0E5\",
366\"^ c #87C0E6\",
367\"/ c #87C0E5\",
368\"( c #82BBE2\",
369\"_ c #81BAE1\",
370\": c #7FB7DF\",
371\"< c #7DB6DD\",
372\"[ c #7DB5DD\",
373\"} c #7CB4DC\",
374\"| c #79B1DA\",
375\"1 c #76ADD7\",
376\"2 c #77AFD8\",
377\"3 c #73AAD4\",
378\"4 c #70A7D1\",
379\"5 c #6EA5D0\",
380\"6 c #6CA2CE\",
381\"7 c #689ECB\",
382\"8 c #6399C7\",
383\"9 c #6095C4\",
384\"0 c #5C90C0\",
385\" \",
386\" \",
387\" . \",
388\" .. \",
389\" .+. \",
390\" .@#. \",
391\" .$%&. \",
392\" .*=-;. \",
393\" .>>*,%. \",
394\" .>>>*,%. \",
395\" .')**=-;. \",
396\" .;!,~{-%&. \",
397\" .;]^/;@#. \",
398\" .(@&_:+. \",
399\" .<[}|1. \",
400\" .2134. \",
401\" .567. \",
402\" .89. \",
403\" .0. \",
404\" .. \",
405\" . \",
406\" \",
407\" \",
408\" \"};
409"
410 'xpm t)
411 "Image for the previous item button."))
412
413(defconst newsticker--previous-feed-image
414 (if (fboundp 'create-image)
415 (create-image "/* XPM */
416static char * prev_feed_xpm[] = {
417\"24 24 52 1\",
418\" c None\",
419\". c #000000\",
420\"+ c #70A7D2\",
421\"@ c #75ADD6\",
422\"# c #71A8D3\",
423\"$ c #79B1DA\",
424\"% c #7BB3DB\",
425\"& c #7DB5DD\",
426\"* c #83BBE2\",
427\"= c #7EB6DE\",
428\"- c #78B0D9\",
429\"; c #7FB7DE\",
430\"> c #88C2E7\",
431\", c #85BEE4\",
432\"' c #80B9E0\",
433\") c #80B8DF\",
434\"! c #8CC6EA\",
435\"~ c #89C3E8\",
436\"{ c #86BFE5\",
437\"] c #81BAE1\",
438\"^ c #7CB4DC\",
439\"/ c #7FB8DF\",
440\"( c #8DC7EB\",
441\"_ c #7BB3DC\",
442\": c #7EB7DE\",
443\"< c #8BC4E9\",
444\"[ c #8AC4E9\",
445\"} c #8AC3E8\",
446\"| c #87C0E6\",
447\"1 c #87C0E5\",
448\"2 c #83BCE2\",
449\"3 c #75ACD6\",
450\"4 c #7FB7DF\",
451\"5 c #77AED8\",
452\"6 c #71A8D2\",
453\"7 c #70A7D1\",
454\"8 c #76ADD7\",
455\"9 c #6CA2CE\",
456\"0 c #699FCC\",
457\"a c #73AAD4\",
458\"b c #6BA1CD\",
459\"c c #669CC9\",
460\"d c #6298C5\",
461\"e c #689ECB\",
462\"f c #6499C7\",
463\"g c #6095C3\",
464\"h c #5C91C0\",
465\"i c #5E93C2\",
466\"j c #5B90C0\",
467\"k c #588CBC\",
468\"l c #578CBC\",
469\"m c #5589BA\",
470\" \",
471\" \",
472\" ... . \",
473\" .+. .. \",
474\" .@. .#. \",
475\" .$. .%@. \",
476\" .&. .*=-. \",
477\" .;. .>,'%. \",
478\" .). .!~{]^. \",
479\" ./. .(!~{]_. \",
480\" .:. .!!<>,'%. \",
481\" .&. .~[}>{*=-. \",
482\" .$. .|1,2/%@. \",
483\" .3. .*]4%56. \",
484\" .7. .^$8#9. \",
485\" .0. .a7bc. \",
486\" .d. .efg. \",
487\" .h. .ij. \",
488\" .k. .l. \",
489\" .m. .. \",
490\" ... . \",
491\" \",
492\" \",
493\" \"};
494"
495 'xpm t)
496 "Image for the previous feed button."))
497
498(defconst newsticker--next-feed-image
499 (if (fboundp 'create-image)
500 (create-image "/* XPM */
501static char * next_feed_xpm[] = {
502\"24 24 57 1\",
503\" c None\",
504\". c #000000\",
505\"+ c #6CA2CE\",
506\"@ c #75ADD6\",
507\"# c #71A8D3\",
508\"$ c #79B1DA\",
509\"% c #7EB7DE\",
510\"& c #7DB5DD\",
511\"* c #81BAE1\",
512\"= c #85BEE4\",
513\"- c #78B0D9\",
514\"; c #7FB7DE\",
515\"> c #83BCE3\",
516\", c #87C1E6\",
517\"' c #8AC4E9\",
518\") c #7BB3DB\",
519\"! c #80B8DF\",
520\"~ c #88C2E7\",
521\"{ c #8BC5E9\",
522\"] c #8DC7EB\",
523\"^ c #7CB4DC\",
524\"/ c #7FB8DF\",
525\"( c #84BDE3\",
526\"_ c #7BB3DC\",
527\": c #83BCE2\",
528\"< c #87C0E6\",
529\"[ c #8AC4E8\",
530\"} c #8BC5EA\",
531\"| c #8CC6EA\",
532\"1 c #88C1E6\",
533\"2 c #89C3E8\",
534\"3 c #8AC3E8\",
535\"4 c #7EB6DE\",
536\"5 c #82BBE1\",
537\"6 c #86C0E5\",
538\"7 c #87C0E5\",
539\"8 c #75ACD6\",
540\"9 c #7AB2DA\",
541\"0 c #81B9E0\",
542\"a c #82BBE2\",
543\"b c #71A8D2\",
544\"c c #70A7D1\",
545\"d c #74ACD6\",
546\"e c #699FCC\",
547\"f c #6EA5D0\",
548\"g c #72A9D4\",
549\"h c #669CC9\",
550\"i c #6298C5\",
551\"j c #679DCA\",
552\"k c #6BA1CD\",
553\"l c #6095C3\",
554\"m c #5C91C0\",
555\"n c #5F94C2\",
556\"o c #5B90C0\",
557\"p c #588CBC\",
558\"q c #578CBC\",
559\"r c #5589BA\",
560\" \",
561\" \",
562\" . ... \",
563\" .. .+. \",
564\" .@. .#. \",
565\" .$%. .@. \",
566\" .&*=. .-. \",
567\" .;>,'. .). \",
568\" .!=~{]. .^. \",
569\" ./(~{]]. ._. \",
570\" .%:<[}||. .). \",
571\" .&*=12'3~. .-. \",
572\" .$45=6<7. .@. \",
573\" .8940a:. .b. \",
574\" .cd-)&. .+. \",
575\" .efg8. .h. \",
576\" .ijk. .l. \",
577\" .mn. .o. \",
578\" .p. .q. \",
579\" .. .r. \",
580\" . ... \",
581\" \",
582\" \",
583\" \"};
584"
585 'xpm t)
586 "Image for the next feed button."))
587
588(defconst newsticker--mark-read-image
589 (if (fboundp 'create-image)
590 (create-image "/* XPM */
591static char * mark_read_xpm[] = {
592\"24 24 44 1\",
593\" c None\",
594\". c #C20000\",
595\"+ c #BE0000\",
596\"@ c #C70000\",
597\"# c #CE0000\",
598\"$ c #C90000\",
599\"% c #BD0000\",
600\"& c #CB0000\",
601\"* c #D10000\",
602\"= c #D70000\",
603\"- c #D30000\",
604\"; c #CD0000\",
605\"> c #C60000\",
606\", c #D40000\",
607\"' c #DA0000\",
608\") c #DE0000\",
609\"! c #DB0000\",
610\"~ c #D60000\",
611\"{ c #D00000\",
612\"] c #DC0000\",
613\"^ c #E00000\",
614\"/ c #E40000\",
615\"( c #E10000\",
616\"_ c #DD0000\",
617\": c #D80000\",
618\"< c #E50000\",
619\"[ c #E70000\",
620\"} c #E60000\",
621\"| c #E20000\",
622\"1 c #E90000\",
623\"2 c #E80000\",
624\"3 c #E30000\",
625\"4 c #DF0000\",
626\"5 c #D90000\",
627\"6 c #CC0000\",
628\"7 c #C10000\",
629\"8 c #C30000\",
630\"9 c #BF0000\",
631\"0 c #B90000\",
632\"a c #BC0000\",
633\"b c #BB0000\",
634\"c c #B80000\",
635\"d c #B50000\",
636\"e c #B70000\",
637\" \",
638\" \",
639\" \",
640\" . + \",
641\" +@# $.% \",
642\" &*= -;> \",
643\" ,') !~{ \",
644\" ]^/ (_: \",
645\" (<[ }|) \",
646\" <[1 2<| \",
647\" }222[< \",
648\" }}}< \",
649\" 333| \",
650\" _4^4)] \",
651\" ~:' 5=- \",
652\" 6{- *#$ \",
653\" 7>$ @89 \",
654\" 0a+ %bc \",
655\" ddc edd \",
656\" ddd ddd \",
657\" d d \",
658\" \",
659\" \",
660\" \"};
661"
662 'xpm t)
663 "Image for the next feed button."))
664
665(defconst newsticker--mark-immortal-image
666 (if (fboundp 'create-image)
667 (create-image "/* XPM */
668static char * mark_immortal_xpm[] = {
669\"24 24 93 2\",
670\" c None\",
671\". c #171717\",
672\"+ c #030303\",
673\"@ c #000000\",
674\"# c #181818\",
675\"$ c #090909\",
676\"% c #FFC960\",
677\"& c #FFCB61\",
678\"* c #FFCB62\",
679\"= c #FFC961\",
680\"- c #FFC75F\",
681\"; c #FFC65E\",
682\"> c #FFCA61\",
683\", c #FFCD63\",
684\"' c #FFCF65\",
685\") c #FFD065\",
686\"! c #FFCE64\",
687\"~ c #FFC35C\",
688\"{ c #FFC45D\",
689\"] c #FFD166\",
690\"^ c #FFD267\",
691\"/ c #FFD368\",
692\"( c #FFD167\",
693\"_ c #FFC05A\",
694\": c #010101\",
695\"< c #040404\",
696\"[ c #FFCC62\",
697\"} c #FFD569\",
698\"| c #FFD56A\",
699\"1 c #FFC860\",
700\"2 c #FFC25B\",
701\"3 c #FFBB56\",
702\"4 c #020202\",
703\"5 c #060606\",
704\"6 c #FFC15B\",
705\"7 c #FFC85F\",
706\"8 c #FFD469\",
707\"9 c #FFD66A\",
708\"0 c #FFBC57\",
709\"a c #1B1B1B\",
710\"b c #070707\",
711\"c c #FFBA55\",
712\"d c #FFB451\",
713\"e c #FFB954\",
714\"f c #FFB350\",
715\"g c #FFB652\",
716\"h c #FFBE58\",
717\"i c #FFCD64\",
718\"j c #FFD066\",
719\"k c #FFC059\",
720\"l c #FFB14E\",
721\"m c #0B0B0B\",
722\"n c #FFBB55\",
723\"o c #FFC15A\",
724\"p c #FFB552\",
725\"q c #FFAD4B\",
726\"r c #080808\",
727\"s c #FFAF4C\",
728\"t c #FFB853\",
729\"u c #FFA948\",
730\"v c #050505\",
731\"w c #FFB04E\",
732\"x c #FFB753\",
733\"y c #FFBC56\",
734\"z c #FFC55D\",
735\"A c #FFC55E\",
736\"B c #FFC45C\",
737\"C c #FFBD57\",
738\"D c #FFB854\",
739\"E c #FFB34F\",
740\"F c #FFAB4A\",
741\"G c #FFA545\",
742\"H c #FFAA49\",
743\"I c #FFB04D\",
744\"J c #FFB551\",
745\"K c #FFBF58\",
746\"L c #FFB24F\",
747\"M c #FFAC4A\",
748\"N c #FFA646\",
749\"O c #FFA344\",
750\"P c #FFA848\",
751\"Q c #FFB14F\",
752\"R c #FFAF4D\",
753\"S c #FFA546\",
754\"T c #FFA243\",
755\"U c #FFA445\",
756\"V c #FFAE4C\",
757\"W c #FFA444\",
758\"X c #FFA142\",
759\"Y c #FF9F41\",
760\"Z c #0A0A0A\",
761\"` c #FF9E40\",
762\" . c #FF9F40\",
763\" \",
764\" \",
765\" \",
766\" . + @ @ + # \",
767\" $ @ % & * * = - + + \",
768\" @ ; > , ' ) ' ! * - ~ @ \",
769\" @ { > ! ] ^ / / ( ' * ; _ : \",
770\" < _ ; [ ) / } | } / ] , 1 2 3 4 \",
771\" 5 6 7 , ] 8 9 9 9 } ^ ! = ~ 0 a \",
772\" b c 6 - , ] 8 9 9 9 } ^ ! % ~ 0 d 5 \",
773\" : e _ ; * ) / 8 } } / ] , 1 2 3 f 5 \",
774\" : g h { = i j ^ / ^ ] ! * ; k e l m \",
775\" : f n o ; > , ' ) ' ! * - 2 0 p q r \",
776\" : s g 0 6 ; % > * * = - ~ h t l u r \",
777\" v u w x y k ~ z A z B o C D E F G b \",
778\" 5 H I J e 0 h K h C c x L M N . \",
779\" 4 O P q Q d g x g J L R H S T < \",
780\" @ T U P F q V q M H N W X + \",
781\" @ Y T O W G G W O X Y @ \",
782\" 4 Z ` Y Y Y .` 4 4 \",
783\" 5 : : @ @ Z \",
784\" \",
785\" \",
786\" \"};
787"
788 'xpm t)
789 "Image for the next feed button."))
790
791(defconst newsticker--narrow-image
792 (if (fboundp 'create-image)
793 (create-image "/* XPM */
794static char * narrow_xpm[] = {
795\"24 24 48 1\",
796\" c None\",
797\". c #000000\",
798\"+ c #969696\",
799\"@ c #9E9E9E\",
800\"# c #A4A4A4\",
801\"$ c #AAAAAA\",
802\"% c #AEAEAE\",
803\"& c #B1B1B1\",
804\"* c #B3B3B3\",
805\"= c #B4B4B4\",
806\"- c #B2B2B2\",
807\"; c #AFAFAF\",
808\"> c #ABABAB\",
809\", c #A6A6A6\",
810\"' c #A0A0A0\",
811\") c #989898\",
812\"! c #909090\",
813\"~ c #73AAD4\",
814\"{ c #7AB2DA\",
815\"] c #7FB8DF\",
816\"^ c #84BDE3\",
817\"/ c #88C2E7\",
818\"( c #8BC5E9\",
819\"_ c #8DC7EB\",
820\": c #8CC6EA\",
821\"< c #89C3E8\",
822\"[ c #86BFE5\",
823\"} c #81BAE1\",
824\"| c #7BB3DC\",
825\"1 c #75ACD6\",
826\"2 c #6DA4CF\",
827\"3 c #979797\",
828\"4 c #A3A3A3\",
829\"5 c #A8A8A8\",
830\"6 c #ADADAD\",
831\"7 c #ACACAC\",
832\"8 c #A9A9A9\",
833\"9 c #A5A5A5\",
834\"0 c #9A9A9A\",
835\"a c #929292\",
836\"b c #8C8C8C\",
837\"c c #808080\",
838\"d c #818181\",
839\"e c #838383\",
840\"f c #848484\",
841\"g c #858585\",
842\"h c #868686\",
843\"i c #828282\",
844\" \",
845\" \",
846\" \",
847\" .................. \",
848\" .+@#$%&*=*-;>,')!. \",
849\" .................. \",
850\" \",
851\" \",
852\" .................. \",
853\" .~{]^/(___:<[}|12. \",
854\" .................. \",
855\" \",
856\" \",
857\" .................. \",
858\" .!3@45>666789'0ab. \",
859\" .................. \",
860\" \",
861\" \",
862\" .................. \",
863\" .cccdefghhgficccc. \",
864\" .................. \",
865\" \",
866\" \",
867\" \"};
868"
869 'xpm t)
870 "Image for the next feed button."))
871
872(defconst newsticker--get-all-image
873 (if (fboundp 'create-image)
874 (create-image "/* XPM */
875static char * get_all_xpm[] = {
876\"24 24 70 1\",
877\" c None\",
878\". c #000000\",
879\"+ c #F3DA00\",
880\"@ c #F5DF00\",
881\"# c #F7E300\",
882\"$ c #F9E700\",
883\"% c #FAEA00\",
884\"& c #FBEC00\",
885\"* c #FBED00\",
886\"= c #FCEE00\",
887\"- c #FAEB00\",
888\"; c #F9E800\",
889\"> c #F8E500\",
890\", c #F6E000\",
891\"' c #F4DB00\",
892\") c #F1D500\",
893\"! c #EFD000\",
894\"~ c #B7CA00\",
895\"{ c #BFD100\",
896\"] c #C5D700\",
897\"^ c #CBDB00\",
898\"/ c #CFDF00\",
899\"( c #D2E200\",
900\"_ c #D4E400\",
901\": c #D3E300\",
902\"< c #D0E000\",
903\"[ c #CCDD00\",
904\"} c #C7D800\",
905\"| c #C1D300\",
906\"1 c #BACC00\",
907\"2 c #B1C500\",
908\"3 c #A8BC00\",
909\"4 c #20A900\",
910\"5 c #22AF00\",
911\"6 c #24B500\",
912\"7 c #26B900\",
913\"8 c #27BC00\",
914\"9 c #27BE00\",
915\"0 c #28BF00\",
916\"a c #27BD00\",
917\"b c #26BA00\",
918\"c c #25B600\",
919\"d c #23B100\",
920\"e c #21AB00\",
921\"f c #1FA400\",
922\"g c #1C9B00\",
923\"h c #21AA00\",
924\"i c #24B300\",
925\"j c #25B800\",
926\"k c #25B700\",
927\"l c #24B400\",
928\"m c #23B000\",
929\"n c #1FA500\",
930\"o c #1D9E00\",
931\"p c #20A800\",
932\"q c #21AC00\",
933\"r c #23B200\",
934\"s c #22AD00\",
935\"t c #1D9F00\",
936\"u c #20A700\",
937\"v c #1EA100\",
938\"w c #1C9C00\",
939\"x c #1DA000\",
940\"y c #1B9800\",
941\"z c #1A9600\",
942\"A c #1A9700\",
943\"B c #1A9500\",
944\"C c #199200\",
945\"D c #189100\",
946\"E c #178C00\",
947\" \",
948\" \",
949\" \",
950\" \",
951\" ................... \",
952\" .+@#$%&*=*&-;>,')!. \",
953\" ................... \",
954\" \",
955\" ................... \",
956\" .~{]^/(___:<[}|123. \",
957\" ................... \",
958\" \",
959\" ................... \",
960\" .45678909abcdefg. \",
961\" .h5icj7jklmeno. \",
962\" .pq5drrmshft. \",
963\" .fu4h4pnvw. \",
964\" .oxvxtwy. \",
965\" .zAAzB. \",
966\" .CCD. \",
967\" .E. \",
968\" . \",
969\" \",
970\" \"};
971"
972 'xpm t)
973 "Image for the next feed button."))
974
975(defconst newsticker--update-image
976 (if (fboundp 'create-image)
977 (create-image "/* XPM */
978static char * update_xpm[] = {
979\"24 24 37 1\",
980\" c None\",
981\". c #076D00\",
982\"+ c #0A8600\",
983\"@ c #0A8800\",
984\"# c #098400\",
985\"$ c #087200\",
986\"% c #087900\",
987\"& c #098500\",
988\"* c #098100\",
989\"= c #087600\",
990\"- c #097E00\",
991\"; c #097F00\",
992\"> c #0A8700\",
993\", c #0A8C00\",
994\"' c #097C00\",
995\") c #098300\",
996\"! c #0A8900\",
997\"~ c #0A8E00\",
998\"{ c #0B9200\",
999\"] c #087700\",
1000\"^ c #076E00\",
1001\"/ c #076C00\",
1002\"( c #076B00\",
1003\"_ c #076A00\",
1004\": c #076900\",
1005\"< c #076800\",
1006\"[ c #066700\",
1007\"} c #066500\",
1008\"| c #066400\",
1009\"1 c #066300\",
1010\"2 c #066600\",
1011\"3 c #066200\",
1012\"4 c #076700\",
1013\"5 c #065E00\",
1014\"6 c #066100\",
1015\"7 c #065F00\",
1016\"8 c #066000\",
1017\" \",
1018\" \",
1019\" \",
1020\" . +@@@+# \",
1021\" $% &@ +* \",
1022\" =-# ; \",
1023\" %*>, ' \",
1024\" ')!~{ = \",
1025\" ]$ \",
1026\" ^ ^ \",
1027\" . . \",
1028\" / ( \",
1029\" _ : \",
1030\" < [ \",
1031\" } | \",
1032\" [[ \",
1033\" 1 $.:23 \",
1034\" 3 4}35 \",
1035\" 6 655 \",
1036\" 76 85 55 \",
1037\" 5555555 5 \",
1038\" \",
1039\" \",
1040\" \"};
1041"
1042 'xpm t)
1043 "Image for the update button."))
1044
1045(defconst newsticker--browse-image
1046 (if (fboundp 'create-image)
1047 (create-image "/* XPM */
1048static char * visit_xpm[] = {
1049\"24 24 39 1\",
1050\" c None\",
1051\". c #000000\",
1052\"+ c #FFFFFF\",
1053\"@ c #00E63D\",
1054\"# c #00E83E\",
1055\"$ c #00E73D\",
1056\"% c #00E93E\",
1057\"& c #00E63C\",
1058\"* c #00E53C\",
1059\"= c #00E23B\",
1060\"- c #00E33B\",
1061\"; c #00E83D\",
1062\"> c #00E13A\",
1063\", c #00DD38\",
1064\"' c #00DE38\",
1065\") c #00E23A\",
1066\"! c #00E43C\",
1067\"~ c #00DF39\",
1068\"{ c #00DB37\",
1069\"] c #00D634\",
1070\"^ c #00D734\",
1071\"/ c #00E039\",
1072\"( c #00DC37\",
1073\"_ c #00D835\",
1074\": c #00D332\",
1075\"< c #00CD2F\",
1076\"[ c #00DB36\",
1077\"} c #00D433\",
1078\"| c #00CF30\",
1079\"1 c #00DA36\",
1080\"2 c #00D936\",
1081\"3 c #00D533\",
1082\"4 c #00D131\",
1083\"5 c #00CE2F\",
1084\"6 c #00CC2F\",
1085\"7 c #00CA2D\",
1086\"8 c #00C62B\",
1087\"9 c #00C52A\",
1088\"0 c #00BE27\",
1089\" \",
1090\" \",
1091\" . \",
1092\" .+. \",
1093\" .+++. \",
1094\" .++.++. \",
1095\" .++.@.++. \",
1096\" .++.##$.++. \",
1097\" .++.%%%#&.++. \",
1098\" .++.$%%%#*=.++. \",
1099\" .++.-@;##$*>,.++. \",
1100\" .++.')!&@@*=~{].++. \",
1101\" .++.^{~>---)/(_:<.++. \",
1102\" .++.^[,~/~'(_}|.++. \",
1103\" .++.]_1[12^:|.++. \",
1104\" .++.:}33:45.++. \",
1105\" .++.<5567.++. \",
1106\" .++.889.++. \",
1107\" .++.0.++. \",
1108\" .++.++. \",
1109\" .+++. \",
1110\" .+. \",
1111\" . \",
1112\" \"};
1113"
1114 'xpm t)
1115 "Image for the browse button."))
1116
1117(provide 'newsticker-reader)
1118;;; newsticker-reader.el ends here