Add gemini export - cl-yag - Common Lisp Yet Another website Generator | |
git clone git://bitreich.org/cl-yag/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws… | |
Log | |
Files | |
Refs | |
Tags | |
README | |
LICENSE | |
--- | |
commit a9cc963e39455b4f75af129ca00d635a02fc1702 | |
parent 929692a3001141f9e9350b888565c51b92851e10 | |
Author: Solene Rapenne <[email protected]> | |
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(-) | |
--- | |
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: | |
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 valu… | |
- ``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 contac… | |
# 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: | |
diff --git a/data/articles.lisp b/data/articles.lisp | |
@@ -14,6 +14,9 @@ | |
:default-converter :markdown2 | |
:html t ;; 't' to enable expor… | |
:gopher t ;; 't' to enable expor… | |
+ :gemini t ;; 't' to enable expor… | |
+ :gemini-path "gemini://perso.pw/blog/" ;; absolute path of yo… | |
+ :gemini-index "index.md" ;; filename of index f… | |
:gopher-path "/user" ;; absolute path of yo… | |
:gopher-server "my.website" ;; hostname of the gop… | |
:gopher-port "70" ;; tcp port of the gop… | |
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-inde… | |
+ (generate-gemini-index *articles*)) | |
+ | |
+ ;; produce a tag list menu | |
+ (let* ((directory-path "output/gemini/_tags_/") | |
+ (index-path (concatenate 'string directory-path (getf *config* :gemin… | |
+ (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 … | |
+ (index-path (concatenate 'string directory-path (getf *config* :… | |
+ (articles-with-tag (loop for article in *articles* | |
+ when (member (article-id article) (getf ta… | |
+ 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-… | |
+ "Tags : " (article-tag article) #\Newline #\… | |
+ (load-file (format nil "data/~d~d" id (conver… | |
+ | |
;; 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))) | |
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 | |
+ | |
+------------------------------------------------------------------ | |
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] | |
----------------------------------------------------------------- |