My Blog Has RSS
From time to time, sharing articles on my website with people, I have been asked, has my website no RSS feed? I'm flattered that anybody would care to stay informed of my occasional postings, but no, I hadn't gotten around to it. Then yesterday the topic came up again and it finally seemed like a worthwhile distraction for an evening of programming.
Adding an RSS feed to an awful
website is straightforward. You add a define-page
form like this:
(define-page "/rss"
(lambda _
(awful-response-headers '((content-type application/rss+xml)))
`((literal "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>")
(rss ...)))
no-template: #t)
I have given a simple _
as the formal parameter(s) of the page handler
as a way of showing that I don't care how many or what arguments this
procedure is called with. The keyword no-template: #t
tells awful that
the page handler is going to provide the entire document, as opposed to
just to body of an HTML document.
The awful-response-headers
call establishes the content-type that we
will be serving, which is application/rss+xml. Then we just return an
SXML structure, and awful will convert this to XML and serve it.
The first form of the structure that gives literal ...
is the only way I
know of so far to include the XML version and encoding header verbatim.
It would be nicer to give that as a form like (?xml (@ (version "1.0")
...))
, and maybe I'll root around with the translation rules later on to
make that work. For now, we can just use literal
.
After that comes the rss root element, contents of which I have ellided.
Multiple Feeds and HTTP Errors
Although in reality there is only one section of my website with dated
articles appropriate for an RSS feed, I wanted to leave open the
possibility of having multiple feeds for hypothetical subsections of the
site. These feeds could be requested with urls like /rss?p=/blog
. If
an invalid path is passed for p, then an appropriate HTTP error should be
issued.
Quickly I'll just say that to get the value of a query variable in awful, you use a form like:
($ 'p)
Basic stuff.
Issuing HTTP errors was something that I did not previously know how to
do, so I looked into that and found that it's quite simple. Note that
when you send an HTTP error, the error message is sent as an HTML
document, so you just need to arrange your code so that you don't change
the content-type to application/rss+xml until after you know that the
request was valid. To send an HTTP error from an awful app, call the
procedure send-status
, provided by the
spiffy egg (got to love these
names), with a valid status-code symbol. The list of valid status-code
symbols is not in spiffy, but in
intarweb. You can give a
message in an optional second argument. The error for an invalid path
request in my RSS handler is an HTTP 400 code, and it looks like this:
(send-status 'bad-request (sprintf "No RSS channel for path ~S" path))
Et cetera
The rest of building an RSS feed in awful is all just basic sxml stuff. Look up the RSS format and make an sxml document in that format. No need to go over all that here.
Room for Improvement
Now that I have a basic RSS feed on my site, there are a couple of obvious directions to go for improvement. One is to add an Atom feed, as well. Another is automatic descriptions. My RSS feed does not have descriptions for most of the entries because under the current system, I have to manually add description metadata to each entry, a practice that I have only now begun. It would be nice if, lacking description metadata, the first couple of sentences could be pulled from the entry as a substitute. Another improvement would be in providing a way for visitors to subscribe only to certain tags or keywords. Some visitors might only want to know about Mowedline, some about Solaronite, or likewise for any of the other topics that I sporadically blog about.
Well, Solaronite improves and you can now stay informed of blog updates on this site more conveniently than before. Onward and upward. Arriba y arriba.