Commit 01c88ba

Eric Bower  ·  2024-04-22 23:01:51 -0400 EDT
parent 5e46398
fix: `--theme` flag loads proper chroma styles
6 files changed,  +33, -720
+4, -5
......@@ -28,11 +28,10 @@ static: build clean
2828 --desc "static site generator for git" \
2929 --clone-url "https://github.com/picosh/pgit.git" \
3030 --home-url "https://git.erock.io" \
31+ --theme "algol" \
3132 --revs main
3233 .PHONY:
3334
34-deploy:
35- rsync -rv ./public/* hey@pgs.sh:/git-pgit-local
36- # $(PROJECT)
37- # ssh hey@pgs.sh link git-pgit $(PROJECT) --write
38-.PHONY: deploy
35+dev: static
36+ rsync -rv ./public/* pgs.sh:/git-pgit-local
37+.PHONY: dev
+2, -2
......@@ -2,8 +2,8 @@
22
33 A static site generator for git.
44
5-This golang binary will generate a commit log, files, and references based
6-on a git repository and the provided revisions.
5+This golang binary will generate a commit log, files, and references based on a
6+git repository and the provided revisions.
77
88 It will only generate a commit log and files for the provided revisions.
99
+25, -12
......@@ -7,6 +7,7 @@ import (
77 "flag"
88 "fmt"
99 "html/template"
10+ "log/slog"
1011 "math"
1112 "os"
1213 "path/filepath"
......@@ -14,7 +15,6 @@ import (
1415 "strings"
1516 "sync"
1617 "unicode/utf8"
17- "log/slog"
1818
1919 "github.com/alecthomas/chroma"
2020 formatterHtml "github.com/alecthomas/chroma/formatters/html"
......@@ -62,7 +62,8 @@ type Config struct {
6262 // logger
6363 Logger *slog.Logger
6464 // chroma style
65- Theme *chroma.Style
65+ Theme *chroma.Style
66+ Formatter *formatterHtml.Formatter
6667 }
6768
6869 type RevInfo interface {
......@@ -234,12 +235,7 @@ func diffFileType(_type git.DiffFileType) string {
234235 }
235236
236237 // converts contents of files in git tree to pretty formatted code
237-func parseText(filename string, text string, style *chroma.Style) (string, error) {
238- formatter := formatterHtml.New(
239- formatterHtml.WithLineNumbers(true),
240- formatterHtml.LinkableLineNumbers(true, ""),
241- formatterHtml.WithClasses(true),
242- )
238+func (c *Config) parseText(filename string, text string) (string, error) {
243239 lexer := lexers.Match(filename)
244240 if lexer == nil {
245241 lexer = lexers.Analyse(text)
......@@ -252,7 +248,7 @@ func parseText(filename string, text string, style *chroma.Style) (string, error
252248 return text, err
253249 }
254250 var buf bytes.Buffer
255- err = formatter.Format(&buf, style, iterator)
251+ err = c.Formatter.Format(&buf, c.Theme, iterator)
256252 if err != nil {
257253 return text, err
258254 }
......@@ -343,7 +339,7 @@ func (c *Config) copyStatic(dir string) error {
343339 bail(err)
344340 fp := filepath.Join(c.Outdir, e.Name())
345341 c.Logger.Info("writing", "filepath", fp)
346- os.WriteFile(fp, w, 0755)
342+ os.WriteFile(fp, w, 0644)
347343 }
348344
349345 return nil
......@@ -411,7 +407,7 @@ func (c *Config) writeHTMLTreeFile(pageData *PageData, treeItem *TreeItem) strin
411407 contents := "binary file, cannot display"
412408 if treeItem.IsTextFile {
413409 treeItem.NumLines = len(strings.Split(str, "\n"))
414- contents, err = parseText(treeItem.Entry.Name(), string(b), c.Theme)
410+ contents, err = c.parseText(treeItem.Entry.Name(), string(b))
415411 bail(err)
416412 }
417413
......@@ -484,7 +480,7 @@ func (c *Config) writeLogDiff(repo *git.Repository, pageData *PageData, commit *
484480 }
485481 }
486482 // set filename to something our `ParseText` recognizes (e.g. `.diff`)
487- finContent, err := parseText("commit.diff", content, c.Theme)
483+ finContent, err := c.parseText("commit.diff", content)
488484 bail(err)
489485
490486 fl.Content = template.HTML(finContent)
......@@ -1045,6 +1041,12 @@ func main() {
10451041 revs = []string{}
10461042 }
10471043
1044+ formatter := formatterHtml.New(
1045+ formatterHtml.WithLineNumbers(true),
1046+ formatterHtml.LinkableLineNumbers(true, ""),
1047+ formatterHtml.WithClasses(true),
1048+ )
1049+
10481050 config := &Config{
10491051 Outdir: out,
10501052 RepoPath: repoPath,
......@@ -1058,6 +1060,7 @@ func main() {
10581060 Desc: *descFlag,
10591061 MaxCommits: *maxCommitsFlag,
10601062 HideTreeLastCommit: *hideTreeLastCommitFlag,
1063+ Formatter: formatter,
10611064 }
10621065 config.Logger.Info("config", "config", config)
10631066
......@@ -1068,6 +1071,16 @@ func main() {
10681071 config.writeRepo()
10691072 config.copyStatic("static")
10701073
1074+ fp := filepath.Join(out, "syntax.css")
1075+ w, err := os.OpenFile(fp, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644)
1076+ if err != nil {
1077+ bail(err)
1078+ }
1079+ err = formatter.WriteCSS(w, theme)
1080+ if err != nil {
1081+ bail(err)
1082+ }
1083+
10711084 url := filepath.Join("/", "index.html")
10721085 config.Logger.Info("root url", "url", url)
10731086 }
+1, -0
......@@ -0,0 +1 @@
1+# dont ignore any files
+1, -1
......@@ -106,6 +106,7 @@ pre > code {
106106 background-color: inherit;
107107 padding: 0;
108108 border: none;
109+ color: initial;
109110 }
110111
111112 code {
......@@ -119,7 +120,6 @@ pre {
119120 padding: 1rem;
120121 margin: 1rem 0;
121122 overflow-x: auto;
122- background-color: var(--pre) !important;
123123 }
124124
125125 small {
+0, -700
......@@ -1,700 +0,0 @@
1-@media (prefers-color-scheme: light) {
2- /* Background */
3- .bg {
4- background-color: #ffffff;
5- }
6- /* PreWrapper */
7- .chroma {
8- background-color: #ffffff;
9- }
10- /* Other */
11- .chroma .x {
12- }
13- /* Error */
14- .chroma .err {
15- background-color: #a848a8;
16- }
17- /* CodeLine */
18- .chroma .cl {
19- }
20- /* LineTableTD */
21- .chroma .lntd {
22- vertical-align: top;
23- padding: 0;
24- margin: 0;
25- border: 0;
26- }
27- /* LineTable */
28- .chroma .lntable {
29- border-spacing: 0;
30- padding: 0;
31- margin: 0;
32- border: 0;
33- }
34- /* LineHighlight */
35- .chroma .hl {
36- background-color: #ffffcc;
37- }
38- /* LineNumbersTable */
39- .chroma .lnt {
40- white-space: pre;
41- user-select: none;
42- margin-right: 0.4em;
43- padding: 0 0.4em 0 0.4em;
44- color: #7f7f7f;
45- }
46- /* LineNumbers */
47- .chroma .ln {
48- white-space: pre;
49- user-select: none;
50- margin-right: 0.4em;
51- padding: 0 0.4em 0 0.4em;
52- color: #7f7f7f;
53- }
54- /* Line */
55- .chroma .line {
56- display: flex;
57- }
58- /* Keyword */
59- .chroma .k {
60- color: #2838b0;
61- }
62- /* KeywordConstant */
63- .chroma .kc {
64- color: #444444;
65- font-style: italic;
66- }
67- /* KeywordDeclaration */
68- .chroma .kd {
69- color: #2838b0;
70- font-style: italic;
71- }
72- /* KeywordNamespace */
73- .chroma .kn {
74- color: #2838b0;
75- }
76- /* KeywordPseudo */
77- .chroma .kp {
78- color: #2838b0;
79- }
80- /* KeywordReserved */
81- .chroma .kr {
82- color: #2838b0;
83- }
84- /* KeywordType */
85- .chroma .kt {
86- color: #2838b0;
87- font-style: italic;
88- }
89- /* Name */
90- .chroma .n {
91- }
92- /* NameAttribute */
93- .chroma .na {
94- color: #388038;
95- }
96- /* NameBuiltin */
97- .chroma .nb {
98- color: #388038;
99- }
100- /* NameBuiltinPseudo */
101- .chroma .bp {
102- font-style: italic;
103- }
104- /* NameClass */
105- .chroma .nc {
106- color: #287088;
107- }
108- /* NameConstant */
109- .chroma .no {
110- color: #b85820;
111- }
112- /* NameDecorator */
113- .chroma .nd {
114- color: #287088;
115- }
116- /* NameEntity */
117- .chroma .ni {
118- color: #709030;
119- }
120- /* NameException */
121- .chroma .ne {
122- color: #908828;
123- }
124- /* NameFunction */
125- .chroma .nf {
126- color: #785840;
127- }
128- /* NameFunctionMagic */
129- .chroma .fm {
130- color: #b85820;
131- }
132- /* NameLabel */
133- .chroma .nl {
134- color: #289870;
135- }
136- /* NameNamespace */
137- .chroma .nn {
138- color: #289870;
139- }
140- /* NameOther */
141- .chroma .nx {
142- }
143- /* NameProperty */
144- .chroma .py {
145- }
146- /* NameTag */
147- .chroma .nt {
148- color: #2838b0;
149- }
150- /* NameVariable */
151- .chroma .nv {
152- color: #b04040;
153- }
154- /* NameVariableClass */
155- .chroma .vc {
156- }
157- /* NameVariableGlobal */
158- .chroma .vg {
159- color: #908828;
160- }
161- /* NameVariableInstance */
162- .chroma .vi {
163- }
164- /* NameVariableMagic */
165- .chroma .vm {
166- color: #b85820;
167- }
168- /* Literal */
169- .chroma .l {
170- }
171- /* LiteralDate */
172- .chroma .ld {
173- }
174- /* LiteralString */
175- .chroma .s {
176- color: #b83838;
177- }
178- /* LiteralStringAffix */
179- .chroma .sa {
180- color: #444444;
181- }
182- /* LiteralStringBacktick */
183- .chroma .sb {
184- color: #b83838;
185- }
186- /* LiteralStringChar */
187- .chroma .sc {
188- color: #a848a8;
189- }
190- /* LiteralStringDelimiter */
191- .chroma .dl {
192- color: #b85820;
193- }
194- /* LiteralStringDoc */
195- .chroma .sd {
196- color: #b85820;
197- font-style: italic;
198- }
199- /* LiteralStringDouble */
200- .chroma .s2 {
201- color: #b83838;
202- }
203- /* LiteralStringEscape */
204- .chroma .se {
205- color: #709030;
206- }
207- /* LiteralStringHeredoc */
208- .chroma .sh {
209- color: #b83838;
210- }
211- /* LiteralStringInterpol */
212- .chroma .si {
213- color: #b83838;
214- text-decoration: underline;
215- }
216- /* LiteralStringOther */
217- .chroma .sx {
218- color: #a848a8;
219- }
220- /* LiteralStringRegex */
221- .chroma .sr {
222- color: #a848a8;
223- }
224- /* LiteralStringSingle */
225- .chroma .s1 {
226- color: #b83838;
227- }
228- /* LiteralStringSymbol */
229- .chroma .ss {
230- color: #b83838;
231- }
232- /* LiteralNumber */
233- .chroma .m {
234- color: #444444;
235- }
236- /* LiteralNumberBin */
237- .chroma .mb {
238- color: #444444;
239- }
240- /* LiteralNumberFloat */
241- .chroma .mf {
242- color: #444444;
243- }
244- /* LiteralNumberHex */
245- .chroma .mh {
246- color: #444444;
247- }
248- /* LiteralNumberInteger */
249- .chroma .mi {
250- color: #444444;
251- }
252- /* LiteralNumberIntegerLong */
253- .chroma .il {
254- color: #444444;
255- }
256- /* LiteralNumberOct */
257- .chroma .mo {
258- color: #444444;
259- }
260- /* Operator */
261- .chroma .o {
262- color: #666666;
263- }
264- /* OperatorWord */
265- .chroma .ow {
266- color: #a848a8;
267- }
268- /* Punctuation */
269- .chroma .p {
270- color: #888888;
271- }
272- /* Comment */
273- .chroma .c {
274- color: #888888;
275- font-style: italic;
276- }
277- /* CommentHashbang */
278- .chroma .ch {
279- color: #287088;
280- font-style: italic;
281- }
282- /* CommentMultiline */
283- .chroma .cm {
284- color: #888888;
285- font-style: italic;
286- }
287- /* CommentSingle */
288- .chroma .c1 {
289- color: #888888;
290- font-style: italic;
291- }
292- /* CommentSpecial */
293- .chroma .cs {
294- color: #888888;
295- font-style: italic;
296- }
297- /* CommentPreproc */
298- .chroma .cp {
299- color: #289870;
300- }
301- /* CommentPreprocFile */
302- .chroma .cpf {
303- color: #289870;
304- }
305- /* Generic */
306- .chroma .g {
307- }
308- /* GenericDeleted */
309- .chroma .gd {
310- color: #c02828;
311- }
312- /* GenericEmph */
313- .chroma .ge {
314- font-style: italic;
315- }
316- /* GenericError */
317- .chroma .gr {
318- color: #c02828;
319- }
320- /* GenericHeading */
321- .chroma .gh {
322- color: #666666;
323- }
324- /* GenericInserted */
325- .chroma .gi {
326- color: #388038;
327- }
328- /* GenericOutput */
329- .chroma .go {
330- color: #666666;
331- }
332- /* GenericPrompt */
333- .chroma .gp {
334- color: #444444;
335- }
336- /* GenericStrong */
337- .chroma .gs {
338- font-weight: bold;
339- }
340- /* GenericSubheading */
341- .chroma .gu {
342- color: #444444;
343- }
344- /* GenericTraceback */
345- .chroma .gt {
346- color: #2838b0;
347- }
348- /* GenericUnderline */
349- .chroma .gl {
350- text-decoration: underline;
351- }
352- /* TextWhitespace */
353- .chroma .w {
354- color: #a89028;
355- }
356-}
357-
358-@media (prefers-color-scheme: dark) {
359- /* Background */
360- .bg {
361- color: #f8f8f2;
362- background-color: #282a36;
363- }
364- /* PreWrapper */
365- .chroma {
366- color: #f8f8f2;
367- background-color: #282a36;
368- }
369- /* Other */
370- .chroma .x {
371- }
372- /* Error */
373- .chroma .err {
374- }
375- /* CodeLine */
376- .chroma .cl {
377- }
378- /* LineTableTD */
379- .chroma .lntd {
380- vertical-align: top;
381- padding: 0;
382- margin: 0;
383- border: 0;
384- }
385- /* LineTable */
386- .chroma .lntable {
387- border-spacing: 0;
388- padding: 0;
389- margin: 0;
390- border: 0;
391- }
392- /* LineHighlight */
393- .chroma .hl {
394- background-color: #ffffcc;
395- }
396- /* LineNumbersTable */
397- .chroma .lnt {
398- white-space: pre;
399- user-select: none;
400- margin-right: 0.4em;
401- padding: 0 0.4em 0 0.4em;
402- color: #7f7f7f;
403- }
404- /* LineNumbers */
405- .chroma .ln {
406- white-space: pre;
407- user-select: none;
408- margin-right: 0.4em;
409- padding: 0 0.4em 0 0.4em;
410- color: #7f7f7f;
411- }
412- /* Line */
413- .chroma .line {
414- display: flex;
415- }
416- /* Keyword */
417- .chroma .k {
418- color: #ff79c6;
419- }
420- /* KeywordConstant */
421- .chroma .kc {
422- color: #ff79c6;
423- }
424- /* KeywordDeclaration */
425- .chroma .kd {
426- color: #8be9fd;
427- font-style: italic;
428- }
429- /* KeywordNamespace */
430- .chroma .kn {
431- color: #ff79c6;
432- }
433- /* KeywordPseudo */
434- .chroma .kp {
435- color: #ff79c6;
436- }
437- /* KeywordReserved */
438- .chroma .kr {
439- color: #ff79c6;
440- }
441- /* KeywordType */
442- .chroma .kt {
443- color: #8be9fd;
444- }
445- /* Name */
446- .chroma .n {
447- }
448- /* NameAttribute */
449- .chroma .na {
450- color: #50fa7b;
451- }
452- /* NameBuiltin */
453- .chroma .nb {
454- color: #8be9fd;
455- font-style: italic;
456- }
457- /* NameBuiltinPseudo */
458- .chroma .bp {
459- }
460- /* NameClass */
461- .chroma .nc {
462- color: #50fa7b;
463- }
464- /* NameConstant */
465- .chroma .no {
466- }
467- /* NameDecorator */
468- .chroma .nd {
469- }
470- /* NameEntity */
471- .chroma .ni {
472- }
473- /* NameException */
474- .chroma .ne {
475- }
476- /* NameFunction */
477- .chroma .nf {
478- color: #50fa7b;
479- }
480- /* NameFunctionMagic */
481- .chroma .fm {
482- }
483- /* NameLabel */
484- .chroma .nl {
485- color: #8be9fd;
486- font-style: italic;
487- }
488- /* NameNamespace */
489- .chroma .nn {
490- }
491- /* NameOther */
492- .chroma .nx {
493- }
494- /* NameProperty */
495- .chroma .py {
496- }
497- /* NameTag */
498- .chroma .nt {
499- color: #ff79c6;
500- }
501- /* NameVariable */
502- .chroma .nv {
503- color: #8be9fd;
504- font-style: italic;
505- }
506- /* NameVariableClass */
507- .chroma .vc {
508- color: #8be9fd;
509- font-style: italic;
510- }
511- /* NameVariableGlobal */
512- .chroma .vg {
513- color: #8be9fd;
514- font-style: italic;
515- }
516- /* NameVariableInstance */
517- .chroma .vi {
518- color: #8be9fd;
519- font-style: italic;
520- }
521- /* NameVariableMagic */
522- .chroma .vm {
523- }
524- /* Literal */
525- .chroma .l {
526- }
527- /* LiteralDate */
528- .chroma .ld {
529- }
530- /* LiteralString */
531- .chroma .s {
532- color: #f1fa8c;
533- }
534- /* LiteralStringAffix */
535- .chroma .sa {
536- color: #f1fa8c;
537- }
538- /* LiteralStringBacktick */
539- .chroma .sb {
540- color: #f1fa8c;
541- }
542- /* LiteralStringChar */
543- .chroma .sc {
544- color: #f1fa8c;
545- }
546- /* LiteralStringDelimiter */
547- .chroma .dl {
548- color: #f1fa8c;
549- }
550- /* LiteralStringDoc */
551- .chroma .sd {
552- color: #f1fa8c;
553- }
554- /* LiteralStringDouble */
555- .chroma .s2 {
556- color: #f1fa8c;
557- }
558- /* LiteralStringEscape */
559- .chroma .se {
560- color: #f1fa8c;
561- }
562- /* LiteralStringHeredoc */
563- .chroma .sh {
564- color: #f1fa8c;
565- }
566- /* LiteralStringInterpol */
567- .chroma .si {
568- color: #f1fa8c;
569- }
570- /* LiteralStringOther */
571- .chroma .sx {
572- color: #f1fa8c;
573- }
574- /* LiteralStringRegex */
575- .chroma .sr {
576- color: #f1fa8c;
577- }
578- /* LiteralStringSingle */
579- .chroma .s1 {
580- color: #f1fa8c;
581- }
582- /* LiteralStringSymbol */
583- .chroma .ss {
584- color: #f1fa8c;
585- }
586- /* LiteralNumber */
587- .chroma .m {
588- color: #bd93f9;
589- }
590- /* LiteralNumberBin */
591- .chroma .mb {
592- color: #bd93f9;
593- }
594- /* LiteralNumberFloat */
595- .chroma .mf {
596- color: #bd93f9;
597- }
598- /* LiteralNumberHex */
599- .chroma .mh {
600- color: #bd93f9;
601- }
602- /* LiteralNumberInteger */
603- .chroma .mi {
604- color: #bd93f9;
605- }
606- /* LiteralNumberIntegerLong */
607- .chroma .il {
608- color: #bd93f9;
609- }
610- /* LiteralNumberOct */
611- .chroma .mo {
612- color: #bd93f9;
613- }
614- /* Operator */
615- .chroma .o {
616- color: #ff79c6;
617- }
618- /* OperatorWord */
619- .chroma .ow {
620- color: #ff79c6;
621- }
622- /* Punctuation */
623- .chroma .p {
624- }
625- /* Comment */
626- .chroma .c {
627- color: #6272a4;
628- }
629- /* CommentHashbang */
630- .chroma .ch {
631- color: #6272a4;
632- }
633- /* CommentMultiline */
634- .chroma .cm {
635- color: #6272a4;
636- }
637- /* CommentSingle */
638- .chroma .c1 {
639- color: #6272a4;
640- }
641- /* CommentSpecial */
642- .chroma .cs {
643- color: #6272a4;
644- }
645- /* CommentPreproc */
646- .chroma .cp {
647- color: #ff79c6;
648- }
649- /* CommentPreprocFile */
650- .chroma .cpf {
651- color: #ff79c6;
652- }
653- /* Generic */
654- .chroma .g {
655- }
656- /* GenericDeleted */
657- .chroma .gd {
658- color: #ff5555;
659- }
660- /* GenericEmph */
661- .chroma .ge {
662- text-decoration: underline;
663- }
664- /* GenericError */
665- .chroma .gr {
666- }
667- /* GenericHeading */
668- .chroma .gh {
669- font-weight: bold;
670- }
671- /* GenericInserted */
672- .chroma .gi {
673- color: #50fa7b;
674- font-weight: bold;
675- }
676- /* GenericOutput */
677- .chroma .go {
678- color: #44475a;
679- }
680- /* GenericPrompt */
681- .chroma .gp {
682- }
683- /* GenericStrong */
684- .chroma .gs {
685- }
686- /* GenericSubheading */
687- .chroma .gu {
688- font-weight: bold;
689- }
690- /* GenericTraceback */
691- .chroma .gt {
692- }
693- /* GenericUnderline */
694- .chroma .gl {
695- text-decoration: underline;
696- }
697- /* TextWhitespace */
698- .chroma .w {
699- }
700-}