|
@@ -9,14 +9,21 @@
|
9
|
9
|
(defclass date-index (index) ())
|
10
|
10
|
(defclass numeric-index (index) ())
|
11
|
11
|
|
12
|
|
-(defmethod page-url ((object index))
|
13
|
|
- (index-id object))
|
|
12
|
+(defclass feed (index)
|
|
13
|
+ (format :initform nil :initarg :format :accessor feed-format))
|
|
14
|
+(defclass tag-feed (feed) ())
|
|
15
|
+
|
14
|
16
|
(defmethod page-url ((object tag-index))
|
15
|
|
- (format nil "tag/~a" (index-id object)))
|
|
17
|
+ (format nil "tag/~a" (index-slug object)))
|
16
|
18
|
(defmethod page-url ((object date-index))
|
17
|
|
- (format nil "date/~a" (index-id object)))
|
|
19
|
+ (format nil "date/~a" (index-slug object)))
|
18
|
20
|
(defmethod page-url ((object numeric-index))
|
19
|
|
- (format nil "~d" (index-id object)))
|
|
21
|
+ (format nil "~d" (index-slug object)))
|
|
22
|
+
|
|
23
|
+(defmethod page-url ((object feed))
|
|
24
|
+ (format nil "~(~a~).xml" (feed-format object)))
|
|
25
|
+(defmethod page-url ((object tag-feed))
|
|
26
|
+ (format nil "tag/~a~(~a~).xml" (index-slug object) (feed-format object)))
|
20
|
27
|
|
21
|
28
|
(defmethod render ((object index) &key prev next)
|
22
|
29
|
(funcall (theme-fn 'index) (list :tags (all-tags)
|
|
@@ -50,27 +57,40 @@
|
50
|
57
|
:posts (remove-if-not (lambda (x) (month-p month x)) content)
|
51
|
58
|
:title (format nil "Posts from ~a" month)))
|
52
|
59
|
|
53
|
|
-(defun index-by-n (i content &optional (step 10))
|
|
60
|
+(defun index-by-n (i content)
|
54
|
61
|
"Return the index for the Ith page of CONTENT in reverse chronological order."
|
55
|
|
- (let* ((start (* step i))
|
56
|
|
- (end (min (length content) (+ start step))))
|
|
62
|
+ (let ((content (subseq content (* 10 i))))
|
57
|
63
|
(make-instance 'numeric-index :slug (1+ i)
|
58
|
|
- :posts (subseq content start end)
|
59
|
|
- :title "Recent Posts")))
|
|
64
|
+ :posts (take-up-to 10 content)
|
|
65
|
+ :title "Recent Posts")))
|
|
66
|
+
|
|
67
|
+(defun render-feed (feed)
|
|
68
|
+ "Render the given FEED to both RSS and ATOM."
|
|
69
|
+ (let ((theme-fn (theme-fn (feed-format feed) "feeds")))
|
|
70
|
+ (write-page (page-path feed) (render-page feed theme-fn))))
|
60
|
71
|
|
61
|
72
|
(defun render-index (index &rest render-args)
|
62
|
73
|
"Render the given INDEX using RENDER-ARGS if provided."
|
63
|
74
|
(write-page (page-path index) (apply #'render-page index nil render-args)))
|
64
|
75
|
|
65
|
|
-(defun render-indexes ()
|
66
|
|
- "Render the indexes to view content in groups of size N, by month, and by tag."
|
67
|
|
- (let ((results (by-date (find-all 'post))))
|
|
76
|
+(defun render-indexes (tag-feeds)
|
|
77
|
+ "Render the indexes to view content in groups of size N, by month, or by tag,
|
|
78
|
+along with RSS and ATOM feeds and any supplied TAG-FEEDS."
|
|
79
|
+ (let ((content (by-date (find-all 'post))))
|
68
|
80
|
(dolist (tag (all-tags))
|
69
|
|
- (render-index (index-by-tag tag results)))
|
|
81
|
+ (render-index (index-by-tag tag content)))
|
70
|
82
|
(dolist (month (all-months))
|
71
|
|
- (render-index (index-by-month month results)))
|
72
|
|
- (dotimes (i (ceiling (length results) 10))
|
73
|
|
- (render-index (index-by-n i results)
|
|
83
|
+ (render-index (index-by-month month content)))
|
|
84
|
+ (dotimes (i (ceiling (length content) 10))
|
|
85
|
+ (render-index (index-by-n i content)
|
74
|
86
|
:prev (and (plusp i) i)
|
75
|
|
- :next (and (< (* (1+ i) 10) (length results))
|
76
|
|
- (+ 2 i))))))
|
|
87
|
+ :next (and (< (* (1+ i) 10) (length content))
|
|
88
|
+ (+ 2 i))))
|
|
89
|
+ (dolist (format '(rss atom))
|
|
90
|
+ (dolist (tag tag-feeds)
|
|
91
|
+ (let ((posts (remove-if-now (lambda (x) (tag-p (make-tag tag) x)) content)))
|
|
92
|
+ (render-feed (make-instance 'tag-feed :posts (take-up-to 10 posts)
|
|
93
|
+ :format format
|
|
94
|
+ :slug tag))))
|
|
95
|
+ (render-feed (make-instance 'feed :posts (take-up-to 10 content)
|
|
96
|
+ :format format)))))
|