blagger 0.3.0

the stupid static site generator fer yer blag
# `blagger`

fer yer blag

`blagger` is a simple static site generator, not as powerful as Jekyll but more robust than a hand-rolled pipeline of scripts.


## Usage
```
USAGE:
    blagger [FLAGS] [OPTIONS] --out-dir <out-dir>

FLAGS:
    -h, --help       Prints help information
    -a               Include hidden files
    -V, --version    Prints version information

OPTIONS:
    -b, --base-url <base-url>                 Base URL of the site once deployed
    -f, --feed <feed>                         RSS feed file location. When specified, an RSS feed of posts (markdown
                                              files) is written to the given file
        --hub-template <hub-template>         Template for the special "all tags" tag page. If not given, defaults to
                                              tag_html
    -I, --ignored-files <ignored-files>...    List of files to ignore [default: ]
    -i, --in-dir <in-dir>                     Input directory [default: .]
    -l, --language <language>                 Language tag. Note that not much validation is performed beyond attempting
                                              to convert a Linux-style locale into an HTML language code [env: LANG=]
    -o, --out-dir <out-dir>                   Output directory
        --pages-dir <pages-dir>               Directory relative to `${out-dir}` that tag pages will be rendered to
                                              [default: tags]
        --tag-html <template>                 Template for tag pages. If not given, tag pages are not generated
    -t, --template-html <template-html>       Path to template file for Markdown posts
    -T, --title <title>                       Title for the RSS feed
```

### Templating
Everything in `in-dir` **except** Markdown files (files with an extension of `md` or `markdown`) and files with a path Rust considers equal to `template-html` is copied as-is into `out-dir`. This is your CSS, JavaScript, images, hand-written HTML (you psycho), whatever. The directory structure is preserved - `in/css/what/why.css` becomes `out/css/what/why.css`.

Markdown files are processed as follows:
1. The post is pre-processed and rendered.
   1. The file is spit at the first occurrence of `::===::\n` (that is, `::===::` and a newline.)
      * The first string split off is the "front matter". This is TOML with the following schema:
        * `title`: Required. A string.
        * `tags`: Required. A (possibly empty) list of strings.
        * `subtitle`: Optional string.
        * `date`: Optional TOML date-time.
      * The second string split off is the Markdown content of the post.
   2. The template file given by `template-html` is rendered. The front matter is provided to the template as an object called `front`, and the markdown content of the post as `md_content`.
      * In the template, a formatter named `markdown` is available for rendering Markdown strings.
2. The rendered file is written to `out-dir` using the same directory-preserving scheme as other files, with the extension changed to `html` so browsers know what the heck is going on.

The template file is never emitted to `out-dir`.

## To-do list
- [x] [Tag navigation pages](https://github.com/c-x-berger/blagger/blob/master/TAG_TEMPLATES.md)
- [X] RSS feed generation
- [ ] Multiple templates available
- [ ] Sitemap?