Component rss

You are here: All Systems / webutils / rss

(defpackage :webutils.rss (:use :araneida :net.telent.date :webutils.xml-mixed-mode :cl)
            (:export :generate-rss :rss-entry)
)

(in-package :webutils.rss)
(webutils::export-all :webutils.rss)

(defun rss-1 (title link time description)
  (<item>
     (<title> title)
     (<link> link)
     (<pubDate> (universal-time-to-rfc-date time))
     (<description> description)
)
)


(defun send-rss (request title link description bodies)
  (format (request-stream request)
            "<?xml version=\"1.0\"?>~%"
)

  (with-xml-output-to-stream (request-stream request)
    (<rss version="2.0">
          (<channel>
           (<title> title)
           (<link> link)
           (<description> description)
           (<language> "en")
           bodies
)
)
)
)


(defun rss-entry (&key title link time description)
  (declare (ignore title link time description))
  (error "rss-entry called outside flet!")
)


(defmacro generate-rss ((request title link description)
                        &body body
)

  (let ((entries (gensym)))
    `(let (,entries)
       (flet ((rss-entry (&key title link time description)
                (push (rss-1 title link time description) ,entries)
)
)

         ,@body
         (send-rss ,request ,title ,link ,description (reverse ,entries))
)
)
)
)

Lisppaste pastes can be made by anyone at any time. Imagine a fearsomely comprehensive disclaimer of liability. Now fear, comprehensively.