this repo has no description
1package routes
2
3import (
4 "bytes"
5 "html/template"
6 "io"
7 "log"
8 "net/http"
9 "strings"
10
11 "github.com/alecthomas/chroma/v2/formatters/html"
12 "github.com/alecthomas/chroma/v2/lexers"
13 "github.com/alecthomas/chroma/v2/styles"
14 "github.com/icyphox/bild/legit/git"
15)
16
17func (h *Handle) listFiles(files []git.NiceTree, data map[string]any, w http.ResponseWriter) {
18 data["files"] = files
19 data["meta"] = h.c.Meta
20
21 if err := h.t.ExecuteTemplate(w, "repo/tree", data); err != nil {
22 log.Println(err)
23 return
24 }
25}
26
27func countLines(r io.Reader) (int, error) {
28 buf := make([]byte, 32*1024)
29 bufLen := 0
30 count := 0
31 nl := []byte{'\n'}
32
33 for {
34 c, err := r.Read(buf)
35 if c > 0 {
36 bufLen += c
37 }
38 count += bytes.Count(buf[:c], nl)
39
40 switch {
41 case err == io.EOF:
42 /* handle last line not having a newline at the end */
43 if bufLen >= 1 && buf[(bufLen-1)%(32*1024)] != '\n' {
44 count++
45 }
46 return count, nil
47 case err != nil:
48 return 0, err
49 }
50 }
51}
52
53func (h *Handle) showFileWithHighlight(name, content string, data map[string]any, w http.ResponseWriter) {
54 lexer := lexers.Get(name)
55 if lexer == nil {
56 lexer = lexers.Get(".txt")
57 }
58
59 style := styles.Get(h.c.Meta.SyntaxHighlight)
60 if style == nil {
61 style = styles.Get("monokailight")
62 }
63
64 formatter := html.New(
65 html.WithLineNumbers(true),
66 html.WithLinkableLineNumbers(true, "L"),
67 )
68
69 iterator, err := lexer.Tokenise(nil, content)
70 if err != nil {
71 h.Write500(w)
72 return
73 }
74
75 var code bytes.Buffer
76 err = formatter.Format(&code, style, iterator)
77 if err != nil {
78 h.Write500(w)
79 return
80 }
81
82 data["content"] = template.HTML(code.String())
83 data["meta"] = h.c.Meta
84 data["chroma"] = true
85
86 if err := h.t.ExecuteTemplate(w, "repo/file", data); err != nil {
87 log.Println(err)
88 return
89 }
90}
91
92func (h *Handle) showFile(content string, data map[string]any, w http.ResponseWriter) {
93 lc, err := countLines(strings.NewReader(content))
94 if err != nil {
95 // Non-fatal, we'll just skip showing line numbers in the template.
96 log.Printf("counting lines: %s", err)
97 }
98
99 lines := make([]int, lc)
100 if lc > 0 {
101 for i := range lines {
102 lines[i] = i + 1
103 }
104 }
105
106 data["linecount"] = lines
107 data["content"] = content
108 data["meta"] = h.c.Meta
109 data["chroma"] = false
110
111 if err := h.t.ExecuteTemplate(w, "repo/file", data); err != nil {
112 log.Println(err)
113 return
114 }
115}
116
117func (h *Handle) showRaw(content string, w http.ResponseWriter) {
118 w.WriteHeader(http.StatusOK)
119 w.Header().Set("Content-Type", "text/plain")
120 w.Write([]byte(content))
121 return
122}