# Jet Template Engine Syntax Reference ## Delimiters Template delimiters are `{{` and `}}`. Delimiters can use `.` to output the execution context: ```jet hello {{ . }} ``` ### Whitespace Trimming Whitespace around delimiters can be trimmed using `{{-` and `-}}`: ```jet foo {{- "bar" -}} baz ``` Whitespace includes spaces, tabs, carriage returns, and newlines. ### Comments Comments use `{* ... *}`: ```jet {* this is a comment *} {* Multiline {{ expressions }} are ignored *} ``` --- ## Variables ### Initialization ```jet {{ foo := "bar" }} ``` ### Assignment ```jet {{ foo = "asd" }} {{ foo = 4711 }} ``` Skip assignment but still evaluate: ```jet {{ _ := stillRuns() }} {{ _ = stillRuns() }} ``` --- ## Expressions ### Identifiers Identifiers resolve to values: ```jet {{ len("hello") }} {{ isset(foo, bar) }} ``` ### Indexing #### String ```jet {{ s := "helloworld" }} {{ s[1] }} ``` #### Slice / Array ```jet {{ s := slice("foo", "bar", "asd") }} {{ s[0] }} {{ s[2] }} ``` #### Map ```jet {{ m := map("foo", 123, "bar", 456) }} {{ m["foo"] }} ``` #### Struct ```jet {{ user["Name"] }} ``` ### Field Access #### Map ```jet {{ m.foo }} {{ range s }} {{ .foo }} {{ end }} ``` #### Struct ```jet {{ user.Name }} {{ range users }} {{ .Name }} {{ end }} ``` ### Slicing ```jet {{ s := slice(6, 7, 8, 9, 10, 11) }} {{ sevenEightNine := s[1:4] }} ``` ### Arithmetic ```jet {{ 1 + 2 * 3 - 4 }} {{ (1 + 2) * 3 - 4.1 }} ``` ### String Concatenation ```jet {{ "HELLO" + " " + "WORLD!" }} ``` #### Logical Operators - `&&` - `||` - `!` - `==`, `!=` - `<`, `>`, `<=`, `>=` ```jet {{ item == true || !item2 && item3 != "test" }} {{ item >= 12.5 || item < 6 }} ``` ### Ternary Operator ```jet {{ .HasTitle ? .Title : "Title not set" }} ``` ### Method Calls ```jet {{ user.Rename("Peter") }} {{ range users }} {{ .FullName() }} {{ end }} ``` ### Function Calls ```jet {{ len(s) }} {{ isset(foo, bar) }} ``` #### Prefix Syntax ```jet {{ len: s }} {{ isset: foo, bar }} ``` #### Pipelining ```jet {{ "123" | len }} {{ "FOO" | lower | len }} {{ "hello" | repeat: 2 | len }} ``` **Escapers must be last in a pipeline:** ```jet {{ "hello" | upper | raw }} {{ raw: "hello" }} {{ raw: "hello" | upper }} ``` #### Piped Argument Slot ```jet {{ 2 | repeat("foo", _) }} {{ 2 | repeat("foo", _) | repeat(_, 3) }} ``` --- ## Control Structures ### if ```jet {{ if foo == "asd" }} foo is 'asd'! {{ end }} ``` #### if / else ```jet {{ if foo == "asd" }} ... {{ else }} ... {{ end }} ``` #### if / else if ```jet {{ if foo == "asd" }} {{ else if foo == 4711 }} {{ end }} ``` #### if / else if / else ```jet {{ if foo == "asd" }} {{ else if foo == 4711 }} {{ else }} {{ end }} ``` ### range #### Slices / Arrays ```jet {{ range s }} {{ . }} {{ end }} {{ range i := s }} {{ i }}: {{ . }} {{ end }} {{ range i, v := s }} {{ i }}: {{ v }} {{ end }} ``` #### Maps ```jet {{ range k := m }} {{ k }}: {{ . }} {{ end }} {{ range k, v := m }} {{ k }}: {{ v }} {{ end }} ``` #### Channels ```jet {{ range v := c }} {{ v }} {{ end }} ``` #### Custom Ranger Any Go type implementing `Ranger` can be ranged over. #### else ```jet {{ range searchResults }} {{ . }} {{ else }} No results found :( {{ end }} ``` ### try ```jet {{ try }} {{ foo }} {{ end }} ``` ### try / catch ```jet {{ try }} {{ foo }} {{ catch }} Fallback content {{ end }} {{ try }} {{ foo }} {{ catch err }} {{ log(err.Error()) }} Error: {{ err.Error() }} {{ end }} ``` --- ## Templates ### include ```jet {{ include "./user.jet" }}
{{ .["name"] }}: {{ .["email"] }}
``` ### return ```jet {{ return "foo" }} {{ foo := exec("./foo.jet") }} Hello, {{ foo }}! ``` --- ## Blocks ### block ```jet {{ block copyright() }}
© ACME, Inc. 2020
{{ end }} {{ block inputField(type="text", label, id, value="", required=false) }} {{ end }} ``` ### yield ```jet {{ yield copyright() }} {{ yield inputField(id="firstname", label="First name", required=true) }} {{ block buff() }} {{ . }} {{ end }} {{ yield buff() "Batman" }} ``` ### content ```jet {{ block link(target) }} {{ yield content }} {{ end }} {{ yield link(target="https://example.com") content }} Example Inc. {{ end }} ``` ```jet {{ block header() }}
{{ yield content }}
{{ content }}

Hey {{ name }}!

{{ end }} ``` ### Recursion ```jet {{ block menu() }} {{ end }} ``` ### extends ```jet {{ extends "./layout.jet" }} {{ block body() }}
This content can be yielded anywhere.
{{ end }} {{ yield body() }} ``` ### import ```jet {{ block body() }}
This content can be yielded anywhere.
{{ end }} {{ import "./my_blocks.jet" }} {{ yield body() }} ```