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 package routes
import ( import (
"bytes"
"html/template" "html/template"
"io"
"log" "log"
"net/http" "net/http"
"path/filepath" "path/filepath"
"strings"
"icyphox.sh/legit/git" "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) { func (d *deps) showFile(content string, data map[string]any, w http.ResponseWriter) {
tpath := filepath.Join(d.c.Template.Dir, "*") tpath := filepath.Join(d.c.Template.Dir, "*")
t := template.Must(template.ParseGlob(tpath)) 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["content"] = content
data["meta"] = d.c.Meta data["meta"] = d.c.Meta

View file

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

View file

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

View file

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