feature: Set nav order via front matter

This commit is contained in:
Keith Solomon
2025-04-21 15:45:45 -05:00
parent 29b398921b
commit 77797231d3
14 changed files with 58 additions and 42 deletions

View File

@@ -3,6 +3,7 @@ title: Go SSG - About
navTitle: About navTitle: About
description: More About My Go SSG Site. description: More About My Go SSG Site.
date: 2025-04-19 date: 2025-04-19
navPosition: 2
--- ---
Experimenting with Go. Seems pretty cool so far! Experimenting with Go. Seems pretty cool so far!

View File

@@ -1,4 +1,5 @@
--- ---
title: Contact title: Contact
navTitle: Contact navTitle: Contact
navPosition: 4
--- ---

View File

@@ -1,6 +1,8 @@
--- ---
title: Go SSG - Home title: Go SSG - Home
navTitle: Home navTitle: Home
showInNav: true
navPosition: 1
description: My Go SSG Site. description: My Go SSG Site.
date: 2025-04-19 date: 2025-04-19
--- ---

56
main.go
View File

@@ -19,14 +19,16 @@ import (
) )
type NavItem struct { type NavItem struct {
Title string Title string
URL string URL string
Position int
} }
type PageMeta struct { type PageMeta struct {
Title string `yaml:"title"` Title string `yaml:"title"`
NavTitle string `yaml:"navTitle"` NavTitle string `yaml:"navTitle"`
ShowInNav *bool `yaml:"showInNav"` ShowInNav *bool `yaml:"showInNav"`
NavPosition *int `yaml:"navPosition"`
Description string `yaml:"description"` Description string `yaml:"description"`
Date string `yaml:"date"` Date string `yaml:"date"`
Categories []string `yaml:"categories"` Categories []string `yaml:"categories"`
@@ -53,6 +55,9 @@ func main() {
entries, _ := os.ReadDir(contentDir) entries, _ := os.ReadDir(contentDir)
nav := buildNav(entries, contentDir) nav := buildNav(entries, contentDir)
for _, item := range nav {
fmt.Printf("Nav: %s (%s) — Pos: %d\n", item.Title, item.URL, item.Position)
}
renderStaticPages(files, contentDir, outputDir, tpl, nav) renderStaticPages(files, contentDir, outputDir, tpl, nav)
blogPosts, categoryMap := processBlogPosts(contentDir, outputDir, tpl, nav) blogPosts, categoryMap := processBlogPosts(contentDir, outputDir, tpl, nav)
renderContactPage(contentDir, outputDir, tpl, nav) renderContactPage(contentDir, outputDir, tpl, nav)
@@ -85,46 +90,53 @@ func buildNav(entries []fs.DirEntry, contentDir string) []NavItem {
} }
meta, _ := parseFrontMatter(rawContent) meta, _ := parseFrontMatter(rawContent)
fmt.Printf("meta from %s: %+v\n", entry.Name(), meta)
// Skip pages with showInNav: false
if meta.ShowInNav != nil && !*meta.ShowInNav {
continue
}
// Pull title info
title := strings.TrimSpace(meta.NavTitle) title := strings.TrimSpace(meta.NavTitle)
if title == "" { if title == "" {
title = meta.Title title = meta.Title
} }
if title == "" {
title = strings.Title(name)
}
// Respect showInNav: false
if meta.ShowInNav != nil && !*meta.ShowInNav {
continue
}
if title == "" && name == "index" { if title == "" && name == "index" {
title = "Home" title = "Home"
} else if title == "" { } else if title == "" {
title = strings.Title(name) title = strings.Title(name)
} }
// Build URL
url := "/" url := "/"
if name != "index" { if name != "index" {
url = "/" + name + "/" url = "/" + name + "/"
} }
nav = append(nav, NavItem{Title: title, URL: url}) // Pull nav position regardless of title logic
position := 999
if meta.NavPosition != nil {
position = *meta.NavPosition
}
nav = append(nav, NavItem{
Title: title,
URL: url,
Position: position,
})
} }
// Add Blog manually // Optional: add Blog manually (or skip if you handle it as a page)
nav = append(nav, NavItem{Title: "Blog", URL: "/blog/"}) nav = append(nav, NavItem{
Title: "Blog",
// Optional: order the nav explicitly URL: "/blog/",
preferredOrder := map[string]int{ Position: 3,
"Home": 0, })
"Blog": 1,
"About": 2,
"Contact": 3,
}
// Sort by position
sort.SliceStable(nav, func(i, j int) bool { sort.SliceStable(nav, func(i, j int) bool {
return preferredOrder[nav[i].Title] < preferredOrder[nav[j].Title] return nav[i].Position < nav[j].Position
}) })
return nav return nav

View File

@@ -20,10 +20,10 @@
<li class="list-none"><a class="text-white hover:text-primary-200" href="/">Home</a></li> <li class="list-none"><a class="text-white hover:text-primary-200" href="/">Home</a></li>
<li class="list-none"><a class="text-white hover:text-primary-200" href="/blog/">Blog</a></li>
<li class="list-none"><a class="text-white hover:text-primary-200" href="/about/">About</a></li> <li class="list-none"><a class="text-white hover:text-primary-200" href="/about/">About</a></li>
<li class="list-none"><a class="text-white hover:text-primary-200" href="/blog/">Blog</a></li>
<li class="list-none"><a class="text-white hover:text-primary-200" href="/contact/">Contact</a></li> <li class="list-none"><a class="text-white hover:text-primary-200" href="/contact/">Contact</a></li>
</ul> </ul>

View File

@@ -20,10 +20,10 @@
<li class="list-none"><a class="text-white hover:text-primary-200" href="/">Home</a></li> <li class="list-none"><a class="text-white hover:text-primary-200" href="/">Home</a></li>
<li class="list-none"><a class="text-white hover:text-primary-200" href="/blog/">Blog</a></li>
<li class="list-none"><a class="text-white hover:text-primary-200" href="/about/">About</a></li> <li class="list-none"><a class="text-white hover:text-primary-200" href="/about/">About</a></li>
<li class="list-none"><a class="text-white hover:text-primary-200" href="/blog/">Blog</a></li>
<li class="list-none"><a class="text-white hover:text-primary-200" href="/contact/">Contact</a></li> <li class="list-none"><a class="text-white hover:text-primary-200" href="/contact/">Contact</a></li>
</ul> </ul>

View File

@@ -20,10 +20,10 @@
<li class="list-none"><a class="text-white hover:text-primary-200" href="/">Home</a></li> <li class="list-none"><a class="text-white hover:text-primary-200" href="/">Home</a></li>
<li class="list-none"><a class="text-white hover:text-primary-200" href="/blog/">Blog</a></li>
<li class="list-none"><a class="text-white hover:text-primary-200" href="/about/">About</a></li> <li class="list-none"><a class="text-white hover:text-primary-200" href="/about/">About</a></li>
<li class="list-none"><a class="text-white hover:text-primary-200" href="/blog/">Blog</a></li>
<li class="list-none"><a class="text-white hover:text-primary-200" href="/contact/">Contact</a></li> <li class="list-none"><a class="text-white hover:text-primary-200" href="/contact/">Contact</a></li>
</ul> </ul>

View File

@@ -20,10 +20,10 @@
<li class="list-none"><a class="text-white hover:text-primary-200" href="/">Home</a></li> <li class="list-none"><a class="text-white hover:text-primary-200" href="/">Home</a></li>
<li class="list-none"><a class="text-white hover:text-primary-200" href="/blog/">Blog</a></li>
<li class="list-none"><a class="text-white hover:text-primary-200" href="/about/">About</a></li> <li class="list-none"><a class="text-white hover:text-primary-200" href="/about/">About</a></li>
<li class="list-none"><a class="text-white hover:text-primary-200" href="/blog/">Blog</a></li>
<li class="list-none"><a class="text-white hover:text-primary-200" href="/contact/">Contact</a></li> <li class="list-none"><a class="text-white hover:text-primary-200" href="/contact/">Contact</a></li>
</ul> </ul>

View File

@@ -20,10 +20,10 @@
<li class="list-none"><a class="text-white hover:text-primary-200" href="/">Home</a></li> <li class="list-none"><a class="text-white hover:text-primary-200" href="/">Home</a></li>
<li class="list-none"><a class="text-white hover:text-primary-200" href="/blog/">Blog</a></li>
<li class="list-none"><a class="text-white hover:text-primary-200" href="/about/">About</a></li> <li class="list-none"><a class="text-white hover:text-primary-200" href="/about/">About</a></li>
<li class="list-none"><a class="text-white hover:text-primary-200" href="/blog/">Blog</a></li>
<li class="list-none"><a class="text-white hover:text-primary-200" href="/contact/">Contact</a></li> <li class="list-none"><a class="text-white hover:text-primary-200" href="/contact/">Contact</a></li>
</ul> </ul>

View File

@@ -20,10 +20,10 @@
<li class="list-none"><a class="text-white hover:text-primary-200" href="/">Home</a></li> <li class="list-none"><a class="text-white hover:text-primary-200" href="/">Home</a></li>
<li class="list-none"><a class="text-white hover:text-primary-200" href="/blog/">Blog</a></li>
<li class="list-none"><a class="text-white hover:text-primary-200" href="/about/">About</a></li> <li class="list-none"><a class="text-white hover:text-primary-200" href="/about/">About</a></li>
<li class="list-none"><a class="text-white hover:text-primary-200" href="/blog/">Blog</a></li>
<li class="list-none"><a class="text-white hover:text-primary-200" href="/contact/">Contact</a></li> <li class="list-none"><a class="text-white hover:text-primary-200" href="/contact/">Contact</a></li>
</ul> </ul>

View File

@@ -20,10 +20,10 @@
<li class="list-none"><a class="text-white hover:text-primary-200" href="/">Home</a></li> <li class="list-none"><a class="text-white hover:text-primary-200" href="/">Home</a></li>
<li class="list-none"><a class="text-white hover:text-primary-200" href="/blog/">Blog</a></li>
<li class="list-none"><a class="text-white hover:text-primary-200" href="/about/">About</a></li> <li class="list-none"><a class="text-white hover:text-primary-200" href="/about/">About</a></li>
<li class="list-none"><a class="text-white hover:text-primary-200" href="/blog/">Blog</a></li>
<li class="list-none"><a class="text-white hover:text-primary-200" href="/contact/">Contact</a></li> <li class="list-none"><a class="text-white hover:text-primary-200" href="/contact/">Contact</a></li>
</ul> </ul>

View File

@@ -20,10 +20,10 @@
<li class="list-none"><a class="text-white hover:text-primary-200" href="/">Home</a></li> <li class="list-none"><a class="text-white hover:text-primary-200" href="/">Home</a></li>
<li class="list-none"><a class="text-white hover:text-primary-200" href="/blog/">Blog</a></li>
<li class="list-none"><a class="text-white hover:text-primary-200" href="/about/">About</a></li> <li class="list-none"><a class="text-white hover:text-primary-200" href="/about/">About</a></li>
<li class="list-none"><a class="text-white hover:text-primary-200" href="/blog/">Blog</a></li>
<li class="list-none"><a class="text-white hover:text-primary-200" href="/contact/">Contact</a></li> <li class="list-none"><a class="text-white hover:text-primary-200" href="/contact/">Contact</a></li>
</ul> </ul>

View File

@@ -20,10 +20,10 @@
<li class="list-none"><a class="text-white hover:text-primary-200" href="/">Home</a></li> <li class="list-none"><a class="text-white hover:text-primary-200" href="/">Home</a></li>
<li class="list-none"><a class="text-white hover:text-primary-200" href="/blog/">Blog</a></li>
<li class="list-none"><a class="text-white hover:text-primary-200" href="/about/">About</a></li> <li class="list-none"><a class="text-white hover:text-primary-200" href="/about/">About</a></li>
<li class="list-none"><a class="text-white hover:text-primary-200" href="/blog/">Blog</a></li>
<li class="list-none"><a class="text-white hover:text-primary-200" href="/contact/">Contact</a></li> <li class="list-none"><a class="text-white hover:text-primary-200" href="/contact/">Contact</a></li>
</ul> </ul>

View File

@@ -20,10 +20,10 @@
<li class="list-none"><a class="text-white hover:text-primary-200" href="/">Home</a></li> <li class="list-none"><a class="text-white hover:text-primary-200" href="/">Home</a></li>
<li class="list-none"><a class="text-white hover:text-primary-200" href="/blog/">Blog</a></li>
<li class="list-none"><a class="text-white hover:text-primary-200" href="/about/">About</a></li> <li class="list-none"><a class="text-white hover:text-primary-200" href="/about/">About</a></li>
<li class="list-none"><a class="text-white hover:text-primary-200" href="/blog/">Blog</a></li>
<li class="list-none"><a class="text-white hover:text-primary-200" href="/contact/">Contact</a></li> <li class="list-none"><a class="text-white hover:text-primary-200" href="/contact/">Contact</a></li>
</ul> </ul>