Yu-Gi-Oh! Deck Building and Card Inventory Management web interface written in Common Lisp, utilizing HTMX.
25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

76 lines
2.4KB

  1. (in-package :cl-user)
  2. (defpackage #:cl-deck-builder2.view
  3. (:use #:cl)
  4. (:import-from #:cl-deck-builder2.config
  5. #:*template-directory*)
  6. (:import-from #:cl-deck-builder2.i18n
  7. #:with-locale)
  8. (:import-from #:caveman2
  9. #:*response*
  10. #:response-headers)
  11. (:import-from #:djula
  12. #:add-template-directory
  13. #:compile-template*
  14. #:render-template*
  15. #:*djula-execute-package*)
  16. (:import-from #:datafly
  17. #:encode-json)
  18. (:export #:render
  19. #:render-json)
  20. (:documentation "The VIEW package.
  21. We just use the defaults generated by Caveman2.
  22. It provides rendering functions for web view.
  23. Additionally, we have i18n support with gettext."))
  24. (in-package :cl-deck-builder2.view)
  25. (djula:add-template-directory *template-directory*)
  26. (defparameter *template-registry* (make-hash-table :test 'equal)
  27. "Hash table of registered templates. Used for caching.")
  28. (defun render (template-path &optional env (lang "en_US"))
  29. "Use Djula to render a template."
  30. (let ((template (gethash template-path *template-registry*)))
  31. (unless template
  32. (setf template (djula:compile-template* (princ-to-string template-path)))
  33. (setf (gethash template-path *template-registry*) template))
  34. (with-locale (lang)
  35. (apply #'djula:render-template* template nil env))))
  36. (defun render-json (object)
  37. "Use Datafly to render a JSON object."
  38. (setf (getf (response-headers *response*) :content-type) "application/json")
  39. (encode-json object))
  40. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  41. ;;
  42. ;; Execute package definition
  43. (defpackage #:cl-deck-builder2.djula
  44. (:use :cl)
  45. (:import-from :cl-deck-builder2.config
  46. :config
  47. :appenv
  48. :developmentp
  49. :productionp)
  50. (:import-from :caveman2
  51. :url-for)
  52. (:documentation "The package in which template expressions are evaluated.
  53. SEE <https://quickref.common-lisp.net/djula.html#g_t_276866_2769>"))
  54. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  55. (setf djula:*djula-execute-package* (find-package :cl-deck-builder2.djula))
  56. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  57. (in-package #:djula)
  58. (djula:def-filter :describe (it)
  59. (with-output-to-string (s) (describe it s)))