A website built in Common Lisp using Caveman2 as its framework. It is based on a collection of tutorials written by hyotang666. Those tutorials are based on chapters from the book 'Basic Ruby on Rails'. hyotang666 ported the Ruby code to Common Lisp.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

70 lines
2.3 KiB

(in-package #:cl-user)
(defpackage rails-to-caveman.view
(:use #:cl)
(:import-from #:rails-to-caveman.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 #:rails-to-caveman.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")
(datafly:encode-json object))
;;
;; Execute package definition
(defpackage rails-to-caveman.djula
(:use #:cl)
(:import-from #:rails-to-caveman.config
#:config
#:appenv
#:developmentp
#:productionp)
(:import-from #:caveman2
#:url-for)
(:export #:title!) ; Added in Chapter 3 (Mockup section).
)
;; in-package and let code added in Chapter 3, also. This is
;; preperation for Switching Layout Templates section.
(in-package #:rails-to-caveman.djula) ; Make sure this states your app name.
(let(title)
(defun title! (&optional sub)
(if sub
(format nil "~@[~A - ~]~:(~A~)"
(setf title sub)
;; Make sure find-system states your app name.
#.(asdf:coerce-name(asdf:find-system :rails-to-caveman)))
title))) ; End of Chapter 3 additional code.
(setf djula:*djula-execute-package* (find-package :rails-to-caveman.djula))
;;; This is a custom filter which is was added in Chapter 3
;;; (Routing). Apparently, this is a filter which is part of the djula
;;; project's TODOs. This filter is used in 'step13.html' (in
;;; /templates directory).
(djula::def-filter :break(it) (cl-ppcre:regex-replace-all #\newline it "<br />"))