|
@@ -4,20 +4,31 @@
|
4
|
4
|
"Make a RFC1123 pubdate representing the current time."
|
5
|
5
|
(local-time:format-rfc1123-timestring nil (local-time:now)))
|
6
|
6
|
|
7
|
|
-(defun render-feeds (feeds)
|
8
|
|
- "Render and write the given FEEDS for the site."
|
9
|
|
- (flet ((first-10 (list)
|
10
|
|
- (subseq list 0 (min (length list) 10))))
|
11
|
|
- (let* ((by-date (by-date (find-all 'post)))
|
12
|
|
- (posts (first-10 by-date))
|
13
|
|
- (rss (make-instance 'index :id "rss.xml" :posts posts))
|
14
|
|
- (atom (make-instance 'index :id "feed.atom" :posts posts))
|
15
|
|
- (rss-template (theme-fn :rss-feed "feeds"))
|
16
|
|
- (atom-template (theme-fn :atom-feed "feeds")))
|
17
|
|
- (write-page (page-path rss) (render-page rss rss-template))
|
18
|
|
- (write-page (page-path atom) (render-page atom atom-template))
|
19
|
|
- (dolist (feed feeds)
|
20
|
|
- (let ((index (index-by-tag (make-tag feed) by-date)))
|
21
|
|
- (setf (index-id index) (format nil "~a-rss.xml" feed)
|
22
|
|
- (index-posts index) (first-10 (index-posts index)))
|
23
|
|
- (write-page (page-path index) (render-page index rss-template)))))))
|
|
7
|
+(defun first-10 (list)
|
|
8
|
+ "Get up to the first 10 items in LIST."
|
|
9
|
+ (subseq list 0 (min (length list) 10)))
|
|
10
|
+
|
|
11
|
+(defun make-tag-feed (tag posts)
|
|
12
|
+ "Make an RSS feed for the given TAG and POSTS."
|
|
13
|
+ (flet ((valid-p (obj) (member tag (content-tags obj) :test #'tag-slug=)))
|
|
14
|
+ (make-instance 'tag-index :id (format nil "~A-rss.xml" (tag-slug tag))
|
|
15
|
+ :posts (first-10 (remove-if-not #'valid-p posts)))))
|
|
16
|
+
|
|
17
|
+(defun render-feed (posts &key path template tag)
|
|
18
|
+ "Given a PATH, TEMPLATE, and possibly a TAG, render the appropriate feed."
|
|
19
|
+ (let ((template (theme-fn template "feeds"))
|
|
20
|
+ (index (if tag
|
|
21
|
+ (make-tag-feed tag posts)
|
|
22
|
+ (make-instance 'index :id path
|
|
23
|
+ :posts (first-10 posts)))))
|
|
24
|
+ (write-page (page-path index) (render-page index template))))
|
|
25
|
+
|
|
26
|
+(defun render-feeds (tag-feeds)
|
|
27
|
+ "Render the default RSS and ATOM feeds along with any TAG-FEEDS."
|
|
28
|
+ (let ((posts (by-date (find-all 'post))))
|
|
29
|
+ (dolist (feed '((:path "rss.xml" :template :rss-feed)
|
|
30
|
+ (:path "feed.atom" :template :atom-feed)))
|
|
31
|
+ (apply #'render-feed posts feed))
|
|
32
|
+ (dolist (feed tag-feeds)
|
|
33
|
+ (apply #'render-feed posts (list :tag (make-tag feed)
|
|
34
|
+ :template :rss-feed)))))
|