commit
message
Using chroma for syntax highlighting for files
author
Ben Vogt <[email protected]>
date
2023-04-03 17:48:35
stats
5 file(s) changed,
118 insertions(+),
166 deletions(-)
files
file.template.html
go.mod
go.sum
main.go
styles.css
1diff --git a/file.template.html b/file.template.html
2index af8f118..eeb873d 100644
3--- a/file.template.html
4+++ b/file.template.html
5@@ -46,7 +46,7 @@
6 </table>
7 </div>
8 <div class="file">
9- <pre>{{.}}</pre>
10+ {{ .Content }}
11 </div>
12 </div>
13 </body>
14diff --git a/go.mod b/go.mod
15index 8afbf62..8f34af0 100644
16--- a/go.mod
17+++ b/go.mod
18@@ -2,13 +2,17 @@ module ben/gshr
19
20 go 1.20
21
22-require github.com/go-git/go-git/v5 v5.6.1
23+require (
24+ github.com/alecthomas/chroma v0.10.0
25+ github.com/go-git/go-git/v5 v5.6.1
26+)
27
28 require (
29 github.com/Microsoft/go-winio v0.5.2 // indirect
30 github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8 // indirect
31 github.com/acomagu/bufpipe v1.0.4 // indirect
32 github.com/cloudflare/circl v1.1.0 // indirect
33+ github.com/dlclark/regexp2 v1.4.0 // indirect
34 github.com/emirpasic/gods v1.18.1 // indirect
35 github.com/go-git/gcfg v1.5.0 // indirect
36 github.com/go-git/go-billy/v5 v5.4.1 // indirect
37diff --git a/go.sum b/go.sum
38index d864ac6..a3a1f90 100644
39--- a/go.sum
40+++ b/go.sum
41@@ -4,6 +4,8 @@ github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8 h1:wPbRQzjjwF
42 github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8/go.mod h1:I0gYDMZ6Z5GRU7l58bNFSkPTFN6Yl12dsUlAZ8xy98g=
43 github.com/acomagu/bufpipe v1.0.4 h1:e3H4WUzM3npvo5uv95QuJM3cQspFNtFBzvJ2oNjKIDQ=
44 github.com/acomagu/bufpipe v1.0.4/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4=
45+github.com/alecthomas/chroma v0.10.0 h1:7XDcGkCQopCNKjZHfYrNLraA+M7e0fMiJ/Mfikbfjek=
46+github.com/alecthomas/chroma v0.10.0/go.mod h1:jtJATyUxlIORhUOFNA9NZDWGAQ8wpxQQqNSB4rjA/1s=
47 github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8=
48 github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4=
49 github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
50@@ -15,6 +17,8 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ3
51 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
52 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
53 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
54+github.com/dlclark/regexp2 v1.4.0 h1:F1rxgk7p4uKjwIQxBs9oAXe5CqrXlCduYEJvrF4u93E=
55+github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc=
56 github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc=
57 github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ=
58 github.com/gliderlabs/ssh v0.3.5 h1:OcaySEmAQJgyYcArR+gGGTHCyE7nvhEMTlYY+Dp8CpY=
59diff --git a/main.go b/main.go
60index a819597..7c4e9a4 100644
61--- a/main.go
62+++ b/main.go
63@@ -1,6 +1,7 @@
64 package main
65
66 import (
67+ "bytes"
68 "fmt"
69 "html/template"
70 "io/fs"
71@@ -9,6 +10,9 @@ import (
72 "path/filepath"
73 "strings"
74
75+ "github.com/alecthomas/chroma/formatters/html"
76+ "github.com/alecthomas/chroma/lexers"
77+ "github.com/alecthomas/chroma/styles"
78 "github.com/go-git/go-git/v5"
79 "github.com/go-git/go-git/v5/plumbing/object"
80 )
81@@ -43,19 +47,35 @@ type TrackedFile struct {
82 Origin string
83 Destination string
84 DestinationDir string
85+ Content template.HTML
86 }
87
88-func (tf *TrackedFile) SaveTemplate(t *template.Template) {
89- err := os.MkdirAll(tf.DestinationDir, 0775)
90+func (f *TrackedFile) SaveTemplate(t *template.Template) {
91+ lexer := lexers.Match(f.Destination)
92+ if lexer == nil {
93+ lexer = lexers.Fallback
94+ }
95+ style := styles.Get("fruity")
96+ if style == nil {
97+ style = styles.Fallback
98+ }
99+ err := os.MkdirAll(f.DestinationDir, 0775)
100 checkErr(err)
101- fileBytes, err := os.ReadFile(tf.Origin)
102+ fileBytes, err := os.ReadFile(f.Origin)
103 checkErr(err)
104 fileStr := string(fileBytes)
105- err = os.MkdirAll(filepath.Dir(tf.Destination), 0775)
106+ iterator, err := lexer.Tokenise(nil, fileStr)
107+ formatter := html.New(html.WithClasses(true))
108+ s := ""
109+ buf := bytes.NewBufferString(s)
110+ err = formatter.Format(buf, style, iterator)
111+ checkErr(err)
112+ err = os.MkdirAll(filepath.Dir(f.Destination), 0775)
113 checkErr(err)
114- output, err := os.Create(tf.Destination)
115+ output, err := os.Create(f.Destination)
116 checkErr(err)
117- err = t.Execute(output, fileStr)
118+ f.Content = template.HTML(buf.String())
119+ err = t.Execute(output, f)
120 checkErr(err)
121 }
122
123@@ -152,7 +172,7 @@ func BuildFilesPages() {
124 Origin: filename,
125 Name: Name,
126 Mode: info.Mode().String(),
127- Size: fmt.Sprintf("%v bytes", info.Size()),
128+ Size: fmt.Sprintf("%v", info.Size()),
129 }
130 trackedFiles = append(trackedFiles, tf)
131 }
132diff --git a/styles.css b/styles.css
133index d812e55..20d7994 100644
134--- a/styles.css
135+++ b/styles.css
136@@ -331,7 +331,7 @@ div.content blockquote {
137 color: var(--blockquote-color);
138 font-style: italic;
139 letter-spacing: 0.002em;
140- font-family: Georgia, serif;
141+ font-family: var(--serif-font);
142 font-size: 1.1em
143 }
144
145@@ -339,22 +339,13 @@ div.content div.file {
146 padding: 0 0.4em;
147 }
148
149-div.content pre,
150-div.content code {
151- color: var(--code-color);
152- background-color: var(--code-bg);
153-}
154-
155 div.content pre {
156 overflow-x: auto;
157 padding: 1em;
158- background: var(--code-bg);
159- color: var(--text-color)
160 }
161
162 div.content code {
163 padding: 2px;
164- font-size: 13px
165 }
166
167 div.content code::before,
168@@ -410,12 +401,8 @@ div.content>*>td {
169 }
170
171 .chroma {
172- background-color: #f0f3f3;
173-}
174-
175-.chroma .err {
176- color: #aa0000;
177- background-color: #ffaaaa
178+ color: #ffffff;
179+ background-color: #111111;
180 }
181
182 .chroma .lnlinks {
183@@ -439,7 +426,7 @@ div.content>*>td {
184 }
185
186 .chroma .hl {
187- background-color: #d8dada
188+ background-color: #282828
189 }
190
191 .chroma .lnt {
192@@ -465,268 +452,210 @@ div.content>*>td {
193 }
194
195 .chroma .k {
196- color: #006699;
197+ color: #fb660a;
198 font-weight: bold
199 }
200
201 .chroma .kc {
202- color: #006699;
203+ color: #fb660a;
204 font-weight: bold
205 }
206
207 .chroma .kd {
208- color: #006699;
209+ color: #fb660a;
210 font-weight: bold
211 }
212
213 .chroma .kn {
214- color: #006699;
215+ color: #fb660a;
216 font-weight: bold
217 }
218
219 .chroma .kp {
220- color: #006699
221+ color: #fb660a
222 }
223
224 .chroma .kr {
225- color: #006699;
226+ color: #fb660a;
227 font-weight: bold
228 }
229
230 .chroma .kt {
231- color: #007788;
232+ color: #cdcaa9;
233 font-weight: bold
234 }
235
236 .chroma .na {
237- color: #330099
238-}
239-
240-.chroma .nb {
241- color: #336666
242-}
243-
244-.chroma .nc {
245- color: #00aa88;
246+ color: #ff0086;
247 font-weight: bold
248 }
249
250 .chroma .no {
251- color: #336600
252-}
253-
254-.chroma .nd {
255- color: #9999ff
256-}
257-
258-.chroma .ni {
259- color: #999999;
260- font-weight: bold
261-}
262-
263-.chroma .ne {
264- color: #cc0000;
265- font-weight: bold
266+ color: #0086d2
267 }
268
269 .chroma .nf {
270- color: #cc00ff
271-}
272-
273-.chroma .nl {
274- color: #9999ff
275-}
276-
277-.chroma .nn {
278- color: #00ccff;
279+ color: #ff0086;
280 font-weight: bold
281 }
282
283 .chroma .nt {
284- color: #330099;
285+ color: #fb660a;
286 font-weight: bold
287 }
288
289 .chroma .nv {
290- color: #003333
291+ color: #fb660a
292 }
293
294 .chroma .s {
295- color: #cc3300
296+ color: #0086d2
297 }
298
299 .chroma .sa {
300- color: #cc3300
301+ color: #0086d2
302 }
303
304 .chroma .sb {
305- color: #cc3300
306+ color: #0086d2
307 }
308
309 .chroma .sc {
310- color: #cc3300
311+ color: #0086d2
312 }
313
314 .chroma .dl {
315- color: #cc3300
316+ color: #0086d2
317 }
318
319 .chroma .sd {
320- color: #cc3300;
321- font-style: italic
322+ color: #0086d2
323 }
324
325 .chroma .s2 {
326- color: #cc3300
327+ color: #0086d2
328 }
329
330 .chroma .se {
331- color: #cc3300;
332- font-weight: bold
333+ color: #0086d2
334 }
335
336 .chroma .sh {
337- color: #cc3300
338+ color: #0086d2
339 }
340
341 .chroma .si {
342- color: #aa0000
343+ color: #0086d2
344 }
345
346 .chroma .sx {
347- color: #cc3300
348+ color: #0086d2
349 }
350
351 .chroma .sr {
352- color: #33aaaa
353+ color: #0086d2
354 }
355
356 .chroma .s1 {
357- color: #cc3300
358+ color: #0086d2
359 }
360
361 .chroma .ss {
362- color: #ffcc33
363+ color: #0086d2
364 }
365
366 .chroma .m {
367- color: #ff6600
368+ color: #0086f7;
369+ font-weight: bold
370 }
371
372 .chroma .mb {
373- color: #ff6600
374+ color: #0086f7;
375+ font-weight: bold
376 }
377
378 .chroma .mf {
379- color: #ff6600
380+ color: #0086f7;
381+ font-weight: bold
382 }
383
384 .chroma .mh {
385- color: #ff6600
386+ color: #0086f7;
387+ font-weight: bold
388 }
389
390 .chroma .mi {
391- color: #ff6600
392+ color: #0086f7;
393+ font-weight: bold
394 }
395
396 .chroma .il {
397- color: #ff6600
398+ color: #0086f7;
399+ font-weight: bold
400 }
401
402 .chroma .mo {
403- color: #ff6600
404-}
405-
406-.chroma .o {
407- color: #555555
408-}
409-
410-.chroma .ow {
411- color: #000000;
412+ color: #0086f7;
413 font-weight: bold
414 }
415
416 .chroma .c {
417- color: #0099ff;
418+ color: #008800;
419+ background-color: #0f140f;
420 font-style: italic
421 }
422
423 .chroma .ch {
424- color: #0099ff;
425+ color: #008800;
426+ background-color: #0f140f;
427 font-style: italic
428 }
429
430 .chroma .cm {
431- color: #0099ff;
432+ color: #008800;
433+ background-color: #0f140f;
434 font-style: italic
435 }
436
437 .chroma .c1 {
438- color: #0099ff;
439+ color: #008800;
440+ background-color: #0f140f;
441 font-style: italic
442 }
443
444 .chroma .cs {
445- color: #0099ff;
446- font-weight: bold;
447+ color: #008800;
448+ background-color: #0f140f;
449 font-style: italic
450 }
451
452 .chroma .cp {
453- color: #009999
454+ color: #ff0007;
455+ background-color: #0f140f;
456+ font-weight: bold;
457+ font-style: italic
458 }
459
460 .chroma .cpf {
461- color: #009999
462-}
463-
464-.chroma .gd {
465- background-color: #ffcccc
466-}
467-
468-.chroma .ge {
469+ color: #ff0007;
470+ background-color: #0f140f;
471+ font-weight: bold;
472 font-style: italic
473 }
474
475-.chroma .gr {
476- color: #ff0000
477-}
478-
479 .chroma .gh {
480- color: #003300;
481 font-weight: bold
482 }
483
484-.chroma .gi {
485- background-color: #ccffcc
486-}
487-
488 .chroma .go {
489- color: #aaaaaa
490-}
491-
492-.chroma .gp {
493- color: #000099;
494- font-weight: bold
495-}
496-
497-.chroma .gs {
498- font-weight: bold
499+ color: #444444;
500+ background-color: #222222
501 }
502
503 .chroma .gu {
504- color: #003300;
505 font-weight: bold
506 }
507
508-.chroma .gt {
509- color: #99cc66
510-}
511-
512-.chroma .gl {
513- text-decoration: underline
514-}
515-
516 .chroma .w {
517- color: #bbbbbb
518+ color: #888888
519 }
520\ No newline at end of file