# A Rust Site Engine A Rust Site Engine, or `arse`, is static site generator written in Rust. It seeks to provide a simple and flexible base for serving sites using: * [Tera](https://tera.netlify.app/) for templates * [pulldown-cmark](https://crates.io/crates/pulldown-cmark) for CommonMark rendering * [axum](https://crates.io/crates/axum) to serve the site * [simplecss](https://simplecss.org) for default styling * [rss](https://crates.io/crates/rss) for generating a full-site RSS feed ## Usage * Run an existing site given the path to its config TOML: `arse run config.toml` * Logging verbosity can be increased with `-v` or `-vv`, the default level is `INFO`. * Create and run a new site from user input: `arse new` ``` $ arse new 2021-05-01T17:34:11.155427589+00:00 [INFO] Logging started 2021-05-01T17:34:11.155543182+00:00 [INFO] Generating new site configuration Please enter a name for the site: Example Site Please enter the site author's name: Arthur Writeson Please enter the base URL for your site: https://www.example.com Please enter comma-separated site topics: one, two, three 2021-05-01T17:34:26.501980660+00:00 [INFO] Creating site filesystem tree 2021-05-01T17:34:26.504816188+00:00 [INFO] Writing site configuration to disk ``` ### Configuration An example config, as generated, is shown below: ```toml [site] name = 'Example Site' author = 'Arthur Writeson' url = 'https://www.example.com' template = 'default.tmpl' topics = [ 'one', 'two', 'three', ] [server] bind = '0.0.0.0' port = 9090 [docpaths] templates = '/home/user/site/templates' webroot = '/home/user/site/webroot' [mime_types] css = "text/css" gif = "image/gif" jpg = "image/jpeg" ``` #### Rendering and Styling A default template, `default.tmpl`, is provided statically within the binary. To change the Tera template, add your custom template to the templates directory referenced in the `[docpaths]` configuration section of `config.toml`. Once the template is in the templates directory, change the `templates` parameter in the `[site]` configuration section to reference the template's file name. This template will now be loaded at runtime. The following elements are available within the Tera context for rendering: * `site`, mapping directly to the fields available in the `site` configuration section * `post`, available when serving single-posts from from `site/:topic/posts/:post.md` * Used when serving `GET /:topic/posts/:post` where `:post` is the markdown filename minus its extension * `posts`, a lexically reverse-sorted list of HTML rendered from markdown in `site/:topic/posts/*.md` * Used when serving `GET /:topic` #### Further Customizations * `bind` and `port` may be set in the `[server]` section. * New topics are added as array elements * For each new topic, create the necessary paths `site/:topic/posts` and `site/:topic/ext` * Items in `[docpaths]` are generated as full paths for completeness, however relative paths will work if desired * From the example above the user is free to simply use `site/templates` and `site/webroot` and move the directory out of `/home/user` * Note that `arse new` creates the site tree, and all other output files, in the current working directory. * If `gallery` is one of the topics requested * A simple image slideshow will be generated for `/gallery/ext/*.jpg` * Display will follow the same lexical reverse order as posts. #### MIME types Version `0.16.0` added a `mime_types` section to the `config.toml` file. This is created with a minimal set of mappings from a file extension to the desired MIME type. These mappings are used when serving files from: - `static/` - `:topic/ext/` If there is no match for the extension, or the file lacks an extension entirely, the default is `text/plain`. As such, if you wish for maximimum compatibility with different reverse proxies, browsers, or other applications it is crticial that you set an appropriate MIME type for each possible extension you intend to serve directly. ## Path to 1.0 - [x] Dynamic route handling - [x] Provide meaningful logging of binary activites at appropriate levels - [x] Context-specific Errors and handling - [x] Support custom Tera templates - [x] Support custom bind address and port - [x] Support favicons - [x] Support a special `gallery` topic - [x] Support RSS feeds - [ ] Support for adding/removing topics ### License Licensed under either of * Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0) * MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT) at your option. ### Contribution Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.