From 52ccc9681e68f41ababaab03673bc2200423abec Mon Sep 17 00:00:00 2001 From: James Brechtel Date: Sat, 20 Jun 2026 15:23:59 -0400 Subject: [PATCH] =?UTF-8?q?feat:=20add=20spine.el=20=E2=80=94=20package=20?= =?UTF-8?q?bootstrap,=20server,=20hello=20handler?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- spine.el | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 spine.el 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