all repos — elgit @ d879c2dfb088cb7911e322694c101fb0bdf7c0c0

fork of legit: web frontend for git, written in go

template: line numbers for file view

commit

d879c2dfb088cb7911e322694c101fb0bdf7c0c0

parent

eda8b58d9f2e85f1bae92ce3b70f279b89031046

1 file changed, 34 insertions(+), 1 deletion(-)

changed files
M routes/template.goroutes/template.go
@@ -1,10 +1,13 @@
package routes import ( + "bytes" "html/template" + "io" "log" "net/http" "path/filepath" + "strings" "icyphox.sh/legit/git" )
@@ -40,12 +43,42 @@ return
} } +func countLines(r io.Reader) (int, error) { + buf := make([]byte, 32*1024) + count := 0 + nl := []byte{'\n'} + + for { + c, err := r.Read(buf) + count += bytes.Count(buf[:c], nl) + + switch { + case err == io.EOF: + return count, nil + case err != nil: + return 0, err + } + } +} + func (d *deps) showFile(content string, data map[string]any, w http.ResponseWriter) { tpath := filepath.Join(d.c.Template.Dir, "*") t := template.Must(template.ParseGlob(tpath)) - // TODO: Process content here. + lc, err := countLines(strings.NewReader(content)) + if err != nil { + // Non-fatal, we'll just skip showing line numbers in the template. + log.Printf("counting lines: %s", err) + } + + lines := make([]int, lc) + if lc > 0 { + for i := range lines { + lines[i] = i + 1 + } + } + data["linecount"] = lines data["content"] = content data["meta"] = d.c.Meta