(in-package :kira) (defmacro with-rss-document ((title link) &body body) `(let ((*absolutep* t) (*excerptp* nil) (*render-function* 'render/rss)) (setf (request-reply-content-type) "application/rss+xml") (xml "" ((:rss :version "2.0" "xml:base" *base-uri* "xmlns:dc" "http://purl.org/dc/elements/1.1/") (:channel (:title ,title) (:link ,link) (:language "en") ,@body))))) (defun rss-view-keyword (view) (if view (intern (format nil "~a/~a" view :rss) :keyword) :rss)) (defmacro define-feed (lambda-list &body body) (let* ((lambda-list (normalize-node-specializers lambda-list)) (node (first (first lambda-list))) (view-parameter (second lambda-list)) (view-parameter-name (first view-parameter)) (view (second (second (second view-parameter))))) `(defmethod handle (,(first lambda-list) (,view-parameter-name (eql ,(rss-view-keyword view))) (,(gensym) (eql :get)) (,(gensym) (eql nil))) (with-rss-document ((escape (html-output (render-title ,node ',view)) +element-escapes+) (:uri-to ,node ',view)) ,@body)))) (defun rss-link (node &optional view) (html ((:a :class "rss" :rel "nofollow") (:if (symbolp node) (:uri-to (rss-view-keyword node)) (:uri-to node (rss-view-keyword view))) "RSS 2.0"))) (defun render/rss (object) (xml (:item (let ((*render-function* 'render/html)) (render-in-style object 'rss)))))