Introduction
Introduction Statistics Contact Development Disclaimer Help
Initialization of the repository - cl-yag - Common Lisp Yet Another website Gen…
git clone git://bitreich.org/cl-yag/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws…
Log
Files
Refs
Tags
README
LICENSE
---
commit 66a2b83f5bceef484963bd78efc2a2da98004f4e
parent 33a711b470f9c3b71345444fff96f7103f933a77
Author: Solene Rapenne <[email protected]>
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(-)
---
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/
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>
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" :aut…
+;; :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 …
+ ))
+
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 :out…
+ (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 :…
+ (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 n…
+
+;; 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)
diff --git a/static/style.css b/static/style.css
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 …
+ </div>
+ <p>%%Text%%</p>
+</div>
+
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…
+<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>
You are viewing proxied material from bitreich.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.