add support for tags in articles + improve code - 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 e94fc554f9a4f95d8b8df4ea8629a330ef129d13 DIR parent 2031387fa4e3079bf8d57e7b3e009b3305ec4c5a HTML Author: solene rapenne <solene@dataswamp.org> Date: Tue, 3 May 2016 14:58:53 +0200 add support for tags in articles + improve code Diffstat: M generator.lisp | 64 +++++++++++++++++++------------ M template/article.tpl | 2 +- 2 files changed, 41 insertions(+), 25 deletions(-) --- DIR diff --git a/generator.lisp b/generator.lisp @@ -37,6 +37,11 @@ data)) "~" "~~")) +;; we have to remove the quotes +;; when using collect in a loop +(defun strip-quotes(input) + (format nil "~{~d~}" input)) + ;; save a string in a file (defun save-file(path data) (with-open-file (stream (concatenate 'string "output/" path) :direction :output :if-exists :supersede) @@ -61,7 +66,7 @@ (generate-layout ,@data)))) ;; generate the list of tags -(defun the-tags() +(defun articles-by-tag() (let ((tag-list)) (loop for article in *articles* do (if (getf article :tag nil) ;; we don't want an error if no tag @@ -73,8 +78,21 @@ (loop for i from 1 to (length tag-list) by 2 collect ;; removing the keywords (nth i tag-list)))) - - +;; generates the html of the list of tags for an article +(defun get-tag-list-article(&optional article) + (strip-quotes + (mapcar #'(lambda (item) + (prepare "template/one-tag.tpl" (template "%%Name%%" item))) + (split-str (getf article :tag))))) + +;; generates the html of the whole list of tags +(defun get-tag-list() + (strip-quotes + (mapcar #'(lambda (item) + (prepare "template/one-tag.tpl" + (template "%%Name%%" (getf item :name)))) + (articles-by-tag)))) + ;; generates the html of one only article ;; this is called in a loop to produce the homepage @@ -84,6 +102,7 @@ (template "%%Date%%" (getf article :date)) (template "%%Title%%" (getf article :title)) (template "%%Id%%" (getf article :id)) + (template "%%Tags%%" (get-tag-list-article article)) (template "%%Text%%" (if (and tiny (member :tiny article)) (getf article :tiny) (load-file (format nil "data/~d.txt" (getf article :id))))))) @@ -92,38 +111,35 @@ (defun generate-layout(body) (prepare "template/layout.tpl" (template "%%Title%%" (getf *config* :title)) - (template "%%Tags%%" - (format nil "~{~d~}" (loop for tag in (the-tags) collect - (prepare "template/one-tag.tpl" - (template "%%Name%%" (getf tag :name)))))) + (template "%%Tags%%" (get-tag-list)) (template "%%Body%%" body) output)) ;; html generation of index homepage (defun generate-semi-mainpage() - (format nil "~{~d~}" - (loop for article in *articles* collect - (create-article article :tiny t)))) + (strip-quotes + (loop for article in *articles* collect + (create-article article :tiny t)))) ;; html generation of a tag homepage (defun generate-tag-mainpage(articles-in-tag) - (format nil "~{~d~}" - (loop for article in *articles* - when (member (getf article :id) articles-in-tag :test #'equal) - collect (create-article article :tiny t)))) + (strip-quotes + (loop for article in *articles* + when (member (getf article :id) articles-in-tag :test #'equal) + collect (create-article article :tiny t)))) ;; xml generation of the items for the rss (defun generate-rss-item() - (format nil "~{~d~}" - (loop for article in *articles* collect - (prepare "template/rss-item.tpl" - (template "%%Title%%" (getf article :title)) - (template "%%Description%%" (getf article :short "")) - (template "%%Url%%" - (format nil "~d/article-~d.html" - (getf *config* :url) - (getf article :id))))))) + (strip-quotes + (loop for article in *articles* collect + (prepare "template/rss-item.tpl" + (template "%%Title%%" (getf article :title)) + (template "%%Description%%" (getf article :short "")) + (template "%%Url%%" + (format nil "~d/article-~d.html" + (getf *config* :url) + (getf article :id))))))) ;; Generate the rss xml data (defun generate-rss() @@ -147,7 +163,7 @@ (create-article article :tiny nil))) ;; produce index file for each tag - (loop for tag in (the-tags) do + (loop for tag in (articles-by-tag) do (generate (format nil"tag-~d.html" (getf tag :NAME)) (generate-tag-mainpage (getf tag :VALUE)))) DIR diff --git a/template/article.tpl b/template/article.tpl @@ -1,6 +1,6 @@ <div class="article"> <div class="informations"> - <b><a href="article-%%Id%%.html"><em>%%Author%%</em> wrote "%%Title%%" on %%Date%%</a></b> + <b><a href="article-%%Id%%.html"><em>%%Author%%</em> wrote "%%Title%%" on %%Date%%</a></b>Tags : %%Tags%% </div> <p>%%Text%%</p> </div>