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")