Initialization of the repository - cl-yag - Common Lisp Yet Another website Generator
 (HTM) 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 66a2b83f5bceef484963bd78efc2a2da98004f4e
 (DIR) parent 33a711b470f9c3b71345444fff96f7103f933a77
 (HTM) Author: Solene Rapenne <solene@srv.dataswamp.org>
       Date:   Sat, 30 Apr 2016 17:21:31 +0200
       
       Initialization of the repository
       
       Diffstat:
         A Makefile                            |      11 +++++++++++
         A data/1.txt                          |       1 +
         A data/articles.lisp                  |      15 +++++++++++++++
         A generator.lisp                      |      82 +++++++++++++++++++++++++++++++
         A static/style.css                    |       0 
         A template/article.tpl                |       7 +++++++
         A template/layout.tpl                 |      23 +++++++++++++++++++++++
       
       7 files changed, 139 insertions(+), 0 deletions(-)
       ---
 (DIR) diff --git a/Makefile b/Makefile
       @@ -0,0 +1,11 @@
       +all:
       +        mkdir -p output/static
       +        cp -fr static/* output/static/
       +        sbcl --dynamic-space-size 60 --script generator.lisp
       +
       +clean:
       +        rm -fr output/*
       +
       +css:
       +        mkdir -p output/static
       +        cp -fr static/* output/static/        
 (DIR) diff --git a/data/1.txt b/data/1.txt
       @@ -0,0 +1 @@
       +<p>This contains the text of the article with id 1</p>
 (DIR) diff --git a/data/articles.lisp b/data/articles.lisp
       @@ -0,0 +1,15 @@
       +(defvar *config*
       +  (list
       +   :webmaster "Your author name here"
       +   :title "Your blog title here"
       +   ))
       +
       +;; describes articles (ordered)
       +;; exemple => (list :id "4" :date "2015-05-04" :title "The article title" :author "Me" :tiny "Short description for home page")
       +;; :author can be omitted and will be replaced by webmaster value
       +;; :tiny can be omitted and will be replaced by the full article text
       +(defvar *articles*
       +  (list
       +   (list :id "1" :date "29 April 2016" :title "My first message" :short "This is my first message" :author "Solène")
       +   ))
       +
 (DIR) diff --git a/generator.lisp b/generator.lisp
       @@ -0,0 +1,82 @@
       +(load "data/articles.lisp")
       +
       +(defun replace-all (string part replacement &key (test #'char=))
       +  "Returns a new string in which all the occurences of the part 
       +is replaced with replacement."
       +  (with-output-to-string (out)
       +                         (loop with part-length = (length part)
       +                               for old-pos = 0 then (+ pos part-length)
       +                               for pos = (search part string
       +                                                 :start2 old-pos
       +                                                 :test test)
       +                               do (write-string string out
       +                                                :start old-pos
       +                                                :end (or pos (length string)))
       +                               when pos do (write-string replacement out)
       +                               while pos)))
       +; load a file as a string
       +(defun slurp-file(path)
       +  (with-open-file (stream path)
       +                  (let ((data (make-string (file-length stream))))
       +                    (read-sequence data stream)
       +                    data)))
       +
       +; save a string in a file
       +(defun save-file(path data)
       +  (with-open-file (stream (concatenate 'string "output/" path) :direction :output :if-exists :supersede)
       +    (format stream data)))
       +
       +;; simplify the str replace work
       +(defmacro template(before &body after)
       +  `(progn
       +     (setf output (replace-all output ,before ,@after))))
       +
       +;; simplify the declaration of a new page type
       +(defmacro prepare(template &body code)
       +  `(progn
       +     (let ((output (slurp-file ,template)))
       +       ,@code
       +       output)))
       +
       +;; generates the html of one only article
       +(defun create-article(article &optional &key (tiny t))
       +  (prepare "template/article.tpl"
       +           (template "%%Author%%" (if (member :author article) (getf article :author) (getf *config* :webmaster)))
       +           (template "%%Date%%" (getf article :date))
       +           (template "%%Title%%" (getf article :title))
       +           (template "%%Id%%" (getf article :id))
       +           (template "%%Text%%" (if (and tiny (member :tiny article))
       +                                    (getf article :tiny) (slurp-file (format nil "data/~d.txt" (getf article :id)))))))
       +
       +;; Layout generation
       +(defun generate-layout(body)
       +  (let ((output (slurp-file "template/layout.tpl")))
       +    (template "%%Title%%" (getf *config* :title))
       +    (template "%%Body%%" body)
       +    output))
       +  
       +; Homepage generation
       +(defun generate-mainpage()
       +  (format nil "~{~d~}"
       +          (loop for article in *articles* collect
       +                (create-article article :tiny t))))
       +
       +; produce index.html
       +(defun generate-file-index()
       +  (save-file "index.html"
       +             (generate-layout (generate-mainpage))))
       +
       +; produce html files for articles
       +(defun generate-file-article(article)
       +  (save-file (format nil "article-~d.html" (getf article :id))
       +             (generate-layout (create-article article :tiny nil))))
       +
       +; ENGINE START !
       +(defun generate-site()
       +  (generate-file-index)
       +  (dolist (article *articles*) (generate-file-article article))
       +  ;;(generate-file-rss)
       +  )
       +
       +
       +(generate-site)
 (DIR) diff --git a/static/style.css b/static/style.css
 (DIR) diff --git a/template/article.tpl b/template/article.tpl
       @@ -0,0 +1,7 @@
       +<div class="article">
       +  <div class="informations">
       +    <b><a href="article-%%Id%%.html"><em>%%Author%%</em> wrote "%%Title%%" on %%Date%%</a></b>
       +  </div>
       +  <p>%%Text%%</p>
       +</div>
       +
 (DIR) diff --git a/template/layout.tpl b/template/layout.tpl
       @@ -0,0 +1,23 @@
       +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
       +<html >
       +  <head>
       +    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
       +    <link rel="stylesheet" type="text/css" href="static/style.css" />
       +    <title>%%Title%%</title>
       +  </head>
       +  <body>
       +
       +    <div id="top">
       +      <a href="index.html">Home</a> <a href="rss.xml">Rss</a>
       +    </div>
       +
       +    <div id="content">
       +      %%Body%%
       +    </div>
       +
       +    <div id="foot" >
       +      This blog is powered by cl-yag ! 
       +    </div>
       +    
       +  </body>
       +</html>