
It is practically impossible to teach good programming to students that have had a prior exposure to Hatter: as potential programmers they are mentally mutilated beyond hope of regeneration.
-– Edsger W. Dijkstra (allegedly)
Hatter is a small, whitespace sensitive templating language with HTML support built right in. Its HTML features and syntax are a cheap knock off of [Imba], except Hatter produces raw, static HTML - no JavaScript in sight.
Hatter can be used to generate static web sites or to render server side content in a good ol' fashioned web application - either with [Vial] or your Rust web framework of choice.
If you're feeling adventerous, or mad as a hatter, you can use the standalone binary to turn templates into HTML files, or include the zero-dependency Rust library in your (web/cli/?) application.
Here are a few basic examples of what Hatter looks like and the HTML it generates:
```html <#main> Hi there!
```
```html
```
<h1> Welcome, <i> Rob becomes <h1> Welcome, <i> Rob </i></h1>id, class, type, and name attributes:
<div#id><div.class1.class2><input@form-field-name><input:text><div page-num={page.id}><div .logged-in=logged-in?><div data-map=is-map?><span.greeting> "Hey there {name}. 2 + 2 is {2 + 2}"<span #page-{page.id} .is-{page.type}> page.title<#main> becomes <div id='main'><i>delicious</> becomes <i>delicious</i><li> <a onclick=(alert("Oink!"))> "🐷"bool, int, float, string, list, map, fnlist and map:
<ul> for page in pages do <li id=page-{page.id}> page.namefor k, v in some-map do <td> k </> <td> vif logged_in? then <h2> Welcome back!:= and =:
name := 'Bob' will error if name is already set.name = 'Bob' will error if name isn't already set.<div.name> to-uppercase(name)def greet(name) do print("Hey there, {name}!")greet("Lydia") prints Hey there, Lydia!def ++(a, b) do concat(to-uppercase(a), ' ', to-uppercase(b))"one" ++ "two" returns ONE TWOadder := fn(x) fn(y) x + y then add1 := adder(1)add1(200) returns 201def greet(title, name) do print("Hiya, {title}. {name}!")greet(name: "Marley", title: "Dr") prints Hiya, Dr. Marley!do keyword for one-line blocks:
if 2 > 1 do print("Obviously")for x in list do print(x)then keyword for one-line if statements:
if 2 > 1 then print("Yup!") else if 2 < 1 then print("Impossible.")<!DOCTYPE> and wrap everything in <html> if
the first tag in your template is <head>.There are two ways to use Hatter:
Hatter can (primarily) be used as a templating language from within your Rust applications.
Simply add Hatter to Cargo.toml:
toml
[dependencies]
hatter = "0.1"
Then create a hatter::Env, which represents the top-level Hatter
scope for your template, to set variables and render your template:
```rust use hatter::{Args, Env, Value};
let mut env = Env::new(); env.set("name", "Bobby Boucher"); env.set("age", 31); env.render(r#"
Name:> name
Age:> age "#) ```
You can also write functions in Rust and make them available to your HTML templates:
```rust use hatter::prelude::*;
fn quote(args: Args) -> Result
Value::from(listofquotes[line]).ok() }
fn main() { let mut env = Env::new(); env.set("quote", quote); println!("{}", env.render("
For more infomation see the API Documentation.
Hatter can be used as a regular command line program to turn .hat
files into HTML.
Just install it using cargo:
bash
cargo install hatter
Then point it at any .hat file:
```bash
$ cat test.hat
$ hatter test.hat Testing 1 2 3 4 ```
You can also install Hatter with a readline-powered REPL:
bash
cargo install hatter --features repl
To launch it, start hatter with no arguments:
```bash $ hatter Hatter v0.0.1 REPL
1 + 2 3 ```
def <item(item)> do <li.item data-id={item.id}> item.text.Hatter is licensed under either of the following, at your pleasure:
[Imba] is licensed under the MIT License.