;; (in-package :cl-user) (defpackage hot-line.view (:use :cl) (:import-from :hot-line.config :*template-directory*) (:import-from :caveman2 :*response* :response-headers) (:import-from :djula :add-template-directory :compile-template* :render-template* :*djula-execute-package*) (:import-from :datafly :encode-json) (:export :render :render-json)) (in-package :hot-line.view) (djula:add-template-directory *template-directory*) (defparameter *template-registry* (make-hash-table :test 'equal)) (defun render (template-path &optional env) (let ((template (gethash template-path *template-registry*))) (unless template (setf template (djula:compile-template* (princ-to-string template-path))) (setf (gethash template-path *template-registry*) template)) (apply #'djula:render-template* template nil env))) (defun render-json (object) (setf (getf (response-headers *response*) :content-type) "application/json") (encode-json object)) ;; ;; Execute package definition (defpackage hot-line.djula (:use :cl) (:import-from :hot-line.config :config :appenv :developmentp :productionp) (:import-from :caveman2 :url-for)) ;;; '(in-package' line added after default Caveman set-up. Needed for ;;; custom filters and functions. Not part of default Caveman set-up. (in-package #:hot-line.djula) (setf djula:*djula-execute-package* (find-package :hot-line.djula)) (defun insert-umami-script () "Outputs the script for my Umami instance (stats.abbether.net). It provides either the dev. or prod. tracker depending on the environment this website is running in." (cond ((equal t (hot-line.config:productionp)) (format nil "")) (t (format nil "")))) (djula::def-filter :chart-icon (filename) (if (null filename) (format nil "/images/file.png") (let ((chart-type (subseq filename 0 (search "_" filename)))) (format nil "/images/~a.png" chart-type))))