Recently Written · git

cl-yag

Mirror and rewrite of Solène Rapenne's cl-yag SSG of renown

git clone https://github.com/equwal/cl-yag

Log | Files | Refs


generators/gemini.lisp (3551 bytes)

1 
2 (in-package #:cl-yag)
3 
4 (defun generate-rss-gemini(article)
5   (format nil "gemini://~a/articles/~a.gmi"
6           (getf *config* :gemini-path)
7           (article-id article)))
8 
9 ;; generate a gemini index file
10 (defun generate-gemini-index(articles)
11   (let ((output (load-file "templates/gemini_head.tpl")))
12     (dolist (article articles)
13       (setf output
14 	    (string
15 	     (concatenate 'string output
16                           (format nil "=> ~a/articles/~a.gmi ~a-~2,'0d-~2,'0d ~a~%"
17                                   (getf *config* :gemini-path)
18                                   (article-id article)
19                                   (getf (article-date article) :year)
20                                   (getf (article-date article) :monthnumber)
21                                   (getf (article-date article) :daynumber)
22                                   (article-title article))))))
23     output))
24 
25 ;; we do all the gemini capsule
26 (defun create-gemini-capsule()
27 
28   ;; produce the index.gmi file
29   (save-file (concatenate 'string "output/gemini/" (getf *config* :gemini-index))
30              (generate-gemini-index *articles*))
31 
32   ;; produce a tag list menu
33   (let* ((directory-path "output/gemini/_tags_/")
34          (index-path (concatenate 'string directory-path (getf *config* :gemini-index))))
35     (ensure-directories-exist directory-path)
36     (save-file index-path
37                (let ((output (load-file "templates/gemini_head.tpl")))
38                  (loop for tag in
39                       ;; sort tags per articles in it
40                       (sort (articles-by-tag) #'>
41                             :key #'(lambda (x) (length (getf x :value))))
42                     do
43                       (setf output
44 	                    (string
45 	                     (concatenate
46                               'string output
47                               (format nil "=> ~a/~a/index.gmi ~a ~d~%"
48                                       (getf *config* :gemini-path)
49                                       (getf tag :name)
50                                       (getf tag :name)
51                                       (length (getf tag :value)))))))
52                  output)))
53 
54   ;; produce each tag gemini index
55   (loop for tag in (articles-by-tag) do
56        (let* ((directory-path (concatenate 'string "output/gemini/" (getf tag :NAME) "/"))
57               (index-path (concatenate 'string directory-path (getf *config* :gemini-index)))
58               (articles-with-tag (loop for article in *articles*
59                                     when (member (article-id article) (getf tag :VALUE) :test #'equal)
60                                     collect article)))
61          (ensure-directories-exist directory-path)
62          (save-file index-path (generate-gemini-index articles-with-tag))))
63 
64   ;; produce each article file (adding some headers)
65   (loop for article in *articles*
66      do
67        (with-converter
68 	   (let ((id (article-id article)))
69 	     (save-file (format nil "output/gemini/articles/~a.gmi" id)
70                         (format nil "~{~a~}"
71                                 (list
72                                  "Title : " (article-title article) #\Newline
73                                  "Author: " (article-author article) #\Newline
74                                  "Date  : " (date-format (getf *config* :date-format) (article-date article)) #\Newline
75                                  "Tags  : " (article-tag article) #\Newline #\Newline
76 		                 (load-file (format nil "data/~d~d" id (converter-extension converter-object))))))))))