diff options
author | Runxi Yu <me@runxiyu.org> | 2025-02-10 14:42:13 +0800 |
---|---|---|
committer | Runxi Yu <me@runxiyu.org> | 2025-02-10 14:42:13 +0800 |
commit | ab3a64993c87fdb433e0bd89a67c3d2e527ff68d (patch) | |
tree | c15459c7d5a8defaedfeed74c08df46be3aa7469 /handle_repo_tree.go | |
parent | {category_,}index: Add heading (diff) | |
download | forge-ab3a64993c87fdb433e0bd89a67c3d2e527ff68d.tar.gz forge-ab3a64993c87fdb433e0bd89a67c3d2e527ff68d.tar.zst forge-ab3a64993c87fdb433e0bd89a67c3d2e527ff68d.zip |
handle_repo_tree: Syntax highlighting
Diffstat (limited to 'handle_repo_tree.go')
-rw-r--r-- | handle_repo_tree.go | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/handle_repo_tree.go b/handle_repo_tree.go index cc79202..c2810d9 100644 --- a/handle_repo_tree.go +++ b/handle_repo_tree.go @@ -7,6 +7,9 @@ import ( "path/filepath" "strings" + chroma_formatters_html "github.com/alecthomas/chroma/v2/formatters/html" + chroma_lexers "github.com/alecthomas/chroma/v2/lexers" + chroma_styles "github.com/alecthomas/chroma/v2/styles" "github.com/go-git/go-git/v5" "github.com/go-git/go-git/v5/plumbing/object" "github.com/microcosm-cc/bluemonday" @@ -63,11 +66,27 @@ func handle_repo_tree(w http.ResponseWriter, r *http.Request) { _, _ = w.Write([]byte("Error retrieving path: " + err.Error())) return } - data["file_contents"], err = file.Contents() + file_contents, err := file.Contents() if err != nil { _, _ = w.Write([]byte("Error reading file: " + err.Error())) return } + lexer := chroma_lexers.Match(path_spec) + if lexer == nil { + lexer = chroma_lexers.Fallback + } + iterator, err := lexer.Tokenise(nil, file_contents) + if err != nil { + _, _ = w.Write([]byte("Error rendering code: " + err.Error())) + return + } + var formatted_unencapsulated bytes.Buffer + style := chroma_styles.Get("emacs") + formatter := chroma_formatters_html.New(chroma_formatters_html.WithClasses(true), chroma_formatters_html.TabWidth(8)) + formatter.Format(&formatted_unencapsulated, style, iterator) + formatted_encapsulated := template.HTML(formatted_unencapsulated.Bytes()) + data["file_contents"] = formatted_encapsulated + err = templates.ExecuteTemplate(w, "repo_tree_file", data) if err != nil { _, _ = w.Write([]byte("Error rendering template: " + err.Error())) |