package modules
import (
"html/template"
"strings"
"gsg/internal/core"
)
type Readme struct {
Name string
HTML template.HTML
}
var readmeNames = []string{"README.md", "readme.md", "README.markdown", "README", "readme"}
func init() { core.Register("readme", readmeMod) }
// readme: first README found at Ctx.Path, rendered.
// Returns nil (not an error) when absent, so `with` in a template just skips it.
func readmeMod(c *core.Ctx, args ...string) (any, error) {
rev := c.Commit
if rev == "" {
rev = c.Ref
}
entries, err := c.Repo.Tree(rev, c.Path)
if err != nil {
return nil, nil
}
present := map[string]bool{}
for _, e := range entries {
if e.Type == "blob" {
present[e.Name] = true
}
}
for _, name := range readmeNames {
if !present[name] {
continue
}
full := strings.TrimPrefix(c.Path+"/"+name, "/")
src, err := c.Repo.Blob(rev, full)
if err != nil {
continue
}
out, err := Markdown(src, "/"+c.Info.Slug, c.Ref, c.Path)
if err != nil {
return nil, err
}
return Readme{Name: name, HTML: out}, nil
}
return nil, nil
}