Pular para o conteúdo

HCL

HCL2 onde quer que uma apresentação aceite YAML: um front matter em HCL, slides.hcl, arquivos de kinds e de dados, com expressões e funções.

O HCL está na v0.3.0 (go-slides/slides#13).

Em todo lugar onde o slides lê YAML, ele também lê a sintaxe nativa do HCL2 — por causa das suas expressões e das suas funções.

OndeYAMLHCL
front matter--- … ------hcl … ---
configuraçãoslides.yamlslides.hcl, procurado primeiro
arquivos de kinds (o tipo de um slide)--kinds kinds.yaml, kinds: kinds.yamlqualquer arquivo chamado *.hcl
arquivos de dados--data data.yaml ou .jsonqualquer arquivo chamado *.hcl

Os comentários de diretiva (<!-- class: invert -->) continuam em YAML, como no Marp, e o corpo da apresentação continua sendo um template Go.

Um front matter em 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 }}
  • Os atributos são as chaves do YAML com os mesmos nomes: as diretivas do Marp (theme, paginate, header, footer, class, backgroundColor…), os metadados (title, author…), template, delims, kinds (caminhos de arquivo) e data, um objeto.
  • Os blocos kind "<name>" { … } definem kinds, com as diretivas locais e extends.
  • Os valores chegam às diretivas nas formas de string que o YAML lhes dá — true vira "true", uma lista de classes continua uma lista — de modo que uma diretiva se comporta do mesmo jeito, qualquer que seja a sintaxe que a definiu. null deixa a diretiva sem definição.
  • data mantém os seus tipos: nos templates, um número inteiro é um int, os demais números são float64, e listas e objetos continuam listas e mapas, então {{ add .quarter 1 }} funciona.
  • Um valor HCL é final: os templates Go não passam por ele uma segunda vez.

Variáveis

data são os dados do template: o data do próprio front matter, sobreposto pelo de slides.hcl, pelos arquivos de --data e por --set. "${data.company}" funciona em qualquer lugar onde {{ .company }} funcionaria.

Os atributos do front matter podem referenciar data.*, mas não uns aos outros: footer = title é um erro. As diretivas pontuais (_class…) não são identificadores HCL; escreva-as em um comentário.

Funções

page(), total()o número da página e o número da última página, como {{ page }} e {{ total }}: um rodapé pagina
now(), timestamp()a hora, em RFC 3339, local e UTC; formatdate a formata
env(name)uma variável de ambiente, "" quando não definida
file(path)um arquivo de texto UTF-8 de no máximo 1 MiB, relativo à apresentação ou ao arquivo de configuração
númerosabs ceil floor log max min parseint pow signum
stringschomp format formatlist join lower regex regexall regexreplace replace split strlen strrev substr title trim trimprefix trimspace trimsuffix upper
coleçõeschunklist coalesce coalescelist compact concat contains distinct element flatten keys length lookup merge range reverse slice sort values zipmap
codificaçõescsvdecode jsondecode jsonencode
datasformatdate timeadd

Todas as linhas, exceto as quatro primeiras, vêm da biblioteca padrão do go-cty. Nenhuma acessa a rede.

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}"
}

Um atributo desconhecido é um erro, não uma operação nula silenciosa. Um arquivo de kinds contém blocos kind; os outros atributos dele são ignorados, então o slides.hcl pode servir como um. Os atributos de um arquivo de dados são as chaves dos dados:

# data.hcl
company = "ACME"
year    = 2026
motto   = trimspace(file("motto.txt"))

Erros

Os erros são os diagnósticos do HCL, posicionados no próprio arquivo da apresentação: footer = data.compnay na quarta linha da apresentação produz

deck.md:4:14: Unsupported attribute: This object does not have an attribute named "compnay".

Marp e slides expand

O Marp também lê ---hcl como o início de um front matter — a regra de front matter dele abre em qualquer primeira linha que comece com três hifens — e, como o bloco não é um mapeamento YAML, não aplica nada dele: a apresentação ainda é renderizada no Marp, sem as suas diretivas. Um teste fixa isso em comparação com a saída do próprio Marp Core.

slides expand escreve o front matter de volta como YAML, de modo que a apresentação expandida é Marp simples e é renderizada como o slides renderiza a original:

---
theme: "gaia"
paginate: true
title: "Quarterly review"
header: "ACME — Q3"
footer: "ACME · 1/2"
date: "19 October 2026"
---

Licenças

O suporte a HCL liga com hashicorp/hcl (MPL-2.0, usado sem modificação como biblioteca) e zclconf/go-cty (MIT).

Created on by tannevaled

Modified on by tannevaled