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))))))))))