Merge branch 'master' of git://bitreich.org/cl-yag
This commit is contained in:
commit
bff6ca9e3a
10
Makefile
10
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:
|
||||
|
|
|
@ -3,7 +3,8 @@
|
|||
|
||||
## 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.
|
||||
|
||||
|
|
|
@ -3,7 +3,8 @@
|
|||
|
||||
## 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.
|
||||
|
||||
|
|
|
@ -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")
|
||||
))
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue