Commit | Line | Data |
---|---|---|
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. | |
43 | Calls all actions which are necessary in order to make the new | |
44 | value 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. | |
62 | This 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. | |
73 | This enables the following image properties: heuristic mask for all | |
74 | logos, 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. | |
81 | If non-nil newsticker calls `fill-region' to wrap long lines in | |
82 | item descriptions. However, if an item description contains HTML | |
83 | text and `newsticker-html-renderer' is non-nil, filling is not | |
84 | done." | |
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. | |
97 | If non-nil newsticker sets `fill-column' so that the whole | |
98 | window 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. | |
106 | If non-nil, newsticker.el will call this function whenever it finds | |
107 | HTML-like tags in item descriptions. Possible functions are, for | |
108 | example, `w3m-region', `w3-region', and (if you have htmlr.el installed) | |
109 | `newsticker-htmlr-render'. | |
110 | ||
111 | In order to make sure that the HTML renderer is loaded when you | |
112 | run newsticker, you should add one of the following statements to | |
113 | your .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 | ||
121 | or, if you use w3, | |
122 | ||
123 | (require 'w3-auto) | |
124 | ||
125 | or, 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. | |
139 | See `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. | |
149 | KEYMAP 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. | |
180 | KEYMAP 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. | |
206 | KEYMAP 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. | |
234 | If DISABLED is non-nil the image will be converted to a disabled look | |
235 | \(unless `newsticker-enable-logo-manipulations' is not t\). | |
236 | Return 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 */ | |
269 | static 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 */ | |
344 | static 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 */ | |
416 | static 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 */ | |
501 | static 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 */ | |
591 | static 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 */ | |
668 | static 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 */ | |
794 | static 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 */ | |
875 | static 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 */ | |
978 | static 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 */ | |
1048 | static 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 |