diff --git a/appview/pages/funcmap.go b/appview/pages/funcmap.go index cb89ff4..1a8d4a8 100644 --- a/appview/pages/funcmap.go +++ b/appview/pages/funcmap.go @@ -4,6 +4,8 @@ import ( "fmt" "html" "html/template" + "log" + "path/filepath" "reflect" "strings" @@ -119,5 +121,39 @@ func funcMap() template.FuncMap { "list": func(args ...any) []any { return args }, + "i": func(name string, classes ...string) template.HTML { + data, err := icon(name, classes) + if err != nil { + log.Printf("icon %s does not exist", name) + data, _ = icon("airplay", classes) + } + return template.HTML(data) + }, } } + +func icon(name string, classes []string) (template.HTML, error) { + iconPath := filepath.Join("static", "icons", name) + + if filepath.Ext(name) == "" { + iconPath += ".svg" + } + + data, err := Files.ReadFile(iconPath) + if err != nil { + return "", fmt.Errorf("icon %s not found: %w", name, err) + } + + // Convert SVG data to string + svgStr := string(data) + + svgTagEnd := strings.Index(svgStr, ">") + if svgTagEnd == -1 { + return "", fmt.Errorf("invalid SVG format for icon %s", name) + } + + classTag := ` class="` + strings.Join(classes, " ") + `"` + + modifiedSVG := svgStr[:svgTagEnd] + classTag + svgStr[svgTagEnd:] + return template.HTML(modifiedSVG), nil +} diff --git a/appview/pages/pages.go b/appview/pages/pages.go index b5542e0..8e2a580 100644 --- a/appview/pages/pages.go +++ b/appview/pages/pages.go @@ -25,8 +25,8 @@ import ( "github.com/sotangled/tangled/types" ) -//go:embed templates/* static/* -var files embed.FS +//go:embed templates/* static +var Files embed.FS type Pages struct { t map[string]*template.Template @@ -36,7 +36,7 @@ func NewPages() *Pages { templates := make(map[string]*template.Template) // Walk through embedded templates directory and parse all .html files - err := fs.WalkDir(files, "templates", func(path string, d fs.DirEntry, err error) error { + err := fs.WalkDir(Files, "templates", func(path string, d fs.DirEntry, err error) error { if err != nil { return err } @@ -49,7 +49,7 @@ func NewPages() *Pages { if strings.HasPrefix(path, "templates/fragments/") { tmpl, err := template.New(name). Funcs(funcMap()). - ParseFS(files, path) + ParseFS(Files, path) if err != nil { return fmt.Errorf("setting up fragment: %w", err) } @@ -64,7 +64,7 @@ func NewPages() *Pages { // Add the page template on top of the base tmpl, err := template.New(name). Funcs(funcMap()). - ParseFS(files, "templates/layouts/*.html", "templates/fragments/*.html", path) + ParseFS(Files, "templates/layouts/*.html", "templates/fragments/*.html", path) if err != nil { return fmt.Errorf("setting up template: %w", err) } @@ -577,7 +577,7 @@ func (p *Pages) RepoPullPatchPage(w io.Writer, params RepoPullPatchParams) error } func (p *Pages) Static() http.Handler { - sub, err := fs.Sub(files, "static") + sub, err := fs.Sub(Files, "static") if err != nil { log.Fatalf("no static dir found? that's crazy: %v", err) } diff --git a/appview/pages/static/.gitkeep b/appview/pages/static/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/appview/pages/templates/fragments/diff.html b/appview/pages/templates/fragments/diff.html index 51b5cc1..47257a4 100644 --- a/appview/pages/templates/fragments/diff.html +++ b/appview/pages/templates/fragments/diff.html @@ -40,7 +40,7 @@ {{ .Name.Old }} - + {{ i "arrow-right" "w-4 h-4" }} {{ .Name.New }} @@ -53,15 +53,15 @@ {{ $iconstyle := "p-1 mx-1 hover:bg-gray-100 rounded" }}