# Skabelon
Simple templating engine for rust, using Angular syntax.
You can use the build-in Angular parser from Prettier for formatting.
## Features
- Angular syntax
- Templates are parsed at runtime. Templates can be recalculated with `templates.reload()`.
- `@if() {} @else if() {} @else {}` support.
- `@for() {}` support for iteration.
- `@defer {}` support for partials. Partials can have a `{{ content }}` where block from `@defer` will be rendered.
- `object["value"]` or `object.value` for accessing object values
## Usage
Templates can be loaded with a glob or string.
```rust
let mut templates = Templates::new();
templates.load_glob("templates/**/*.html");
let template_str =
"<table>@for(row in table) {<tr>@for(col in row) {<td>{{col}}</td>}</tr>}</table>";
templates.load_str("template", template_str);
```
Templates are rendered with:
```rust
let ctx = json!({"table": table});
let render = templates.render("big-table.html", &ctx);
// or for load_str
let render = templates.render("template", &ctx);
```
### Context notation
Context can be referenced in templates with `{{ key }}`.
If `key` is an object, values can be referenced with `{{ key["value"] }}` or `{{ key.value }}`.
If `key` is an array, array can be indexed with `{{ key[index] }}`.
### `@if`
#### Renders block if condition is true.
Supports `==`, `!=`, `&&`, `||`, `<`, `>`, `<=`, `>=`,
```html
@if (condition) {
block
}
```
#### If else
```html
@if (condition) {
block
} @else {
otherwhere
}
```
#### if else if
```html
@if (condition) {
block
} @else if (condition) {
block
}
```
#### if else if else
```html
@if (condition) {
block
} @else if (condition) {
block
} @else {
otherwhere
}
```
### `@for`
Iterates over array. `index` is added to the context:
```html
@for (item in items) {
{{index}}: {{item}}
}
```
### `@defer`
#### Includes other template by key.
```html
@defer (key) {}
```
#### Render block in partial content slot
`main`
```html
@defer (partial) {Hello}
```
`partial`
```html
{{ content }} World
```
#### Context can be send to partial.
```html
@defer (key; value="hello") {}
```
or for variables
```html
@defer (key; value=variable) {}
```