diff --git a/spine.el b/spine.el new file mode 100644 index 0000000..5441609 --- /dev/null +++ b/spine.el @@ -0,0 +1,55 @@ +;;; spine.el — personal reading tracker, served from Emacs + +;; --- package bootstrap ------------------------------------------------ + +(require 'package) +(add-to-list 'package-archives + '("melpa" . "https://melpa.org/packages/") + t) +(package-initialize) + +(dolist (pkg '(simple-httpd mustache)) + (unless (package-installed-p pkg) + (package-refresh-contents) + (package-install pkg))) + +(require 'simple-httpd) +(require 'mustache) + +;; --- configuration ---------------------------------------------------- + +(defvar spine-port 8080 + "Port for the Spine HTTP server.") + +(defvar spine-template-dir + (expand-file-name "templates/" + (file-name-directory load-file-name)) + "Directory containing .mustache templates.") + +;; --- template rendering ----------------------------------------------- + +(defun spine-render (name context) + "Render templates/NAME.mustache with CONTEXT (an ht hash table). +Returns the rendered string." + (mustache-render + (with-temp-buffer + (insert-file-contents + (expand-file-name name spine-template-dir)) + (buffer-string)) + context)) + +;; --- handlers --------------------------------------------------------- + +(defservlet hello text/html () + (insert (spine-render "hello.mustache" + (ht ("title" "Spine") + ("message" "Hello from Emacs."))))) + +;; --- start ------------------------------------------------------------ + +(setq httpd-port spine-port) +(httpd-start) +(message "Spine listening on http://localhost:%d" spine-port) + +(provide 'spine) +;;; spine.el ends here