diff --git a/internal/theme/repository/fs/fs_theme.go b/internal/theme/repository/fs/fs_theme.go index 6110ce6..02cd6ac 100644 --- a/internal/theme/repository/fs/fs_theme.go +++ b/internal/theme/repository/fs/fs_theme.go @@ -2,9 +2,11 @@ package fs import ( "context" + "errors" "fmt" "html/template" "io/fs" + "reflect" "source.toby3d.me/toby3d/home/internal/theme" ) @@ -13,6 +15,21 @@ type fileSystemThemeRepository struct { dir fs.FS } +var ErrSafeHTML error = errors.New("unsupported input type for SafeHTML") + +var helpers = template.FuncMap{ + "safeHTML": func(v reflect.Value) (template.HTML, error) { + switch v.Kind() { + default: + return "", ErrSafeHTML + case reflect.Slice: + return template.HTML(v.Bytes()), nil + case reflect.String: + return template.HTML(v.String()), nil + } + }, +} + func NewFileSystemThemeRepository(dir fs.FS) theme.Repository { return &fileSystemThemeRepository{ dir: dir, @@ -20,9 +37,9 @@ func NewFileSystemThemeRepository(dir fs.FS) theme.Repository { } func (repo *fileSystemThemeRepository) Get(ctx context.Context) (*template.Template, error) { - tpl, err := template.New("").ParseFS(repo.dir, "baseof.html", "single.html") + tpl, err := template.New("").Funcs(helpers).ParseFS(repo.dir, "baseof.html", "single.html") if err != nil { - return nil, fmt.Errorf("cannot find baseof.html: %w", err) + return nil, fmt.Errorf("cannot find baseof template: %w", err) } return tpl, nil