PageRenderTime 60ms CodeModel.GetById 36ms RepoModel.GetById 0ms app.codeStats 0ms

/cl-terrace-init/cl-terrace-init.lisp

https://github.com/nallen05/old-cl-terrace
Lisp | 80 lines | 45 code | 10 blank | 25 comment | 0 complexity | 15b84fbbded896d60f110646813d4e5b MD5 | raw file
  1. ;; the function !CL-TERRACE-INIT takes the name of a project and a directory and creates
  2. ;; a new terrace project in that directory, creating a new .asd file, \"site/\" folder,
  3. ;; etc.
  4. ;;
  5. ;; try running this:
  6. ;;
  7. ;; ;; load cl-terrace-init
  8. ;; (asdf:oos 'asdf:load-op :cl-terrace-init)
  9. ;;
  10. ;; ;; create a project named "foo" in *DEFAULT-PATHNAME-DEFAULTS*
  11. ;; (cl-terrace-init:!cl-terrace-init "foo")
  12. ;;
  13. ;; ;; load and start the new "foo" project
  14. ;; (asdf:oos 'asdf:load-op :foo)
  15. ;; (cl-terrace:!start-terrace-server 'foo:foo :port 8080)
  16. ;;
  17. ;; then go to
  18. ;;
  19. ;; http://localhost:8080
  20. ;;
  21. (defpackage :cl-terrace-init
  22. (:use :cl :logv)
  23. (:export :!cl-terrace-init))
  24. (in-package :cl-terrace-init)
  25. (defparameter *system-folder*
  26. (asdf:component-pathname (asdf:find-system :cl-terrace-init)))
  27. (defparameter *template-folder*
  28. (merge-pathnames "templates/" *system-folder*))
  29. (defun !cl-terrace-init (name &optional (directory *default-pathname-defaults*))
  30. (assert (and (cl-fad:directory-pathname-p directory)
  31. (cl-fad:directory-exists-p directory))
  32. (directory)
  33. "<<<`DIRECTORY' should name a director that exists!>>>")
  34. (flet ((create-directory (fmt-string &rest fmt-args)
  35. (let ((string (apply 'format nil fmt-string fmt-args)))
  36. (logv:format-log "Creating directory: \"~A\"" string)
  37. (ensure-directories-exist (merge-pathnames string directory))))
  38. (render-template (template &rest v-plist)
  39. (apply (djula:compile-template (merge-pathnames template *template-folder*)
  40. :template-folder *template-folder*)
  41. v-plist))
  42. (create-file (content-string fmt-string &rest fmt-args)
  43. (let ((string (apply 'format nil fmt-string fmt-args)))
  44. (logv:format-log "Creating file \"~A\"" string)
  45. (with-open-file (out (merge-pathnames string directory)
  46. :direction :output
  47. :if-does-not-exist :create)
  48. (write-string content-string out)))))
  49. ;; system folder
  50. (let ((new-directory (create-directory "~A/" name)))
  51. ;; "site/" folder and hello world
  52. (create-directory "~A/site/" name)
  53. (create-directory "~A/site/terrace/" name)
  54. (create-file (render-template "hello-world.lisp" :name name)
  55. "~A/site/terrace/i.hello-world.lisp" name)
  56. (create-directory "~A/site/template/" name)
  57. (create-file (render-template "hello-world.html" :name name)
  58. "~A/site/template/hello-world.html" name)
  59. (create-directory "~A/site/static/" name)
  60. ;; "src/" folder
  61. (create-directory "~A/src/" name)
  62. (create-file (render-template "defpackage.lisp" :name name)
  63. "~A/src/package.lisp" name)
  64. (create-file (render-template "core.lisp" :name name)
  65. "~A/src/core.lisp" name)
  66. ;; .asd file
  67. (create-file (render-template "asd-file.lisp" :name name)
  68. "~A/~:*~A.asd" name)
  69. ;; push new directory to .asd
  70. (push new-directory asdf:*central-registry*))))