Add gemini export - cl-yag - Common Lisp Yet Another website Generator HTML git clone git://bitreich.org/cl-yag/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/cl-yag/ DIR Log DIR Files DIR Refs DIR Tags DIR README DIR LICENSE --- DIR commit a9cc963e39455b4f75af129ca00d635a02fc1702 DIR parent 929692a3001141f9e9350b888565c51b92851e10 HTML Author: Solene Rapenne <solene@perso.pw> Date: Mon, 30 Nov 2020 21:46:43 +0100 Add gemini export Diffstat: M Makefile | 1 + M data/README.md | 22 +++++++++++++++------- M data/articles.lisp | 3 +++ M generator.lisp | 68 +++++++++++++++++++++++++++++++ A templates/gemini_head.tpl | 6 ++++++ M templates/gopher_head.tpl | 2 +- 6 files changed, 94 insertions(+), 8 deletions(-) --- DIR diff --git a/Makefile b/Makefile @@ -8,6 +8,7 @@ html: $(HTML) css dirs: mkdir -p "output/html/static" mkdir -p "output/gopher" + mkdir -p "output/gemini/articles/" clean: DIR diff --git a/data/README.md b/data/README.md @@ -51,13 +51,15 @@ least the following files and folders: | `-- articles.lisp |-- generator.lisp |-- output/ - | |-- gopher/ + | |-- gemini/ + | |-- gopher/ | `-- html/ |-- static/ | |-- css/style.css | `-- img/ `-- templates/ |-- article.tpl + |-- gemini_head.tpl |-- gopher_head.tpl |-- layout.tpl |-- one-tag.tpl @@ -129,6 +131,12 @@ The *config* variable is used to assign the following values: - ``t`` to export html website. Set ``nil`` to disable. - **gopher** - ``t`` to export gopher website. Set ``nil`` to disable. +- **gemini** + - ``t`` to export gemini capsule. Set ``nil`` to disable. +- **gemini-path** + - This is the absolute public gemini url. +- **gemini-index** + - This is the name of the index file. Default is ``index.md`` - **gopher-path** - This is the full path of the directory to access your gopher hole. - **gopher-server** @@ -187,9 +195,9 @@ publishing your static sites. All you need to do in order to publish is to go into your cl-yag directory and type ``make``. -The make command creates html and gopher files in the defined location. -The default is the **output/** directory, but you can use a symbolic link -pointing to some other directory as well. +The make command creates html, gemini and gopher files in the defined +location. The default is the **output/** directory, but you can use a +symbolic link pointing to some other directory as well. ## Howto Add A New Page @@ -261,8 +269,8 @@ displays: "Tags: ". ### A Note On Themes Although cl-yag may ship with a minimalistic template, cl-yag focuses -on generating html- and gopher-compliant structural markup - not -themed layouts. +on generating html-, gemini and gopher-compliant structural markup - +not themed layouts. If you want some deeply refined, cross-browser compatible, responsive, webscale style sheets, you need to create them yourself. However, @@ -272,7 +280,7 @@ style sheets a part of cl-yag you're very welcome to contact me. # Hacking cl-yag -I tried to make cl-yag easy to extend. +I tried to make cl-yag easy to extend. If you want to contribute, feel free to contact me and/or to send in a patch. - If you are looking for a way to contribute: DIR diff --git a/data/articles.lisp b/data/articles.lisp @@ -14,6 +14,9 @@ :default-converter :markdown2 :html t ;; 't' to enable export to a html website / 'nil' to disable :gopher t ;; 't' to enable export to a gopher website / 'nil' to disable + :gemini t ;; 't' to enable export to a gemini capsule / 'nil' to disable + :gemini-path "gemini://perso.pw/blog/" ;; absolute path of your gemini capsule + :gemini-index "index.md" ;; filename of index file :gopher-path "/user" ;; absolute path of your gopher directory :gopher-server "my.website" ;; hostname of the gopher server :gopher-port "70" ;; tcp port of the gopher server, 70 usually DIR diff --git a/generator.lisp b/generator.lisp @@ -173,6 +173,19 @@ `(progn (save-file ,name (generate-layout ,@data)))) +;; generate a gemini index file +(defun generate-gemini-index(articles) + (let ((output (load-file "templates/gemini_head.tpl"))) + (dolist (article articles) + (setf output + (string + (concatenate 'string output + (format nil "=> ~a/articles/~a.txt ~a~%" + (getf *config* :gemini-path) + (article-id article) + (article-title article)))))) + output)) + ;; generate a gopher index file (defun generate-gopher-index(articles) (let ((output (load-file "templates/gopher_head.tpl"))) @@ -339,6 +352,59 @@ ;;(generate-file-rss) (save-file "output/html/rss.xml" (generate-rss))) +;; we do all the gemini capsule +(defun create-gemini-capsule() + + ;; produce the index.md file + (save-file (concatenate 'string "output/gemini/" (getf *config* :gemini-index)) + (generate-gemini-index *articles*)) + + ;; produce a tag list menu + (let* ((directory-path "output/gemini/_tags_/") + (index-path (concatenate 'string directory-path (getf *config* :gemini-index)))) + (ensure-directories-exist directory-path) + (save-file index-path + (let ((output (load-file "templates/gemini_head.tpl"))) + (loop for tag in + ;; sort tags per articles in it + (sort (articles-by-tag) #'> + :key #'(lambda (x) (length (getf x :value)))) + do + (setf output + (string + (concatenate + 'string output + (format nil "=> ~a/~a/index.md ~a ~d~%" + (getf *config* :gemini-path) + (getf tag :name) + (getf tag :name) + (length (getf tag :value))))))) + output))) + + ;; produce each tag gemini index + (loop for tag in (articles-by-tag) do + (let* ((directory-path (concatenate 'string "output/gemini/" (getf tag :NAME) "/")) + (index-path (concatenate 'string directory-path (getf *config* :gemini-index))) + (articles-with-tag (loop for article in *articles* + when (member (article-id article) (getf tag :VALUE) :test #'equal) + collect article))) + (ensure-directories-exist directory-path) + (save-file index-path (generate-gemini-index articles-with-tag)))) + + ;; produce each article file (adding some headers) + (loop for article in *articles* + do + (with-converter + (let ((id (article-id article))) + (save-file (format nil "output/gemini/articles/~a.txt" id) + (format nil "~{~a~}" + (list + "Title : " (article-title article) #\Newline + "Author: " (article-author article) #\Newline + "Date : " (date-format (getf *config* :date-format) (article-date article)) #\Newline + "Tags : " (article-tag article) #\Newline #\Newline + (load-file (format nil "data/~d~d" id (converter-extension converter-object)))))))))) + ;; we do all the gopher hole (defun create-gopher-hole() @@ -410,6 +476,8 @@ (defun generate-site() (if (getf *config* :html) (create-html-site)) + (if (getf *config* :gemini) + (create-gemini-capsule)) (if (getf *config* :gopher) (create-gopher-hole))) DIR diff --git a/templates/gemini_head.tpl b/templates/gemini_head.tpl @@ -0,0 +1,6 @@ +Hello, this is the head of your gophermap page, you can +customize it how you want ! + +=> /index.md Home + +------------------------------------------------------------------ DIR diff --git a/templates/gopher_head.tpl b/templates/gopher_head.tpl @@ -2,7 +2,7 @@ Hello, this is the head of your gophermap page, you can customize it how you want ! [0|RSS Feed|/~me/rss.xml|server|port] -[1|Phlog index|/~me/|server|port] +[1|Phlog index|/~me/|server|port]i [1|Browse by tag|/~me/_tags_/|server|port] -----------------------------------------------------------------