HCL
Überall, wo slides YAML liest, liest es auch die native Syntax von
HCL2 – wegen
ihrer Ausdrücke und Funktionen.
| Wo | YAML | HCL |
|---|---|---|
| Front-Matter | --- … --- | ---hcl … --- |
| Konfiguration | slides.yaml | slides.hcl, wird zuerst gesucht |
| Kinds-Dateien | --kinds kinds.yaml, kinds: kinds.yaml | jede Datei namens *.hcl |
| Datendateien | --data data.yaml oder .json | jede Datei namens *.hcl |
Direktivenkommentare (<!-- class: invert -->) bleiben wie in Marp YAML, und der
Rumpf des Foliensatzes bleibt eine Go-Vorlage.
Ein Front-Matter in HCL
---hcl
theme = "gaia"
paginate = true
title = "Quarterly review"
data = {
company = "ACME"
quarter = 3
}
header = format("%s — Q%d", data.company, data.quarter)
footer = "${upper(data.company)} · ${page()}/${total()}"
date = formatdate("D MMMM YYYY", now())
kind "chapter" {
extends = "section"
class = ["lead", "invert"]
}
---
# {{ .title }}- Attribute sind die YAML-Schlüssel unter denselben Namen: die Direktiven von Marp
(
theme,paginate,header,footer,class,backgroundColor…), die Metadaten (title,author…),template,delims,kinds(Dateipfade) unddata, ein Objekt. kind "<name>" { … }-Blöcke definieren Kinds (Folientypen) mit den lokalen Direktiven undextends.- Werte erreichen die Direktiven in den Zeichenkettenformen, die YAML ihnen gibt –
truewird zu"true", eine Liste von Klassen bleibt eine Liste –, sodass sich eine Direktive gleich verhält, welche Syntax sie auch gesetzt hat.nulllässt eine Direktive ungesetzt. databehält seine Typen: In Vorlagen ist eine ganze Zahl einint, andere Zahlen sindfloat64, und Listen und Objekte bleiben Listen und Maps, sodass{{ add .quarter 1 }}funktioniert.- Ein HCL-Wert ist endgültig: Go-Vorlagen laufen kein zweites Mal darüber.
Variablen
data sind die Vorlagendaten: das data des Front-Matters, überlagert von dem
aus slides.hcl, von --data-Dateien und von --set. "${data.company}" funktioniert
überall dort, wo auch {{ .company }} funktionieren würde.
Attribute des Front-Matters dürfen auf data.* verweisen, aber nicht aufeinander:
footer = title ist ein Fehler. Spot-Direktiven (_class …) sind keine HCL-
Bezeichner; schreiben Sie sie in einen Kommentar.
Funktionen
page(), total() | die Seitennummer und die Nummer der letzten Seite, wie {{ page }} und {{ total }}: eine Fußzeile paginiert |
now(), timestamp() | die Zeit, RFC 3339, lokal und UTC; formatdate formatiert sie |
env(name) | eine Umgebungsvariable, "" wenn nicht gesetzt |
file(path) | eine UTF-8-Textdatei von höchstens 1 MiB, relativ zum Foliensatz oder zur Konfigurationsdatei |
| Zahlen | abs ceil floor log max min parseint pow signum |
| Zeichenketten | chomp format formatlist join lower regex regexall regexreplace replace split strlen strrev substr title trim trimprefix trimspace trimsuffix upper |
| Collections | chunklist coalesce coalescelist compact concat contains distinct element flatten keys length lookup merge range reverse slice sort values zipmap |
| Kodierungen | csvdecode jsondecode jsonencode |
| Datumsangaben | formatdate timeadd |
Alle Zeilen außer den ersten vier stammen aus der Standardbibliothek von go-cty. Keine davon greift auf das Netzwerk zu.
slides.hcl
kinds = "kinds.hcl" # or a list of files
themes = ["themes/acme.css"]
data = { company = "ACME" } # or file paths
html = false
lang = "en"
kind "quote" {
extends = "blank"
footer = "${data.company}"
}Ein unbekanntes Attribut ist ein Fehler, kein stilles Nichts. Eine Kinds-Datei enthält
kind-Blöcke; ihre übrigen Attribute werden ignoriert, sodass slides.hcl als
solche dienen kann. Die Attribute einer Datendatei sind die Schlüssel der Daten:
# data.hcl
company = "ACME"
year = 2026
motto = trimspace(file("motto.txt"))Fehler
Fehler sind die Diagnosen von HCL, an der Position in der Foliensatz-Datei selbst:
footer = data.compnay in der vierten Zeile des Foliensatzes ergibt
deck.md:4:14: Unsupported attribute: This object does not have an attribute named "compnay".Marp und slides expand
Auch Marp liest ---hcl als Beginn eines Front-Matters – seine Front-Matter-
Regel greift bei jeder ersten Zeile, die mit drei Strichen beginnt – und wendet davon nichts an,
da der Block keine YAML-Map ist: Der Foliensatz wird in Marp trotzdem gerendert,
nur ohne seine Direktiven. Ein Test legt dies gegen die eigene Ausgabe von Marp Core fest.
slides expand schreibt das Front-Matter als YAML zurück, sodass der expandierte Foliensatz
reines Marp ist und so gerendert wird, wie slides das Original rendert:
---
theme: "gaia"
paginate: true
title: "Quarterly review"
header: "ACME — Q3"
footer: "ACME · 1/2"
date: "19 October 2026"
---Lizenzen
Die HCL-Unterstützung bindet hashicorp/hcl (MPL-2.0, unverändert als Bibliothek verwendet) und zclconf/go-cty (MIT) ein.
Erstellt am von tannevaled
Geändert am von tannevaled