src/feeds.lisp (1405 bytes)
1 (in-package :coleslaw) 2 3 ;;; Atom and RSS Feeds 4 5 (defclass base-feed () ((format :initarg :format :reader feed-format))) 6 7 (defclass feed (index base-feed) ()) 8 9 (defmethod discover ((doc-type (eql (find-class 'feed)))) 10 (let ((content (by-date (find-all 'post)))) 11 (dolist (format '(rss atom)) 12 (let ((feed (make-instance 'feed :format format 13 :content (take-up-to 10 content) 14 :slug (format nil "~(~a~)" format)))) 15 (add-document feed))))) 16 17 (defmethod publish ((doc-type (eql (find-class 'feed)))) 18 (dolist (feed (find-all 'feed)) 19 (write-document feed (theme-fn (feed-format feed) "feeds")))) 20 21 ;;; Tag Feeds 22 23 (defclass tag-feed (index base-feed) ()) 24 25 (defmethod discover ((doc-type (eql (find-class 'tag-feed)))) 26 (let ((content (by-date (find-all 'post)))) 27 (dolist (tag (feeds *config*)) 28 (let ((tagged (remove-if-not (lambda (x) (tag-p tag x)) content))) 29 (dolist (format '(rss atom)) 30 (let ((feed (make-instance 'tag-feed :format format 31 :content (take-up-to 10 tagged) 32 :slug (format nil "~a-~(~a~)" tag format)))) 33 (add-document feed))))))) 34 35 (defmethod publish ((doc-type (eql (find-class 'tag-feed)))) 36 (dolist (feed (find-all 'tag-feed)) 37 (write-document feed (theme-fn (feed-format feed) "feeds"))))