Add date in posts url - 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 76cfe4f9da795b24680eba4e8c940e042b1d6e11
DIR parent fc0d8912469f5ce1e210ded72b2f52f49d307352
HTML Author: solene rapenne <solene@dataswamp.org>
Date: Thu, 14 Dec 2017 00:23:40 +0100
Add date in posts url
Diffstat:
M generator.lisp | 92 ++++++++++++++++++-------------
M templates/article.tpl | 3 ++-
2 files changed, 55 insertions(+), 40 deletions(-)
---
DIR diff --git a/generator.lisp b/generator.lisp
@@ -1,3 +1,5 @@
+;;;; GLOBAL VARIABLES
+
(defparameter *articles* '())
(defparameter *converters* '())
(defparameter *days* '("Monday" "Tuesday" "Wednesday" "Thursday"
@@ -7,36 +9,19 @@
"October" "November" "December"))
;; structure to store links
-(defstruct article title tag date id tiny author)
+(defstruct article title tag date id tiny author rawdate)
(defstruct converter name command extension)
-(defun post(&optional &key title tag date id (tiny nil) (author nil))
- (push (make-article :title title
- :tag tag
- :date date
- :tiny tiny
- :author author
- :id id)
- *articles*))
-
-;; we add a converter to the list of the one availables
-(defun converter(&optional &key name command extension)
- (push (make-converter :name name
- :command command
- :extension extension)
- *converters*))
-
-(load "data/articles.lisp")
-(setf *articles* (reverse *articles*))
-
+;;;; FUNCTIONS
;; return the day of the week
(defun get-day-of-week(day month year)
(multiple-value-bind
- (second minute hour date month year day-of-week dst-p tz)
- (decode-universal-time (encode-universal-time 0 0 0 day month year))
- (declare (ignore second minute hour date month year dst-p tz))
- day-of-week))
+ (second minute hour date month year day-of-week dst-p tz)
+ (decode-universal-time (encode-universal-time 0 0 0 day month year))
+ (declare (ignore second minute hour date month year dst-p tz))
+ day-of-week))
+
;; parse the date to
(defun date-parse(date)
@@ -52,7 +37,28 @@
:monthname month
:monthnumber monthnum
:year year))
- nil))
+ nil))
+
+(defun post(&optional &key title tag date id (tiny nil) (author nil))
+ (push (make-article :title title
+ :tag tag
+ :date (date-parse date)
+ :rawdate date
+ :tiny tiny
+ :author author
+ :id id)
+ *articles*))
+
+;; we add a converter to the list of the one availables
+(defun converter(&optional &key name command extension)
+ (push (make-converter :name name
+ :command command
+ :extension extension)
+ *converters*))
+
+;; load data from metadata and load config
+(load "data/articles.lisp")
+(setf *articles* (reverse *articles*))
;; common-lisp don't have a replace string function natively
@@ -115,9 +121,9 @@
(defun date-format(format date)
(let ((output format))
(template "%DayName" (getf date :dayname))
- (template "%DayNumber" (write-to-string (getf date :daynumber)))
+ (template "%DayNumber" (format nil "~2,'0d" (getf date :daynumber)))
(template "%MonthName" (getf date :monthname))
- (template "%MonthNumber" (write-to-string (getf date :monthnumber)))
+ (template "%MonthNumber" (format nil "~2,'0d" (getf date :monthnumber)))
(template "%Year" (write-to-string (getf date :year )))
output))
@@ -162,18 +168,20 @@
(articles-by-tag))))
-;; generates the html of one only article
+;; generates the html of only one article
;; this is called in a loop to produce the homepage
(defun create-article(article &optional &key (tiny t) (no-text nil))
(prepare "templates/article.tpl"
(template "%%Author%%" (let ((author (article-author article)))
(or author (getf *config* :webmaster))))
(template "%%Date%%" (date-format (getf *config* :date-format)
- (date-parse (article-date article))))
- (template "%%Raw-Date%%" (article-date article))
+ (article-date article)))
+ (template "%%Raw-Date%%" (article-rawdate article))
(template "%%Title%%" (article-title article))
(template "%%Id%%" (article-id article))
(template "%%Tags%%" (get-tag-list-article article))
+ (template "%%Date-Url%%" (date-format "%Year-%MonthNumber-%DayNumber"
+ (article-date article)))
(template "%%Text%%" (if no-text
""
(if (and tiny (article-tiny article))
@@ -212,10 +220,11 @@
(prepare "templates/rss-item.tpl"
(template "%%Title%%" (article-title article))
(template "%%Description%%" (load-file (format nil "temp/data/~d.html" (article-id article))))
- (let ((date (date-parse (article-date article))))
- (template "%%Date%%" (format nil (date-format "~a, %DayNumber ~a %Year 00:00:00 GMT" date)
- (subseq (getf date :dayname) 0 3)
- (subseq (getf date :monthname) 0 3))))
+ (template "%%Date%%" (format nil
+ (date-format "~a, %DayNumber ~a %Year 00:00:00 GMT"
+ (article-date article))
+ (subseq (getf (article-date article) :dayname) 0 3)
+ (subseq (getf (article-date article) :monthname) 0 3)))
(template "%%Url%%"
(format nil "~darticle-~d.html"
(getf *config* :url)
@@ -238,10 +247,14 @@
(generate "output/html/index-titles.html" (generate-semi-mainpage :no-text t))
;; produce each article file
- (dolist (article *articles*)
- (generate (format nil "output/html/article-~d.html" (article-id article))
- (create-article article :tiny nil)
- :title (concatenate 'string (getf *config* :title) " : " (article-title article))))
+ (loop for article in *articles*
+ do
+ (generate (format nil "output/html/~d-~d.html"
+ (date-format "%Year-%MonthNumber-%DayNumber"
+ (article-date article))
+ (article-id article))
+ (create-article article :tiny nil)
+ :title (concatenate 'string (getf *config* :title) " : " (article-title article))))
;; produce index file for each tag
(loop for tag in (articles-by-tag) do
@@ -269,7 +282,7 @@
(if (< 80 (length (article-title article)))
(subseq (article-title article) 0 80)
(article-title article)))))
- (replace title (article-date article) :start1 (- (length title) (length (article-date article)))))
+ (replace title (article-rawdate article) :start1 (- (length title) (length (article-rawdate article)))))
(getf *config* :gopher-path)
@@ -296,6 +309,7 @@
(if (getf *config* :gopher)
(create-gopher-hole)))
+;;;; EXECUTION
(generate-site)
DIR diff --git a/templates/article.tpl b/templates/article.tpl
@@ -1,7 +1,8 @@
<article id="%%Raw-Date%%">
<header>
- <h1><a href="article-%%Id%%.html">%%Title%%</a></h1>
+
+ <h1><a href="%%Date-Url%%-%%Id%%.html">%%Title%%</a></h1>
<p>Written by <em>%%Author%%</em>, on %%Date%%.<br/>Tags: %%Tags%%</p>
</header>
%%Text%%