Add embedded templates and a test index template

This commit is contained in:
Miguel de la Cruz 2024-06-29 00:03:06 +02:00
parent 847f5a0629
commit 8be57baa83
4 changed files with 62 additions and 6 deletions

3
.gitignore vendored
View file

@ -1 +1,2 @@
/gitstatic
/gitstatic
/index.html

View file

@ -6,11 +6,21 @@ Simple CLI tool to generate webpages from git repositories.
- [ ] Embed templates for the index and repository pages.
- [ ] Generate the index html file for the -index subcommand.
- [ ] Generate the log html file for a repository.
- [ ] Detect and link README, LICENSE and CONTRIBUTING files.
- [ ] Generate the files html file and file structure.
- [ ] Generate the refs html file.
- [ ] Add a proper CLI parsing and subcommands.
- [ ] Add a sample CSS file for the default templates.
- [ ] Add a subcommand to dump the embed templates.
- [ ] Add a subcommand to dump the embedded templates so they can be
modified.
- [ ] Take binary files into account.
- [ ] Limit the output for large diffs.
- [ ] Allow to anchor lines.
- [ ] Check if the templates exist on a location and use them if
so. Allow to change that location through CLI flags or env vars.
- [ ] Optimize repository generation through a cache.
- [ ] Add a flag to regenerate in case a `push -f` comes in.
- [ ] Optimize output generation through the use of smaller templates
instead of having all the structs in memory when executing one
template (for large repos).

View file

@ -1,8 +1,11 @@
package main
import (
"bytes"
"embed"
"flag"
"fmt"
"html/template"
"log/slog"
"os"
"path/filepath"
@ -19,6 +22,29 @@ type RepoDir struct {
LastCommit time.Time
}
//go:embed templates
var embedTmpl embed.FS
func executeTemplate(name string, data any) (string, error) {
path := filepath.Join("templates", fmt.Sprintf("%s.html.tmpl", name))
b, err := embedTmpl.ReadFile(path)
if err != nil {
return "", fmt.Errorf("cannot read embedded file %q: %w", path, err)
}
tmpl, err := template.New("").Parse(string(b))
if err != nil {
return "", fmt.Errorf("cannot parse template %q: %w", path, err)
}
var strb bytes.Buffer
if err := tmpl.Execute(&strb, data); err != nil {
return "", fmt.Errorf("cannot execute template %q: %w", path, err)
}
return strb.String(), nil
}
func errAndExit(msg string, args ...any) {
fmt.Fprintf(os.Stderr, msg, args...)
os.Exit(1)
@ -120,10 +146,16 @@ func generateIndex(args []string) error {
repoDirs = append(repoDirs, repoDir)
}
// ToDo: pass repoDirs to a template and generate index.htlm
// ToDo: remove this
for _, rd := range repoDirs {
slog.Info("Repo", "name", rd.Name, "desc", rd.Description, "owner", rd.Owner, "lastcommit", rd.LastCommit)
data := map[string]any{
"repoDirs": repoDirs,
}
contents, err := executeTemplate("index", data)
if err != nil {
return fmt.Errorf("cannot execute index template: %w", err)
}
if err := os.WriteFile("index.html", []byte(contents), 0755); err != nil {
return fmt.Errorf("cannot write index contents to \"index.html\": %w", err)
}
return nil

13
templates/index.html.tmpl Normal file
View file

@ -0,0 +1,13 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
</head>
<body>
<h3>Repositories</h3>
{{- range .repoDirs}}
<p>{{ .Name }} :: {{.Owner}} :: {{.Description}} :: {{.LastCommit}}</p>
{{- end}}
</body>
</html>