1diff --git a/go.mod b/go.mod
2index b8b36b4cc85febdf92f178dea6604511c034b56d..ff4f2dd03286fea07e936a6b3961402b2971dae9 100644
3--- a/go.mod
4+++ b/go.mod
5@@ -4,9 +4,13 @@ go 1.22.2
6
7 require (
8 git.sr.ht/~emersion/go-scfg v0.0.0-20240128091534-2ae16e782082
9+ github.com/alecthomas/chroma/v2 v2.13.0
10 github.com/google/go-cmp v0.6.0
11 github.com/valyala/quicktemplate v1.7.0
12 golang.org/x/sync v0.7.0
13 )
14
15-require github.com/valyala/bytebufferpool v1.0.0 // indirect
16+require (
17+ github.com/dlclark/regexp2 v1.11.0 // indirect
18+ github.com/valyala/bytebufferpool v1.0.0 // indirect
19+)
20diff --git a/go.sum b/go.sum
21index 0ba6fdb880c9cf8d7bef209163294c73990aab69..15e574af4ac10ebbfb80200b39121f4d3cda7584 100644
22--- a/go.sum
23+++ b/go.sum
24@@ -1,12 +1,22 @@
25 git.sr.ht/~emersion/go-scfg v0.0.0-20240128091534-2ae16e782082 h1:9Udx5fm4vRtmgDIBjy2ef5QioHbzpw5oHabbhpAUyEw=
26 git.sr.ht/~emersion/go-scfg v0.0.0-20240128091534-2ae16e782082/go.mod h1:ybgvEJTIx5XbaspSviB3KNa6OdPmAZqDoSud7z8fFlw=
27+github.com/alecthomas/assert/v2 v2.6.0 h1:o3WJwILtexrEUk3cUVal3oiQY2tfgr/FHWiz/v2n4FU=
28+github.com/alecthomas/assert/v2 v2.6.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k=
29+github.com/alecthomas/chroma/v2 v2.13.0 h1:VP72+99Fb2zEcYM0MeaWJmV+xQvz5v5cxRHd+ooU1lI=
30+github.com/alecthomas/chroma/v2 v2.13.0/go.mod h1:BUGjjsD+ndS6eX37YgTchSEG+Jg9Jv1GiZs9sqPqztk=
31+github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc=
32+github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4=
33 github.com/andybalholm/brotli v1.0.2/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y=
34 github.com/andybalholm/brotli v1.0.3/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
35 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
36 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
37+github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI=
38+github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
39 github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
40 github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
41 github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
42+github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM=
43+github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg=
44 github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
45 github.com/klauspost/compress v1.13.5/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
46 github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
47diff --git a/main.go b/main.go
48index 55f866e18d0497c7d8c44ff21ea0adf1517b90be..3d6411d1c2cac54353b520600f1ffe6fa21054b3 100644
49--- a/main.go
50+++ b/main.go
51@@ -1,6 +1,7 @@
52 package main
53
54 import (
55+ "bytes"
56 "context"
57 "encoding/json"
58 "flag"
59@@ -10,6 +11,10 @@ "os"
60 "os/signal"
61 "time"
62
63+ "github.com/alecthomas/chroma/v2/formatters/html"
64+ "github.com/alecthomas/chroma/v2/lexers"
65+ "github.com/alecthomas/chroma/v2/styles"
66+
67 "git.gabrielgio.me/cerrado/pkg/config"
68 "git.gabrielgio.me/cerrado/pkg/worker"
69 "git.gabrielgio.me/cerrado/templates"
70@@ -33,6 +38,7 @@ flag.Parse()
71
72 mux := http.NewServeMux()
73 mux.HandleFunc("/", func(w http.ResponseWriter, _ *http.Request) {
74+ slog.Info("Handling index")
75
76 f, err := os.Open(*configPath)
77 if err != nil {
78@@ -52,8 +58,26 @@ slog.Error("Error parsing json", "error", err)
79 return
80 }
81
82+ lexer := lexers.Get("json")
83+ style := styles.Get("monokailight")
84+ formatter := html.New(
85+ html.WithLineNumbers(true),
86+ )
87+ iterator, err := lexer.Tokenise(nil, string(b))
88+ if err != nil {
89+ slog.Error("Error tokenise", "error", err)
90+ return
91+ }
92+
93+ var code bytes.Buffer
94+ err = formatter.Format(&code, style, iterator)
95+ if err != nil {
96+ slog.Error("Error format", "error", err)
97+ return
98+ }
99+
100 hello := &templates.HelloPage{
101- Body: string(b),
102+ Body: code.String(),
103 }
104
105 templates.WritePageTemplate(w, hello)
106diff --git a/templates/helloworld.qtpl b/templates/helloworld.qtpl
107index 02c09681378f5fad6de6fa1ec9550d59233cf887..66287eac78fadb51d34da5420d2700ff4b4bb511 100644
108--- a/templates/helloworld.qtpl
109+++ b/templates/helloworld.qtpl
110@@ -9,7 +9,7 @@
111 {% func (p *HelloPage) Content() %}
112 HelloWorld
113
114-{%s p.Body %}
115+{%s= p.Body %}
116 {% endfunc %}
117
118 {% func (p *HelloPage) Script() %}
119diff --git a/templates/helloworld.qtpl.go b/templates/helloworld.qtpl.go
120index 9ef78f55e201f7d50d7d373dc40fa30c682169bf..a12455fe6c09e8027a97fd8b4a1fe30179553928 100644
121--- a/templates/helloworld.qtpl.go
122+++ b/templates/helloworld.qtpl.go
123@@ -63,7 +63,7 @@ HelloWorld
124
125 `)
126 //line helloworld.qtpl:12
127- qw422016.E().S(p.Body)
128+ qw422016.N().S(p.Body)
129 //line helloworld.qtpl:12
130 qw422016.N().S(`
131 `)