src/posts.lisp (1315 bytes)
1 (in-package :coleslaw) 2 3 (defclass post (content) 4 ((title :initarg :title :reader title-of) 5 (author :initarg :author :reader author-of) 6 (excerpt :initarg :excerpt :reader excerpt-of) 7 (format :initarg :format :reader post-format)) 8 (:default-initargs :author nil :excerpt nil)) 9 10 (defmethod initialize-instance :after ((object post) &key) 11 (with-slots (url title author excerpt format text) object 12 (let (post-content) 13 (setf url (compute-url object (slugify title)) 14 format (make-keyword (string-upcase format)) 15 post-content (render-text text format) 16 excerpt (or excerpt 17 (first (split (excerpt-sep *config*) 18 post-content 19 :limit 2))) 20 text post-content 21 author (or author (author *config*)))))) 22 23 (defmethod render ((object post) &key prev next) 24 (funcall (theme-fn 'post) (list :config *config* 25 :post object 26 :prev prev 27 :next next))) 28 29 (defmethod publish ((doc-type (eql (find-class 'post)))) 30 (loop for (next post prev) on (append '(nil) (by-date (find-all 'post))) 31 while post do (write-document post nil :prev prev :next next)))