feat: Improved the template chain.

This commit is contained in:
Spencer Brower
2026-07-17 11:49:05 -04:00
parent fba62fe156
commit cfb41ef930
+28 -14
View File
@@ -120,24 +120,38 @@ get_template :: proc(
layout: string, layout: string,
cache: ^map[string]mustache.Template, cache: ^map[string]mustache.Template,
) -> mustache.Template { ) -> mustache.Template {
if cached, ok := cache[layout]; ok { // Build fallback chain: <layout> → [section_index] → page → base
return cached chain: [4]string
n := 0
chain[n] = layout; n += 1
if strings.has_suffix(layout, "_index") && layout != "section_index" {
chain[n] = "section_index"; n += 1
}
if layout != "page" && layout != "base" {
chain[n] = "page"; n += 1
}
if layout != "base" {
chain[n] = "base"; n += 1
} }
filename := fmt.tprintf("%s.html", layout) for i in 0..<n {
if os.exists(fmt.tprintf("%s/%s", layouts_dir, filename)) { candidate := chain[i]
tpl := load_template(layouts_dir, filename) if cached, ok := cache[candidate]; ok {
cache[layout] = tpl return cached
return tpl }
filename := fmt.tprintf("%s.html", candidate)
if os.exists(fmt.tprintf("%s/%s", layouts_dir, filename)) {
tpl := load_template(layouts_dir, filename)
cache[candidate] = tpl
return tpl
}
if candidate != chain[n - 1] {
log.warnf("thor: template %s not found, falling back", filename)
}
} }
if layout != "page" { log.errorf("thor: base.html not found in %s", layouts_dir)
log.warnf("thor: template %s not found, falling back to page.html", filename) return mustache.Template{}
return get_template(layouts_dir, "page", cache)
}
log.errorf("thor: default template page.html not found in %s", layouts_dir)
return load_template(layouts_dir, "page.html")
} }
capitalize :: proc(s: string) -> string { capitalize :: proc(s: string) -> string {