Minor adjustments

- Checked for ambiguous usage of 'should' and 'could'.
- Deleted _ in :id
- Corrections of minor spelling errors.
- Remove bmake and CLISP references.
- Correct spelling errors.
- Add links to websites of sbcl, ecl, multimarkdown in section 'Requirements'.
- Add :title to data/articles.lisp section.
- Use *bar* for *vars* and *functions* (exception: Beginning of list-item).
- Use ``bar`` for ``:keywords``, booleans, inline-examples.
- Use **bar** for **foo/path/** and **foo/path/file.name**.
This commit is contained in:
lambda 2017-12-01 14:35:38 +00:00 committed by Solene Rapenne
parent e763198dd9
commit 0ffdf3f28a
1 changed files with 119 additions and 120 deletions

239
README.md
View File

@ -1,18 +1,19 @@
# README
o# README
## Introduction
cl-yag is a very lightweight, 'static site'-generator that produces **gopher** sites as well as **html** websites.
The name 'cl-yag' stands for 'Common Lisp - Yet Another website Generator'.
cl-yag is a lightweight, static-site generator that produces **gopher** sites as well as **html** websites.
The name 'cl-yag' stands for 'Common Lisp - Yet Another website Generator'.
It runs without Quicklisp.
## Showcase
I am using cl-yag to create and maintain my websites in the
world-wide-web (visit: *[Solene'spercent](https://dataswamp.org/~solene/)*)
as well as [in gopher-space](gopher://dataswamp.org/1/~solene/).
world-wide-web (visit: *[Solene's
percent](https://dataswamp.org/~solene/)*) as well as [in
gopher-space](gopher://dataswamp.org/1/~solene/).
## Requirements
@ -20,21 +21,17 @@ as well as [in gopher-space](gopher://dataswamp.org/1/~solene/).
To use cl-yag you'll need:
1. A Common Lisp Interpreter
- cl-yag's current default is **Steel Bank Common Lisp (SBCL)**.
- **Embeddable Common Lisp (ECL)** will do fine as well.
- cl-yag's current default is [Steel Bank Common Lisp (SBCL)](http://www.sbcl.org/).
- [Embeddable Common Lisp (ECL)](https://common-lisp.net/project/ecl/) will do fine as well.
2. A Markdown-to-HTML Converter
- cl-yag's current default is **multimarkdown**.
3. BSD Make
- Linux-Users, cl-yag uses a BSD Makefile syntax, that isn't compatible with GNU make's.
- You need to install a port of the NetBSD make tool, called **bmake**.
- cl-yag's current default is [multimarkdown](http://fletcherpenney.net/multimarkdown/).
## Usage
Go into your project's directory and type ``make``. You'll find your new website/gopher page in 'output/'.
If you want to get rid of everything in your 'output/' subdirectories,
type ``make clean``.
For further commands: read the Makefile.
Go into your project's directory and type ``make``. You'll find your new website/gopher page in **output/**.
If you want to get rid of everything in your **output/** subdirectories, type ``make clean``.
For further commands: read the Makefile.
Read in the follwing section where to find it.
@ -43,28 +40,28 @@ Read in the follwing section where to find it.
After cloning the repository, your project's directory should contain at
least the following files and folders:
.
|-- LICENSE
|-- Makefile
|-- README.md
|-- data/
| |-- 1.md
| |-- README.md
| `-- articles.lisp
|-- generator.lisp
|-- output/
| |-- gopher/
| `-- html/
|-- static/
| |-- css/style.css
| `-- img/
`-- templates/
|-- article.tpl
|-- gopher_head.tpl
|-- layout.tpl
|-- one-tag.tpl
|-- rss-item.tpl
`-- rss.tpl
.
|-- LICENSE
|-- Makefile
|-- README.md
|-- data/
| |-- 1.md
| |-- README.md
| `-- articles.lisp
|-- generator.lisp
|-- output/
| |-- gopher/
| `-- html/
|-- static/
| |-- css/style.css
| `-- img/
`-- templates/
|-- article.tpl
|-- gopher_head.tpl
|-- layout.tpl
|-- one-tag.tpl
|-- rss-item.tpl
`-- rss.tpl
- **Makefile**
- This file exists to simplifiy the recurring execution of frequently used commands.
@ -72,25 +69,25 @@ least the following files and folders:
- This is cl-yag's core library.
- **static/**
- This directory holds content, that needs to be published without being changed (e.g. stylesheets, js-scripts).
- If you come from 'non-static CMS'-Country: 'static/' holds, what you would put in your 'assets/' directory.
- If you come from 'non-static CMS'-Country: **static/** holds, what you would put in your **assets/** directory.
- **templates/**
- The templates in this directory provide the structural skeleton(s) of the webpages and feeds you want to create.
- **output/**
- cl-yag puts in this directory everything ready to get deployed.
- Because cl-yag generates not only HTML, but gopher-compliant pages as well, output/ **holds two subdirectories**.
- **gopher/** : contains the website for gopher,
- **html/** : contains the website in HTML.
- Because cl-yag generates not only HTML, but gopher-compliant pages as well, **output/** **holds two subdirectories**.
- **gopher/** contains the website for gopher,
- **html/** contains the website in HTML.
And there is the **data/** directory, which is important enough to get a subsubsection of its own.
### The 'data/' Directory
### The data/ Directory
This directory is crucial for the usage of cl-yag.
**data/** contains
- the **articles.lisp configuration file**, which defines important metadata for posts and pages.
- It also holds **${id}.md**-files, which are holding your posts' and pages' content. You can use markdown to write them.
- the **articles.lisp** configuration file, which defines important metadata for posts and pages.
- It also holds **${id}.md** files, which are holding your posts' (or pages') content. You can use markdown to write them.
For more information: Read section 'Configuration'.
@ -98,112 +95,116 @@ For more information: Read section 'Configuration'.
## Configuration
cl-yag's main configuration file is **data/articles.lisp**.
In order to have a reliably running implementation of cl-yag, you have
In order to have a running implementation of cl-yag, you have
to set most of the values in this file.
**data/articles.lisp** has two parts:
1. A variable called **config**. It defines global values, that define your webpage.
2. A variable called **articles**. It defines local values, that - in turn - define individual pages/posts.
1. A variable called *config*. Its values define your webpage.
2. A variable called *articles*. Its values define your posts.
Values are assigned by placing a string (e.g. "foo") or a boolean
(i.e. 't' or 'nil') behind a keyword (e.g. ':title').
Values are assigned by placing a string (e.g. ``"foo"``) or a boolean
(i.e. ``t`` or ``nil``) behind a keyword (e.g. ``:title``).
### The **config** Variable
### The *config* Variable
The **config** variable is used to assign the following values:
The *config* variable is used to assign the following values:
- **:webmaster**
- The name of the default(!) author.
- :webmaster gets used, if **:author** is omitted. (see below: 'The **articles** variable'.)
- ``:webmaster`` gets used, if ``:author`` is omitted. (See below: 'The **articles** variable'.)
- **:title**
- The title of the webpage
- **:description**
- This text is used in the *description* field of the Atom RSS
- **:url**
- This needs to be the full(!) URL of your website, including(!) a final slash.
- MIND: If the url contains a tilde (~), it needs to get duplicated
- Example: https://mydomain/~~user/ is a valid url.
- MIND: If the url contains a tilde (~), it needs to get duplicated
- Example: ``https://mydomain/~~user/``
- **:rss-item-number**
- This holds the number of latest(!) RSS items you want to get published when you generate the files.
- **html**
- *t* to export html website. Set *nil* to disable.
- ``t`` to export html website. Set ``nil`` to disable.
- **gopher**
- *t* to export gopher website. Set *nil* to disable.
- ``t`` to export gopher website. Set ``nil`` to disable.
- **gopher-path**
- This is the full path of the directory to access your gopher hole.
- **gopher-server**
- Hostname of the gopher server. Because gopher doesn't allow relative links (like html), you need to know where you put your files.
- Hostname of the gopher server. It needs to be included in every link.
- **gopher-port**
- tcp port of the gopher server. 70 is the default port. It need to be included in every link (see: **gopher-server**).
- tcp port of the gopher server. 70 is the default port. It needs to be included in every link.
### The **articles** Variable
### The *articles* Variable
The **articles** variable holds per page/post-metadata.
Of the following fields, only the *:author* and *:short* description could be omitted.
The *articles* variable holds post metadata.
So you need to create an entry in the *articles* variable for each of your posts.
Of the following keywords, only ``:author`` and ``:short`` can be omitted.
- **:short**
- The _:short_ field's value is used for displaying a really short description of the posts content on your homepage.
- If _:short_ doesn't get a value, the full article gets displayed.
- Hint: Use ``:short "view the article for the full text"``, if you don't want to display the full text of an article on your index site.
- **:id_**
- The _:id_ field holds the filename of your post/page.
- Example: ``:id "2"`` will load file ``data/2.md``. Use text instead of numbers, if you want to.
- (See section: 'The **data/** Directory'.)
- **:author**
- The _:author_ field is used to display the article' author.
- If you omit it, the generator will take the name from the **:webmaster** field of the *config* variable.
- The ``:author`` field is used to display the article's author.
- If you omit it, the generator will take the name from the ``:webmaster`` field of the *config* variable.
- **:id**
- The ``:id`` field holds the filename of your post/page.
- Example: ``:id "2"`` will load file **data/2.md**. Use text instead of numbers, if you want to.
- (See section: 'The **data/** Directory'.)
- **:short**
- The ``:short`` field's value is used for displaying a really short description of the posts content on your homepage.
- If ``:short`` doesn't get a value, the full article gets displayed.
- Hint: Use ``:short "view the article for the full text"``, if you don't want to display the full text of an article on your index site.
- **:tag**
- _:tag_ field is used to create a "view" containing all articles of the same tag.
- MIND: Whitespaces are not allowed in(!) tags.
- ``:tag`` field is used to create a "view" containing all articles of the same tag.
- MIND: Whitespaces are used to separate tags and are not allowed in(!) tags.
- **:title**
- The ``:title`` field's value sets your post's title, its first headline, as well as its entry on the index.html.
## Howto Create A New Post
Edit **data/articles.lisp** and add a new list to the *articles* variable:
Edit data/articles.lisp and add a new list to the *articles* variable:
(list :title "How do I use cl-yag"
:id "2"
:date "29 April 2016"
:author "Solène"
:short "I will explain how to use the generator"
:tag "example help code")
(list :title "How do I use cl-yag"
:id "2"
:date "29 April 2016"
:author "Solène"
:short "I will explain how to use the generator"
:tag "example help code")
Then write a corresponding **data/2.md** file, using markdown.
Then write a corresponding ``2.md`` file, using markdown.
## Howto Publish A Post
I prepared a Makefile to facilitate the process of generating and
publishing your static sites.
publishing your static sites.
All you need to do in order to publish is to go into your cl-yag
directory and type "make".
directory and type ``make``.
The 'make' command does create html and gopher files in the defined
**output/** location (which can be a symbolic link pointing to some
other directory, somewhere else on your machine).
The make command creates html and gopher files in the defined location.
The default is the **output/** directory, but you can use a symbolic link
pointing to some other directory as well.
## Howto Add A New Page
You may want to have some dedicated pages besides the index or a post.
To create one, edit the **generate-site** function in cl-yag's
generator.lisp and add a function call, like this:
You may want to have some dedicated pages besides the index or a post.
To create one, edit the *generate-site* function in cl-yag's
**generator.lisp** and add a function call, like this:
(generate "somepage.html" (load-file "data/mypage.html"))
This will produce the file **somepage.html** in the output folder.
This will produce **output/html/somepage.html**.
## Further Customization
### Howto Use Another Common Lisp Interpreter
cl-yags default Lisp interpreter is **sbcl**.
cl-yags default Lisp interpreter is **sbcl**.
If you want to use a different lisp interpreter you need to set the
variable 'LISP' to the name of your binary, when calling ``make``.
variable *LISP* to the name of your binary, when calling ``make``:
make LISP=ecl
@ -211,67 +212,65 @@ variable 'LISP' to the name of your binary, when calling ``make``.
### Using git Hooks For Publishing
You may customize your publishing-process further, e.g. by using a git
hook to call 'make' after each change in the repo so your website gets
updated automatically.
hook to call the make program after each change in the repo so your
website gets updated automatically.
## Page-Includes
Here is an example code, if you want to include another page in the template:
1. Create **template/panel.tpl** with the html you want to include.
2. Add a string in the target file, where the replacement should occur.
In this case, we choose **%%Panel%%** for a string, and, because we want the panel to be displayed on each page, we add this string to **template/layout.tpl**.
1. Create **templates/panel.tpl** containing the html you want to include.
2. Add a replacement-string in the target file, where the replacement should occur.
In this case, we choose **%%Panel%%** for a string, and, because we want the panel to be displayed on each page, we add this string to **templates/layout.tpl**.
3. Modify the function *generate-layout* in cl-yag's **generator.lisp** accordingly.
3. Modify the function *generate-layout* in cl-yag's **generator.lisp** accordingly.
This is done by adding the following template function call:
(template "%%Panel%%" (load-file "template/panel.tpl"))
(Note: You can insert your text directly into the layout template file
as well.)
(template "%%Panel%%" (load-file "templates/panel.tpl"))
Another valid approach is to writer your html directly into **templates/layout.tpl**.
## Known Limitations
### Use ~~ To Create ~
cl-yag crashes if you use a single "**~**" caracter inside one data
structure in **articles.lisp** files, because Common Lisp employs the
tilde as a prefix to indicate format specifiers in format strings.
cl-yag crashes if you use a single "~" character inside
**templates/articles.lisp**, because Common Lisp employs the tilde as a
prefix to indicate format specifiers in format strings.
In order to use a literal `~` - e.g. for creating a :title or :url
reference - you have to **escape** the tilde **by duplicating** it:
``~~``.
(See _:url_ in section 'Configuration').
In order to use a literal `~` -- e.g. for creating a ``:title`` or
``:url`` reference -- you have to *escape* the tilde *by
duplicating* it: ``~~``. (See ``:url`` in section 'Configuration').
### Posting Without Tagging
cl-yag allows posts to be 'untagged'- but with the default template
you'll get a line below your title that displays: "Tags: ".
cl-yag allows posts without tags, but, using the default
**templates/layout.tpl**, you'll get a line below your title that
displays: "Tags: ".
(Note: If you are looking for a way to contribute this may be a task for you.)
### A Note On Themes
Although cl-yag **may** ship with a **minimalistic** template, cl-yag
focuses only on generating html- and gopher-compliant structural
markup - not themed layouts.
Although cl-yag may ship with a minimalistic template, cl-yag focuses
on generating html- and gopher-compliant structural markup - not
themed layouts.
If you want some deeply refined, cross-browser compatible, responsive,
webscale style-sheet, you need to create it yourself.
However, cl-yag will work nicely with it and if you want to make your
webscale style sheets, you need to create them yourself. However,
cl-yag will work nicely with them and if you want to make your
stylesheets a part of cl-yag you're very welcome to contact me.
# Hacking cl-yag
I tried to make cl-yag easy to extend.
I tried to make cl-yag easy to extend.
If you want to contribute, feel free to contact me and/or to send in a patch.
- If you are looking for a way to contribute:
- You could find a way to "sanitize" cl-yag's behaviour regarding the tilde (see: above);
- Also see: 'Note' in 'Posting Without Tagging';
- Also see: 'A Note On Themes.
- Also see: 'A Note On Themes'.