cerrado @ 8f5f9ff24b0327f7640e3619de109e1f19cfba1d

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