handles
handles
is a templating language written in pure Gleam. Heavily inspired by mustache and Handlebars.js.
gleam add handles
import gleam/io
import handles
import handles/ctx
pub fn main() {
let assert Ok(template) = handles.prepare("Hello {{name}}")
let assert Ok(string) =
handles.run(template, ctx.Dict([ctx.Prop("name", ctx.Str("Oliver"))]))
io.debug(string)
}
Usage Documentation
Handles a is very simple templating language that consists of a single primitive, the “tag”.
A tag starts with two open braces {{
, followed by a string body, and ends with two closing braces }}
.
There are two kinds of tags, Property tags and Block tags.
Property tags
A property tag is used to access properties passed into the template engine and insert them into the resulting string in-place of the property tag.
Values accessed by a property tag must be of type String
, Int
, or Float
, or it will result in a runtime error.
Accessing a property which was not passed into the template engine will result in a runtime error.
A property tag can refer to a nested property with .
separating keys in nested dicts.
{{some.property.path}}
A property can also refer to the current context element by passing a single .
.
{{.}}
Block tags
A block tag is used to temporarily alter the behavior of the templating engine.
Each block tag have two variants; A start tag indicated by a leading #
and a stop tag indicated by a leading /
.
A blocks start tag accepts a property accessor, while the end tag does not.
if
if
blocks are used to conditionally include parts of a templated based on the value of a property.
Values accessed by an if block must be of type Bool
or it will result in a runtime error.
Accessing a property which was not passed into the template engine will result in a runtime error.
{{#if some.prop}}
{{name}}
{{/if}}
unless
unless
blocks are used to conditionally exclude parts of a templated based on the value of a property.
Values accessed by an unless
block must be of type Bool
or it will result in a runtime error.
Accessing a property which was not passed into the template engine will result in a runtime error.
{{#unless some.prop}}
{{name}}
{{/unless}}
each
each
blocks are used to include a part of a templated zero or more times.
Values accessed by an each
block must be of type List(Dict)
or it will result in a runtime error.
Accessing a property which was not passed into the template engine will result in a runtime error.
The context of which properties are resolved while inside the each block will be scoped to the current item from the list.
{{#each some.prop}}
{{name}}
{{/each}}
Further documentation can be found at https://hexdocs.pm/handles.
Development
gleam test