gshr
git static host repo -- generates static html for repos
git clone https://git.vogt.world/gshr.git
Log | Files | README.md | LICENSE
← Commit log
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