template: line numbers for file view

This commit is contained in:
Anirudh Oppiliappan 2022-12-13 11:50:39 +05:30
parent eda8b58d9f
commit d879c2dfb0
No known key found for this signature in database
GPG Key ID: 8A93F96F78C5D4C4
4 changed files with 41 additions and 1 deletions

View File

@ -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 @@ func (d *deps) listFiles(files []git.NiceTree, data map[string]any, w http.Respo
}
}
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

View File

@ -9,6 +9,11 @@
<body>
{{ template "nav" . }}
<main>
<pre>
{{ range .linecount }}
<a id="#L{{ . }}" href="#{{ . }}">{{ . }}</a>
{{- end -}}
</pre>
<pre>
{{ .content }}
</pre>

View File

@ -2,6 +2,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="/static/style.css" type="text/css">
<!-- other meta tags here -->
</head>
{{ end }}

View File

@ -9,6 +9,7 @@
<li><a href="/{{ .name }}/tree/{{ .ref }}/">tree</a>
<li><a href="/{{ .name }}/log/{{ .ref }}">log</a>
{{ end }}
<li><a href="/{{ .name }}/refs">refs</a>
</ul>
</nav>
{{ end }}