Merge branch 'cl-yag' from Solene's master - 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 2a146ce064617e43c80f9c41ceef007843bea20d DIR parent 5024296da286dd15e183886cd4110e05a6049078 HTML Author: lambda <lambda@fnord.one> Date: Wed, 29 Nov 2017 11:16:10 +0100 Merge branch 'cl-yag' from Solene's master Diffstat: M Makefile | 10 +--------- M README.md | 2 +- M data/README.md | 2 +- M data/articles.lisp | 4 ++-- M generator.lisp | 97 ++++++++++++++++--------------- 5 files changed, 54 insertions(+), 61 deletions(-) --- DIR diff --git a/Makefile b/Makefile @@ -5,18 +5,10 @@ HTMLDIR= temp/data ARTICLES!= ls data/*.md HTML= $(ARTICLES:.md=.html) -.if "${LISP}" == "sbcl" -PARAM=--dynamic-space-size 90 --script -.elif "${LISP}" == "clisp" -PARAM= -.elif "${LISP}" == "ecl" -PARAM=-shell -.endif - all: clean dirs html html: $(HTML) css - $(LISP) $(PARAM) generator.lisp + $(LISP) --load generator.lisp rm -fr "temp" dirs: DIR diff --git a/README.md b/README.md @@ -3,7 +3,7 @@ ## Introduction -cl-yag is a very lightweight, static-site generator that produces **gopher** sites as well as **html** websites. +cl-yag is a very lightweight, static site generator that produces **gopher** sites as well as **html** websites. The name 'cl-yag' stands for 'Common Lisp - Yet Another website Generator'. It runs without Quicklisp. DIR diff --git a/data/README.md b/data/README.md @@ -3,7 +3,7 @@ ## Introduction -cl-yag is a very lightweight, static-site generator that produces **gopher** sites as well as **html** websites. +cl-yag is a very lightweight, static site generator that produces **gopher** sites as well as **html** websites. The name 'cl-yag' stands for 'Common Lisp - Yet Another website Generator'. It runs without Quicklisp. DIR diff --git a/data/articles.lisp b/data/articles.lisp @@ -34,10 +34,10 @@ (defvar *articles* (list ;; README - (list :id "README" :date "23 November 2016" :tag "cl-yag README" + (list :id "README" :date "23 November 2017" :tag "cl-yag README" :title "README" :author "lambda" :short "cl-yag's README got reworked." :tiny "Read cl-yag's README") ;; 1 - (list :id "1" :date "29 April 2016":tag "pony code" + (list :id "1" :date "29 April 2016" :tag "pony code" :title "My first message" :short "This is my first message" :author "Solène" :tiny "Read more") )) DIR diff --git a/generator.lisp b/generator.lisp @@ -15,31 +15,32 @@ while pos))) ;; common-lisp don't have a split string function natively -;; thanks https://gist.github.com/siguremon/1174988 -(defun split-str-1 (string &optional (separator " ") (r nil)) - (let ((n (position separator string - :from-end t - :test #'(lambda (x y) - (find y x :test #'string=))))) - (if n - (split-str-1 (subseq string 0 n) separator (cons (subseq string (1+ n)) r)) - (cons string r)))) -(defun split-str (string &optional (separator " ")) - (split-str-1 string separator)) - -;; we have to remove the quotes -;; when using collect in a loop -(defun strip-quotes(input) - (format nil "~{~d~%~}" input)) +(defun split-str(text &optional (separator #\Space)) + "this function split a string with separator and return a list" + (let ((text (concatenate 'string text (string separator)))) + (loop for char across text + counting char into count + when (char= char separator) + collect + ;; we look at the position of the left separator from right to left + (let ((left-separator-position (position separator text :from-end t :end (- count 1)))) + (subseq text + ;; if we can't find a separator at the left of the current, then it's the start of + ;; the string + (if left-separator-position (+ 1 left-separator-position) 0) + (- count 1)))))) ;; load a file as a string ;; we escape ~ to avoid failures with format (defun load-file(path) (if (probe-file path) (replace-all - (strip-quotes - (with-open-file (stream path) - (loop for line = (read-line stream nil) while line collect line))) + (apply #'concatenate 'string + (with-open-file (stream path) + (loop for line = (read-line stream nil) + while line + collect + (format nil "~a~%" line)))) "~" "~~") (progn (format t "ERROR : file ~a not found. Aborting~%" path) @@ -82,18 +83,18 @@ ;; generates the html of the list of tags for an article (defun get-tag-list-article(&optional article) - (strip-quotes - (mapcar #'(lambda (item) - (prepare "templates/one-tag.tpl" (template "%%Name%%" item))) - (split-str (getf article :tag))))) + (apply #'concatenate 'string + (mapcar #'(lambda (item) + (prepare "templates/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 "templates/one-tag.tpl" - (template "%%Name%%" (getf item :name)))) - (articles-by-tag)))) + (apply #'concatenate 'string + (mapcar #'(lambda (item) + (prepare "templates/one-tag.tpl" + (template "%%Name%%" (getf item :name)))) + (articles-by-tag)))) ;; generates the html of one only article @@ -123,31 +124,31 @@ ;; html generation of index homepage (defun generate-semi-mainpage(&key (tiny t) (no-text nil)) - (strip-quotes - (loop for article in *articles* collect - (create-article article :tiny tiny :no-text no-text)))) + (apply #'concatenate 'string + (loop for article in *articles* collect + (create-article article :tiny tiny :no-text no-text)))) ;; html generation of a tag homepage (defun generate-tag-mainpage(articles-in-tag) - (strip-quotes - (loop for article in *articles* - when (member (getf article :id) articles-in-tag :test #'equal) - collect (create-article article :tiny t)))) + (apply #'concatenate 'string + (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() - (strip-quotes - (loop for article in *articles* - for i from 1 to (if (> (length *articles*) (getf *config* :rss-item-number)) (getf *config* :rss-item-number) (length *articles*)) - collect - (prepare "templates/rss-item.tpl" - (template "%%Title%%" (getf article :title)) - (template "%%Description%%" (load-file (format nil "temp/data/~d.html" (getf article :id)))) - (template "%%Url%%" - (format nil "~darticle-~d.html" - (getf *config* :url) - (getf article :id))))))) - + (apply #'concatenate 'string + (loop for article in *articles* + for i from 1 to (if (> (length *articles*) (getf *config* :rss-item-number)) (getf *config* :rss-item-number) (length *articles*)) + collect + (prepare "templates/rss-item.tpl" + (template "%%Title%%" (getf article :title)) + (template "%%Description%%" (load-file (format nil "temp/data/~d.html" (getf article :id)))) + (template "%%Url%%" + (format nil "~darticle-~d.html" + (getf *config* :url) + (getf article :id))))))) + ;; Generate the rss xml data (defun generate-rss() (prepare "templates/rss.tpl" @@ -225,4 +226,4 @@ (create-gopher-hole))) (generate-site) - +(quit)