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 } // Same (rev, path) listing the `tree` module already computes for this // page -- go through it instead of forking a second identical ls-tree. v, err := c.Mod("tree") if err != nil { return nil, nil } t, ok := v.(Tree) if !ok { return nil, nil } present := map[string]bool{} for _, e := range t.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 }