* filelock.c: Fix unlikely file descriptor leaks.
[emacs.git] / lisp / net / newsticker.el
blobbc95ad3045248d423f5dbb0557968e43cfa2179d
1 ;;; newsticker.el --- A Newsticker for Emacs.
3 ;; Copyright (C) 2003-2013 Free Software Foundation, Inc.
5 ;; Author: Ulf Jasper <ulf.jasper@web.de>
6 ;; Filename: newsticker.el
7 ;; URL: http://www.nongnu.org/newsticker
8 ;; Created: 17. June 2003
9 ;; Keywords: News, RSS, Atom
10 ;; Time-stamp: "6. Dezember 2009, 19:15:18 (ulf)"
11 ;; Version: 1.99
13 ;; ======================================================================
15 ;; This file is part of GNU Emacs.
17 ;; GNU Emacs is free software: you can redistribute it and/or modify
18 ;; it under the terms of the GNU General Public License as published by
19 ;; the Free Software Foundation, either version 3 of the License, or
20 ;; (at your option) any later version.
22 ;; GNU Emacs is distributed in the hope that it will be useful,
23 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
24 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
25 ;; GNU General Public License for more details.
27 ;; You should have received a copy of the GNU General Public License
28 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
30 (defconst newsticker-version "1.99" "Version number of newsticker.el.")
32 ;; ======================================================================
33 ;;; Commentary:
35 ;; Overview
36 ;; --------
38 ;; Newsticker provides a newsticker for Emacs. A newsticker is a thing
39 ;; that asynchronously retrieves headlines from a list of news sites,
40 ;; prepares these headlines for reading, and allows for loading the
41 ;; corresponding articles in a web browser.
43 ;; Headlines consist of a title and (possibly) a small description. They
44 ;; are contained in "RSS" (RDF Site Summary) or "Atom" files. Newsticker
45 ;; should work with the following RSS formats:
46 ;; * RSS 0.91
47 ;; (see http://backend.userland.com/rss091 or
48 ;; http://my.netscape.com/publish/formats/rss-spec-0.91.html)
49 ;; * RSS 0.92
50 ;; (see http://backend.userland.com/rss092)
51 ;; * RSS 1.0
52 ;; (see http://purl.org/rss/1.0/spec)
53 ;; * RSS 2.0
54 ;; (see http://blogs.law.harvard.edu/tech/rss)
55 ;; as well as the following Atom formats:
56 ;; * Atom 0.3
57 ;; * Atom 1.0
58 ;; (see http://www.ietf.org/internet-drafts/draft-ietf-atompub-format-11.txt)
59 ;; That makes Newsticker.el an "Atom aggregator, "RSS reader", "RSS
60 ;; aggregator", and "Feed Reader".
62 ;; Newsticker provides several commands for reading headlines, navigating
63 ;; through them, marking them as read/unread, hiding old headlines
64 ;; etc. Headlines can be displayed as plain text or as rendered HTML.
66 ;; Headlines can be displayed in the echo area, either scrolling like
67 ;; messages in a stock-quote ticker, or just changing.
69 ;; Newsticker allows for automatic processing of headlines by providing
70 ;; hooks and (sample) functions for automatically downloading images and
71 ;; enclosed files (as delivered by podcasts, e.g.).
73 ;; Requirements
74 ;; ------------
75 ;; Newsticker can be used with GNU Emacs version 21.1 or later as well as
76 ;; XEmacs. It requires an XML-parser (`xml.el') which is part of GNU
77 ;; Emacs. If you are using XEmacs you want to get the `net-utils' package
78 ;; which contains `xml.el' for XEmacs.
80 ;; Newsticker requires a program which can retrieve files via http and
81 ;; prints them to stdout. By default Newsticker will use wget for this
82 ;; task.
84 ;; Installation
85 ;; ------------
87 ;; If you are using Newsticker as part of GNU Emacs there is no need to
88 ;; perform any installation steps in order to use Newsticker. Otherwise
89 ;; place Newsticker in a directory where Emacs can find it. Add the
90 ;; following line to your init file:
91 ;; (add-to-list 'load-path "/path/to/newsticker/")
92 ;; (autoload 'newsticker-start "newsticker" "Emacs Newsticker" t)
93 ;; (autoload 'newsticker-show-news "newsticker" "Emacs Newsticker" t)
95 ;; If you are using `imenu', which allows for navigating with the help of a
96 ;; menu, you should add the following to your Emacs startup file
97 ;; (`~/.emacs').
98 ;; (add-hook 'newsticker-mode-hook 'imenu-add-menubar-index)
100 ;; That's it.
102 ;; Usage
103 ;; -----
104 ;; The command newsticker-show-news will display all available headlines in
105 ;; a special buffer, called `*newsticker*'. It will also start the
106 ;; asynchronous download of headlines. The mode line in the `*newsticker*'
107 ;; buffer informs whenever new headlines have arrived. Clicking
108 ;; mouse-button 2 or pressing RET in this buffer on a headline will call
109 ;; browse-url to load the corresponding news story in your favorite web
110 ;; browser.
112 ;; The scrolling, or flashing of headlines in the echo area, can be started
113 ;; with the command newsticker-start-ticker. It can be stopped with
114 ;; newsticker-stop-ticker.
116 ;; If you just want to start the periodic download of headlines use the
117 ;; command newsticker-start. Calling newsticker-stop will stop the
118 ;; periodic download, but will call newsticker-stop-ticker as well.
120 ;; Configuration
121 ;; -------------
122 ;; All Newsticker options are customizable, i.e. they can be changed with
123 ;; Emacs customization methods: Call the command customize-group and enter
124 ;; `newsticker' for the customization group.
126 ;; All Newsticker options have reasonable default values, so that in most
127 ;; cases it is not necessary to customize settings before starting
128 ;; Newsticker for the first time.
130 ;; Newsticker options are organized in the following groups.
132 ;; * newsticker-feed contains options that define which news
133 ;; feeds are retrieved and how this is done.
134 ;; o newsticker-url-list defines the list of headlines which are
135 ;; retrieved.
136 ;; o newsticker-retrieval-interval defines how often headlines are
137 ;; retrieved.
138 ;; * newsticker-headline-processing contains options that define how the
139 ;; retrieved headlines are processed.
140 ;; o newsticker-keep-obsolete-items decides whether unread headlines that
141 ;; have been removed from the feed are kept in the Newsticker cache.
142 ;; * newsticker-layout contains options that define how the buffer for
143 ;; reading news headlines is formatted.
144 ;; o newsticker-item-format defines how the title of a headline is
145 ;; formatted.
146 ;; * newsticker-ticker contains options that define how headlines are shown
147 ;; in the echo area.
148 ;; o newsticker-display-interval and newsticker-scroll-smoothly define
149 ;; how headlines are shown in the echo area.
150 ;; * newsticker-hooks contains options for hooking other Emacs commands to
151 ;; newsticker functions.
152 ;; o newsticker-new-item-functions allows for automatic processing of
153 ;; headlines. See `newsticker-download-images', and
154 ;; `newsticker-download-enclosures' for sample functions.
155 ;; * newsticker-miscellaneous contains other Newsticker options.
157 ;; Please have a look at the customization buffers for the complete list of
158 ;; options.
160 ;; Remarks
161 ;; -------
162 ;; This newsticker is designed do its job silently in the background
163 ;; without disturbing you. However, it is probably impossible to prevent
164 ;; such a tool from slightly attenuating your Editor's responsiveness every
165 ;; once in a while.
167 ;; Byte-compiling newsticker.el is recommended.
169 ;; ======================================================================
170 ;;; History:
172 ;; 1.99
173 ;; * Lots! of changes.
175 ;; 1.10x
176 ;; * Support for download via url. Setting the new variable
177 ;; `newsticker-download-method' to 'intern will make newsticker
178 ;; use the url-package instead of the external program
179 ;; wget. Default value is 'extern.
180 ;; * Re-enabled `newsticker-default-face'.
181 ;; * Workaround for broken extra-data.
183 ;; 1.10 (2007-01-29)
184 ;; * Bugfixes mostly: `newsticker--decode-iso8601-date',
185 ;; `newsticker--sentinel', and others.
186 ;; * Renamed `newsticker--retrieval-timer-list' to
187 ;; `newsticker-retrieval-timer-list'. Removed
188 ;; `newsticker-running-p' -- check newsticker-retrieval-timer-list
189 ;; to find out whether newsticker is running. Removed
190 ;; `newsticker-ticker-running-p'.
191 ;; * Try to cache images in w3m-rendered HTML text.
192 ;; * Other minor changes.
194 ;; 1.9 (2005-11-01)
195 ;; * Rewrote feed parsing part. Newsticker now supports RSS 0.91,
196 ;; 0.92, 1.0, 2.0 as well as Atom 0.3 and 1.0 -- thanks to Thien-Thi
197 ;; Nguyen.
198 ;; * Changed auto-marking mechanism: Replaced variable
199 ;; `newsticker-auto-mark-filter' with new variable
200 ;; `newsticker-auto-mark-filter-list', which allows for looking not
201 ;; only at the title but also at the description of a headline.
202 ;; * Call `newsticker--ticker-text-setup' only after all pending
203 ;; downloads processes have finished.
204 ;; * Improved handling of coding systems.
205 ;; * Added magic autoload comments.
206 ;; * Bugfixes:
207 ;; - `hide-entry' was hiding too much when called for the last
208 ;; headline,
209 ;; - update mode-line and menu-bar when necessary,
210 ;; - repaired `newsticker--imenu-goto',
211 ;; - other minor things.
213 ;; 1.8 (2005-08-26)
214 ;; * Added commands `newsticker-show-extra' and `newsticker-hide-extra'
215 ;; to show and hide extra RSS elements, bound to "sx" and "hx"
216 ;; resp. Changed default value of `newsticker-show-all-rss-elements'
217 ;; to nil.
218 ;; * mode-line: Introduced special mode-line-format for newsticker.
219 ;; * Get feed logos only once every 24 h.
220 ;; * Default faces changed.
221 ;; * Minor fixes.
223 ;; 1.7 (2005-06-25)
224 ;; * Tool-bar support: most important commands can be called from
225 ;; tool-bar buttons.
226 ;; * Auto-Narrowing introduced: *newsticker* buffer can be narrowed to
227 ;; a single item (bound to key `xi') or a single feed (bound to
228 ;; `xf').
229 ;; * Enclosure support: enclosed items are shown (see
230 ;; `newsticker-enclosure-face') and can be (automatically) downloaded
231 ;; (see below). For those of you who read "podcasts".
232 ;; * Added variable `newsticker-auto-mark-filter' for automatically
233 ;; marking items as immortal or old.
234 ;; * Added hook variable `newsticker-new-item-functions' for handling
235 ;; new items. Added sample functions `newsticker-download-images',
236 ;; and `newsticker-download-enclosures'.
237 ;; * Added hook variable `newsticker-select-item-hook' which is run
238 ;; after `newsticker-(next|previous)-(new-)?-item'.
239 ;; * Added hook variable `newsticker-select-feed-hook' which is run
240 ;; after `newsticker-(next|previous)-feed'.
241 ;; * Added hook variable `newsticker-buffer-change-hook' which is run
242 ;; after the contents or visibility of the newsticker buffer has
243 ;; changed, e.g. after `newsticker-buffer-update' or
244 ;; `newsticker-show-feed-desc'.
245 ;; * Added command `newsticker-handle-url' for interactively launching
246 ;; arbitrary programs for URLs, bound to `C-RET'.
247 ;; * URLs in extra elements are clickable.
248 ;; * Better support for w3, added command
249 ;; `newsticker-w3m-show-inline-images' for displaying all inline
250 ;; images.
251 ;; * Insert an artificial headline which notifies about failed
252 ;; retrievals.
253 ;; * Use pubDate element (RSS 2.0) instead of retrieval time when
254 ;; available.
255 ;; * Customizable options grouped.
256 ;; * Bugfixes: `newsticker--imenu-create-index'; strip whitespace
257 ;; from links; apply coding-system to extra-elements; time-comparison
258 ;; for obsolete items; and others which I have forgotten.
259 ;; * Workaround for another bug in xml-parse-region -- thanks to
260 ;; anonymous for sending patch.
261 ;; * Renamed invisible buffers ` *wget-newsticker-<feed>*' to
262 ;; ` *newsticker-wget-<feed>*'.
263 ;; * Tested with GNU Emacs versions 21.3 and 22.0 and XEmacs
264 ;; 21.something.
266 ;; 1.6 * Support for (some) optional RSS elements: guid, dc:date. See
267 ;; `newsticker-show-all-rss-elements' `newsticker-extra-face'.
268 ;; * Better support for w3m -- `newsticker-default-face' is obsolete
269 ;; now, removed `newsticker-w3m-toggle-inline-image'.
270 ;; * Added `newsticker-desc-comp-max' -- comparison of item
271 ;; descriptions can take quite some time.
272 ;; * Added `newsticker--buffer-make-item-completely-visible' to
273 ;; ensure that the current item is fully visible.
274 ;; * Allow for non-positive retrieval-interval, which make newsticker
275 ;; get news only once.
276 ;; * Use :set for customizable variables.
277 ;; * Added `newsticker-buffer-force-update', bound to key `U'.
278 ;; * Added concept of obsolete items, see
279 ;; `newsticker-keep-obsolete-items', `newsticker-obsolete-item-face',
280 ;; `newsticker-obsolete-item-max-age'.
281 ;; * Added `newsticker-add-url'.
282 ;; * OPML export.
283 ;; * Save pre-formatted titles => even better performance!!
284 ;; * `newsticker-*-new-item' wraps at beginning/end of buffer.
285 ;; * Always sort obsolete items to end of item list.
286 ;; * Bugfixes:
287 ;; - newsticker-hide-entry,
288 ;; - changes of feed-titles led to duplicate feed items,
289 ;; - faces for rendered HTML texts,
290 ;; - length of ticker-text (for "exotic"/multibyte texts),
291 ;; Thanks to Hiroshi Maruyama.
292 ;; - suppress items with empty title and description
293 ;; - newsticker-sort-method was ignored!
294 ;; - prevent call of fill-region on HTML-rendered descriptions.
296 ;; 1.5 * Rewrote the visibility stuff. newsticker does not inherit
297 ;; outline anymore. Now you have complete freedom for
298 ;; `newsticker-*-format'.
299 ;; * Save pre-formatted descriptions => incredible performance boost!!
300 ;; * Introduced `newsticker-(start|stop)-ticker'.
301 ;; * Introduced statistics for heading-format and
302 ;; `newsticker-statistics-face'.
303 ;; * Introduced `newsticker-enable-logo-manipulations'.
304 ;; * Compare link of items (as well as title and desc).
305 ;; * Added `newsticker-start-hook' and `newsticker-stop-hook', thanks
306 ;; to mace.
307 ;; * Bugfixes -- thanks to Ryan Yeske, Jari Aalto, Bruce Ingalls.
308 ;; * Tested with Emacs 21.3.50, 21.3.1, 21.2, 21.1; XEmacs 21.4.15
310 ;; 1.4 * Enabled HTML rendering, added `newsticker-html-renderer' to
311 ;; choose a HTML rendering engine, thanks to Greg Scott for testing
312 ;; * New Outline handling using text properties instead of "**"
313 ;; prefixes.
314 ;; * Added possibility to mark single item as old (bound to key
315 ;; `o' (`newsticker-mark-item-at-point-as-read').
316 ;; * Added possibility to mark single item as immortal (bound to key
317 ;; `i' (`newsticker-mark-item-at-point-as-immortal').
318 ;; * Added possibility to display feed logos.
319 ;; * Added `newsticker-heading-format', `newsticker-item-format'.
320 ;; * Added `newsticker-date-format'.
321 ;; * Added `newsticker-justification'.
322 ;; * Added `newsticker-automatically-mark-visited-items-as-old'.
323 ;; * Added `newsticker-w3m-toggle-inline-image' which calls
324 ;; `w3m-toggle-inline-image' if `newsticker-html-renderer' is
325 ;; `w3m-region'. Exists for convenience only (bound to key
326 ;; `RET').
328 ;; 1.3 * Compare title AND desc to check whether item is old, except
329 ;; for feed desc
330 ;; * Mark as not-up-to-date only after new items have arrived.
331 ;; * Added XEmacs compatibility code, tested with XEmacs 21.4.13.
332 ;; * Tested with Emacs 21.3.50 and Emacs 21.2.something.
333 ;; * Bugfix: Apply coding-systems to feed title and description,
334 ;; thanks to OHASHI Akira
335 ;; * Bugfix: xml-parser-workaround did not work for japanese texts,
336 ;; thanks to OHASHI Akira
337 ;; * Kill wget-buffers unless newsticker-debug is not nil.
338 ;; * Bugfix: xml-parser-workaround for "DOCTYPE rdf:RDF"
340 ;; 1.2 Peter S Galbraith <psg@debian.org>
341 ;; * Added `newsticker-url-list-defaults', splitting the URLs into
342 ;; a customizable selection list, and a user add-on list.
343 ;; * Minor checkdoc fixes.
345 ;; 1.1 * Introduced optional feed-specific wget-arguments.
346 ;; * Keep order of feeds as given in `newsticker-url-list' in
347 ;; *newsticker* buffer.
348 ;; * Ignore unsupported coding systems.
350 ;; 1.0 * Introduced feed-specific retrieval-timers.
351 ;; * Removed dependency on 'cl (cddddr).
352 ;; * Thanks to Kevin Rodgers and T.V. Raman for their help.
353 ;; * Use utf-8 for reading and writing cache data.
354 ;; * Reported to work with Emacs 21.3.50.
356 ;; 0.99 * Minor tweaks.
357 ;; * Tested with Emacs 21.3.2
359 ;; 0.98 * Check exit status of wget processes. Keep cache data if
360 ;; something went wrong. Throw error when old wget-processes
361 ;; are hanging around.
362 ;; * Introduced newsticker-specific faces.
363 ;; * Added `newsticker-show-descriptions-of-new-items'.
364 ;; * Added `newsticker-hide-old-items-in-newsticker-buffer'.
365 ;; * Added `newsticker-(hide|show)-old-items'.
367 ;; 0.97 * Minor tweaks.
369 ;; 0.96 * Added caching.
370 ;; * newsticker-mode inherits outline-mode.
371 ;; * newsticker-mode supports imenu.
372 ;; * Easy buffer-navigation with newsticker-mode's keymap.
373 ;; * Some bugs fixed.
374 ;; * Thanks to Moritz Epple for documentation tips.
376 ;; 0.95 * Added newsticker-mode -- Thanks to T.V. Raman.
377 ;; * Catch xml-parser errors -- Thanks to T.V. Raman.
378 ;; * Remove stupid newlines in titles (headlines) -- Thanks to
379 ;; Jeff Rancier.
381 ;; 0.94 * Added clickerability and description for channel headings.
382 ;; * Made it work for (at least some) rss 0.9<something> feeds.
384 ;; 0.93 * Added some more sites.
385 ;; * Do not flood the *Messages* buffer.
386 ;; * First attempt at handling coding systems.
388 ;; 0.92 * Added `newsticker-wget-name'.
389 ;; * Try to display message only if minibuffer and echo area are
390 ;; not in use already.
391 ;; * Dirty workaround for newer versions of xml.el: Remove
392 ;; whitespace in rdf.
393 ;; * Tested with Emacs 21.3.2 and CVS-snapshot of 2003-06-21.
395 ;; 0.91 * First bugfix: *newsticker* is read-only.
397 ;; 0.9 * First release.
398 ;; * Tested with Emacs 21.3.2 and wget 1.8.2.
400 ;; ======================================================================
401 ;;; Code:
403 (require 'newst-backend)
404 (require 'newst-ticker)
405 (require 'newst-reader)
406 (require 'newst-plainview)
407 (require 'newst-treeview)
409 (provide 'newsticker)
411 ;;; newsticker.el ends here