package operation
import (
"bytes"
"fmt"
"html/template"
"io"
"github.com/aziis98/cabret"
)
func init() {
registerType("template", &Template{})
}
type Template struct {
Engine string
}
// Configure will configure this operation
//
// use: template
// engine: # required, can be "html" or "text"
func (op *Template) Configure(options map[string]any) error {
var err error
op.Engine, err = getKey[string](options, "engine")
if err != nil {
return err
}
return nil
}
func (op *Template) ProcessList(items []cabret.Content) ([]cabret.Content, error) {
var t bytes.Buffer
// concatenate all templates
for _, item := range items {
t.Write(item.Data)
}
tmpl := t.String()
var data bytes.Buffer
switch op.Engine {
case "html":
if err := op.RenderHtml(tmpl, items, &data); err != nil {
return nil, err
}
case "text":
if err := op.RenderText(tmpl, items, &data); err != nil {
return nil, err
}
default:
return nil, fmt.Errorf(`unknown format "%s"`, op.Engine)
}
return []cabret.Content{
{
Type: items[0].Type,
Metadata: cabret.Map{},
Data: data.Bytes(),
},
}, nil
}
func (op *Template) RenderHtml(tmpl string, items []cabret.Content, w io.Writer) error {
t, err := template.New("template").Parse(tmpl)
if err != nil {
return err
}
if err := t.ExecuteTemplate(w, "template", map[string]any{"Items": items}); err != nil {
return err
}
return nil
}
func (op *Template) RenderText(tmpl string, items []cabret.Content, w io.Writer) error {
t, err := template.New("template").Parse(tmpl)
if err != nil {
return err
}
if err := t.ExecuteTemplate(w, "template", map[string]any{"Items": items}); err != nil {
return err
}
return nil
}