|
|
|
;; (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
|
|
|
|
"<script async src=\"https://stats.abbether.net/script.js\" data-website-id=\"ea4c9748-aa78-445e-a0af-f4943f3c16cb\"></script>"))
|
|
|
|
(t (format nil "<!-- Umami has not been set-up -->"))))
|
|
|
|
|
|
|
|
(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))))
|