URI: 
       - Date now computed from a format YYYYMMDD - id attribute on <article> - 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 013ada82f339f61de56f426824c1c3c1a88bf9b1
   DIR parent 52bd9a828bdd422d4c4ec8fbd30ba8f5ef253e76
  HTML Author: Solene Rapenne <solene@perso.pw>
       Date:   Wed, 13 Dec 2017 20:35:33 +0100
       
       - Date now computed from a format YYYYMMDD
       - id attribute on <article>
       
       Diffstat:
         M data/articles.lisp                  |       7 ++++---
         M generator.lisp                      |      55 +++++++++++++++++++++++++++----
         M templates/article.tpl               |       2 +-
       
       3 files changed, 53 insertions(+), 11 deletions(-)
       ---
   DIR diff --git a/data/articles.lisp b/data/articles.lisp
       @@ -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")
   DIR diff --git a/generator.lisp b/generator.lisp
       @@ -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))
   DIR diff --git a/templates/article.tpl b/templates/article.tpl
       @@ -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>