Files
svg-templater/pkg/svg/actions/template.go
T
2026-05-27 22:02:11 +02:00

74 lines
1.5 KiB
Go

package actions
import (
"errors"
"log"
"maps"
"regexp"
"slices"
"github.com/hymkor/exregexp-go"
"tomatentum.net/svg-templater/internal/database"
"tomatentum.net/svg-templater/pkg/svg"
)
type TemplateParameters struct {
Id string
Keys map[string]string
}
func Template(r *TemplateParameters) ([][]byte, error) {
data, err := database.GetSpecificSVG(r.Id)
if err != nil {
return nil, err
}
mapkeys := slices.Collect(maps.Keys(r.Keys))
ok, err := verifyTemplate(data, mapkeys)
if err != nil {
return nil, err
}
if !ok {
return nil, errors.New("Template does not exist.")
}
log.Printf("Replacing keys of %s template\n", r.Id)
pagesdata := make([][]byte, len(data.Pages))
for _, page := range data.Pages {
pagedata, err := GetPage(page.TemplateId, page.Page)
if err != nil {
return nil, err
}
replaceAll(&pagedata, r.Keys)
pagesdata[page.Page-1] = pagedata
log.Printf("Finished replacing keys of %s page %d\n", r.Id, page.Page)
}
log.Printf("Finished replacing keys of %s template\n", r.Id)
return pagesdata, nil
}
func replaceAll(svgblob *[]byte, keys map[string]string) {
regex := regexp.MustCompile(svg.KeyRegex)
*svgblob = []byte(exregexp.ReplaceAllStringSubmatchFunc(regex, string(*svgblob), func(s []string) string {
log.Printf("Replacing key %s with %s\n", s[1], keys[s[1]])
return keys[s[1]]
}))
}
func verifyTemplate(data svg.TemplateData, keys []string) (bool, error) {
for _, key := range data.AllKeys() {
if !slices.Contains(keys, key) {
return false, nil
}
}
return true, nil
}