commit 6e7ab0dfdbe4f2de63925b6a3e27e73f29484fe6
parent f378df5dd6db182615a4adc4e8bc251db98763e3
Author: Decay <decay@todayiwilllaunchmyinfantsonintoorbit.com>
Date:   Mon, 12 Oct 2020 21:58:16 -0700
Getting rid of the spurious make-*-format functions
Also introducing a wrapper function to augment the DB data
transformations. Currently it just creates duplicate date fields.
Diffstat:
6 files changed, 66 insertions(+), 57 deletions(-)
diff --git a/src/content.lisp b/src/content.lisp
@@ -34,9 +34,9 @@
                :month month
                :pages pages
                :archive-date-list archive-date-list
-               :content-formatter (miniblog.format:make-content-formatter)
-               :short-date-formatter (miniblog.format:make-short-date-formatter (or tz *default-timezone*))
-               :long-date-formatter (miniblog.format:make-long-date-formatter (or tz *default-timezone*)))))))
+               :content-formatter #'miniblog.format:markdown
+               :short-date-formatter (lambda (datetime) (miniblog.format:short-date-format datetime (or tz *default-timezone*)))
+               :long-date-formatter (lambda (datetime) (miniblog.format:long-date-format datetime (or tz *default-timezone*))))))))
 
 (defun make-page-generator (&key title root-uri header links stylesheet)
   (lambda (entry path pages &key archive-date-list tz enable-rss)
@@ -54,8 +54,9 @@
                :post entry
                :path path
                :archive-date-list archive-date-list
-               :content-formatter (miniblog.format:make-content-formatter)
-               :long-date-formatter (miniblog.format:make-long-date-formatter (or tz *default-timezone*)))))))
+               :content-formatter #'miniblog.format:markdown
+               :short-date-formatter (lambda (datetime) (miniblog.format:short-date-format datetime (or tz *default-timezone*)))
+               :long-date-formatter (lambda (datetime) (miniblog.format:long-date-format datetime (or tz *default-timezone*))))))))
 
 (defun strip-html-tags (content)
   (format nil "~{~A~}"
@@ -84,9 +85,9 @@
                  :category category
                  :posts entries
                  :build-date (now)
-                 :content-formatter (miniblog.format:make-content-formatter)
+                 :content-formatter #'miniblog.format:markdown
                  :content-stripper #'strip-html-tags
-                 :rfc-822-date-formatter (miniblog.format:make-rfc-822-date-formatter (or tz *default-timezone*))))))
+                 :rfc-822-date-formatter (lambda (datetime) (miniblog.format:rfc-822-format datetime (or tz *default-timezone*)))))))
     (lambda (entries &key tz)
       (declare (ignore entries tz)))))
 
diff --git a/src/data.lisp b/src/data.lisp
@@ -1,29 +1,40 @@
 (in-package :miniblog.data)
 
+(defun format-dates (content)
+  (let ((created-at (getf content :created-at))
+        (last-updated-at (getf content :last-updated-at)))
+    (setf (getf content :created-at-short) created-at)
+    (setf (getf content :created-at-long) created-at)
+    (setf (getf content :last-updated-at-short) last-updated-at)
+    (setf (getf content :last-updated-at-long) last-updated-at)
+    content))
+
 (defgeneric xform (entry)
   (:documentation "Transform an entry of some type into an idiomatic p-list"))
 
 (defmethod xform ((entry blog-entries))
   "Transform a blog-entries object into an idiomatic property list"
-  (list :id (mito.dao.mixin:object-id entry)
-        :created-at (mito.dao.mixin:object-created-at entry)
-        :last-updated-at (mito.dao.mixin:object-updated-at entry)
-        :title (entry-title entry)
-        :content (entry-content entry)
-        :created-by (entry-username entry)
-        :last-updated-by (entry-last-updated-by entry)))
+  (format-dates
+    (list :id (mito.dao.mixin:object-id entry)
+          :created-at (mito.dao.mixin:object-created-at entry)
+          :last-updated-at (mito.dao.mixin:object-updated-at entry)
+          :title (entry-title entry)
+          :content (entry-content entry)
+          :created-by (entry-username entry)
+          :last-updated-by (entry-last-updated-by entry))))
 
 (defmethod xform ((entry blog-pages))
   "Transform a blog-pages object into an idiomatic p-list"
-  (list :id (mito.dao.mixin:object-id entry)
-        :created-at (mito.dao.mixin:object-created-at entry)
-        :last-updated-at (mito.dao.mixin:object-updated-at entry)
-        :name (page-name entry)
-        :parent (page-parent entry)
-        :title (page-title entry)
-        :content (page-content entry)
-        :created-by (page-username entry)
-        :last-updated-by (page-last-updated-by entry)))
+  (format-dates
+    (list :id (mito.dao.mixin:object-id entry)
+          :created-at (mito.dao.mixin:object-created-at entry)
+          :last-updated-at (mito.dao.mixin:object-updated-at entry)
+          :name (page-name entry)
+          :parent (page-parent entry)
+          :title (page-title entry)
+          :content (page-content entry)
+          :created-by (page-username entry)
+          :last-updated-by (page-last-updated-by entry))))
 
 (defun add-entry (title content &key (username "nobody"))
   (miniblog.db:add-entry title content :username username :transform #'xform))
diff --git a/src/format.lisp b/src/format.lisp
@@ -10,28 +10,28 @@
   "Long format datetime, like:
    Monday, February 3rd 2020 at 2:46 PM PST")
 
-(defun make-content-formatter ()
-  "Return the default content formatter (parses Markdown)"
-  (lambda (content)
-    (nth 1 (multiple-value-list (markdown content :stream nil)))))
+(defun markdown (content)
+  "Translate CONTENT with CL-MARKDOWN"
+  (nth 1 (multiple-value-list (cl-markdown:markdown content :stream nil))))
+
+(defun rfc-822-format (datetime tz)
+  "RFC 822/1123 date formatter for RSS items"
+  (format-timestring nil datetime
+                     :format +rfc-1123-format+
+                     :timezone tz))
 
-(defun make-rfc-822-date-formatter (&optional (timezone *default-timezone*))
-  "Return an RFC 822/1123-style date formatter for RSS items"
-  (lambda (datetime)
-    (format-timestring nil datetime
-                       :format +rfc-1123-format+
-                       :timezone timezone)))
+(defun short-date-format (datetime tz)
+  "Short-datetime formatter (see +short-date-format+)"
+  (format-timestring nil datetime
+                     :format +short-date-format+
+                     :timezone tz))
 
-(defun make-short-date-formatter (&optional (timezone *default-timezone*))
-  "Return the default short-date formatter (see +short-date-format+)"
-  (lambda (datetime)
-    (format-timestring nil datetime
-                       :format +short-date-format+
-                       :timezone timezone)))
+(defun long-date-format (datetime tz)
+  "Long-datetime formatter (see +long-date-format+)"
+  (format-timestring nil datetime
+                     :format +long-date-format+
+                     :timezone tz))
 
-(defun make-long-date-formatter (&optional (timezone *default-timezone*))
-  "Return the default long-datetime formatter (see +long-date-format+)"
-  (lambda (datetime)
-    (format-timestring nil datetime
-                       :format +long-date-format+
-                       :timezone timezone)))
+(defun make-content-formatter ()
+  "Return the default content formatter (parses Markdown)"
+  #'markdown)
diff --git a/src/miniblog.lisp b/src/miniblog.lisp
@@ -279,7 +279,7 @@
       (format t "Invalid page name ~a~%" uri)))
 
 (defun date-format (datetime)
-  (funcall (miniblog.format:make-long-date-formatter *blog-timezone*) datetime))
+  (miniblog.format:long-date-format datetime *blog-timezone*))
 
 (defgeneric get-entry (entry-type id)
   (:documentation "Get an entry of type ENTRY-TYPE with id ID"))
diff --git a/src/packages.lisp b/src/packages.lisp
@@ -1,8 +1,9 @@
 (in-package :cl-user)
 
 (defpackage :miniblog.format
-  (:use :cl :cl-markdown :local-time)
-  (:export #:make-content-formatter
+  (:use :cl :local-time)
+  (:export #:markdown #:rfc-822-format #:short-date-format #:long-date-format
+           #:make-content-formatter
            #:make-rfc-822-date-formatter
            #:make-short-date-formatter
            #:make-long-date-formatter))
diff --git a/tst/format.lisp b/tst/format.lisp
@@ -4,18 +4,14 @@
 
 (test test-date-formatters
   "Validate that date formatters return expected results"
-  (let ((ts (encode-timestamp 0 0 0 12 20 4 2020 :timezone +utc-zone+))
-        (rfc-822 (miniblog.format:make-rfc-822-date-formatter +utc-zone+))
-        (short-date (miniblog.format:make-short-date-formatter +utc-zone+))
-        (long-date (miniblog.format:make-long-date-formatter +utc-zone+)))
-    (is (string= "Mon, 20 Apr 2020 12:00:00 +0000" (funcall rfc-822 ts)))  
-    (is (string= "2020-04-20" (funcall short-date ts)))
-    (is (string= "Monday, April 20th 2020 at 12:00 pm UTC" (funcall long-date ts)))))
+  (let ((ts (encode-timestamp 0 0 0 12 20 4 2020 :timezone +utc-zone+)))
+    (is (string= "Mon, 20 Apr 2020 12:00:00 +0000" (miniblog.format:rfc-822-format ts +utc-zone+)))
+    (is (string= "2020-04-20" (miniblog.format:short-date-format ts +utc-zone+)))
+    (is (string= "Monday, April 20th 2020 at 12:00 pm UTC" (miniblog.format:long-date-format ts +utc-zone+)))))
 
 (test test-markdown-formatter
   "Simple validation that the Markdown formatter works"
-  (let* ((formatter (miniblog.format:make-content-formatter))
-         (html (funcall formatter "# foo"))
+  (let* ((html (miniblog.format:markdown "# foo"))
          (html-frag (parse-html5-fragment html))
          (maybe-h1 (node-first-child html-frag))
          (maybe-text (node-first-child maybe-h1)))