From e21db7a061b8eaa00d9938dd11373d75f4e2a95d Mon Sep 17 00:00:00 2001 From: Luke Granger-Brown Date: Sun, 21 Mar 2021 03:03:15 +0000 Subject: [PATCH] fup: add a template function for getting paths to static assets We add the hash of the file to the static assets, so they can be cached indefinitely. This also, however, means that we need some way of referring to them. --- web/fup/fuphttp/fuphttp.go | 26 ++++++++++++++++++++++---- web/fup/fupstatic/tmpl/base.html | 7 +++++++ 2 files changed, 29 insertions(+), 4 deletions(-) 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}} +