1diff --git a/pkg/handler/about/handler.go b/pkg/handler/about/handler.go
2index a2caa4eeea02e1e6885069fc90f0d1ef479b4798..1acde601c7aa036550ab6e73253f7c820646e1e6 100644
3--- a/pkg/handler/about/handler.go
4+++ b/pkg/handler/about/handler.go
5@@ -50,7 +50,7 @@ renderer := html.NewRenderer(opts)
6
7 bs = markdown.Render(doc, renderer)
8
9- gitList := &templates.HelloPage{
10+ gitList := &templates.AboutPage{
11 Body: bs,
12 }
13 templates.WritePageTemplate(w, gitList)
14diff --git a/pkg/handler/config/handler.go b/pkg/handler/config/handler.go
15index c278e35d0e624ac09c1a0065f0f906bd6e88dfe1..30f428383db9ada7b0337c2400b983a7d1a4b8c2 100644
16--- a/pkg/handler/config/handler.go
17+++ b/pkg/handler/config/handler.go
18@@ -56,7 +56,7 @@ slog.Error("Error format", "error", err)
19 return
20 }
21
22- hello := &templates.HelloPage{
23+ hello := &templates.ConfigPage{
24 Body: code.Bytes(),
25 }
26
27diff --git a/scss/main.scss b/scss/main.scss
28index fc16ca57f6aa40d4c92e7243b7c9bee7b10b3ea5..f57579ac37605a06ed15ba86c2f689c926d07f4c 100644
29--- a/scss/main.scss
30+++ b/scss/main.scss
31@@ -50,6 +50,10 @@ margin: 0.5rem 0;
32 background: #f8f9fa;
33 }
34
35+.selected {
36+ text-decoration: underline;
37+}
38+
39 .event > h4 {
40 margin: 0;
41 }
42diff --git a/templates/about.qtpl b/templates/about.qtpl
43new file mode 100644
44index 0000000000000000000000000000000000000000..faee50e18821c54e739efd5611c0b548cf94cc15
45--- /dev/null
46+++ b/templates/about.qtpl
47@@ -0,0 +1,16 @@
48+{% code
49+type AboutPage struct {
50+ Body []byte
51+}
52+%}
53+
54+{% func (p *AboutPage) Title() %}Hello{% endfunc %}
55+
56+{% func (p *AboutPage) Navbar() %}{%= Navbar(About) %}{% endfunc %}
57+
58+{% func (p *AboutPage) Content() %}
59+{%z= p.Body %}
60+{% endfunc %}
61+
62+{% func (p *AboutPage) Script() %}
63+{% endfunc %}
64diff --git a/templates/about.qtpl.go b/templates/about.qtpl.go
65new file mode 100644
66index 0000000000000000000000000000000000000000..aaa25148913dfd971fc954840e85f3c2aef70905
67--- /dev/null
68+++ b/templates/about.qtpl.go
69@@ -0,0 +1,162 @@
70+// Code generated by qtc from "about.qtpl". DO NOT EDIT.
71+// See https://github.com/valyala/quicktemplate for details.
72+
73+//line about.qtpl:1
74+package templates
75+
76+//line about.qtpl:1
77+import (
78+ qtio422016 "io"
79+
80+ qt422016 "github.com/valyala/quicktemplate"
81+)
82+
83+//line about.qtpl:1
84+var (
85+ _ = qtio422016.Copy
86+ _ = qt422016.AcquireByteBuffer
87+)
88+
89+//line about.qtpl:2
90+type AboutPage struct {
91+ Body []byte
92+}
93+
94+//line about.qtpl:7
95+func (p *AboutPage) StreamTitle(qw422016 *qt422016.Writer) {
96+//line about.qtpl:7
97+ qw422016.N().S(`Hello`)
98+//line about.qtpl:7
99+}
100+
101+//line about.qtpl:7
102+func (p *AboutPage) WriteTitle(qq422016 qtio422016.Writer) {
103+//line about.qtpl:7
104+ qw422016 := qt422016.AcquireWriter(qq422016)
105+//line about.qtpl:7
106+ p.StreamTitle(qw422016)
107+//line about.qtpl:7
108+ qt422016.ReleaseWriter(qw422016)
109+//line about.qtpl:7
110+}
111+
112+//line about.qtpl:7
113+func (p *AboutPage) Title() string {
114+//line about.qtpl:7
115+ qb422016 := qt422016.AcquireByteBuffer()
116+//line about.qtpl:7
117+ p.WriteTitle(qb422016)
118+//line about.qtpl:7
119+ qs422016 := string(qb422016.B)
120+//line about.qtpl:7
121+ qt422016.ReleaseByteBuffer(qb422016)
122+//line about.qtpl:7
123+ return qs422016
124+//line about.qtpl:7
125+}
126+
127+//line about.qtpl:9
128+func (p *AboutPage) StreamNavbar(qw422016 *qt422016.Writer) {
129+//line about.qtpl:9
130+ StreamNavbar(qw422016, About)
131+//line about.qtpl:9
132+}
133+
134+//line about.qtpl:9
135+func (p *AboutPage) WriteNavbar(qq422016 qtio422016.Writer) {
136+//line about.qtpl:9
137+ qw422016 := qt422016.AcquireWriter(qq422016)
138+//line about.qtpl:9
139+ p.StreamNavbar(qw422016)
140+//line about.qtpl:9
141+ qt422016.ReleaseWriter(qw422016)
142+//line about.qtpl:9
143+}
144+
145+//line about.qtpl:9
146+func (p *AboutPage) Navbar() string {
147+//line about.qtpl:9
148+ qb422016 := qt422016.AcquireByteBuffer()
149+//line about.qtpl:9
150+ p.WriteNavbar(qb422016)
151+//line about.qtpl:9
152+ qs422016 := string(qb422016.B)
153+//line about.qtpl:9
154+ qt422016.ReleaseByteBuffer(qb422016)
155+//line about.qtpl:9
156+ return qs422016
157+//line about.qtpl:9
158+}
159+
160+//line about.qtpl:11
161+func (p *AboutPage) StreamContent(qw422016 *qt422016.Writer) {
162+//line about.qtpl:11
163+ qw422016.N().S(`
164+`)
165+//line about.qtpl:12
166+ qw422016.N().Z(p.Body)
167+//line about.qtpl:12
168+ qw422016.N().S(`
169+`)
170+//line about.qtpl:13
171+}
172+
173+//line about.qtpl:13
174+func (p *AboutPage) WriteContent(qq422016 qtio422016.Writer) {
175+//line about.qtpl:13
176+ qw422016 := qt422016.AcquireWriter(qq422016)
177+//line about.qtpl:13
178+ p.StreamContent(qw422016)
179+//line about.qtpl:13
180+ qt422016.ReleaseWriter(qw422016)
181+//line about.qtpl:13
182+}
183+
184+//line about.qtpl:13
185+func (p *AboutPage) Content() string {
186+//line about.qtpl:13
187+ qb422016 := qt422016.AcquireByteBuffer()
188+//line about.qtpl:13
189+ p.WriteContent(qb422016)
190+//line about.qtpl:13
191+ qs422016 := string(qb422016.B)
192+//line about.qtpl:13
193+ qt422016.ReleaseByteBuffer(qb422016)
194+//line about.qtpl:13
195+ return qs422016
196+//line about.qtpl:13
197+}
198+
199+//line about.qtpl:15
200+func (p *AboutPage) StreamScript(qw422016 *qt422016.Writer) {
201+//line about.qtpl:15
202+ qw422016.N().S(`
203+`)
204+//line about.qtpl:16
205+}
206+
207+//line about.qtpl:16
208+func (p *AboutPage) WriteScript(qq422016 qtio422016.Writer) {
209+//line about.qtpl:16
210+ qw422016 := qt422016.AcquireWriter(qq422016)
211+//line about.qtpl:16
212+ p.StreamScript(qw422016)
213+//line about.qtpl:16
214+ qt422016.ReleaseWriter(qw422016)
215+//line about.qtpl:16
216+}
217+
218+//line about.qtpl:16
219+func (p *AboutPage) Script() string {
220+//line about.qtpl:16
221+ qb422016 := qt422016.AcquireByteBuffer()
222+//line about.qtpl:16
223+ p.WriteScript(qb422016)
224+//line about.qtpl:16
225+ qs422016 := string(qb422016.B)
226+//line about.qtpl:16
227+ qt422016.ReleaseByteBuffer(qb422016)
228+//line about.qtpl:16
229+ return qs422016
230+//line about.qtpl:16
231+}
232diff --git a/templates/base.qtpl b/templates/base.qtpl
233index d8d1d344fcc5a6f70683c0c3fd95494ec6055322..ba32aad77d3aa3bf33796127b6af71409d673e1c 100644
234--- a/templates/base.qtpl
235+++ b/templates/base.qtpl
236@@ -2,14 +2,19 @@ This is a base page template. All the other template pages implement this interface.
237
238 {% import "strconv" %}
239
240+{% code
241+ var Slug = ""
242+%}
243+
244 {% interface
245 Page {
246 Title()
247 Content()
248 Script()
249+ Navbar()
250 }
251-
252 %}
253+
254
255 {% code func FromUInttoString(u *uint) string {
256 if u != nil {
257@@ -19,10 +24,6 @@ return ""
258 }
259 %}
260
261-{% code
262- var Slug = ""
263-%}
264-
265 Page prints a page implementing Page interface.
266 {% func PageTemplate(p Page) %}
267 <html lang="en">
268@@ -34,14 +35,7 @@ <link rel="stylesheet" href="/static/main{%s Slug%}.css">
269 <meta name="viewport" content="width=device-width, initial-scale=1" />
270 </head>
271 <body>
272- <nav class="container navbar navbar-expand-sm">
273- <div class="navbar-nav">
274- <a class="nav-link" href="/git">git</a>
275- <a class="nav-link" href="/list">list</a>
276- <a class="nav-link" href="/about">about</a>
277- <a class="nav-link" href="/config">config</a>
278- </div>
279- </nav>
280+ {%= p.Navbar() %}
281 <div class="container">
282 {%= p.Content() %}
283 </div>
284diff --git a/templates/base.qtpl.go b/templates/base.qtpl.go
285index 15c9e4f0ae2b83b1bb86993cb9e15a280a821318..2f419c68086d58c248e274382152c0ab9a3fc6fb 100644
286--- a/templates/base.qtpl.go
287+++ b/templates/base.qtpl.go
288@@ -24,29 +24,38 @@ _ = qt422016.AcquireByteBuffer
289 )
290
291 //line base.qtpl:6
292+var Slug = ""
293+
294+//line base.qtpl:10
295 type Page interface {
296-//line base.qtpl:6
297+//line base.qtpl:10
298 Title() string
299-//line base.qtpl:6
300+//line base.qtpl:10
301 StreamTitle(qw422016 *qt422016.Writer)
302-//line base.qtpl:6
303+//line base.qtpl:10
304 WriteTitle(qq422016 qtio422016.Writer)
305-//line base.qtpl:6
306+//line base.qtpl:10
307 Content() string
308-//line base.qtpl:6
309+//line base.qtpl:10
310 StreamContent(qw422016 *qt422016.Writer)
311-//line base.qtpl:6
312+//line base.qtpl:10
313 WriteContent(qq422016 qtio422016.Writer)
314-//line base.qtpl:6
315+//line base.qtpl:10
316 Script() string
317-//line base.qtpl:6
318+//line base.qtpl:10
319 StreamScript(qw422016 *qt422016.Writer)
320-//line base.qtpl:6
321+//line base.qtpl:10
322 WriteScript(qq422016 qtio422016.Writer)
323-//line base.qtpl:6
324+//line base.qtpl:10
325+ Navbar() string
326+//line base.qtpl:10
327+ StreamNavbar(qw422016 *qt422016.Writer)
328+//line base.qtpl:10
329+ WriteNavbar(qq422016 qtio422016.Writer)
330+//line base.qtpl:10
331 }
332
333-//line base.qtpl:14
334+//line base.qtpl:19
335 func FromUInttoString(u *uint) string {
336 if u != nil {
337 return strconv.FormatUint(uint64(*u), 10)
338@@ -54,180 +63,174 @@ }
339 return ""
340 }
341
342-//line base.qtpl:23
343-var Slug = ""
344-
345 // Page prints a page implementing Page interface.
346
347-//line base.qtpl:27
348+//line base.qtpl:28
349 func StreamPageTemplate(qw422016 *qt422016.Writer, p Page) {
350-//line base.qtpl:27
351+//line base.qtpl:28
352 qw422016.N().S(`
353 <html lang="en">
354 <head>
355 <meta charset="utf-8">
356 <link rel="icon" href="data:,">
357 <title>cerrado | `)
358-//line base.qtpl:32
359+//line base.qtpl:33
360 p.StreamTitle(qw422016)
361-//line base.qtpl:32
362+//line base.qtpl:33
363 qw422016.N().S(`</title>
364 <link rel="stylesheet" href="/static/main`)
365-//line base.qtpl:33
366+//line base.qtpl:34
367 qw422016.E().S(Slug)
368-//line base.qtpl:33
369+//line base.qtpl:34
370 qw422016.N().S(`.css">
371 <meta name="viewport" content="width=device-width, initial-scale=1" />
372 </head>
373 <body>
374- <nav class="container navbar navbar-expand-sm">
375- <div class="navbar-nav">
376- <a class="nav-link" href="/git">git</a>
377- <a class="nav-link" href="/list">list</a>
378- <a class="nav-link" href="/about">about</a>
379- <a class="nav-link" href="/config">config</a>
380- </div>
381- </nav>
382+ `)
383+//line base.qtpl:38
384+ p.StreamNavbar(qw422016)
385+//line base.qtpl:38
386+ qw422016.N().S(`
387 <div class="container">
388 `)
389-//line base.qtpl:46
390+//line base.qtpl:40
391 p.StreamContent(qw422016)
392-//line base.qtpl:46
393+//line base.qtpl:40
394 qw422016.N().S(`
395 </div>
396 </body>
397 `)
398-//line base.qtpl:49
399+//line base.qtpl:43
400 p.StreamScript(qw422016)
401-//line base.qtpl:49
402+//line base.qtpl:43
403 qw422016.N().S(`
404 </html>
405 `)
406-//line base.qtpl:51
407+//line base.qtpl:45
408 }
409
410-//line base.qtpl:51
411+//line base.qtpl:45
412 func WritePageTemplate(qq422016 qtio422016.Writer, p Page) {
413-//line base.qtpl:51
414+//line base.qtpl:45
415 qw422016 := qt422016.AcquireWriter(qq422016)
416-//line base.qtpl:51
417+//line base.qtpl:45
418 StreamPageTemplate(qw422016, p)
419-//line base.qtpl:51
420+//line base.qtpl:45
421 qt422016.ReleaseWriter(qw422016)
422-//line base.qtpl:51
423+//line base.qtpl:45
424 }
425
426-//line base.qtpl:51
427+//line base.qtpl:45
428 func PageTemplate(p Page) string {
429-//line base.qtpl:51
430+//line base.qtpl:45
431 qb422016 := qt422016.AcquireByteBuffer()
432-//line base.qtpl:51
433+//line base.qtpl:45
434 WritePageTemplate(qb422016, p)
435-//line base.qtpl:51
436+//line base.qtpl:45
437 qs422016 := string(qb422016.B)
438-//line base.qtpl:51
439+//line base.qtpl:45
440 qt422016.ReleaseByteBuffer(qb422016)
441-//line base.qtpl:51
442+//line base.qtpl:45
443 return qs422016
444-//line base.qtpl:51
445+//line base.qtpl:45
446 }
447
448-//line base.qtpl:53
449+//line base.qtpl:47
450 type BasePage struct{}
451
452-//line base.qtpl:54
453+//line base.qtpl:48
454 func (p *BasePage) StreamTitle(qw422016 *qt422016.Writer) {
455-//line base.qtpl:54
456+//line base.qtpl:48
457 qw422016.N().S(`Empty`)
458-//line base.qtpl:54
459+//line base.qtpl:48
460 }
461
462-//line base.qtpl:54
463+//line base.qtpl:48
464 func (p *BasePage) WriteTitle(qq422016 qtio422016.Writer) {
465-//line base.qtpl:54
466+//line base.qtpl:48
467 qw422016 := qt422016.AcquireWriter(qq422016)
468-//line base.qtpl:54
469+//line base.qtpl:48
470 p.StreamTitle(qw422016)
471-//line base.qtpl:54
472+//line base.qtpl:48
473 qt422016.ReleaseWriter(qw422016)
474-//line base.qtpl:54
475+//line base.qtpl:48
476 }
477
478-//line base.qtpl:54
479+//line base.qtpl:48
480 func (p *BasePage) Title() string {
481-//line base.qtpl:54
482+//line base.qtpl:48
483 qb422016 := qt422016.AcquireByteBuffer()
484-//line base.qtpl:54
485+//line base.qtpl:48
486 p.WriteTitle(qb422016)
487-//line base.qtpl:54
488+//line base.qtpl:48
489 qs422016 := string(qb422016.B)
490-//line base.qtpl:54
491+//line base.qtpl:48
492 qt422016.ReleaseByteBuffer(qb422016)
493-//line base.qtpl:54
494+//line base.qtpl:48
495 return qs422016
496-//line base.qtpl:54
497+//line base.qtpl:48
498 }
499
500-//line base.qtpl:55
501+//line base.qtpl:49
502 func (p *BasePage) StreamBody(qw422016 *qt422016.Writer) {
503-//line base.qtpl:55
504+//line base.qtpl:49
505 qw422016.N().S(`HelloWorld`)
506-//line base.qtpl:55
507+//line base.qtpl:49
508 }
509
510-//line base.qtpl:55
511+//line base.qtpl:49
512 func (p *BasePage) WriteBody(qq422016 qtio422016.Writer) {
513-//line base.qtpl:55
514+//line base.qtpl:49
515 qw422016 := qt422016.AcquireWriter(qq422016)
516-//line base.qtpl:55
517+//line base.qtpl:49
518 p.StreamBody(qw422016)
519-//line base.qtpl:55
520+//line base.qtpl:49
521 qt422016.ReleaseWriter(qw422016)
522-//line base.qtpl:55
523+//line base.qtpl:49
524 }
525
526-//line base.qtpl:55
527+//line base.qtpl:49
528 func (p *BasePage) Body() string {
529-//line base.qtpl:55
530+//line base.qtpl:49
531 qb422016 := qt422016.AcquireByteBuffer()
532-//line base.qtpl:55
533+//line base.qtpl:49
534 p.WriteBody(qb422016)
535-//line base.qtpl:55
536+//line base.qtpl:49
537 qs422016 := string(qb422016.B)
538-//line base.qtpl:55
539+//line base.qtpl:49
540 qt422016.ReleaseByteBuffer(qb422016)
541-//line base.qtpl:55
542+//line base.qtpl:49
543 return qs422016
544-//line base.qtpl:55
545+//line base.qtpl:49
546 }
547
548-//line base.qtpl:56
549+//line base.qtpl:50
550 func (p *BasePage) StreamScript(qw422016 *qt422016.Writer) {
551-//line base.qtpl:56
552+//line base.qtpl:50
553 }
554
555-//line base.qtpl:56
556+//line base.qtpl:50
557 func (p *BasePage) WriteScript(qq422016 qtio422016.Writer) {
558-//line base.qtpl:56
559+//line base.qtpl:50
560 qw422016 := qt422016.AcquireWriter(qq422016)
561-//line base.qtpl:56
562+//line base.qtpl:50
563 p.StreamScript(qw422016)
564-//line base.qtpl:56
565+//line base.qtpl:50
566 qt422016.ReleaseWriter(qw422016)
567-//line base.qtpl:56
568+//line base.qtpl:50
569 }
570
571-//line base.qtpl:56
572+//line base.qtpl:50
573 func (p *BasePage) Script() string {
574-//line base.qtpl:56
575+//line base.qtpl:50
576 qb422016 := qt422016.AcquireByteBuffer()
577-//line base.qtpl:56
578+//line base.qtpl:50
579 p.WriteScript(qb422016)
580-//line base.qtpl:56
581+//line base.qtpl:50
582 qs422016 := string(qb422016.B)
583-//line base.qtpl:56
584+//line base.qtpl:50
585 qt422016.ReleaseByteBuffer(qb422016)
586-//line base.qtpl:56
587+//line base.qtpl:50
588 return qs422016
589-//line base.qtpl:56
590+//line base.qtpl:50
591 }
592diff --git a/templates/config.qtpl b/templates/config.qtpl
593new file mode 100644
594index 0000000000000000000000000000000000000000..c5146b8b015513ceeec3fe0bcaf42c3301380309
595--- /dev/null
596+++ b/templates/config.qtpl
597@@ -0,0 +1,16 @@
598+{% code
599+type ConfigPage struct {
600+ Body []byte
601+}
602+%}
603+
604+{% func (p *ConfigPage) Title() %}Hello{% endfunc %}
605+
606+{% func (p *ConfigPage) Navbar() %}{%= Navbar(Config) %}{% endfunc %}
607+
608+{% func (p *ConfigPage) Content() %}
609+{%z= p.Body %}
610+{% endfunc %}
611+
612+{% func (p *ConfigPage) Script() %}
613+{% endfunc %}
614diff --git a/templates/config.qtpl.go b/templates/config.qtpl.go
615new file mode 100644
616index 0000000000000000000000000000000000000000..a5df086e3ce1d3f9f186b3fb28aea4659db0649c
617--- /dev/null
618+++ b/templates/config.qtpl.go
619@@ -0,0 +1,162 @@
620+// Code generated by qtc from "config.qtpl". DO NOT EDIT.
621+// See https://github.com/valyala/quicktemplate for details.
622+
623+//line config.qtpl:1
624+package templates
625+
626+//line config.qtpl:1
627+import (
628+ qtio422016 "io"
629+
630+ qt422016 "github.com/valyala/quicktemplate"
631+)
632+
633+//line config.qtpl:1
634+var (
635+ _ = qtio422016.Copy
636+ _ = qt422016.AcquireByteBuffer
637+)
638+
639+//line config.qtpl:2
640+type ConfigPage struct {
641+ Body []byte
642+}
643+
644+//line config.qtpl:7
645+func (p *ConfigPage) StreamTitle(qw422016 *qt422016.Writer) {
646+//line config.qtpl:7
647+ qw422016.N().S(`Hello`)
648+//line config.qtpl:7
649+}
650+
651+//line config.qtpl:7
652+func (p *ConfigPage) WriteTitle(qq422016 qtio422016.Writer) {
653+//line config.qtpl:7
654+ qw422016 := qt422016.AcquireWriter(qq422016)
655+//line config.qtpl:7
656+ p.StreamTitle(qw422016)
657+//line config.qtpl:7
658+ qt422016.ReleaseWriter(qw422016)
659+//line config.qtpl:7
660+}
661+
662+//line config.qtpl:7
663+func (p *ConfigPage) Title() string {
664+//line config.qtpl:7
665+ qb422016 := qt422016.AcquireByteBuffer()
666+//line config.qtpl:7
667+ p.WriteTitle(qb422016)
668+//line config.qtpl:7
669+ qs422016 := string(qb422016.B)
670+//line config.qtpl:7
671+ qt422016.ReleaseByteBuffer(qb422016)
672+//line config.qtpl:7
673+ return qs422016
674+//line config.qtpl:7
675+}
676+
677+//line config.qtpl:9
678+func (p *ConfigPage) StreamNavbar(qw422016 *qt422016.Writer) {
679+//line config.qtpl:9
680+ StreamNavbar(qw422016, Config)
681+//line config.qtpl:9
682+}
683+
684+//line config.qtpl:9
685+func (p *ConfigPage) WriteNavbar(qq422016 qtio422016.Writer) {
686+//line config.qtpl:9
687+ qw422016 := qt422016.AcquireWriter(qq422016)
688+//line config.qtpl:9
689+ p.StreamNavbar(qw422016)
690+//line config.qtpl:9
691+ qt422016.ReleaseWriter(qw422016)
692+//line config.qtpl:9
693+}
694+
695+//line config.qtpl:9
696+func (p *ConfigPage) Navbar() string {
697+//line config.qtpl:9
698+ qb422016 := qt422016.AcquireByteBuffer()
699+//line config.qtpl:9
700+ p.WriteNavbar(qb422016)
701+//line config.qtpl:9
702+ qs422016 := string(qb422016.B)
703+//line config.qtpl:9
704+ qt422016.ReleaseByteBuffer(qb422016)
705+//line config.qtpl:9
706+ return qs422016
707+//line config.qtpl:9
708+}
709+
710+//line config.qtpl:11
711+func (p *ConfigPage) StreamContent(qw422016 *qt422016.Writer) {
712+//line config.qtpl:11
713+ qw422016.N().S(`
714+`)
715+//line config.qtpl:12
716+ qw422016.N().Z(p.Body)
717+//line config.qtpl:12
718+ qw422016.N().S(`
719+`)
720+//line config.qtpl:13
721+}
722+
723+//line config.qtpl:13
724+func (p *ConfigPage) WriteContent(qq422016 qtio422016.Writer) {
725+//line config.qtpl:13
726+ qw422016 := qt422016.AcquireWriter(qq422016)
727+//line config.qtpl:13
728+ p.StreamContent(qw422016)
729+//line config.qtpl:13
730+ qt422016.ReleaseWriter(qw422016)
731+//line config.qtpl:13
732+}
733+
734+//line config.qtpl:13
735+func (p *ConfigPage) Content() string {
736+//line config.qtpl:13
737+ qb422016 := qt422016.AcquireByteBuffer()
738+//line config.qtpl:13
739+ p.WriteContent(qb422016)
740+//line config.qtpl:13
741+ qs422016 := string(qb422016.B)
742+//line config.qtpl:13
743+ qt422016.ReleaseByteBuffer(qb422016)
744+//line config.qtpl:13
745+ return qs422016
746+//line config.qtpl:13
747+}
748+
749+//line config.qtpl:15
750+func (p *ConfigPage) StreamScript(qw422016 *qt422016.Writer) {
751+//line config.qtpl:15
752+ qw422016.N().S(`
753+`)
754+//line config.qtpl:16
755+}
756+
757+//line config.qtpl:16
758+func (p *ConfigPage) WriteScript(qq422016 qtio422016.Writer) {
759+//line config.qtpl:16
760+ qw422016 := qt422016.AcquireWriter(qq422016)
761+//line config.qtpl:16
762+ p.StreamScript(qw422016)
763+//line config.qtpl:16
764+ qt422016.ReleaseWriter(qw422016)
765+//line config.qtpl:16
766+}
767+
768+//line config.qtpl:16
769+func (p *ConfigPage) Script() string {
770+//line config.qtpl:16
771+ qb422016 := qt422016.AcquireByteBuffer()
772+//line config.qtpl:16
773+ p.WriteScript(qb422016)
774+//line config.qtpl:16
775+ qs422016 := string(qb422016.B)
776+//line config.qtpl:16
777+ qt422016.ReleaseByteBuffer(qb422016)
778+//line config.qtpl:16
779+ return qs422016
780+//line config.qtpl:16
781+}
782diff --git a/templates/gitlist.qtpl b/templates/gitlist.qtpl
783index fef912632b84fac88e3a587d3f28eed195d58d50..588c26460e2549a7a8164dc5d6ee467a12329dd2 100644
784--- a/templates/gitlist.qtpl
785+++ b/templates/gitlist.qtpl
786@@ -8,6 +8,8 @@ %}
787
788 {% func (p *GitListPage) Title() %}Git | List{% endfunc %}
789
790+{% func (p *GitListPage) Navbar() %}{%= Navbar(Git) %}{% endfunc %}
791+
792 {% func (p *GitListPage) Content() %}
793 <div class="row">
794 <div class="col-md-8 offset-md-2">
795diff --git a/templates/gitlist.qtpl.go b/templates/gitlist.qtpl.go
796index 89d1d71c2a63543102dcec825cc68031fdc436fa..54387293127fea06b93cde8fe006eb4e3223430e 100644
797--- a/templates/gitlist.qtpl.go
798+++ b/templates/gitlist.qtpl.go
799@@ -59,111 +59,144 @@ //line gitlist.qtpl:9
800 }
801
802 //line gitlist.qtpl:11
803-func (p *GitListPage) StreamContent(qw422016 *qt422016.Writer) {
804+func (p *GitListPage) StreamNavbar(qw422016 *qt422016.Writer) {
805+//line gitlist.qtpl:11
806+ StreamNavbar(qw422016, Git)
807+//line gitlist.qtpl:11
808+}
809+
810+//line gitlist.qtpl:11
811+func (p *GitListPage) WriteNavbar(qq422016 qtio422016.Writer) {
812+//line gitlist.qtpl:11
813+ qw422016 := qt422016.AcquireWriter(qq422016)
814+//line gitlist.qtpl:11
815+ p.StreamNavbar(qw422016)
816+//line gitlist.qtpl:11
817+ qt422016.ReleaseWriter(qw422016)
818+//line gitlist.qtpl:11
819+}
820+
821+//line gitlist.qtpl:11
822+func (p *GitListPage) Navbar() string {
823+//line gitlist.qtpl:11
824+ qb422016 := qt422016.AcquireByteBuffer()
825 //line gitlist.qtpl:11
826+ p.WriteNavbar(qb422016)
827+//line gitlist.qtpl:11
828+ qs422016 := string(qb422016.B)
829+//line gitlist.qtpl:11
830+ qt422016.ReleaseByteBuffer(qb422016)
831+//line gitlist.qtpl:11
832+ return qs422016
833+//line gitlist.qtpl:11
834+}
835+
836+//line gitlist.qtpl:13
837+func (p *GitListPage) StreamContent(qw422016 *qt422016.Writer) {
838+//line gitlist.qtpl:13
839 qw422016.N().S(`
840 <div class="row">
841 <div class="col-md-8 offset-md-2">
842 <div class="event-list">
843 `)
844-//line gitlist.qtpl:15
845+//line gitlist.qtpl:17
846 for _, r := range p.Respositories {
847-//line gitlist.qtpl:15
848+//line gitlist.qtpl:17
849 qw422016.N().S(`
850 <div class="event">
851 <h4>
852 <a href="/`)
853-//line gitlist.qtpl:18
854+//line gitlist.qtpl:20
855 qw422016.E().S(r.Name)
856-//line gitlist.qtpl:18
857+//line gitlist.qtpl:20
858 qw422016.N().S(`">`)
859-//line gitlist.qtpl:18
860+//line gitlist.qtpl:20
861 qw422016.E().S(r.Name)
862-//line gitlist.qtpl:18
863+//line gitlist.qtpl:20
864 qw422016.N().S(`</a>
865 </h4>
866 </hr>
867 <p>`)
868-//line gitlist.qtpl:21
869+//line gitlist.qtpl:23
870 qw422016.E().S(r.LastCommitMessage)
871-//line gitlist.qtpl:21
872+//line gitlist.qtpl:23
873 qw422016.N().S(`</p>
874 <p><small>`)
875-//line gitlist.qtpl:22
876+//line gitlist.qtpl:24
877 qw422016.E().S(r.LastCommitDate)
878-//line gitlist.qtpl:22
879+//line gitlist.qtpl:24
880 qw422016.N().S(`</small></p>
881 </div>
882 `)
883-//line gitlist.qtpl:24
884+//line gitlist.qtpl:26
885 }
886-//line gitlist.qtpl:24
887+//line gitlist.qtpl:26
888 qw422016.N().S(`
889 </div>
890 `)
891-//line gitlist.qtpl:26
892+//line gitlist.qtpl:28
893 }
894
895-//line gitlist.qtpl:26
896+//line gitlist.qtpl:28
897 func (p *GitListPage) WriteContent(qq422016 qtio422016.Writer) {
898-//line gitlist.qtpl:26
899+//line gitlist.qtpl:28
900 qw422016 := qt422016.AcquireWriter(qq422016)
901-//line gitlist.qtpl:26
902+//line gitlist.qtpl:28
903 p.StreamContent(qw422016)
904-//line gitlist.qtpl:26
905+//line gitlist.qtpl:28
906 qt422016.ReleaseWriter(qw422016)
907-//line gitlist.qtpl:26
908+//line gitlist.qtpl:28
909 }
910
911-//line gitlist.qtpl:26
912+//line gitlist.qtpl:28
913 func (p *GitListPage) Content() string {
914-//line gitlist.qtpl:26
915+//line gitlist.qtpl:28
916 qb422016 := qt422016.AcquireByteBuffer()
917-//line gitlist.qtpl:26
918+//line gitlist.qtpl:28
919 p.WriteContent(qb422016)
920-//line gitlist.qtpl:26
921+//line gitlist.qtpl:28
922 qs422016 := string(qb422016.B)
923-//line gitlist.qtpl:26
924+//line gitlist.qtpl:28
925 qt422016.ReleaseByteBuffer(qb422016)
926-//line gitlist.qtpl:26
927+//line gitlist.qtpl:28
928 return qs422016
929-//line gitlist.qtpl:26
930+//line gitlist.qtpl:28
931 }
932
933 // </div>
934 // </div>
935 //
936
937-//line gitlist.qtpl:30
938+//line gitlist.qtpl:32
939 func (p *GitListPage) StreamScript(qw422016 *qt422016.Writer) {
940-//line gitlist.qtpl:30
941+//line gitlist.qtpl:32
942 qw422016.N().S(`
943 `)
944-//line gitlist.qtpl:31
945+//line gitlist.qtpl:33
946 }
947
948-//line gitlist.qtpl:31
949+//line gitlist.qtpl:33
950 func (p *GitListPage) WriteScript(qq422016 qtio422016.Writer) {
951-//line gitlist.qtpl:31
952+//line gitlist.qtpl:33
953 qw422016 := qt422016.AcquireWriter(qq422016)
954-//line gitlist.qtpl:31
955+//line gitlist.qtpl:33
956 p.StreamScript(qw422016)
957-//line gitlist.qtpl:31
958+//line gitlist.qtpl:33
959 qt422016.ReleaseWriter(qw422016)
960-//line gitlist.qtpl:31
961+//line gitlist.qtpl:33
962 }
963
964-//line gitlist.qtpl:31
965+//line gitlist.qtpl:33
966 func (p *GitListPage) Script() string {
967-//line gitlist.qtpl:31
968+//line gitlist.qtpl:33
969 qb422016 := qt422016.AcquireByteBuffer()
970-//line gitlist.qtpl:31
971+//line gitlist.qtpl:33
972 p.WriteScript(qb422016)
973-//line gitlist.qtpl:31
974+//line gitlist.qtpl:33
975 qs422016 := string(qb422016.B)
976-//line gitlist.qtpl:31
977+//line gitlist.qtpl:33
978 qt422016.ReleaseByteBuffer(qb422016)
979-//line gitlist.qtpl:31
980+//line gitlist.qtpl:33
981 return qs422016
982-//line gitlist.qtpl:31
983+//line gitlist.qtpl:33
984 }
985diff --git a/templates/helloworld.qtpl b/templates/helloworld.qtpl
986deleted file mode 100644
987index 1785bb5b399087bb3237a3673a9b1e3717e45e81..0000000000000000000000000000000000000000
988--- a/templates/helloworld.qtpl
989+++ /dev/null
990@@ -1,14 +0,0 @@
991-{% code
992-type HelloPage struct {
993- Body []byte
994-}
995-%}
996-
997-{% func (p *HelloPage) Title() %}Hello{% endfunc %}
998-
999-{% func (p *HelloPage) Content() %}
1000-{%z= p.Body %}
1001-{% endfunc %}
1002-
1003-{% func (p *HelloPage) Script() %}
1004-{% endfunc %}
1005diff --git a/templates/helloworld.qtpl.go b/templates/helloworld.qtpl.go
1006deleted file mode 100644
1007index 7e37f3bca4276829888fe900fa3d9bf53ff094ed..0000000000000000000000000000000000000000
1008--- a/templates/helloworld.qtpl.go
1009+++ /dev/null
1010@@ -1,129 +0,0 @@
1011-// Code generated by qtc from "helloworld.qtpl". DO NOT EDIT.
1012-// See https://github.com/valyala/quicktemplate for details.
1013-
1014-//line helloworld.qtpl:1
1015-package templates
1016-
1017-//line helloworld.qtpl:1
1018-import (
1019- qtio422016 "io"
1020-
1021- qt422016 "github.com/valyala/quicktemplate"
1022-)
1023-
1024-//line helloworld.qtpl:1
1025-var (
1026- _ = qtio422016.Copy
1027- _ = qt422016.AcquireByteBuffer
1028-)
1029-
1030-//line helloworld.qtpl:2
1031-type HelloPage struct {
1032- Body []byte
1033-}
1034-
1035-//line helloworld.qtpl:7
1036-func (p *HelloPage) StreamTitle(qw422016 *qt422016.Writer) {
1037-//line helloworld.qtpl:7
1038- qw422016.N().S(`Hello`)
1039-//line helloworld.qtpl:7
1040-}
1041-
1042-//line helloworld.qtpl:7
1043-func (p *HelloPage) WriteTitle(qq422016 qtio422016.Writer) {
1044-//line helloworld.qtpl:7
1045- qw422016 := qt422016.AcquireWriter(qq422016)
1046-//line helloworld.qtpl:7
1047- p.StreamTitle(qw422016)
1048-//line helloworld.qtpl:7
1049- qt422016.ReleaseWriter(qw422016)
1050-//line helloworld.qtpl:7
1051-}
1052-
1053-//line helloworld.qtpl:7
1054-func (p *HelloPage) Title() string {
1055-//line helloworld.qtpl:7
1056- qb422016 := qt422016.AcquireByteBuffer()
1057-//line helloworld.qtpl:7
1058- p.WriteTitle(qb422016)
1059-//line helloworld.qtpl:7
1060- qs422016 := string(qb422016.B)
1061-//line helloworld.qtpl:7
1062- qt422016.ReleaseByteBuffer(qb422016)
1063-//line helloworld.qtpl:7
1064- return qs422016
1065-//line helloworld.qtpl:7
1066-}
1067-
1068-//line helloworld.qtpl:9
1069-func (p *HelloPage) StreamContent(qw422016 *qt422016.Writer) {
1070-//line helloworld.qtpl:9
1071- qw422016.N().S(`
1072-`)
1073-//line helloworld.qtpl:10
1074- qw422016.N().Z(p.Body)
1075-//line helloworld.qtpl:10
1076- qw422016.N().S(`
1077-`)
1078-//line helloworld.qtpl:11
1079-}
1080-
1081-//line helloworld.qtpl:11
1082-func (p *HelloPage) WriteContent(qq422016 qtio422016.Writer) {
1083-//line helloworld.qtpl:11
1084- qw422016 := qt422016.AcquireWriter(qq422016)
1085-//line helloworld.qtpl:11
1086- p.StreamContent(qw422016)
1087-//line helloworld.qtpl:11
1088- qt422016.ReleaseWriter(qw422016)
1089-//line helloworld.qtpl:11
1090-}
1091-
1092-//line helloworld.qtpl:11
1093-func (p *HelloPage) Content() string {
1094-//line helloworld.qtpl:11
1095- qb422016 := qt422016.AcquireByteBuffer()
1096-//line helloworld.qtpl:11
1097- p.WriteContent(qb422016)
1098-//line helloworld.qtpl:11
1099- qs422016 := string(qb422016.B)
1100-//line helloworld.qtpl:11
1101- qt422016.ReleaseByteBuffer(qb422016)
1102-//line helloworld.qtpl:11
1103- return qs422016
1104-//line helloworld.qtpl:11
1105-}
1106-
1107-//line helloworld.qtpl:13
1108-func (p *HelloPage) StreamScript(qw422016 *qt422016.Writer) {
1109-//line helloworld.qtpl:13
1110- qw422016.N().S(`
1111-`)
1112-//line helloworld.qtpl:14
1113-}
1114-
1115-//line helloworld.qtpl:14
1116-func (p *HelloPage) WriteScript(qq422016 qtio422016.Writer) {
1117-//line helloworld.qtpl:14
1118- qw422016 := qt422016.AcquireWriter(qq422016)
1119-//line helloworld.qtpl:14
1120- p.StreamScript(qw422016)
1121-//line helloworld.qtpl:14
1122- qt422016.ReleaseWriter(qw422016)
1123-//line helloworld.qtpl:14
1124-}
1125-
1126-//line helloworld.qtpl:14
1127-func (p *HelloPage) Script() string {
1128-//line helloworld.qtpl:14
1129- qb422016 := qt422016.AcquireByteBuffer()
1130-//line helloworld.qtpl:14
1131- p.WriteScript(qb422016)
1132-//line helloworld.qtpl:14
1133- qs422016 := string(qb422016.B)
1134-//line helloworld.qtpl:14
1135- qt422016.ReleaseByteBuffer(qb422016)
1136-//line helloworld.qtpl:14
1137- return qs422016
1138-//line helloworld.qtpl:14
1139-}
1140diff --git a/templates/navbar.qtpl b/templates/navbar.qtpl
1141new file mode 100644
1142index 0000000000000000000000000000000000000000..26991a37dd96d09dc51cfe7366aea56aceed8828
1143--- /dev/null
1144+++ b/templates/navbar.qtpl
1145@@ -0,0 +1,23 @@
1146+{% code
1147+type Selection int
1148+const (
1149+ Git Selection = iota
1150+ List
1151+ About
1152+ Config
1153+)
1154+%}
1155+
1156+{% func insertIfEqual(s, d Selection) %}{% if s == d %} selected{% endif %}{% endfunc %}
1157+
1158+
1159+{% func Navbar (s Selection) %}
1160+ <nav class="container navbar navbar-expand-sm">
1161+ <div class="navbar-nav">
1162+ <a class="nav-link{%= insertIfEqual(s, Git) %}" href="/git">git</a>
1163+ <a class="nav-link{%= insertIfEqual(s, List) %}" href="/list">list</a>
1164+ <a class="nav-link{%= insertIfEqual(s, About) %}" href="/about">about</a>
1165+ <a class="nav-link{%= insertIfEqual(s, Config) %}" href="/config">config</a>
1166+ </div>
1167+ </nav>
1168+{% endfunc %}
1169diff --git a/templates/navbar.qtpl.go b/templates/navbar.qtpl.go
1170new file mode 100644
1171index 0000000000000000000000000000000000000000..e2b738ccae4df0a80353a23aa195a6099cbde6cc
1172--- /dev/null
1173+++ b/templates/navbar.qtpl.go
1174@@ -0,0 +1,123 @@
1175+// Code generated by qtc from "navbar.qtpl". DO NOT EDIT.
1176+// See https://github.com/valyala/quicktemplate for details.
1177+
1178+//line navbar.qtpl:1
1179+package templates
1180+
1181+//line navbar.qtpl:1
1182+import (
1183+ qtio422016 "io"
1184+
1185+ qt422016 "github.com/valyala/quicktemplate"
1186+)
1187+
1188+//line navbar.qtpl:1
1189+var (
1190+ _ = qtio422016.Copy
1191+ _ = qt422016.AcquireByteBuffer
1192+)
1193+
1194+//line navbar.qtpl:2
1195+type Selection int
1196+
1197+const (
1198+ Git Selection = iota
1199+ List
1200+ About
1201+ Config
1202+)
1203+
1204+//line navbar.qtpl:11
1205+func streaminsertIfEqual(qw422016 *qt422016.Writer, s, d Selection) {
1206+//line navbar.qtpl:11
1207+ if s == d {
1208+//line navbar.qtpl:11
1209+ qw422016.N().S(` selected`)
1210+//line navbar.qtpl:11
1211+ }
1212+//line navbar.qtpl:11
1213+}
1214+
1215+//line navbar.qtpl:11
1216+func writeinsertIfEqual(qq422016 qtio422016.Writer, s, d Selection) {
1217+//line navbar.qtpl:11
1218+ qw422016 := qt422016.AcquireWriter(qq422016)
1219+//line navbar.qtpl:11
1220+ streaminsertIfEqual(qw422016, s, d)
1221+//line navbar.qtpl:11
1222+ qt422016.ReleaseWriter(qw422016)
1223+//line navbar.qtpl:11
1224+}
1225+
1226+//line navbar.qtpl:11
1227+func insertIfEqual(s, d Selection) string {
1228+//line navbar.qtpl:11
1229+ qb422016 := qt422016.AcquireByteBuffer()
1230+//line navbar.qtpl:11
1231+ writeinsertIfEqual(qb422016, s, d)
1232+//line navbar.qtpl:11
1233+ qs422016 := string(qb422016.B)
1234+//line navbar.qtpl:11
1235+ qt422016.ReleaseByteBuffer(qb422016)
1236+//line navbar.qtpl:11
1237+ return qs422016
1238+//line navbar.qtpl:11
1239+}
1240+
1241+//line navbar.qtpl:14
1242+func StreamNavbar(qw422016 *qt422016.Writer, s Selection) {
1243+//line navbar.qtpl:14
1244+ qw422016.N().S(`
1245+ <nav class="container navbar navbar-expand-sm">
1246+ <div class="navbar-nav">
1247+ <a class="nav-link`)
1248+//line navbar.qtpl:17
1249+ streaminsertIfEqual(qw422016, s, Git)
1250+//line navbar.qtpl:17
1251+ qw422016.N().S(`" href="/git">git</a>
1252+ <a class="nav-link`)
1253+//line navbar.qtpl:18
1254+ streaminsertIfEqual(qw422016, s, List)
1255+//line navbar.qtpl:18
1256+ qw422016.N().S(`" href="/list">list</a>
1257+ <a class="nav-link`)
1258+//line navbar.qtpl:19
1259+ streaminsertIfEqual(qw422016, s, About)
1260+//line navbar.qtpl:19
1261+ qw422016.N().S(`" href="/about">about</a>
1262+ <a class="nav-link`)
1263+//line navbar.qtpl:20
1264+ streaminsertIfEqual(qw422016, s, Config)
1265+//line navbar.qtpl:20
1266+ qw422016.N().S(`" href="/config">config</a>
1267+ </div>
1268+ </nav>
1269+`)
1270+//line navbar.qtpl:23
1271+}
1272+
1273+//line navbar.qtpl:23
1274+func WriteNavbar(qq422016 qtio422016.Writer, s Selection) {
1275+//line navbar.qtpl:23
1276+ qw422016 := qt422016.AcquireWriter(qq422016)
1277+//line navbar.qtpl:23
1278+ StreamNavbar(qw422016, s)
1279+//line navbar.qtpl:23
1280+ qt422016.ReleaseWriter(qw422016)
1281+//line navbar.qtpl:23
1282+}
1283+
1284+//line navbar.qtpl:23
1285+func Navbar(s Selection) string {
1286+//line navbar.qtpl:23
1287+ qb422016 := qt422016.AcquireByteBuffer()
1288+//line navbar.qtpl:23
1289+ WriteNavbar(qb422016, s)
1290+//line navbar.qtpl:23
1291+ qs422016 := string(qb422016.B)
1292+//line navbar.qtpl:23
1293+ qt422016.ReleaseByteBuffer(qb422016)
1294+//line navbar.qtpl:23
1295+ return qs422016
1296+//line navbar.qtpl:23
1297+}