template: line numbers for file view
This commit is contained in:
		
							parent
							
								
									eda8b58d9f
								
							
						
					
					
						commit
						d879c2dfb0
					
				| 
						 | 
					@ -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 New Issue