package web
import (
"errors"
"fmt"
"html/template"
"strings"
"tug/internal/transport/web/text"
)
type Ident string
const identMarker = "{ident}"
var errNoMarker = errors.New("catalog sentence has no identifier marker")
func identHTML(v Ident) template.HTML {
return template.HTML(`` + template.HTMLEscapeString(string(v)) + ``)
}
func interpolate(sentence string, v Ident) (template.HTML, error) {
before, after, ok := strings.Cut(sentence, identMarker)
if !ok || strings.Contains(after, identMarker) {
return "", errNoMarker
}
return template.HTML(template.HTMLEscapeString(before)) + identHTML(v) + template.HTML(template.HTMLEscapeString(after)), nil
}
func lookup(k text.Key) (string, error) {
s, ok := text.Lookup(k)
if !ok {
return "", fmt.Errorf("unknown catalog key %q", k)
}
return s, nil
}
func translate(k text.Key, v Ident) (template.HTML, error) {
s, err := lookup(k)
if err != nil {
return "", err
}
out, err := interpolate(s, v)
if err != nil {
return "", fmt.Errorf("%w: %q", err, k)
}
return out, nil
}
func translateText(k text.Key, v Ident) (string, error) {
s, err := lookup(k)
if err != nil {
return "", err
}
before, after, ok := strings.Cut(s, identMarker)
if !ok || strings.Contains(after, identMarker) {
return "", fmt.Errorf("%w: %q", errNoMarker, k)
}
return before + string(v) + after, nil
}
func funcs() template.FuncMap {
return template.FuncMap{
"t": lookup,
"tr": translate,
"trt": translateText,
"id": identHTML,
}
}