From 656401df71c005d30ae591a717e486aa9197d26f Mon Sep 17 00:00:00 2001 From: Spenser Truex Date: Tue, 24 Mar 2020 15:12:11 -0700 Subject: [PATCH 1/3] Optional extension file extensions for posts and index I wanted posts to have no extension (via :page-ext), so I had to allow for :page-ext "" to work, and without inserting a dot at the end of my files. To allow for index.html when :page-ext is not "html", :index-ext "html" in the .coleslawrc is supported. --- src/coleslaw.lisp | 4 ++-- src/config.lisp | 16 ++++++++++++---- src/documents.lisp | 10 +++++++++- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/coleslaw.lisp b/src/coleslaw.lisp index 1517c66..f4bfeee 100644 --- a/src/coleslaw.lisp +++ b/src/coleslaw.lisp @@ -40,8 +40,8 @@ (publish ctype)) (do-subclasses (itype index) (publish itype)) - (update-symlink (format nil "index.~A" (page-ext *config*)) - (format nil "1.~A" (page-ext *config*))))) + (update-symlink (format nil "index.~A" (index-ext *config*)) + (format nil "1~A" (page-ext *config*))))) (defgeneric deploy (staging) (:documentation "Deploy the STAGING build to the directory specified in the config.") diff --git a/src/config.lisp b/src/config.lisp index 9d5a45f..53f0fe4 100644 --- a/src/config.lisp +++ b/src/config.lisp @@ -9,7 +9,7 @@ (feeds :initarg :feeds :reader feeds) (lang :initarg :lang :reader lang) (license :initarg :license :reader license) - (page-ext :initarg :page-ext :reader page-ext) + (page-ext :initarg :page-ext :reader page-ext-intolerant) (plugins :initarg :plugins :reader plugins) (repo :initarg :repo :accessor repo-dir) (routing :initarg :routing :reader routing) @@ -17,7 +17,8 @@ (sitenav :initarg :sitenav :reader sitenav) (staging-dir :initarg :staging-dir :reader staging-dir) (theme :initarg :theme :reader theme) - (title :initarg :title :reader title)) + (title :initarg :title :reader title) + (index-ext :initarg :index-ext :reader index-ext)) (:default-initargs :feeds nil :license nil @@ -26,10 +27,17 @@ :excerpt-sep "" :charset "UTF-8" :lang "en" - :page-ext "html" + :page-ext #1="html" :separator ";;;;;" - :staging-dir "/tmp/coleslaw")) + :staging-dir "/tmp/coleslaw" + :index-ext #1#)) +(defun page-ext (config) + "Get page extension, and allow for an extensionless system." + (let ((ext (page-ext-intolerant config))) + (if (string= ext "") + "" + (concatenate 'string "." ext)))) (defun dir-slot-reader (config name) "Take CONFIG and NAME, and return a directory pathname for the matching SLOT." (ensure-directory-pathname (slot-value config name))) diff --git a/src/documents.lisp b/src/documents.lisp index b90d299..0bb64c6 100644 --- a/src/documents.lisp +++ b/src/documents.lisp @@ -42,7 +42,15 @@ is provided, it overrides the route used." (error "No routing method found for: ~A" class-name)) (let* ((result (format nil route unique-id)) (type (or (pathname-type result) (page-ext *config*)))) - (make-pathname :type type :defaults result)))) + (make-pathname :name (pathname-name result) + :type (when (string/= type "") + (if (or (string-equal "index" + (pathname-name result)) + (string-equal "1" + (pathname-name result))) + (index-ext *config*) + type)) + :defaults result)))) (defun get-route (doc-type) "Return the route format string for DOC-TYPE." From efc0bfb738a435689497914407b3f49a297b41a4 Mon Sep 17 00:00:00 2001 From: Spenser Truex Date: Tue, 24 Mar 2020 15:51:54 -0700 Subject: [PATCH 2/3] Support name-fn for modifying URL strings. Once the title has been converted to a URL (by `slugify`), name-fn changes it. It is available in the .coleslawrc as `:namefn 'fn`, with the default `:name-fn 'identity` --- src/config.lisp | 2 ++ src/documents.lisp | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/config.lisp b/src/config.lisp index 53f0fe4..92a1164 100644 --- a/src/config.lisp +++ b/src/config.lisp @@ -7,6 +7,7 @@ (domain :initarg :domain :reader domain) (excerpt-sep :initarg :excerpt-sep :reader excerpt-sep) (feeds :initarg :feeds :reader feeds) + (name-fn :initarg :name-fn :reader name-fn) (lang :initarg :lang :reader lang) (license :initarg :license :reader license) (page-ext :initarg :page-ext :reader page-ext-intolerant) @@ -25,6 +26,7 @@ :plugins '((rsync "-avz" "--delete" "--exclude" ".git/" "--exclude" ".gitignore" "--copy-links")) :sitenav nil :excerpt-sep "" + :name-fn 'identity :charset "UTF-8" :lang "en" :page-ext #1="html" diff --git a/src/documents.lisp b/src/documents.lisp index 0bb64c6..225b836 100644 --- a/src/documents.lisp +++ b/src/documents.lisp @@ -42,7 +42,8 @@ is provided, it overrides the route used." (error "No routing method found for: ~A" class-name)) (let* ((result (format nil route unique-id)) (type (or (pathname-type result) (page-ext *config*)))) - (make-pathname :name (pathname-name result) + (make-pathname :name (funcall (name-fn *config*) + (pathname-name result)) :type (when (string/= type "") (if (or (string-equal "index" (pathname-name result)) From 9a3cd70d4cf9eea933551f74bb27e335567b6337 Mon Sep 17 00:00:00 2001 From: Spenser Truex Date: Tue, 24 Mar 2020 16:25:41 -0700 Subject: [PATCH 3/3] Document URL generator config keywords :index-ext :page-ext :name-fn Change how URLs are generated by coleslaw. --- docs/config.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/config.md b/docs/config.md index b149f53..b4edc7c 100644 --- a/docs/config.md +++ b/docs/config.md @@ -25,9 +25,11 @@ There are also many *optional* config parameters such as: * `:charset` => to set HTML attributes for international characters, default: "UTF-8" * `:feeds` => to generate RSS and Atom feeds for certain tagged content * `:excerpt-sep` => to set the separator for excerpt in content, default: `` +* `:index-ext` => The extension for the index, default "html" for index.html * `:lang` => to set HTML attributes indicating the site language, default: "en" * `:license` => to override the displayed content license, the default is CC-BY-SA -* `:page-ext` => to set the suffix of generated files, default: "html" +* `:name-fn` => to modify URL strings after they are generated, default: `'identity` +* `:page-ext` => to set the suffix of generated files, default: "html". "" for no extension * `:plugins` => to configure and enable coleslaw's [various plugins][plugin-use] * `:separator` => to set the separator for content metadata, default: ";;;;;" * `:sitenav` => to provide relevant links and ease navigation