diff --git a/appview/pages/pages.go b/appview/pages/pages.go index 5d8aafa7..8f83b14f 100644 --- a/appview/pages/pages.go +++ b/appview/pages/pages.go @@ -136,50 +136,6 @@ func (p *Pages) EmbedFS() fs.FS { return p.embedFS } -// ParseWith parses the base layout together with all appview fragments and -// an additional template from extraFS identified by extraPath (relative to -// extraFS root). The returned template is ready to ExecuteTemplate with -// "layouts/base" -- primarily for use with the blog. -func (p *Pages) ParseWith(extraFS fs.FS, extraPath string) (*template.Template, error) { - fragmentPaths, err := p.fragmentPaths() - if err != nil { - return nil, err - } - - funcs := p.funcMap() - tpl, err := template.New("layouts/base"). - Funcs(funcs). - ParseFS(p.embedFS, append(fragmentPaths, p.nameToPath("layouts/base"))...) - if err != nil { - return nil, err - } - - err = fs.WalkDir(extraFS, ".", func(path string, d fs.DirEntry, err error) error { - if err != nil { - return err - } - if d.IsDir() || !strings.HasSuffix(path, ".html") { - return nil - } - if path != extraPath && !strings.Contains(path, "fragments/") { - return nil - } - data, err := fs.ReadFile(extraFS, path) - if err != nil { - return err - } - if _, err = tpl.New(path).Parse(string(data)); err != nil { - return err - } - return nil - }) - if err != nil { - return nil, err - } - - return tpl, nil -} - func (p *Pages) fragmentPaths() ([]string, error) { var fragmentPaths []string err := fs.WalkDir(p.embedFS, "templates", func(path string, d fs.DirEntry, err error) error { diff --git a/blog/blog.go b/blog/blog.go index 424a7149..aff04367 100644 --- a/blog/blog.go +++ b/blog/blog.go @@ -148,9 +148,53 @@ func AtomFeed(posts []Post, baseURL string) (string, error) { return feed.ToAtom() } +// parseLayout builds a template set from the appview's fragments together with +// the blog's own layouts, fragments, and the given page template (relative to +// templatesDir). The result is ready to ExecuteTemplate with "layouts/blogbase". +func parseLayout(p *pages.Pages, templatesDir, page string) (*template.Template, error) { + fragmentPaths, err := p.FragmentPaths() + if err != nil { + return nil, err + } + + tpl, err := template.New("layouts/blogbase"). + Funcs(p.FuncMap()). + ParseFS(p.EmbedFS(), fragmentPaths...) + if err != nil { + return nil, err + } + + extraFS := os.DirFS(templatesDir) + err = fs.WalkDir(extraFS, ".", func(path string, d fs.DirEntry, err error) error { + if err != nil { + return err + } + if d.IsDir() || !strings.HasSuffix(path, ".html") { + return nil + } + // only the requested page, plus shared layouts and fragments + if path != page && !strings.Contains(path, "fragments/") && !strings.Contains(path, "layouts/") { + return nil + } + data, err := fs.ReadFile(extraFS, path) + if err != nil { + return err + } + if _, err = tpl.New(path).Parse(string(data)); err != nil { + return err + } + return nil + }) + if err != nil { + return nil, err + } + + return tpl, nil +} + // RenderIndex renders the blog index page to w. func RenderIndex(p *pages.Pages, templatesDir string, posts []Post, w io.Writer) error { - tpl, err := p.ParseWith(os.DirFS(templatesDir), "index.html") + tpl, err := parseLayout(p, templatesDir, "index.html") if err != nil { return err } @@ -163,14 +207,14 @@ func RenderIndex(p *pages.Pages, templatesDir string, posts []Post, w io.Writer) } } } - return tpl.ExecuteTemplate(w, "layouts/base", indexParams{Posts: posts, Featured: featured}) + return tpl.ExecuteTemplate(w, "layouts/blogbase", indexParams{Posts: posts, Featured: featured}) } // RenderPost renders a single blog post page to w. func RenderPost(p *pages.Pages, templatesDir string, post Post, w io.Writer) error { - tpl, err := p.ParseWith(os.DirFS(templatesDir), "post.html") + tpl, err := parseLayout(p, templatesDir, "post.html") if err != nil { return err } - return tpl.ExecuteTemplate(w, "layouts/base", postParams{Post: post}) + return tpl.ExecuteTemplate(w, "layouts/blogbase", postParams{Post: post}) } diff --git a/blog/templates/layouts/blogbase.html b/blog/templates/layouts/blogbase.html new file mode 100644 index 00000000..66629799 --- /dev/null +++ b/blog/templates/layouts/blogbase.html @@ -0,0 +1,77 @@ +{{ define "layouts/blogbase" }} + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +