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

1
.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. - [ ] Embed templates for the index and repository pages.
- [ ] Generate the index html file for the -index subcommand. - [ ] 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 proper CLI parsing and subcommands.
- [ ] Add a sample CSS file for the default templates. - [ ] 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 - [ ] Check if the templates exist on a location and use them if
so. Allow to change that location through CLI flags or env vars. 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 - [ ] Optimize output generation through the use of smaller templates
instead of having all the structs in memory when executing one instead of having all the structs in memory when executing one
template (for large repos). template (for large repos).

View file

@ -1,8 +1,11 @@
package main package main
import ( import (
"bytes"
"embed"
"flag" "flag"
"fmt" "fmt"
"html/template"
"log/slog" "log/slog"
"os" "os"
"path/filepath" "path/filepath"
@ -19,6 +22,29 @@ type RepoDir struct {
LastCommit time.Time 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) { func errAndExit(msg string, args ...any) {
fmt.Fprintf(os.Stderr, msg, args...) fmt.Fprintf(os.Stderr, msg, args...)
os.Exit(1) os.Exit(1)
@ -120,10 +146,16 @@ func generateIndex(args []string) error {
repoDirs = append(repoDirs, repoDir) repoDirs = append(repoDirs, repoDir)
} }
// ToDo: pass repoDirs to a template and generate index.htlm data := map[string]any{
// ToDo: remove this "repoDirs": repoDirs,
for _, rd := range repoDirs { }
slog.Info("Repo", "name", rd.Name, "desc", rd.Description, "owner", rd.Owner, "lastcommit", rd.LastCommit) 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 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>