media/loader: article slug from folder; _index.md loads as article; _ dirs ignored; slugs lowercased

This commit is contained in:
sam
2026-09-10 13:43:05 +10:00
parent e220fa537e
commit c5895e15ca

View File

@@ -186,17 +186,20 @@ func (c *Content) loadFilesUnder(dir string, out *[]*Article) error {
} }
for _, e := range entries { for _, e := range entries {
name := e.Name() name := e.Name()
if strings.HasPrefix(name, "_") {
continue
}
if e.IsDir() { if e.IsDir() {
// recurse one level (article folder) — skip hidden // recurse one level (article folder) — skip hidden/_ folders (e.g. _attachments)
c.loadFilesUnder(path.Join(dir, name), out) if !strings.HasPrefix(name, "_") {
c.loadFilesUnder(path.Join(dir, name), out)
}
continue continue
} }
if !strings.HasSuffix(name, ".md") { if !strings.HasSuffix(name, ".md") {
continue continue
} }
// skip _ files (config, templates) BUT _index.md is the real article in a folder
if strings.HasPrefix(name, "_") && name != "_index.md" {
continue
}
if a, err := c.loadFile(path.Join(dir, name)); err == nil { if a, err := c.loadFile(path.Join(dir, name)); err == nil {
// unpublished articles are drafts — load, then hide from all listings // unpublished articles are drafts — load, then hide from all listings
*out = append(*out, a) *out = append(*out, a)
@@ -338,7 +341,13 @@ func parseFrontMatter(text string) (FrontMatter, string, bool) {
func slugOf(full string) string { func slugOf(full string) string {
base := path.Base(full) base := path.Base(full)
base = strings.TrimSuffix(base, ".md") base = strings.TrimSuffix(base, ".md")
return base // article files are now <folder>/_index.md — the slug is the folder name.
if base == "_index" {
dir := path.Dir(full)
base = path.Base(dir)
}
// lowercase for URL-friendly slugs
return strings.ToLower(base)
} }
// resolveShortcodes replaces {{media:name}} with base/name and // resolveShortcodes replaces {{media:name}} with base/name and