After some toil, I have a working proof-of-concept blog. The idea is simple: write blog posts in markdown and store the posts in the `./posts` directory. Then use the server and `pandoc` to convert these markdown files into HTML at request time. I'm using nix to package everything together. It's far from perfect, but it works at the moment, which is encouraging.
49 lines
1.7 KiB
Common Lisp
49 lines
1.7 KiB
Common Lisp
(in-package #:cl-user)
|
|
(defpackage #:server
|
|
(:documentation "Robot condemned to a life of admin work for my blog.")
|
|
(:use #:cl)
|
|
(:import-from #:cl-arrows #:->>)
|
|
(:export :main))
|
|
(in-package #:server)
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;; Nix-injected dependencies
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
;; TODO: Wrap this in an assert or ensure that there's a trailing slash so it's
|
|
;; treated as a directory.
|
|
(defvar *path-to-posts* "/tmp/"
|
|
"File path pointing to the posts directory.")
|
|
|
|
(defvar *pandoc-bin* "/usr/bin/pandoc")
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;; Library
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
(defun render-post (path)
|
|
"Render the markdown file stored at PATH to HTML using pandoc."
|
|
(uiop:run-program (list *pandoc-bin* path "--to" "html")
|
|
:output :string))
|
|
|
|
;; TODO: Figure out how to handle this with Nix.
|
|
(defvar *posts* (uiop:directory-files *path-to-posts*)
|
|
"List of the paths to the blog posts.")
|
|
|
|
(hunchentoot:define-easy-handler
|
|
(get-latest :uri "/latest") ()
|
|
(render-post (concatenate 'string *path-to-posts* "/" "test.md")))
|
|
|
|
(hunchentoot:define-easy-handler
|
|
(get-posts :uri "/posts") ()
|
|
"Working!")
|
|
|
|
(defun main ()
|
|
"This is the main entrypoint for our application."
|
|
(hunchentoot:start (make-instance 'hunchentoot:easy-acceptor :port 4242))
|
|
(print "Listing on port 4242...")
|
|
(sb-thread:join-thread
|
|
(find-if (lambda (th)
|
|
(string= (sb-thread:thread-name th)
|
|
"hunchentoot-listener-*:4242"))
|
|
(sb-thread:list-all-threads))))
|