main.go (view raw)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 | package main import ( "context" "fmt" "log" "net/url" "os" "path/filepath" "github.com/a-h/templ" "github.com/pelletier/go-toml/v2" ) type Config struct { Title string Domain string Forge string Menu []*Link Packages []string } type Link struct { Name string URL string } func must[T any](t T, err error) T { if err != nil { panic(err) } return t } func fatal(err error) { if err != nil { log.Fatal(err) } } func importString(config *Config, pkg string) string { return fmt.Sprintf("%s git %s", must(url.JoinPath(config.Domain, pkg)), must(url.JoinPath(config.Forge, pkg)), ) } func sourceString(config *Config, pkg string) string { return fmt.Sprintf("%s _ %s %s", must(url.JoinPath(config.Domain, pkg)), must(url.JoinPath(config.Forge, pkg, "tree/main{/dir}")), must(url.JoinPath(config.Forge, pkg, "tree/main{/dir}/{file}#n{line}")), ) } func godocURL(config *Config, pkg string) string { return must(url.JoinPath("https://pkg.go.dev", packageImportPath(config, pkg))) } func packageImportPath(config *Config, pkg string) string { return must(url.JoinPath(config.Domain, pkg)) } func packageForgeURL(config *Config, pkg string) string { return must(url.JoinPath(config.Forge, pkg)) } func getConfig(filename string) (cfg *Config, err error) { cfg = new(Config) file, err := os.Open(filename) if err != nil { return nil, err } defer file.Close() dec := toml.NewDecoder(file) err = dec.Decode(cfg) if err != nil { return nil, err } return cfg, nil } const destDir = "dist" func renderToFile(c templ.Component, filename string) error { pathname := filepath.Join(destDir, filename) err := os.MkdirAll(filepath.Dir(pathname), 0755) if err != nil { return err } file, err := os.Create(pathname) if err != nil { return err } defer file.Close() return c.Render(context.Background(), file) } func main() { cfg, err := getConfig("vanity.toml") fatal(err) err = renderToFile( ListPage(cfg), "index.html", ) fatal(err) for _, pkg := range cfg.Packages { err = renderToFile( PackagePage(cfg, pkg), filepath.Join(pkg, "index.html"), ) fatal(err) } } |