[![Build Status](https://ci.mills.io/api/badges/prologic/zs/status.svg)](https://ci.mills.io/prologic/zs)
+## Quick Start
+
+```console
+go get install go.mills.io/zs@latest
+cat > .zs/layout.html <<EOF
+<html>
+ <head>
+ <title>{{ title }}</title>
+ </head>
+ <body>{{ content }}</body>
+</html>
+EOF
+cat > index.md <<EOF
+---
+title: Hello World
+---
+
+# Hello World
+
+Hello World!
+EOF
+zs serve
+```
+
## Features
* Zero configuration (no configuration file needed)
go get go.mills.io/zs@latest
```
-Or build from source manaully:
+Or build from source manually:
```console
git clone https://git.mills.io/prologic/zs
files, e.g. `{{ title }}` or `{{ command arg1 arg2 }}.
Write extensions in any language you like and put them into the `.zs`
-subdiretory.
+sub-directory.
Everything the extensions prints to stdout becomes the value of the
placeholder.
- `$ZS_FILE` - a path to the currently processed markdown file
- `$ZS_URL` - a URL for the currently generated page
-## Example of RSS generation
+## Extensions
+
+Extensions are just executables in any language that output content. They can be system executables like `data` or custom extensions that you place in `.zs/`. To use an extensions simply reference it in your content like so:
+
+```markdown
+Site last updated at {{{ date }}
+```
+
+Or:
+
+```markdown
+Here's a list of support features:
+
+{{ features }}
+```
-Extensions can be written in any language you know (Bash, Python, Lua, JavaScript, Go, even Assembler). Here's an example of how to scan all markdown blog posts and create RSS items:
+Where `features` is a script defined in `.zs/features`
+
+Extensions can be written in any language you know (Bash, Python, Lua, JavaScript, Go, even Assembler).
+Here are some example extensions you might find useful in your site.
+
+### Extension: Include
+
+`.zs/include`:
+
+```bash
+#!/bin/sh
+
+if [ ! $# = 1 ]; then
+ printf "Usage: %s <file>\n" "$(basename "$0")"
+ exit 0
+fi
+
+if [ -f "$1" ]; then
+ cat "$1"
+else
+ echo "error: file not found $1"
+fi
+```
+
+### Extension: RSS
+
+`.zs/rss`:
```bash
+#!/bin/sh
+
for f in ./blog/*.md ; do
- d=$($ZS var $f date)
+ d="$("$ZS" var "$f" date)"
if [ ! -z $d ] ; then
- timestamp=`date --date "$d" +%s`
- url=`$ZS var $f url`
- title=`$ZS var $f title | tr A-Z a-z`
- descr=`$ZS var $f description`
+ timestamp="$(date --date "$d" +%s)"
+ url="$("$ZS" var "$f" url)"
+ title="$("$ZS" var "$f" title | tr A-Z a-z)"
+ desc="$("$ZS" var "$f" description)"
echo $timestamp \
"<item>" \
"<title>$title</title>" \
"<link>http://zserge.com/$url</link>" \
- "<description>$descr</description>" \
+ "<description>$desc</description>" \
"<pubDate>$(date --date @$timestamp -R)</pubDate>" \
"<guid>http://zserge.com/$url</guid>" \
"</item>"
## Hooks
There are two special plugin names that are executed every time the build
-happens - `prehook` and `posthook`. You can define some global actions here like
-content generation, or additional commands, like to minify CSS or Javascript files.
+happens:
+
+- `prehook` -- executed before the build
+- `posthook` -- executed after the build
+
+You can use these to customize the build before and after. For example you can use the `posthook` to minify CSS or Javascript files.
+
+`.zs/posthook`:
```bash
#!/bin/sh
- `zs build` re-builds your site.
- `zs build <file>` re-builds one file and prints resulting content to stdout.
- `zs watch` rebuilds your site every time you modify any file.
+- `zs serve` rebuilds your site and serve it on the network.
- `zs var <filename> [var1 var2...]` prints a list of variables defined in the
header of a given markdown file, or the values of certain variables (even if
it's an empty string).
## License
-`zs` is licensed under the terms of the [MIT License](/LICENSE) and was orignally forked from [zserge/zs](https://github.com/zserge/zs) also licensed under the terms of the [MIT License](/LICENSE.old).
+`zs` is licensed under the terms of the [MIT License](/LICENSE) and was orignally forked from [zserge/zs](https://github.com/zserge/zs) also licensed under the terms of the [MIT License](/LICENSE.old).
\ No newline at end of file