aboutsummaryrefslogtreecommitdiffstats
path: root/internal/web/handlers_blog.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/web/handlers_blog.go')
-rw-r--r--internal/web/handlers_blog.go51
1 files changed, 28 insertions, 23 deletions
diff --git a/internal/web/handlers_blog.go b/internal/web/handlers_blog.go
index 9b2fe5e..42ec45b 100644
--- a/internal/web/handlers_blog.go
+++ b/internal/web/handlers_blog.go
@@ -12,42 +12,47 @@ import (
const postsPerPage = 10
-// blogView gathers what every public page needs: theme css, nav, announcements, the blog.
+// blogView gathers what every public page needs: theme css, the layout with
+// its modules and their data, the menu, announcements, the blog.
func (s *Server) blogView(r *http.Request) (map[string]any, error) {
blog := currentBlog(r)
- pages, err := s.st.ListPages(r.Context(), blog.ID)
+ ctx := r.Context()
+ pages, err := s.st.ListPages(ctx, blog.ID)
if err != nil {
return nil, err
}
- sections, err := s.st.EnabledSections(r.Context(), blog.ID)
+ menu, err := s.st.ListMenu(ctx, blog.ID)
+ if err != nil {
+ return nil, err
+ }
+ mods, err := s.st.ListModules(ctx, blog.ID)
+ if err != nil {
+ return nil, err
+ }
+ sections, err := s.st.EnabledSections(ctx, blog.ID)
if err != nil {
return nil, err
}
theme := ParseTheme(blog.ThemeJSON)
- var nav []store.Page
- for _, p := range pages {
- if p.ShowInNav && (theme.NavShowHome || !p.IsHome) {
- nav = append(nav, p)
+ layout := buildLayout(theme, mods)
+ v := map[string]any{"theme": theme, "css": theme.CSS(), "layout": layout, "menu": menu, "pages": pages}
+ // Module data is only fetched when a visible module shows it.
+ if layout.NeedsArchive() {
+ index, err := s.st.PublishedPostIndex(ctx, blog.ID)
+ if err != nil {
+ return nil, err
}
+ v["archive"] = groupArchive(index)
}
- above, below, sidebar := splitSections(sections, theme.NavPosition == "left-sidebar")
- return map[string]any{"theme": theme, "css": theme.CSS(), "nav": nav, "above": above, "below": below, "sidebar": sidebar}, nil
-}
-
-// splitSections groups announcements by placement. The sidebar only exists in
-// the left-sidebar layout; elsewhere sidebar announcements go above the content.
-func splitSections(secs []store.Section, hasSidebar bool) (above, below, sidebar []store.Section) {
- for _, sec := range secs {
- switch {
- case sec.Placement == "below":
- below = append(below, sec)
- case sec.Placement == "sidebar" && hasSidebar:
- sidebar = append(sidebar, sec)
- default:
- above = append(above, sec)
+ if n := layout.MaxRecent(); n > 0 {
+ recent, err := s.st.RecentPublishedPosts(ctx, blog.ID, n)
+ if err != nil {
+ return nil, err
}
+ v["recent"] = recent
}
- return
+ v["notices"] = placeNotices(sections, layout)
+ return v, nil
}
func (s *Server) handleBlogHome(w http.ResponseWriter, r *http.Request) {