template: line numbers for file view
This commit is contained in:
parent
eda8b58d9f
commit
d879c2dfb0
4 changed files with 41 additions and 1 deletions
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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 }}
|
||||||
|
|
|
@ -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 }}
|
||||||
|
|
Loading…
Reference in a new issue