Skip to content

Template Engine

Template rendering using CloudyKit Jet.

KindDescription
template.setTemplate set with shared configuration
template.jetIndividual template

A set is a namespace containing related templates. Templates within a set share configuration and can reference each other by name.

- name: views
kind: template.set

All configuration is optional with sensible defaults:

FieldTypeDefaultDescription
engine.development_modeboolfalseDisable template caching
engine.delimiters.leftstring{{Variable opening delimiter
engine.delimiters.rightstring}}Variable closing delimiter
engine.delimiters.comment_leftstring{*Comment opening delimiter
engine.delimiters.comment_rightstring*}Comment closing delimiter
engine.extensionsstring[][.jet, .html.jet, .jet.html]Template file extensions
engine.globalsmap-Variables available to all templates

Templates belong to a set and are identified by name for internal resolution.

- name: layout
kind: template.jet
set: app.views:views
source: |
<html>
<body>{{ yield content() }}</body>
</html>
- name: home
kind: template.jet
set: app.views:views
source: |
{{ extends "layout" }}
{{ block content() }}
<h1>Welcome, {{ name }}</h1>
{{ end }}
FieldTypeRequiredDescription
setreferenceYesParent template set
sourcestringYesTemplate content

Templates reference each other using names, not registry IDs. The resolution works like a virtual filesystem within the set:

  1. By default, the registry entry name (entry.ID.Name) becomes the template name
  2. Override with meta.name for custom naming:
- name: email-welcome-v2
kind: template.jet
set: app.emails:templates
meta:
name: welcome
source: |
{{ include "header" }}
Hello {{ user }}!

This template is registered as welcome in the set, so other templates use {{ include "welcome" }} or {{ extends "welcome" }}.

Templates can extend parent templates and override blocks:

# Parent defines yield points
- name: base
kind: template.jet
set: app.views:views
source: |
<html>
<head><title>{{ yield title() }}</title></head>
<body>{{ yield body() }}</body>
</html>
# Child extends and fills blocks
- name: page
kind: template.jet
set: app.views:views
source: |
{{ extends "base" }}
{{ block title() }}My Page{{ end }}
{{ block body() }}<p>Content here</p>{{ end }}

See Template Module for rendering operations.