document-server/services/templater.go

98 lines
2.3 KiB
Go

package services
import (
"bytes"
"encoding/base64"
"errors"
"fmt"
"html/template"
"strings"
)
type Templater interface {
Execute(template *template.Template, data interface{}) (string, error)
StringToTemplate(templateString string) (*template.Template, error)
}
type DefaultTemplater struct {
BarcodeService BarcodeService
StaticService StaticService
}
func idToEan13(id string, prefix string) (string, error) {
if len(id) > 12 {
return "", errors.New("id too long")
}
for len(id) < 11 {
id = "0" + id
}
id = prefix + id
return id, nil
}
func (t *DefaultTemplater) GenerateBarcode(code string, format string, prefix string) (string, error) {
var err error
if format == "ean13" {
code, err = idToEan13(code, prefix)
if err != nil {
return "", err
}
}
buf, err := t.BarcodeService.GenerateBarcode(format, code, 1000, 500)
return base64.StdEncoding.EncodeToString(buf.Bytes()), err
}
func (t *DefaultTemplater) SelectSponsorImage(id int) (string, error) {
sponsors, err := t.StaticService.ListFilesInStaticSubFolder("images/sponsors")
if err != nil {
return "", err
}
return t.StaticService.GetImage("sponsors/" + strings.TrimSuffix(sponsors[id%len(sponsors)], ".base64")), nil
}
func (t *DefaultTemplater) LoadImage(name string) (string, error) {
return t.StaticService.GetImage(name), nil
}
func (t *DefaultTemplater) FormatUnit(unit string, locale string, amount int) (string, error) {
var formatted string
switch unit {
case "kilometer":
formatted = fmt.Sprintf("%.3f", float64(amount)/1000)
case "euro":
formatted = fmt.Sprintf("%.2f", float64(amount)/100)
default:
return "", errors.New("unknown unit")
}
if locale == "de" {
return strings.Replace(formatted, ".", ",", -1), nil
}
return formatted, nil
}
func (t *DefaultTemplater) StringToTemplate(templateString string) (*template.Template, error) {
return template.New("template").Funcs(template.FuncMap{
"barcode": t.GenerateBarcode,
"sponsorLogo": t.SelectSponsorImage,
"formatUnit": t.FormatUnit,
"loadImage": t.LoadImage,
}).Parse(templateString)
}
func (t *DefaultTemplater) Execute(baseTemplate *template.Template, data interface{}) (string, error) {
resultBuffer := new(bytes.Buffer)
err := baseTemplate.Execute(resultBuffer, data)
if err != nil {
return "", err
}
return resultBuffer.String(), nil
}