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/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}