- Date now computed from a format YYYYMMDD

- id attribute on <article>
This commit is contained in:
Solene Rapenne 2017-12-13 20:35:33 +01:00
parent 52bd9a828b
commit 013ada82f3
3 changed files with 53 additions and 11 deletions

View File

@ -10,6 +10,7 @@
:description "Yet another website on the net"
:url "https://my.website/~~user/" ;; the trailing slash is mandatory! RSS links will fail without it. Notice the '~~' to produce a literal '~'
:rss-item-number 10 ;; limit total amount of items in RSS feed to 10
:date-format "%DayNumber %MonthName %Year" ;; format for date %DayNumber %DayName %MonthNumber %MonthName %Year
:html t ;; 't' to enable export to a html website / 'nil' to disable
:gopher t ;; 't' to enable export to a gopher website / 'nil' to disable
:gopher-path "/user" ;; absolute path of your gopher directory
@ -41,15 +42,15 @@
;; CSS
(post :title "CSS For cl-yag"
:id "css" :date "02.12.2017" :tag "cl-yag"
:id "css" :date "20171202" :tag "cl-yag"
:author "lambda" :tiny "Read more")
;; README
(post :title "README"
:id "README" :date "23.11.2017" :tag "cl-yag"
:id "README" :date "20171202" :tag "cl-yag"
:author "lambda" :tiny "Read cl-yag's README")
;; 1
(post :title "My first post"
:id "1" :date "29.04.2016" :tag "pony"
:id "1" :date "20160429" :tag "pony"
:tiny "This is the first message" :author "Solène")

View File

@ -1,17 +1,21 @@
(defparameter *articles* '())
(defparameter *converters* '())
(defparameter *days* '("Monday" "Tuesday" "Wednesday" "Thursday"
"Friday" "Saturday" "Sunday"))
(defparameter *months* '("January" "February" "March" "April"
"May" "June" "July" "August" "September"
"October" "November" "December"))
;; structure to store links
(defstruct article title tag date id tiny author short)
(defstruct article title tag date id tiny author)
(defstruct converter name command extension)
(defun post(&optional &key title tag date id (tiny nil) (author nil) (short nil))
(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
:short short
:id id)
*articles*))
@ -26,6 +30,31 @@
(setf *articles* (reverse *articles*))
;; 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))
;; parse the date to
(defun date-parse(date)
(if (= 8 (length date))
(let* ((year (parse-integer date :start 0 :end 4))
(monthnum (parse-integer date :start 4 :end 6))
(daynum (parse-integer date :start 6 :end 8))
(day (nth (get-day-of-week daynum monthnum year) *days*))
(month (nth (- monthnum 1) *months*)))
(list
:dayname day
:daynumber daynum
:monthname month
:monthnumber monthnum
:year year))
nil))
;; common-lisp don't have a replace string function natively
(defun replace-all (string part replacement &key (test #'char=))
(with-output-to-string (out)
@ -82,6 +111,16 @@
`(progn
(setf output (replace-all output ,before ,@after))))
;; format the date
(defun date-format(format date)
(let ((output format))
(template "%DayName" (getf date :dayname))
(template "%DayNumber" (write-to-string (getf date :daynumber)))
(template "%MonthName" (getf date :monthname))
(template "%MonthNumber" (write-to-string (getf date :monthnumber)))
(template "%Year" (write-to-string (getf date :year )))
output))
;; simplify the declaration of a new page type
(defmacro prepare(template &body code)
`(progn
@ -129,9 +168,11 @@
(prepare "templates/article.tpl"
(template "%%Author%%" (let ((author (article-author article)))
(or author (getf *config* :webmaster))))
(template "%%Date%%" (article-date article))
(template "%%Title%%" (article-title article))
(template "%%Id%%" (article-id article))
(template "%%Date%%" (date-format (getf *config* :date-format)
(date-parse (article-date article))))
(template "%%Raw-Date%%" (article-date article))
(template "%%Title%%" (article-title article))
(template "%%Id%%" (article-id article))
(template "%%Tags%%" (get-tag-list-article article))
(template "%%Text%%" (if no-text
""
@ -166,7 +207,7 @@
(defun generate-rss-item()
(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*))
for i from 1 to (min (length *articles*) (getf *config* :rss-item-number))
collect
(prepare "templates/rss-item.tpl"
(template "%%Title%%" (article-title article))

View File

@ -1,5 +1,5 @@
<article>
<article id="%%Raw-Date%%">
<header>
<h1><a href="article-%%Id%%.html">%%Title%%</a></h1>
<p>Written by <em>%%Author%%</em>, on %%Date%%.<br/>Tags: %%Tags%%</p>