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
description: More About My Go SSG Site.
date: 2025-04-19
navPosition: 2
---
Experimenting with Go. Seems pretty cool so far!

View File

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

View File

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

50
main.go
View File

@@ -21,12 +21,14 @@ import (
type NavItem struct {
Title string
URL string
Position int
}
type PageMeta struct {
Title string `yaml:"title"`
NavTitle string `yaml:"navTitle"`
ShowInNav *bool `yaml:"showInNav"`
NavPosition *int `yaml:"navPosition"`
Description string `yaml:"description"`
Date string `yaml:"date"`
Categories []string `yaml:"categories"`
@@ -53,6 +55,9 @@ func main() {
entries, _ := os.ReadDir(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)
blogPosts, categoryMap := processBlogPosts(contentDir, outputDir, tpl, nav)
renderContactPage(contentDir, outputDir, tpl, nav)
@@ -85,46 +90,53 @@ func buildNav(entries []fs.DirEntry, contentDir string) []NavItem {
}
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)
if title == "" {
title = meta.Title
}
if title == "" {
title = strings.Title(name)
}
// Respect showInNav: false
if meta.ShowInNav != nil && !*meta.ShowInNav {
continue
}
if title == "" && name == "index" {
title = "Home"
} else if title == "" {
title = strings.Title(name)
}
// Build URL
url := "/"
if name != "index" {
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
}
// Add Blog manually
nav = append(nav, NavItem{Title: "Blog", URL: "/blog/"})
// Optional: order the nav explicitly
preferredOrder := map[string]int{
"Home": 0,
"Blog": 1,
"About": 2,
"Contact": 3,
nav = append(nav, NavItem{
Title: title,
URL: url,
Position: position,
})
}
// Optional: add Blog manually (or skip if you handle it as a page)
nav = append(nav, NavItem{
Title: "Blog",
URL: "/blog/",
Position: 3,
})
// Sort by position
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

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="/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="/blog/">Blog</a></li>
<li class="list-none"><a class="text-white hover:text-primary-200" href="/contact/">Contact</a></li>
</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="/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="/blog/">Blog</a></li>
<li class="list-none"><a class="text-white hover:text-primary-200" href="/contact/">Contact</a></li>
</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="/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="/blog/">Blog</a></li>
<li class="list-none"><a class="text-white hover:text-primary-200" href="/contact/">Contact</a></li>
</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="/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="/blog/">Blog</a></li>
<li class="list-none"><a class="text-white hover:text-primary-200" href="/contact/">Contact</a></li>
</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="/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="/blog/">Blog</a></li>
<li class="list-none"><a class="text-white hover:text-primary-200" href="/contact/">Contact</a></li>
</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="/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="/blog/">Blog</a></li>
<li class="list-none"><a class="text-white hover:text-primary-200" href="/contact/">Contact</a></li>
</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="/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="/blog/">Blog</a></li>
<li class="list-none"><a class="text-white hover:text-primary-200" href="/contact/">Contact</a></li>
</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="/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="/blog/">Blog</a></li>
<li class="list-none"><a class="text-white hover:text-primary-200" href="/contact/">Contact</a></li>
</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="/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="/blog/">Blog</a></li>
<li class="list-none"><a class="text-white hover:text-primary-200" href="/contact/">Contact</a></li>
</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="/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="/blog/">Blog</a></li>
<li class="list-none"><a class="text-white hover:text-primary-200" href="/contact/">Contact</a></li>
</ul>