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, } }