apps/posts/render.go 1.2 K raw
1
package main
2
3
import (
4
	"fmt"
5
	"html/template"
6
	"io/fs"
7
	"net/http"
8
	"path"
9
	"strings"
10
11
	"github.com/stevedylandev/andromeda/pkg/web"
12
)
13
14
func buildTemplates() (map[string]*template.Template, error) {
15
	pages, err := fs.Glob(appFS, "templates/*.html")
16
	if err != nil {
17
		return nil, err
18
	}
19
20
	out := make(map[string]*template.Template, len(pages))
21
	for _, page := range pages {
22
		name := path.Base(page)
23
		if name == "base.html" || name == "admin_base.html" {
24
			continue
25
		}
26
27
		patterns := []string{page}
28
		switch {
29
		case strings.HasPrefix(name, "admin_"):
30
			patterns = append([]string{"templates/admin_base.html"}, patterns...)
31
		case name == "login.html":
32
			// standalone template
33
		default:
34
			patterns = append([]string{"templates/base.html"}, patterns...)
35
		}
36
37
		tmpl, err := template.ParseFS(appFS, patterns...)
38
		if err != nil {
39
			return nil, fmt.Errorf("parse %s: %w", page, err)
40
		}
41
		out[name] = tmpl
42
	}
43
	return out, nil
44
}
45
46
func (a *App) renderPage(w http.ResponseWriter, name string, data any) {
47
	tmpl, ok := a.Templates[name]
48
	if !ok {
49
		a.Log.Error("template missing", "name", name)
50
		http.Error(w, "template missing", http.StatusInternalServerError)
51
		return
52
	}
53
	web.Render(tmpl, w, name, data, a.Log)
54
}