Title: New cl-yag version
       Author: Solène
       Date: 16 December 2017
       Tags: unix cl-yag
       Description: 
       
       #+OPTIONS: toc:nil num:nil
       
       ** Introduction
       
       cl-yag is a static website generator. It's a software used to publish
       a website and/or a gopher hole from a list of articles. As the
       developer of cl-yag I'm happy to announce that a new version has been
       released.
       
       ** New features
       
       The new version, with its number 0.6, bring lot of new features :
       
       - supporting **different** markup language **per article**
       - date format configurable
       - gopher output format configurable
       - ship with the default theme "clyma", minimalist but responsive (the
         one used on this website)
       - easier to use
       - full user documentation
       
       The code is available at git://bitreich.org/cl-yag, the program
       requires sbcl or ecl to work.
       
       *** Per article markup language
       
       The best feature I'm proud of is allowing to use a different language
       per article. While on my blog I choosed to use markdown, it's
       sometimes not adapted for more elaborated articles like the one about
       LISP containing code which was written in org-mode then converted to
       markdown manually to fit to cl-yag. Now, the user can declare a named
       "converter" which is a command line with pattern replacement, to
       produce the html file. We can imagine a lot of things with this, even
       producing a gallery with find + awk command. Now, I can use markdown
       by default and specify if I want to use org-mode or something else.
       
       This is the way to declare a converter, taking org-mode as example,
       which is not very simple, because of emacs not being script friendly :
       
       #+BEGIN_SRC lisp
       (converter :name :org-mode  :extension ".org"
                  :command (concatenate 'string
                                        "emacs data/%IN --batch --eval
       '(with-temp-buffer (org-mode) "
                                        "(insert-file \"%IN\")
       (org-html-export-as-html nil nil nil t)"
                                        "(princ (buffer-string)))' --kill |
       tee %OUT"))
       
       #+END_SRC
       
       And an easy way to produce a gallery with awk from a =.txt= file
       containing a list of images path.
       
       #+BEGIN_SRC lisp
         (converter :name :gallery :extension ".txt"
                    :command (concatenate 'string
                                          "awk 'BEGIN { print \"<div
       class=\\\"gallery\\\">\"} "
                                          "{ print \"<img
       src=\\\"static/images/\"$1\"\\\" />\" } "
                                          " END { print  \"</div>\"} data/%IN
       | tee %OUT"))
       #+END_SRC
       
       The concatenate function is only used to improve the presentation, to
       split the command in multiples lines and make it easier to read. It's
       possible to write all the command in one line.
       
       The patterns **=%IN=** and **=%OUT=** are replaced by the input file
       name and the output file name when the command is executed.
       
       For an easier example, the default markdown converter looks like this,
       calling multimarkdown command :
       
       #+BEGIN_SRC lisp
         (converter :name :markdown :extension ".md"
                    :command "multimarkdown -t html -o %OUT data/%IN")
       #+END_SRC
       
       It's really easy (I hope !) to add new converters you need with this
       feature.
       
       
       *** Date format configurable
       
       One problem I had with cl-yag is that it's plain vanilla Common LISP
       without libraries, so it's easier to fetch and use but it lacks some
       elaborated libraries like one to parse date and format a date. Before
       this release, I was writing in plain text "14 December 2017" in the
       date field of a blog post. It was easy to use, but not really usable
       in the RSS feed in the **=pubDate=** attribute, and if I wanted to
       change the display of the date for some reason, I would have to
       rewrite everything.
       
       Now, the date is simply in the format "YYYYMMDD" like "20171231" for
       the 31rd December 2017. And in the configuration variable, there is a
       **=:date-format=** keyword to define the date display. This variable
       is a string allowing pattern replacement of the following variables :
       
       - %DayNumber :: day of the month in number, from 1 to 31
       - %DayName :: day of the week, from Monday to Sunday, names are
                     written in english in the source code and can be
                     translated
       - %MonthNumber :: month in number, from 1 to 12
       - %MonthName :: month name, from January to December, names are
                       written in english in the source code and can be
                       translated
       - %Year :: year
       
       Currently, as the time of writing, I use the value "**=%DayNumber
       %MonthName %Year=**"
       
       A **=:gopher-format=** keyword exist in the configuration file to
       configure the date format in the gopher export. It can be different
       from the html one.
       
       *** More Gopher configuration
       
       There are cases where the gopher server use an unusual syntax compared
       to most of the servers. I wanted to make it configurable, so the user
       could easily use cl-yag without having to mess with the code. I
       provide the default for **geomyidae** and in comments another syntax
       is available. There is also a configurable value to indicates where to
       store the gopher page menu, it's not always **gophermap**, it could be
       **index.gph** or whatever you need.
       
       *** Easier to use
       
       A comparison of code will make it easier to understand. There was a
       little change the way blog posts are declared :
       
       From
       
       #+BEGIN_SRC lisp
         (defparameter *articles*
           (list
            (list :id "third-article"  :title "My third article" :tag "me"
       :date "20171205")
            (list :id "second-article" :title "Another article"  :tag "me"
       :date "20171204")
            (list :id "first-article"  :title "My first article" :tag "me"
       :date "20171201")
            ))
       #+END_SRC
       
       to
       
       #+BEGIN_SRC lisp
         (post :id "third-article"  :title "My third article" :tag "me" :date
       "20171205")
         (post :id "second-article" :title "Another article"  :tag "me" :date
       "20171204")
         (post :id "first-article"  :title "My first article" :tag "me" :date
       "20171201")
       #+END_SRC
       
       Each post are independtly declared and I plan to add a "page" function
       to create static pages, but this is going to be for the next version !
       
       ** Future work
       
       I am very happy to hack on cl-yag, I want to continue improving it but
       I should really think about each feature I want to add. I want to keep
       it really simple even if it limits the features.
       
       I want to allow the creation of static pages like "About me", "Legal"
       or "websites I liked" that integrates well in the template. The user
       may not want all the static pages links to go at the same place in the
       template, or use the same template. I'm thinking about this.
       
       Also, I think the gopher generation could be improved, but I still
       have no idea how.
       
       Others themes may come in the default configuration, allowing the user
       to have a choice between themes. But as for now, I don't plan to bring
       a theme using javascript.