package main import ( "bytes" _ "embed" "fmt" "os" "sigs.k8s.io/yaml" "strings" "github.com/yuin/goldmark" "html/template" ) type Plan struct { Tags map[string]TagInfo `json:"tags"` Contributions []Contribution `json:"contributions"` } type TagInfo struct { PrettyName string `json:"prettyName"` Desc string `json:"desc"` } type Contribution struct { URLs []string `json:"urls"` Tags []string `json:"tags"` SponsoredBy string `json:"sponsored-by"` Desc string `json:"desc"` } func ReadPlan(filename string) (Plan, error) { bs, err := os.ReadFile(filename) if err != nil { return Plan{}, err } var ret Plan if err := yaml.UnmarshalStrict(bs, &ret); err != nil { return Plan{}, err } return ret, nil } func MarkdownToHTML(md string) (template.HTML, error) { var html strings.Builder if err := goldmark.Convert([]byte(md), &html); err != nil { return template.HTML(""), err } return template.HTML(html.String()), nil } func main() { if err := mainWithError(); err != nil { fmt.Fprintf(os.Stderr, "%s: error: %v\n", os.Args[0], err) os.Exit(1) } } //go:embed plan.html.tmpl var embedPlanHTMLTmpl string var tmpl = template.Must(template.New("plan.html"). Funcs(template.FuncMap{ "md2html": MarkdownToHTML, }). Parse(embedPlanHTMLTmpl)) func mainWithError() error { plan, err := ReadPlan("plan.yml") if err != nil { return err } var out bytes.Buffer if err := tmpl.Execute(&out, plan); err != nil { return err } if err := os.WriteFile("plan.html", out.Bytes(), 0666); err != nil { return err } return nil }