template: line numbers for file view
This commit is contained in:
		
							parent
							
								
									eda8b58d9f
								
							
						
					
					
						commit
						d879c2dfb0
					
				| 
						 | 
				
			
			@ -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
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,6 +10,11 @@
 | 
			
		|||
    {{ template "nav" . }}
 | 
			
		||||
    <main>
 | 
			
		||||
    <pre>
 | 
			
		||||
{{ range .linecount }}
 | 
			
		||||
<a id="#L{{ . }}" href="#{{ . }}">{{ . }}</a>
 | 
			
		||||
{{- end -}}
 | 
			
		||||
    </pre>
 | 
			
		||||
      <pre>
 | 
			
		||||
{{ .content }}
 | 
			
		||||
      </pre>
 | 
			
		||||
    </main>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 }}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 }}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue