diff --git a/web/fup/fuphttp/fuphttp.go b/web/fup/fuphttp/fuphttp.go index 4fb516325f..ab1a5dacf3 100644 --- a/web/fup/fuphttp/fuphttp.go +++ b/web/fup/fuphttp/fuphttp.go @@ -10,15 +10,18 @@ import ( "io/fs" "net/http" + "github.com/google/safehtml" "github.com/google/safehtml/template" "github.com/google/safehtml/template/uncheckedconversions" + shuncheckedconversions "github.com/google/safehtml/uncheckedconversions" "github.com/gorilla/mux" + "hg.lukegb.com/lukegb/depot/web/fup/hashfs" ) type Config struct { Templates fs.FS Static fs.FS - StaticRoot string + StaticRoot safehtml.TrustedResourceURL } type Application struct { @@ -48,8 +51,8 @@ func parseTemplate(t *template.Template, fsys fs.FS, name string) (*template.Tem ) } -func loadTemplate(fsys fs.FS, name string) (*template.Template, error) { - t := template.New(name) +func loadTemplate(fsys fs.FS, name string, funcs template.FuncMap) (*template.Template, error) { + t := template.New(name).Funcs(funcs) var err error if t, err = parseTemplate(t, fsys, "base.html"); err != nil { return nil, fmt.Errorf("loading base template: %w", err) @@ -71,8 +74,23 @@ func New(ctx context.Context, cfg *Config) (*Application, error) { {&a.notFoundTmpl, "404"}, } + funcMap := template.FuncMap{ + "static": func(s string) safehtml.TrustedResourceURL { + staticPath := s + if fs, ok := cfg.Static.(*hashfs.FS); ok { + sp, ok := fs.LookupHashedName(staticPath) + if ok { + staticPath = sp + } else { + log.Printf("warning: couldn't find static file %v", staticPath) + } + } + return shuncheckedconversions.TrustedResourceURLFromStringKnownToSatisfyTypeContract(cfg.StaticRoot.String() + staticPath) + }, + } + for _, tmpl := range tmpls { - t, err := loadTemplate(cfg.Templates, tmpl.name) + t, err := loadTemplate(cfg.Templates, tmpl.name, funcMap) if err != nil { return nil, fmt.Errorf("loading template %q: %w", tmpl.name, err) } diff --git a/web/fup/fupstatic/tmpl/base.html b/web/fup/fupstatic/tmpl/base.html index 39ab6e4c18..d42e97d9f0 100644 --- a/web/fup/fupstatic/tmpl/base.html +++ b/web/fup/fupstatic/tmpl/base.html @@ -6,5 +6,12 @@ SPDX-License-Identifier: Apache-2.0 + + + + + + {{block "main" .}}{{end}} +