Flexible Lisp Blogware. Fork for personal use. Mirrored from https://github.com/kingcons/coleslaw originally.

indices.lisp 2.2KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. (in-package :coleslaw)
  2. (defun monthlinks ()
  3. (loop for month in (gethash :months-index *storage*)
  4. collecting (list :url (index-url :date month) :name month)))
  5. (defun taglinks ()
  6. (loop for tag in (gethash :tags-index *storage*)
  7. collecting (list :url (index-url :tag tag) :name tag)))
  8. (defun index-title (id &optional page)
  9. (case id
  10. (:range "Recent Posts")
  11. (:date (format nil "Posts from ~A" page))
  12. (:tag (format nil "Posts tagged ~A" page))))
  13. (defun index-posts (id page)
  14. (case id
  15. (:range (let* ((count (hash-table-count (gethash :posts *storage*)))
  16. (start (- count (* 10 (1- page))))
  17. (end (- start 9)))
  18. (remove nil (find-by-range start end))))
  19. (:date (find-by-date page))
  20. (:tag (find-by-tag page))))
  21. (defmethod render-index (id page)
  22. (let* ((posts (index-posts id page))
  23. (content (funcall (find-symbol "INDEX" (theme-package))
  24. (list :taglinks (taglinks)
  25. :monthlinks (monthlinks)
  26. :title (index-title id page)
  27. :posts (loop for post in posts collect
  28. (list :url (post-url (post-id post))
  29. :title (post-title post)
  30. :date (pretty-date (post-date post))
  31. :contents (post-content post)))
  32. :prev (when (and (numberp id)
  33. (index-posts id (1- page)))
  34. (index-url id (1- page)))
  35. :next (when (and (numberp id)
  36. (index-posts id (1+ page)))
  37. (index-url id (1+ page)))))))
  38. content))
  39. (defmethod index-url (id page)
  40. (flet ((keyword-name (keyword)
  41. (format nil "~A" keyword)))
  42. (if (member id '(:date :tag))
  43. (concatenate 'string *site-root* "/"
  44. (string-downcase (keyword-name id)) "/" page)
  45. (concatenate 'string *site-root* "/page/" (write-to-string page)))))