feat: add spine.el — package bootstrap, server, hello handler
This commit is contained in:
@@ -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
|
||||||
Reference in New Issue
Block a user