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 }