coleslaw/src/indices.lisp

54 lines
2.1 KiB
Common Lisp
Raw Normal View History

2011-04-16 15:45:37 -04:00
(in-package :coleslaw)
2012-08-20 11:53:39 -04:00
(defun taglinks ()
(let ((tags (remove-duplicates (mapcar #'post-tags *posts*))))
(loop for tag in tags
collect (list :url (format nil "~a/tag/~a.html" (domain *config*) tag)
:name tag))))
2011-04-16 15:45:37 -04:00
2012-08-20 11:53:39 -04:00
(defun monthlinks ()
(let ((months (mapcar (lambda (x) (get-month (post-date x))) *posts*)))
(loop for month in months
collect (list :url (format nil "~a/month/~a.html" (domain *config*) month)
:name month))))
2012-08-20 11:53:39 -04:00
(defun render-index (posts)
(loop for post in posts
collect (list :url (format nil "~a/posts/~a.html"
(domain *config*) (post-slug post))
:title (post-title post)
:date (post-date post)
:contents (post-contents post))))
2012-08-20 11:53:39 -04:00
(defun render-by-20 ()
(flet ((by-20 (posts start)
(let ((index (* 20 (1- start))))
(subseq posts index (min (length posts) (+ index 19))))))
(let ((posts (sort *posts* #'string> :key #'post-date)))
(loop for i from 1 then (1+ i)
until (> (* (1- i) 20) (length posts))
do (render-page (format nil "~d.html" i)
(funcall (theme-fn "INDEX")
(list :taglinks (taglinks)
:monthlinks (monthlinks)
:posts (render-index (by-20 posts i))
; TODO: Populate prev and next with links.
:prev nil
:next nil)))))))
2011-04-16 15:45:37 -04:00
2012-08-20 11:53:39 -04:00
(defun render-by-tag ()
(let ((tags (remove-duplicates (mapcan #'post-tags *posts*) :test #'string=)))
(loop for tag in tags
do (let ((posts (remove-if-not (lambda (x)
(member tag x :test #'string=
:key #'post-tags))
posts)))
(render-index posts)))))
2011-04-16 15:45:37 -04:00
2012-08-20 11:53:39 -04:00
(defun render-by-month ())
2012-08-20 11:53:39 -04:00
(defun render-indices ()
(render-by-20)
(render-by-tag)
(render-by-month))