diff --git a/legit/routes/template.go b/legit/routes/file.go similarity index 58% rename from legit/routes/template.go rename to legit/routes/file.go index d7c96ae..03a5eb1 100644 --- a/legit/routes/template.go +++ b/legit/routes/file.go @@ -2,12 +2,10 @@ package routes import ( "bytes" - "fmt" "html/template" "io" "log" "net/http" - "path/filepath" "strings" "github.com/alecthomas/chroma/v2/formatters/html" @@ -16,36 +14,11 @@ import ( "github.com/icyphox/bild/legit/git" ) -func (h *Handle) Write404(w http.ResponseWriter) { - w.WriteHeader(404) - if err := h.t.ExecuteTemplate(w, "404", nil); err != nil { - log.Printf("404 template: %s", err) - } -} - -func (h *Handle) Write500(w http.ResponseWriter) { - w.WriteHeader(500) - if err := h.t.ExecuteTemplate(w, "500", nil); err != nil { - log.Printf("500 template: %s", err) - } -} - -func (h *Handle) WriteOOBNotice(w http.ResponseWriter, id, msg string) { - html := fmt.Sprintf(`%s`, id, msg) - - w.Header().Set("Content-Type", "text/html") - w.WriteHeader(http.StatusOK) - w.Write([]byte(html)) -} - func (h *Handle) listFiles(files []git.NiceTree, data map[string]any, w http.ResponseWriter) { - tpath := filepath.Join(h.c.Dirs.Templates, "*") - t := template.Must(template.ParseGlob(tpath)) - data["files"] = files data["meta"] = h.c.Meta - if err := t.ExecuteTemplate(w, "tree", data); err != nil { + if err := h.t.ExecuteTemplate(w, "repo/tree", data); err != nil { log.Println(err) return } @@ -77,16 +50,13 @@ func countLines(r io.Reader) (int, error) { } } -func (d *Handle) showFileWithHighlight(name, content string, data map[string]any, w http.ResponseWriter) { - tpath := filepath.Join(d.c.Dirs.Templates, "*") - t := template.Must(template.ParseGlob(tpath)) - +func (h *Handle) showFileWithHighlight(name, content string, data map[string]any, w http.ResponseWriter) { lexer := lexers.Get(name) if lexer == nil { lexer = lexers.Get(".txt") } - style := styles.Get(d.c.Meta.SyntaxHighlight) + style := styles.Get(h.c.Meta.SyntaxHighlight) if style == nil { style = styles.Get("monokailight") } @@ -98,31 +68,28 @@ func (d *Handle) showFileWithHighlight(name, content string, data map[string]any iterator, err := lexer.Tokenise(nil, content) if err != nil { - d.Write500(w) + h.Write500(w) return } var code bytes.Buffer err = formatter.Format(&code, style, iterator) if err != nil { - d.Write500(w) + h.Write500(w) return } data["content"] = template.HTML(code.String()) - data["meta"] = d.c.Meta + data["meta"] = h.c.Meta data["chroma"] = true - if err := t.ExecuteTemplate(w, "file", data); err != nil { + if err := h.t.ExecuteTemplate(w, "repo/file", data); err != nil { log.Println(err) return } } -func (d *Handle) showFile(content string, data map[string]any, w http.ResponseWriter) { - tpath := filepath.Join(d.c.Dirs.Templates, "*") - t := template.Must(template.ParseGlob(tpath)) - +func (h *Handle) showFile(content string, data map[string]any, w http.ResponseWriter) { lc, err := countLines(strings.NewReader(content)) if err != nil { // Non-fatal, we'll just skip showing line numbers in the template. @@ -138,16 +105,16 @@ func (d *Handle) showFile(content string, data map[string]any, w http.ResponseWr data["linecount"] = lines data["content"] = content - data["meta"] = d.c.Meta + data["meta"] = h.c.Meta data["chroma"] = false - if err := t.ExecuteTemplate(w, "file", data); err != nil { + if err := h.t.ExecuteTemplate(w, "repo/file", data); err != nil { log.Println(err) return } } -func (d *Handle) showRaw(content string, w http.ResponseWriter) { +func (h *Handle) showRaw(content string, w http.ResponseWriter) { w.WriteHeader(http.StatusOK) w.Header().Set("Content-Type", "text/plain") w.Write([]byte(content)) diff --git a/legit/routes/handler.go b/legit/routes/handler.go index 8288b90..d290984 100644 --- a/legit/routes/handler.go +++ b/legit/routes/handler.go @@ -2,9 +2,7 @@ package routes import ( "fmt" - "html/template" "net/http" - "path/filepath" _ "github.com/bluesky-social/indigo/atproto/identity" _ "github.com/bluesky-social/indigo/atproto/syntax" @@ -13,6 +11,7 @@ import ( "github.com/gorilla/sessions" "github.com/icyphox/bild/legit/config" "github.com/icyphox/bild/legit/db" + "github.com/icyphox/bild/legit/routes/tmpl" ) // Checks for gitprotocol-http(5) specific smells; if found, passes @@ -39,10 +38,13 @@ func (h *Handle) Multiplex(w http.ResponseWriter, r *http.Request) { func Setup(c *config.Config) (http.Handler, error) { r := chi.NewRouter() - t := template.Must(template.ParseGlob(filepath.Join(c.Dirs.Templates, "*"))) s := sessions.NewCookieStore([]byte("TODO_CHANGE_ME")) - db, err := db.Setup(c.Server.DBPath) + t, err := tmpl.Load(c.Dirs.Templates) + if err != nil { + return nil, fmt.Errorf("failed to load templates: %w", err) + } + db, err := db.Setup(c.Server.DBPath) if err != nil { return nil, fmt.Errorf("failed to setup db: %w", err) } diff --git a/legit/routes/html_util.go b/legit/routes/html_util.go new file mode 100644 index 0000000..991ce57 --- /dev/null +++ b/legit/routes/html_util.go @@ -0,0 +1,29 @@ +package routes + +import ( + "fmt" + "log" + "net/http" +) + +func (h *Handle) Write404(w http.ResponseWriter) { + w.WriteHeader(404) + if err := h.t.ExecuteTemplate(w, "errors/404", nil); err != nil { + log.Printf("404 template: %s", err) + } +} + +func (h *Handle) Write500(w http.ResponseWriter) { + w.WriteHeader(500) + if err := h.t.ExecuteTemplate(w, "errors/500", nil); err != nil { + log.Printf("500 template: %s", err) + } +} + +func (h *Handle) WriteOOBNotice(w http.ResponseWriter, id, msg string) { + html := fmt.Sprintf(`%s`, id, msg) + + w.Header().Set("Content-Type", "text/html") + w.WriteHeader(http.StatusOK) + w.Write([]byte(html)) +} diff --git a/legit/routes/routes.go b/legit/routes/routes.go index 958da3e..9a1107e 100644 --- a/legit/routes/routes.go +++ b/legit/routes/routes.go @@ -106,11 +106,10 @@ func (h *Handle) RepoIndex(w http.ResponseWriter, r *http.Request) { name = filepath.Clean(name) path := filepath.Join(h.c.Repo.ScanPath, name) - fmt.Println(path) gr, err := git.Open(path, "") if err != nil { if errors.Is(err, plumbing.ErrReferenceNotFound) { - h.t.ExecuteTemplate(w, "empty", nil) + h.t.ExecuteTemplate(w, "repo/empty", nil) return } else { h.Write404(w) @@ -173,7 +172,7 @@ func (h *Handle) RepoIndex(w http.ResponseWriter, r *http.Request) { data["meta"] = h.c.Meta data["gomod"] = isGoModule(gr) - if err := h.t.ExecuteTemplate(w, "repo", data); err != nil { + if err := h.t.ExecuteTemplate(w, "repo/repo", data); err != nil { log.Println(err) return } @@ -192,7 +191,6 @@ func (h *Handle) RepoTree(w http.ResponseWriter, r *http.Request) { name = filepath.Clean(name) path := filepath.Join(h.c.Repo.ScanPath, name) - fmt.Println(path) gr, err := git.Open(path, ref) if err != nil { h.Write404(w) @@ -348,7 +346,7 @@ func (h *Handle) Log(w http.ResponseWriter, r *http.Request) { data["desc"] = getDescription(path) data["log"] = true - if err := h.t.ExecuteTemplate(w, "log", data); err != nil { + if err := h.t.ExecuteTemplate(w, "repo/log", data); err != nil { log.Println(err) return } @@ -387,7 +385,7 @@ func (h *Handle) Diff(w http.ResponseWriter, r *http.Request) { data["ref"] = ref data["desc"] = getDescription(path) - if err := h.t.ExecuteTemplate(w, "commit", data); err != nil { + if err := h.t.ExecuteTemplate(w, "repo/commit", data); err != nil { log.Println(err) return } @@ -429,7 +427,7 @@ func (h *Handle) Refs(w http.ResponseWriter, r *http.Request) { data["tags"] = tags data["desc"] = getDescription(path) - if err := h.t.ExecuteTemplate(w, "refs", data); err != nil { + if err := h.t.ExecuteTemplate(w, "repo/refs", data); err != nil { log.Println(err) return } @@ -509,7 +507,7 @@ func (h *Handle) Keys(w http.ResponseWriter, r *http.Request) { data := make(map[string]interface{}) data["keys"] = keys - if err := h.t.ExecuteTemplate(w, "keys", data); err != nil { + if err := h.t.ExecuteTemplate(w, "settings/keys", data); err != nil { log.Println(err) return } @@ -541,7 +539,7 @@ func (h *Handle) NewRepo(w http.ResponseWriter, r *http.Request) { switch r.Method { case http.MethodGet: - if err := h.t.ExecuteTemplate(w, "new", nil); err != nil { + if err := h.t.ExecuteTemplate(w, "repo/new", nil); err != nil { log.Println(err) return } diff --git a/legit/routes/tmpl/tmpl.go b/legit/routes/tmpl/tmpl.go new file mode 100644 index 0000000..2f8d757 --- /dev/null +++ b/legit/routes/tmpl/tmpl.go @@ -0,0 +1,54 @@ +package tmpl + +import ( + "html/template" + "log" + "os" + "path/filepath" + "strings" +) + +func Load(tpath string) (*template.Template, error) { + tmpl := template.New("") + loadedTemplates := make(map[string]bool) + + err := filepath.Walk(tpath, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + + if !info.IsDir() && strings.HasSuffix(path, ".html") { + content, err := os.ReadFile(path) + if err != nil { + return err + } + + relPath, err := filepath.Rel(tpath, path) + if err != nil { + return err + } + + name := strings.TrimSuffix(relPath, ".html") + name = strings.ReplaceAll(name, string(filepath.Separator), "/") + + _, err = tmpl.New(name).Parse(string(content)) + if err != nil { + log.Printf("error parsing template %s: %v", name, err) + return err + } + + loadedTemplates[name] = true + log.Printf("loaded template: %s", name) + return err + } + return nil + }) + + if err != nil { + return nil, err + } + + log.Printf("total templates loaded: %d", len(loadedTemplates)) + return tmpl, nil + +} diff --git a/legit/templates/404.html b/legit/templates/404.html deleted file mode 100644 index 8c40cd1..0000000 --- a/legit/templates/404.html +++ /dev/null @@ -1,13 +0,0 @@ -{{ define "404" }} - - 404 -{{ template "head" . }} - - {{ template "nav" . }} -
-

404 — nothing like that here.

-
- - - -{{ end }} diff --git a/legit/templates/500.html b/legit/templates/500.html deleted file mode 100644 index 53c605f..0000000 --- a/legit/templates/500.html +++ /dev/null @@ -1,13 +0,0 @@ -{{ define "500" }} - - 500 -{{ template "head" . }} - - {{ template "nav" . }} -
-

500 — something broke!

-
- - - -{{ end }} diff --git a/legit/templates/errors/404.html b/legit/templates/errors/404.html new file mode 100644 index 0000000..285c2d6 --- /dev/null +++ b/legit/templates/errors/404.html @@ -0,0 +1,10 @@ + + 404 + {{ template "layouts/head" . }} + + {{ template "layouts/nav" . }} +
+

404 — nothing like that here.

+
+ + diff --git a/legit/templates/errors/500.html b/legit/templates/errors/500.html new file mode 100644 index 0000000..642f821 --- /dev/null +++ b/legit/templates/errors/500.html @@ -0,0 +1,10 @@ + + 500 + {{ template "layouts/head" . }} + + {{ template "layouts/nav" . }} +
+

500 — something broke!

+
+ + diff --git a/legit/templates/index.html b/legit/templates/index.html index 7a77aec..7d43e06 100644 --- a/legit/templates/index.html +++ b/legit/templates/index.html @@ -1,6 +1,6 @@ {{ define "index" }} -{{ template "head" . }} +{{ template "layouts/head" . }}

{{ .meta.Title }}

diff --git a/legit/templates/head.html b/legit/templates/layouts/head.html similarity index 97% rename from legit/templates/head.html rename to legit/templates/layouts/head.html index f79a4de..ce6c02a 100644 --- a/legit/templates/head.html +++ b/legit/templates/layouts/head.html @@ -1,4 +1,3 @@ -{{ define "head" }} @@ -36,4 +35,3 @@ {{ end }} -{{ end }} diff --git a/legit/templates/layouts/nav.html b/legit/templates/layouts/nav.html new file mode 100644 index 0000000..14ee621 --- /dev/null +++ b/legit/templates/layouts/nav.html @@ -0,0 +1,12 @@ + diff --git a/legit/templates/layouts/repo-header.html b/legit/templates/layouts/repo-header.html new file mode 100644 index 0000000..87a5a99 --- /dev/null +++ b/legit/templates/layouts/repo-header.html @@ -0,0 +1,9 @@ +
+

+ all repos + — {{ .displayname }} {{ if .ref }} + @ {{ .ref }} + {{ end }} +

+

{{ .desc }}

+
diff --git a/legit/templates/nav.html b/legit/templates/nav.html deleted file mode 100644 index 51c9a34..0000000 --- a/legit/templates/nav.html +++ /dev/null @@ -1,14 +0,0 @@ -{{ define "nav" }} - -{{ end }} diff --git a/legit/templates/repo-header.html b/legit/templates/repo-header.html deleted file mode 100644 index 0420da7..0000000 --- a/legit/templates/repo-header.html +++ /dev/null @@ -1,12 +0,0 @@ -{{ define "repoheader" }} -
-

- all repos - — {{ .displayname }} - {{ if .ref }} - @ {{ .ref }} - {{ end }} -

-

{{ .desc }}

-
-{{ end }} diff --git a/legit/templates/commit.html b/legit/templates/repo/commit.html similarity index 94% rename from legit/templates/commit.html rename to legit/templates/repo/commit.html index c1def17..83a6e5c 100644 --- a/legit/templates/commit.html +++ b/legit/templates/repo/commit.html @@ -1,15 +1,12 @@ -{{ define "commit" }} -{{ template "head" . }} +{{ template "layouts/head" . }} - {{ template "repoheader" . }} + {{ template "layouts/repo-header" . }} - {{ template "nav" . }} + {{ template "layouts/nav" . }}
-
-          {{- .commit.Message -}}
-        
+
{{- .commit.Message -}}
{{ .commit.Author.Name }} {{ .commit.Author.Email}}
{{ .commit.Author.When.Format "Mon, 02 Jan 2006 15:04:05 -0700" }}
@@ -100,5 +97,4 @@
- -{{ end }} + \ No newline at end of file diff --git a/legit/templates/empty.html b/legit/templates/repo/empty.html similarity index 71% rename from legit/templates/empty.html rename to legit/templates/repo/empty.html index bbe07b3..da89978 100644 --- a/legit/templates/empty.html +++ b/legit/templates/repo/empty.html @@ -1,6 +1,5 @@ -{{ define "empty" }} - {{ template "head" . }} + {{ template "layouts/head" . }}
@@ -8,4 +7,3 @@
-{{ end }} diff --git a/legit/templates/file.html b/legit/templates/repo/file.html similarity index 86% rename from legit/templates/file.html rename to legit/templates/repo/file.html index 1a09e87..5dea3f6 100644 --- a/legit/templates/file.html +++ b/legit/templates/repo/file.html @@ -1,9 +1,8 @@ -{{ define "file" }} - {{ template "head" . }} - {{ template "repoheader" . }} + {{ template "layouts/head" . }} + {{ template "layouts/repo-header" . }} - {{ template "nav" . }} + {{ template "layouts/nav" . }}

{{ .path }} (view raw)

{{if .chroma }} @@ -33,4 +32,3 @@
-{{ end }} diff --git a/legit/templates/log.html b/legit/templates/repo/log.html similarity index 84% rename from legit/templates/log.html rename to legit/templates/repo/log.html index 7d74cb3..02f3a79 100644 --- a/legit/templates/log.html +++ b/legit/templates/repo/log.html @@ -1,10 +1,9 @@ -{{ define "log" }} -{{ template "head" . }} +{{ template "layouts/head" . }} - {{ template "repoheader" . }} + {{ template "layouts/repo-header" . }} - {{ template "nav" . }} + {{ template "layouts/nav" . }}
{{ $repo := .name }}
@@ -22,4 +21,3 @@
-{{ end }} diff --git a/legit/templates/new.html b/legit/templates/repo/new.html similarity index 94% rename from legit/templates/new.html rename to legit/templates/repo/new.html index 3c75700..61dad29 100644 --- a/legit/templates/new.html +++ b/legit/templates/repo/new.html @@ -1,6 +1,5 @@ -{{ define "new" }} - {{ template "head" . }} + {{ template "layouts/head" . }}
@@ -29,4 +28,3 @@
-{{ end }} diff --git a/legit/templates/refs.html b/legit/templates/repo/refs.html similarity index 88% rename from legit/templates/refs.html rename to legit/templates/repo/refs.html index 00058d5..cb24aeb 100644 --- a/legit/templates/refs.html +++ b/legit/templates/repo/refs.html @@ -1,10 +1,9 @@ -{{ define "refs" }} -{{ template "head" . }} +{{ template "layouts/head" . }} - {{ template "repoheader" . }} + {{ template "layouts/repo-header" . }} - {{ template "nav" . }} + {{ template "layouts/nav" . }}
{{ $name := .name }}

branches

@@ -36,5 +35,4 @@ {{ end }}
- -{{ end }} + \ No newline at end of file diff --git a/legit/templates/repo.html b/legit/templates/repo/repo.html similarity index 88% rename from legit/templates/repo.html rename to legit/templates/repo/repo.html index 1cd9b5c..dbb09ed 100644 --- a/legit/templates/repo.html +++ b/legit/templates/repo/repo.html @@ -1,11 +1,10 @@ -{{ define "repo" }} -{{ template "head" . }} +{{ template "layouts/head" . }} -{{ template "repoheader" . }} +{{ template "layouts/repo-header" . }} - {{ template "nav" . }} + {{ template "layouts/nav" . }}
{{ $repo := .name }}
@@ -35,4 +34,3 @@ git clone https://{{ .servername }}/{{ .name }}
-{{ end }} diff --git a/legit/templates/tree.html b/legit/templates/repo/tree.html similarity index 91% rename from legit/templates/tree.html rename to legit/templates/repo/tree.html index c4b7e4f..3f42524 100644 --- a/legit/templates/tree.html +++ b/legit/templates/repo/tree.html @@ -1,11 +1,10 @@ -{{ define "tree" }} -{{ template "head" . }} +{{ template "layouts/head" . }} - {{ template "repoheader" . }} + {{ template "layouts/repo-header" . }} - {{ template "nav" . }} + {{ template "layouts/nav" . }}
{{ $repo := .name }} {{ $ref := .ref }} @@ -51,5 +50,4 @@
- -{{ end }} + \ No newline at end of file diff --git a/legit/templates/keys.html b/legit/templates/settings/keys.html similarity index 95% rename from legit/templates/keys.html rename to legit/templates/settings/keys.html index efbce3f..247a723 100644 --- a/legit/templates/keys.html +++ b/legit/templates/settings/keys.html @@ -1,6 +1,5 @@ -{{ define "keys" }} - {{ template "head" . }} + {{ template "layouts/head" . }}
@@ -49,5 +48,4 @@
- -{{ end }} + \ No newline at end of file diff --git a/legit/templates/login.html b/legit/templates/user/login.html similarity index 79% rename from legit/templates/login.html rename to legit/templates/user/login.html index 418df6e..5315b60 100644 --- a/legit/templates/login.html +++ b/legit/templates/user/login.html @@ -1,14 +1,9 @@ -{{ define "login" }} - {{ template "head" . }} + {{ template "layouts/head" . }}
-
- -{{ end }} + \ No newline at end of file