plugins/sitemap.lisp (1074 bytes)
1 (defpackage :coleslaw-sitemap 2 (:use :cl) 3 (:import-from :coleslaw #:*config* 4 #:index 5 #:page-url 6 #:find-all 7 #:publish 8 #:theme-fn 9 #:add-document 10 #:write-document) 11 (:import-from :alexandria #:hash-table-values) 12 (:export #:enable)) 13 14 (in-package :coleslaw-sitemap) 15 16 (defclass sitemap (index) 17 ((urls :initarg :urls :reader urls))) 18 19 (defmethod page-url ((object sitemap)) "sitemap.xml") 20 21 ;; We do 'discovery' in the publish method here because we can't ensure the 22 ;; sitemap discover method is called last. Need all other content to be 23 ;; discovered/in the DB. 24 (defmethod publish ((doc-type (eql (find-class 'sitemap)))) 25 (let* ((base-urls '("" "sitemap.xml")) 26 (urls (mapcar #'page-url (hash-table-values coleslaw::*site*))) 27 (sitemap (make-instance 'sitemap :urls (append base-urls urls)))) 28 (write-document sitemap (theme-fn 'sitemap "sitemap")))) 29 30 (defun enable ())