WiLiKiソース解読:src/wiliki/rss.scm
(select-module wiliki)
;; API
(define (rss-page db)
(rss-format (take* (wdb-recent-changes db) 15)))
(define (rss-format entries)
(let* ((self (wiliki))
(full-url #`"http://,(server-name-of self),(script-name-of self)"))
`("Content-type: text/xml\n\n"
"<?xml version=\"1.0\" encoding=\"" ,(output-charset) "\" ?>\n"
"<rdf:RDF
xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"
xmlns=\"http://purl.org/rss/1.0/\"
xmlns:dc=\"http://purl.org/dc/elements/1.1/\"
>\n"
,(rdf-channel
full-url
(rdf-title (top-page-of self))
(rdf-link full-url)
(rdf-description (description-of self))
(rdf-items-seq
(map (lambda (entry) (rdf-li (url-full "~a" (cv-out (car entry)))))
entries)))
,(map (lambda (entry)
(let1 url (url-full "~a" (cv-out (car entry)))
(rdf-item url
(rdf-title (car entry))
(rdf-link url)
(dc-date (cdr entry)))))
entries)
"</rdf:RDF>\n")))
;; NB: these should be implemented within xml framework
(define (rdf-channel about . content)
`("<channel rdf:about=\"" ,(html-escape-string about) "\">"
,@content
"\n</channel>\n"))
(define (rdf-li resource)
`("<rdf:li rdf:resource=\"" ,(html-escape-string resource) "\" />\n"))
(define (rdf-simple tag . content)
`("<" ,tag ">" ,@content "</" ,tag ">\n"))
(define (rdf-item about . content)
`("<item rdf:about=\"" ,(html-escape-string about) "\">"
,@content
"</item>\n"))
(define (rdf-items-seq . items)
`("<items><rdf:Seq>" ,@items "</rdf:Seq></items>\n"))
(define (rdf-simple-1 tag content)
`("<" ,tag ">" ,(html-escape-string content) "</" ,tag ">\n"))
(define (rdf-title title) (rdf-simple-1 "title" title))
(define (rdf-link link) (rdf-simple-1 "link" link))
(define (rdf-description desc) (rdf-simple-1 "description" desc))
(define (dc-date secs)
(rdf-simple-1 "dc:date"
(sys-strftime "%Y-%m-%dT%H:%M:%S+00:00" (sys-gmtime secs))))
(provide "wiliki/rss")
Last modified : 2003/03/24 07:23:45 UTC