aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--main.go10
-rw-r--r--pkg/config/config.go16
-rw-r--r--pkg/ext/auth.go45
-rw-r--r--pkg/ext/router.go18
-rw-r--r--pkg/handler/about/handler.go4
-rw-r--r--pkg/handler/auth/login.go75
-rw-r--r--pkg/handler/git/handler.go24
-rw-r--r--pkg/handler/router.go5
-rw-r--r--pkg/service/auth.go8
-rw-r--r--pkg/service/git.go4
-rw-r--r--templates/about.qtpl11
-rw-r--r--templates/about.qtpl.go176
-rw-r--r--templates/base.qtpl27
-rw-r--r--templates/base.qtpl.go143
-rw-r--r--templates/error.qtpl10
-rw-r--r--templates/error.qtpl.go165
-rw-r--r--templates/gititem.qtpl10
-rw-r--r--templates/gititem.qtpl.go189
-rw-r--r--templates/gitlist.qtpl9
-rw-r--r--templates/gitlist.qtpl.go215
-rw-r--r--templates/login.qtpl24
-rw-r--r--templates/login.qtpl.go195
-rw-r--r--templates/navbar.qtpl8
-rw-r--r--templates/navbar.qtpl.go211
24 files changed, 920 insertions, 682 deletions
diff --git a/main.go b/main.go
index ab4aee9..797ebea 100644
--- a/main.go
+++ b/main.go
@@ -74,8 +74,7 @@ func run() error {
return err
}
- // checking chroma configurationo
-
+ // checking chroma configuration
if _, ok := styles.Registry[configRepo.GetSyntaxHighlight()]; !ok {
slog.Warn(
"Invalid Syntax highlight selected",
@@ -87,8 +86,13 @@ func run() error {
// services
gitService := service.NewGitService(configRepo)
+ authService := service.NewAuthService(configRepo)
- handler, err := handler.MountHandler(gitService, configRepo)
+ handler, err := handler.MountHandler(
+ gitService,
+ authService,
+ configRepo,
+ )
if err != nil {
return err
}
diff --git a/pkg/config/config.go b/pkg/config/config.go
index 812a06e..da6e0e7 100644
--- a/pkg/config/config.go
+++ b/pkg/config/config.go
@@ -55,8 +55,8 @@ type (
ConfigurationRepository struct {
rootReadme string
listenAddr string
- passphrase string
- aesKey string
+ passphrase []byte
+ aesKey []byte
syntaxHighlight string
repositories []*GitRepositoryConfiguration
}
@@ -74,9 +74,9 @@ func LoadConfigurationRepository(configPath string) (*ConfigurationRepository, e
}
repo := &ConfigurationRepository{
- aesKey: config.AESKey,
+ aesKey: []byte(config.AESKey),
listenAddr: config.ListenAddr,
- passphrase: config.Passphrase,
+ passphrase: []byte(config.Passphrase),
repositories: config.Repositories,
rootReadme: config.RootReadme,
syntaxHighlight: config.SyntaxHighlight,
@@ -105,6 +105,14 @@ func (c *ConfigurationRepository) GetListenAddr() string {
return c.listenAddr
}
+func (c *ConfigurationRepository) GetPassphrase() []byte {
+ return c.passphrase
+}
+
+func (c *ConfigurationRepository) GetBase64AesKey() []byte {
+ return c.aesKey
+}
+
// GetByName returns configuration of repository for a given name.
// It returns nil if there is not match for it.
func (c *ConfigurationRepository) GetByName(name string) *GitRepositoryConfiguration {
diff --git a/pkg/ext/auth.go b/pkg/ext/auth.go
new file mode 100644
index 0000000..bb6c0a2
--- /dev/null
+++ b/pkg/ext/auth.go
@@ -0,0 +1,45 @@
+package ext
+
+import (
+ "context"
+ "encoding/base64"
+ "log/slog"
+ "net/http"
+)
+
+type authService interface {
+ ValidateToken(token []byte) (bool, error)
+}
+
+func Authenticate(auth authService) func(next http.HandlerFunc) http.HandlerFunc {
+ return func(next http.HandlerFunc) http.HandlerFunc {
+ return func(w http.ResponseWriter, r *http.Request) {
+ cookie, err := r.Cookie("auth")
+ if err != nil {
+ slog.Error("Error loading cookie", "error", err)
+ next(w, r)
+ return
+ }
+
+ value, err := base64.StdEncoding.DecodeString(cookie.Value)
+ if err != nil {
+ slog.Error("Error decoding", "error", err)
+ next(w, r)
+ return
+ }
+
+ valid, err := auth.ValidateToken(value)
+ if err != nil {
+ slog.Error("Error validating token", "error", err, "cookie", cookie.Value)
+ next(w, r)
+ return
+ }
+
+ ctx := r.Context()
+ ctx = context.WithValue(ctx, "logged", true)
+
+ slog.Info("Validated token", "valid?", valid)
+ next(w, r.WithContext(ctx))
+ }
+ }
+}
diff --git a/pkg/ext/router.go b/pkg/ext/router.go
index 96da1c9..956254d 100644
--- a/pkg/ext/router.go
+++ b/pkg/ext/router.go
@@ -23,6 +23,7 @@ func NewRouter() *Router {
router: http.NewServeMux(),
}
}
+
func (r *Router) Handler() http.Handler {
return r.router
}
@@ -35,9 +36,9 @@ func wrapError(next ErrorRequestHandler) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
if err := next(w, r); err != nil {
if errors.Is(err, service.ErrRepositoryNotFound) {
- NotFound(w)
+ NotFound(w, r)
} else {
- InternalServerError(w, err)
+ InternalServerError(r, w, err)
}
}
}
@@ -57,16 +58,21 @@ func (r *Router) HandleFunc(path string, handler ErrorRequestHandler) {
r.router.HandleFunc(path, r.run(handler))
}
-func NotFound(w http.ResponseWriter) {
+func NotFound(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusNotFound)
templates.WritePageTemplate(w, &templates.ErrorPage{
Message: "Not Found",
- })
+ }, r.Context())
+}
+
+func Redirect(w http.ResponseWriter, location string) {
+ w.Header().Add("location", location)
+ w.WriteHeader(http.StatusTemporaryRedirect)
}
-func InternalServerError(w http.ResponseWriter, err error) {
+func InternalServerError(r *http.Request, w http.ResponseWriter, err error) {
w.WriteHeader(http.StatusInternalServerError)
templates.WritePageTemplate(w, &templates.ErrorPage{
Message: fmt.Sprintf("Internal Server Error:\n%s", err.Error()),
- })
+ }, r.Context())
}
diff --git a/pkg/handler/about/handler.go b/pkg/handler/about/handler.go
index ac3d314..ee084cd 100644
--- a/pkg/handler/about/handler.go
+++ b/pkg/handler/about/handler.go
@@ -26,7 +26,7 @@ func NewAboutHandler(configRepo configurationRepository) *AboutHandler {
return &AboutHandler{configRepo.GetRootReadme()}
}
-func (g *AboutHandler) About(w http.ResponseWriter, _ *http.Request) error {
+func (g *AboutHandler) About(w http.ResponseWriter, r *http.Request) error {
f, err := os.Open(g.readmePath)
if err != nil {
return err
@@ -50,6 +50,6 @@ func (g *AboutHandler) About(w http.ResponseWriter, _ *http.Request) error {
gitList := &templates.AboutPage{
Body: bs,
}
- templates.WritePageTemplate(w, gitList)
+ templates.WritePageTemplate(w, gitList, r.Context())
return nil
}
diff --git a/pkg/handler/auth/login.go b/pkg/handler/auth/login.go
index 7e77a67..7014548 100644
--- a/pkg/handler/auth/login.go
+++ b/pkg/handler/auth/login.go
@@ -1,20 +1,87 @@
package auth
import (
+ "encoding/base64"
"net/http"
+ "time"
"git.gabrielgio.me/cerrado/pkg/ext"
"git.gabrielgio.me/cerrado/templates"
)
type (
- LoginHandler struct{}
+ LoginHandler struct {
+ auth authService
+ }
+
+ authService interface {
+ CheckAuth(username, password string) bool
+ IssueToken() ([]byte, error)
+ }
)
+func NewLoginHandler(auth authService) *LoginHandler {
+ return &LoginHandler{
+ auth: auth,
+ }
+}
+
+func (g *LoginHandler) Logout(w http.ResponseWriter, r *http.Request) error {
+ cookie := &http.Cookie{
+ Name: "auth",
+ Value: "",
+ Path: "/",
+ Expires: time.Unix(0, 0),
+ }
+
+ referer := r.Header.Get("Referer")
+ if referer == "" {
+ referer = "/"
+ }
+
+ http.SetCookie(w, cookie)
+ ext.Redirect(w, referer)
+ return nil
+}
+
func (g *LoginHandler) Login(w http.ResponseWriter, r *http.Request) error {
- ext.SetHTML(w)
+ if r.Method == "GET" {
+ ext.SetHTML(w)
+
+ login := &templates.LoginPage{}
+ templates.WritePageTemplate(w, login, r.Context())
+ } else if r.Method == "POST" {
+
+ username := r.FormValue("username")
+ password := r.FormValue("password")
+
+ if !g.auth.CheckAuth(username, password) {
+ login := &templates.LoginPage{
+ ErrorMessage: "Invalid login",
+ }
+ templates.WritePageTemplate(w, login, r.Context())
+ } else {
+
+ bytes, err := g.auth.IssueToken()
+ if err != nil {
+ return err
+ }
+
+ cookie := &http.Cookie{
+ Name: "auth",
+ Value: base64.StdEncoding.EncodeToString(bytes),
+ Path: "/",
+ MaxAge: 3600,
+ HttpOnly: true,
+ Secure: true,
+ SameSite: http.SameSiteStrictMode,
+ }
+
+ http.SetCookie(w, cookie)
+ ext.Redirect(w, "/")
+ }
+
+ }
- login := &templates.LoginPage{}
- templates.WritePageTemplate(w, login)
return nil
}
diff --git a/pkg/handler/git/handler.go b/pkg/handler/git/handler.go
index 5739c8e..4276159 100644
--- a/pkg/handler/git/handler.go
+++ b/pkg/handler/git/handler.go
@@ -43,7 +43,7 @@ func NewGitHandler(gitService *service.GitService, confRepo configurationReposit
}
}
-func (g *GitHandler) List(w http.ResponseWriter, _ *http.Request) error {
+func (g *GitHandler) List(w http.ResponseWriter, r *http.Request) error {
repos, err := g.gitService.ListRepositories()
if err != nil {
return err
@@ -73,7 +73,7 @@ func (g *GitHandler) List(w http.ResponseWriter, _ *http.Request) error {
Respositories: repos,
About: bs,
}
- templates.WritePageTemplate(w, gitList)
+ templates.WritePageTemplate(w, gitList, r.Context())
return nil
}
@@ -85,7 +85,7 @@ func (g *GitHandler) Archive(w http.ResponseWriter, r *http.Request) error {
// TODO: remove it once we can support more than gzip
if !strings.HasSuffix(file, ".tar.gz") {
- ext.NotFound(w)
+ ext.NotFound(w, r)
return nil
}
@@ -135,7 +135,7 @@ func (g *GitHandler) Summary(w http.ResponseWriter, r *http.Request) error {
Commits: commits,
},
}
- templates.WritePageTemplate(w, gitList)
+ templates.WritePageTemplate(w, gitList, r.Context())
return nil
}
@@ -155,7 +155,7 @@ func (g *GitHandler) About(w http.ResponseWriter, r *http.Request) error {
GitItemBase: &templates.GitItemAboutPage{
About: []byte("About file not configured properly"),
},
- })
+ }, r.Context())
return nil
}
if err != nil {
@@ -179,7 +179,7 @@ func (g *GitHandler) About(w http.ResponseWriter, r *http.Request) error {
About: bs,
},
}
- templates.WritePageTemplate(w, gitList)
+ templates.WritePageTemplate(w, gitList, r.Context())
return nil
}
@@ -210,7 +210,7 @@ func (g *GitHandler) Refs(w http.ResponseWriter, r *http.Request) error {
Branches: branches,
},
}
- templates.WritePageTemplate(w, gitList)
+ templates.WritePageTemplate(w, gitList, r.Context())
return nil
}
@@ -239,7 +239,7 @@ func (g *GitHandler) Tree(w http.ResponseWriter, r *http.Request) error {
Tree: tree,
},
}
- templates.WritePageTemplate(w, gitList)
+ templates.WritePageTemplate(w, gitList, r.Context())
return nil
}
@@ -270,7 +270,7 @@ func (g *GitHandler) Blob(w http.ResponseWriter, r *http.Request) error {
Content: []byte("Binary file"),
},
}
- templates.WritePageTemplate(w, gitList)
+ templates.WritePageTemplate(w, gitList, r.Context())
return nil
}
@@ -307,7 +307,7 @@ func (g *GitHandler) Blob(w http.ResponseWriter, r *http.Request) error {
Content: code.Bytes(),
},
}
- templates.WritePageTemplate(w, gitList)
+ templates.WritePageTemplate(w, gitList, r.Context())
return nil
}
@@ -328,7 +328,7 @@ func (g *GitHandler) Log(w http.ResponseWriter, r *http.Request) error {
Commits: commits,
},
}
- templates.WritePageTemplate(w, gitList)
+ templates.WritePageTemplate(w, gitList, r.Context())
return nil
}
@@ -355,7 +355,7 @@ func (g *GitHandler) Commit(w http.ResponseWriter, r *http.Request) error {
Diff: diff,
},
}
- templates.WritePageTemplate(w, gitList)
+ templates.WritePageTemplate(w, gitList, r.Context())
return nil
}
diff --git a/pkg/handler/router.go b/pkg/handler/router.go
index 32bd78a..ee4081b 100644
--- a/pkg/handler/router.go
+++ b/pkg/handler/router.go
@@ -17,12 +17,13 @@ import (
// its sub package don't leak in other places.
func MountHandler(
gitService *service.GitService,
+ authService *service.AuthService,
configRepo *serverconfig.ConfigurationRepository,
) (http.Handler, error) {
var (
gitHandler = git.NewGitHandler(gitService, configRepo)
aboutHandler = about.NewAboutHandler(configRepo)
- loginHandler = &auth.LoginHandler{}
+ loginHandler = auth.NewLoginHandler(authService)
)
staticHandler, err := static.ServeStaticHandler()
@@ -32,10 +33,12 @@ func MountHandler(
mux := ext.NewRouter()
mux.AddMiddleware(ext.Compress)
+ mux.AddMiddleware(ext.Authenticate(authService))
mux.AddMiddleware(ext.Log)
mux.HandleFunc("/static/{file}", staticHandler)
mux.HandleFunc("/login/{$}", loginHandler.Login)
+ mux.HandleFunc("/logout/{$}", loginHandler.Logout)
mux.HandleFunc("/{name}/about/{$}", gitHandler.About)
mux.HandleFunc("/{name}/", gitHandler.Summary)
mux.HandleFunc("/{name}/refs/{$}", gitHandler.Refs)
diff --git a/pkg/service/auth.go b/pkg/service/auth.go
index 1fbf4b6..0dbd960 100644
--- a/pkg/service/auth.go
+++ b/pkg/service/auth.go
@@ -23,7 +23,13 @@ type (
}
)
-var tokenSeed = []byte("cerrado")
+var tokenSeed = []byte("this is a token for cerrado")
+
+func NewAuthService(repostiory authRepository) *AuthService {
+ return &AuthService{
+ authRepository: repostiory,
+ }
+}
func (a *AuthService) CheckAuth(username, password string) bool {
passphrase := a.authRepository.GetPassphrase()
diff --git a/pkg/service/git.go b/pkg/service/git.go
index f03ba42..6c3912f 100644
--- a/pkg/service/git.go
+++ b/pkg/service/git.go
@@ -30,9 +30,7 @@ type (
}
)
-var (
- ErrRepositoryNotFound = errors.New("Repository not found")
-)
+var ErrRepositoryNotFound = errors.New("Repository not found")
// TODO: make it configurable
const timeFormat = "2006.01.02 15:04:05"
diff --git a/templates/about.qtpl b/templates/about.qtpl
index faee50e..cfbf0d9 100644
--- a/templates/about.qtpl
+++ b/templates/about.qtpl
@@ -1,16 +1,19 @@
+{% import "context" %}
+
{% code
type AboutPage struct {
+ LoggedIn bool
Body []byte
}
%}
-{% func (p *AboutPage) Title() %}Hello{% endfunc %}
+{% func (p *AboutPage) Title(ctx context.Context) %}Hello{% endfunc %}
-{% func (p *AboutPage) Navbar() %}{%= Navbar(About) %}{% endfunc %}
+{% func (p *AboutPage) Navbar(ctx context.Context) %}{%= Navbar(ctx, About) %}{% endfunc %}
-{% func (p *AboutPage) Content() %}
+{% func (p *AboutPage) Content(ctx context.Context) %}
{%z= p.Body %}
{% endfunc %}
-{% func (p *AboutPage) Script() %}
+{% func (p *AboutPage) Script(ctx context.Context) %}
{% endfunc %}
diff --git a/templates/about.qtpl.go b/templates/about.qtpl.go
index 2c07ceb..a640f7e 100644
--- a/templates/about.qtpl.go
+++ b/templates/about.qtpl.go
@@ -5,130 +5,100 @@
package templates
//line templates/about.qtpl:1
+import "context"
+
+//line templates/about.qtpl:3
import (
qtio422016 "io"
qt422016 "github.com/valyala/quicktemplate"
)
-//line templates/about.qtpl:1
+//line templates/about.qtpl:3
var (
_ = qtio422016.Copy
_ = qt422016.AcquireByteBuffer
)
-//line templates/about.qtpl:2
+//line templates/about.qtpl:4
type AboutPage struct {
- Body []byte
+ LoggedIn bool
+ Body []byte
}
-//line templates/about.qtpl:7
-func (p *AboutPage) StreamTitle(qw422016 *qt422016.Writer) {
-//line templates/about.qtpl:7
+//line templates/about.qtpl:10
+func (p *AboutPage) StreamTitle(qw422016 *qt422016.Writer, ctx context.Context) {
+//line templates/about.qtpl:10
qw422016.N().S(`Hello`)
-//line templates/about.qtpl:7
+//line templates/about.qtpl:10
}
-//line templates/about.qtpl:7
-func (p *AboutPage) WriteTitle(qq422016 qtio422016.Writer) {
-//line templates/about.qtpl:7
+//line templates/about.qtpl:10
+func (p *AboutPage) WriteTitle(qq422016 qtio422016.Writer, ctx context.Context) {
+//line templates/about.qtpl:10
qw422016 := qt422016.AcquireWriter(qq422016)
-//line templates/about.qtpl:7
- p.StreamTitle(qw422016)
-//line templates/about.qtpl:7
+//line templates/about.qtpl:10
+ p.StreamTitle(qw422016, ctx)
+//line templates/about.qtpl:10
qt422016.ReleaseWriter(qw422016)
-//line templates/about.qtpl:7
+//line templates/about.qtpl:10
}
-//line templates/about.qtpl:7
-func (p *AboutPage) Title() string {
-//line templates/about.qtpl:7
+//line templates/about.qtpl:10
+func (p *AboutPage) Title(ctx context.Context) string {
+//line templates/about.qtpl:10
qb422016 := qt422016.AcquireByteBuffer()
-//line templates/about.qtpl:7
- p.WriteTitle(qb422016)
-//line templates/about.qtpl:7
+//line templates/about.qtpl:10
+ p.WriteTitle(qb422016, ctx)
+//line templates/about.qtpl:10
qs422016 := string(qb422016.B)
-//line templates/about.qtpl:7
+//line templates/about.qtpl:10
qt422016.ReleaseByteBuffer(qb422016)
-//line templates/about.qtpl:7
+//line templates/about.qtpl:10
return qs422016
-//line templates/about.qtpl:7
-}
-
-//line templates/about.qtpl:9
-func (p *AboutPage) StreamNavbar(qw422016 *qt422016.Writer) {
-//line templates/about.qtpl:9
- StreamNavbar(qw422016, About)
-//line templates/about.qtpl:9
+//line templates/about.qtpl:10
}
-//line templates/about.qtpl:9
-func (p *AboutPage) WriteNavbar(qq422016 qtio422016.Writer) {
-//line templates/about.qtpl:9
- qw422016 := qt422016.AcquireWriter(qq422016)
-//line templates/about.qtpl:9
- p.StreamNavbar(qw422016)
-//line templates/about.qtpl:9
- qt422016.ReleaseWriter(qw422016)
-//line templates/about.qtpl:9
-}
-
-//line templates/about.qtpl:9
-func (p *AboutPage) Navbar() string {
-//line templates/about.qtpl:9
- qb422016 := qt422016.AcquireByteBuffer()
-//line templates/about.qtpl:9
- p.WriteNavbar(qb422016)
-//line templates/about.qtpl:9
- qs422016 := string(qb422016.B)
-//line templates/about.qtpl:9
- qt422016.ReleaseByteBuffer(qb422016)
-//line templates/about.qtpl:9
- return qs422016
-//line templates/about.qtpl:9
-}
-
-//line templates/about.qtpl:11
-func (p *AboutPage) StreamContent(qw422016 *qt422016.Writer) {
-//line templates/about.qtpl:11
- qw422016.N().S(`
-`)
//line templates/about.qtpl:12
- qw422016.N().Z(p.Body)
+func (p *AboutPage) StreamNavbar(qw422016 *qt422016.Writer, ctx context.Context) {
+//line templates/about.qtpl:12
+ StreamNavbar(qw422016, ctx, About)
//line templates/about.qtpl:12
- qw422016.N().S(`
-`)
-//line templates/about.qtpl:13
}
-//line templates/about.qtpl:13
-func (p *AboutPage) WriteContent(qq422016 qtio422016.Writer) {
-//line templates/about.qtpl:13
+//line templates/about.qtpl:12
+func (p *AboutPage) WriteNavbar(qq422016 qtio422016.Writer, ctx context.Context) {
+//line templates/about.qtpl:12
qw422016 := qt422016.AcquireWriter(qq422016)
-//line templates/about.qtpl:13
- p.StreamContent(qw422016)
-//line templates/about.qtpl:13
+//line templates/about.qtpl:12
+ p.StreamNavbar(qw422016, ctx)
+//line templates/about.qtpl:12
qt422016.ReleaseWriter(qw422016)
-//line templates/about.qtpl:13
+//line templates/about.qtpl:12
}
-//line templates/about.qtpl:13
-func (p *AboutPage) Content() string {
-//line templates/about.qtpl:13
+//line templates/about.qtpl:12
+func (p *AboutPage) Navbar(ctx context.Context) string {
+//line templates/about.qtpl:12
qb422016 := qt422016.AcquireByteBuffer()
-//line templates/about.qtpl:13
- p.WriteContent(qb422016)
-//line templates/about.qtpl:13
+//line templates/about.qtpl:12
+ p.WriteNavbar(qb422016, ctx)
+//line templates/about.qtpl:12
qs422016 := string(qb422016.B)
-//line templates/about.qtpl:13
+//line templates/about.qtpl:12
qt422016.ReleaseByteBuffer(qb422016)
-//line templates/about.qtpl:13
+//line templates/about.qtpl:12
return qs422016
-//line templates/about.qtpl:13
+//line templates/about.qtpl:12
}
+//line templates/about.qtpl:14
+func (p *AboutPage) StreamContent(qw422016 *qt422016.Writer, ctx context.Context) {
+//line templates/about.qtpl:14
+ qw422016.N().S(`
+`)
//line templates/about.qtpl:15
-func (p *AboutPage) StreamScript(qw422016 *qt422016.Writer) {
+ qw422016.N().Z(p.Body)
//line templates/about.qtpl:15
qw422016.N().S(`
`)
@@ -136,22 +106,22 @@ func (p *AboutPage) StreamScript(qw422016 *qt422016.Writer) {
}
//line templates/about.qtpl:16
-func (p *AboutPage) WriteScript(qq422016 qtio422016.Writer) {
+func (p *AboutPage) WriteContent(qq422016 qtio422016.Writer, ctx context.Context) {
//line templates/about.qtpl:16
qw422016 := qt422016.AcquireWriter(qq422016)
//line templates/about.qtpl:16
- p.StreamScript(qw422016)
+ p.StreamContent(qw422016, ctx)
//line templates/about.qtpl:16
qt422016.ReleaseWriter(qw422016)
//line templates/about.qtpl:16
}
//line templates/about.qtpl:16
-func (p *AboutPage) Script() string {
+func (p *AboutPage) Content(ctx context.Context) string {
//line templates/about.qtpl:16
qb422016 := qt422016.AcquireByteBuffer()
//line templates/about.qtpl:16
- p.WriteScript(qb422016)
+ p.WriteContent(qb422016, ctx)
//line templates/about.qtpl:16
qs422016 := string(qb422016.B)
//line templates/about.qtpl:16
@@ -160,3 +130,37 @@ func (p *AboutPage) Script() string {
return qs422016
//line templates/about.qtpl:16
}
+
+//line templates/about.qtpl:18
+func (p *AboutPage) StreamScript(qw422016 *qt422016.Writer, ctx context.Context) {
+//line templates/about.qtpl:18
+ qw422016.N().S(`
+`)
+//line templates/about.qtpl:19
+}
+
+//line templates/about.qtpl:19
+func (p *AboutPage) WriteScript(qq422016 qtio422016.Writer, ctx context.Context) {
+//line templates/about.qtpl:19
+ qw422016 := qt422016.AcquireWriter(qq422016)
+//line templates/about.qtpl:19
+ p.StreamScript(qw422016, ctx)
+//line templates/about.qtpl:19
+ qt422016.ReleaseWriter(qw422016)
+//line templates/about.qtpl:19
+}
+
+//line templates/about.qtpl:19
+func (p *AboutPage) Script(ctx context.Context) string {
+//line templates/about.qtpl:19
+ qb422016 := qt422016.AcquireByteBuffer()
+//line templates/about.qtpl:19
+ p.WriteScript(qb422016, ctx)
+//line templates/about.qtpl:19
+ qs422016 := string(qb422016.B)
+//line templates/about.qtpl:19
+ qt422016.ReleaseByteBuffer(qb422016)
+//line templates/about.qtpl:19
+ return qs422016
+//line templates/about.qtpl:19
+}
diff --git a/templates/base.qtpl b/templates/base.qtpl
index 566308f..2a42cb8 100644
--- a/templates/base.qtpl
+++ b/templates/base.qtpl
@@ -1,5 +1,6 @@
This is a base page template. All the other template pages implement this interface.
+{% import "context" %}
{% import "strconv" %}
{% import "time" %}
@@ -9,10 +10,10 @@ This is a base page template. All the other template pages implement this interf
{% interface
Page {
- Title()
- Content()
- Script()
- Navbar()
+ Title(ctx context.Context)
+ Content(ctx context.Context)
+ Script(ctx context.Context)
+ Navbar(ctx context.Context)
}
%}
@@ -25,6 +26,8 @@ Page {
}
%}
+
+
{% code func TimeFormat(t time.Time) string {
return t.Format("02.01.2006")
}
@@ -35,24 +38,30 @@ Page {
}
%}
+{% code func IsLoggedIn(ctx context.Context) bool {
+ t, ok := ctx.Value("logged").(bool)
+ return ok && t
+ }
+%}
+
Page prints a page implementing Page interface.
-{% func PageTemplate(p Page) %}
+{% func PageTemplate(p Page, ctx context.Context) %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<link rel="icon" href="data:,">
- <title>{%= p.Title() %}</title>
+ <title>{%= p.Title(ctx) %}</title>
<link rel="stylesheet" href="/static/main{%s Slug %}.css">
<meta content="text/html;charset=utf-8" http-equiv="Content-Type">
<meta name="viewport" content="width=device-width, initial-scale=1" />
</head>
<body>
- {%= p.Navbar() %}
+ {%= p.Navbar(ctx) %}
<div class="container">
- {%= p.Content() %}
+ {%= p.Content(ctx) %}
</div>
</body>
- {%= p.Script() %}
+ {%= p.Script(ctx) %}
</html>
{% endfunc %}
diff --git a/templates/base.qtpl.go b/templates/base.qtpl.go
index f8ff91f..5bb4532 100644
--- a/templates/base.qtpl.go
+++ b/templates/base.qtpl.go
@@ -8,57 +8,60 @@
package templates
//line templates/base.qtpl:3
-import "strconv"
+import "context"
//line templates/base.qtpl:4
+import "strconv"
+
+//line templates/base.qtpl:5
import "time"
-//line templates/base.qtpl:6
+//line templates/base.qtpl:7
import (
qtio422016 "io"
qt422016 "github.com/valyala/quicktemplate"
)
-//line templates/base.qtpl:6
+//line templates/base.qtpl:7
var (
_ = qtio422016.Copy
_ = qt422016.AcquireByteBuffer
)
-//line templates/base.qtpl:7
+//line templates/base.qtpl:8
var Slug = ""
-//line templates/base.qtpl:11
+//line templates/base.qtpl:12
type Page interface {
-//line templates/base.qtpl:11
- Title() string
-//line templates/base.qtpl:11
- StreamTitle(qw422016 *qt422016.Writer)
-//line templates/base.qtpl:11
- WriteTitle(qq422016 qtio422016.Writer)
-//line templates/base.qtpl:11
- Content() string
-//line templates/base.qtpl:11
- StreamContent(qw422016 *qt422016.Writer)
-//line templates/base.qtpl:11
- WriteContent(qq422016 qtio422016.Writer)
-//line templates/base.qtpl:11
- Script() string
-//line templates/base.qtpl:11
- StreamScript(qw422016 *qt422016.Writer)
-//line templates/base.qtpl:11
- WriteScript(qq422016 qtio422016.Writer)
-//line templates/base.qtpl:11
- Navbar() string
-//line templates/base.qtpl:11
- StreamNavbar(qw422016 *qt422016.Writer)
-//line templates/base.qtpl:11
- WriteNavbar(qq422016 qtio422016.Writer)
-//line templates/base.qtpl:11
+//line templates/base.qtpl:12
+ Title(ctx context.Context) string
+//line templates/base.qtpl:12
+ StreamTitle(qw422016 *qt422016.Writer, ctx context.Context)
+//line templates/base.qtpl:12
+ WriteTitle(qq422016 qtio422016.Writer, ctx context.Context)
+//line templates/base.qtpl:12
+ Content(ctx context.Context) string
+//line templates/base.qtpl:12
+ StreamContent(qw422016 *qt422016.Writer, ctx context.Context)
+//line templates/base.qtpl:12
+ WriteContent(qq422016 qtio422016.Writer, ctx context.Context)
+//line templates/base.qtpl:12
+ Script(ctx context.Context) string
+//line templates/base.qtpl:12
+ StreamScript(qw422016 *qt422016.Writer, ctx context.Context)
+//line templates/base.qtpl:12
+ WriteScript(qq422016 qtio422016.Writer, ctx context.Context)
+//line templates/base.qtpl:12
+ Navbar(ctx context.Context) string
+//line templates/base.qtpl:12
+ StreamNavbar(qw422016 *qt422016.Writer, ctx context.Context)
+//line templates/base.qtpl:12
+ WriteNavbar(qq422016 qtio422016.Writer, ctx context.Context)
+//line templates/base.qtpl:12
}
-//line templates/base.qtpl:20
+//line templates/base.qtpl:21
func FromUInttoString(u *uint) string {
if u != nil {
return strconv.FormatUint(uint64(*u), 10)
@@ -66,21 +69,27 @@ func FromUInttoString(u *uint) string {
return ""
}
-//line templates/base.qtpl:28
+//line templates/base.qtpl:31
func TimeFormat(t time.Time) string {
return t.Format("02.01.2006")
}
-//line templates/base.qtpl:33
+//line templates/base.qtpl:36
func Ignore[T any](v T, _ error) T {
return v
}
+//line templates/base.qtpl:41
+func IsLoggedIn(ctx context.Context) bool {
+ t, ok := ctx.Value("logged").(bool)
+ return ok && t
+}
+
// Page prints a page implementing Page interface.
-//line templates/base.qtpl:39
-func StreamPageTemplate(qw422016 *qt422016.Writer, p Page) {
-//line templates/base.qtpl:39
+//line templates/base.qtpl:48
+func StreamPageTemplate(qw422016 *qt422016.Writer, p Page, ctx context.Context) {
+//line templates/base.qtpl:48
qw422016.N().S(`
<!DOCTYPE html>
<html lang="en">
@@ -88,64 +97,64 @@ func StreamPageTemplate(qw422016 *qt422016.Writer, p Page) {
<meta charset="utf-8">
<link rel="icon" href="data:,">
<title>`)
-//line templates/base.qtpl:45
- p.StreamTitle(qw422016)
-//line templates/base.qtpl:45
+//line templates/base.qtpl:54
+ p.StreamTitle(qw422016, ctx)
+//line templates/base.qtpl:54
qw422016.N().S(`</title>
<link rel="stylesheet" href="/static/main`)
-//line templates/base.qtpl:46
+//line templates/base.qtpl:55
qw422016.E().S(Slug)
-//line templates/base.qtpl:46
+//line templates/base.qtpl:55
qw422016.N().S(`.css">
<meta content="text/html;charset=utf-8" http-equiv="Content-Type">
<meta name="viewport" content="width=device-width, initial-scale=1" />
</head>
<body>
`)
-//line templates/base.qtpl:51
- p.StreamNavbar(qw422016)
-//line templates/base.qtpl:51
+//line templates/base.qtpl:60
+ p.StreamNavbar(qw422016, ctx)
+//line templates/base.qtpl:60
qw422016.N().S(`
<div class="container">
`)
-//line templates/base.qtpl:53
- p.StreamContent(qw422016)
-//line templates/base.qtpl:53
+//line templates/base.qtpl:62
+ p.StreamContent(qw422016, ctx)
+//line templates/base.qtpl:62
qw422016.N().S(`
</div>
</body>
`)
-//line templates/base.qtpl:56
- p.StreamScript(qw422016)
-//line templates/base.qtpl:56
+//line templates/base.qtpl:65
+ p.StreamScript(qw422016, ctx)
+//line templates/base.qtpl:65
qw422016.N().S(`
</html>
`)
-//line templates/base.qtpl:58
+//line templates/base.qtpl:67
}
-//line templates/base.qtpl:58
-func WritePageTemplate(qq422016 qtio422016.Writer, p Page) {
-//line templates/base.qtpl:58
+//line templates/base.qtpl:67
+func WritePageTemplate(qq422016 qtio422016.Writer, p Page, ctx context.Context) {
+//line templates/base.qtpl:67
qw422016 := qt422016.AcquireWriter(qq422016)
-//line templates/base.qtpl:58
- StreamPageTemplate(qw422016, p)
-//line templates/base.qtpl:58
+//line templates/base.qtpl:67
+ StreamPageTemplate(qw422016, p, ctx)
+//line templates/base.qtpl:67
qt422016.ReleaseWriter(qw422016)
-//line templates/base.qtpl:58
+//line templates/base.qtpl:67
}
-//line templates/base.qtpl:58
-func PageTemplate(p Page) string {
-//line templates/base.qtpl:58
+//line templates/base.qtpl:67
+func PageTemplate(p Page, ctx context.Context) string {
+//line templates/base.qtpl:67
qb422016 := qt422016.AcquireByteBuffer()
-//line templates/base.qtpl:58
- WritePageTemplate(qb422016, p)
-//line templates/base.qtpl:58
+//line templates/base.qtpl:67
+ WritePageTemplate(qb422016, p, ctx)
+//line templates/base.qtpl:67
qs422016 := string(qb422016.B)
-//line templates/base.qtpl:58
+//line templates/base.qtpl:67
qt422016.ReleaseByteBuffer(qb422016)
-//line templates/base.qtpl:58
+//line templates/base.qtpl:67
return qs422016
-//line templates/base.qtpl:58
+//line templates/base.qtpl:67
}
diff --git a/templates/error.qtpl b/templates/error.qtpl
index 771d533..65e1321 100644
--- a/templates/error.qtpl
+++ b/templates/error.qtpl
@@ -1,16 +1,18 @@
+{% import "context" %}
+
{% code
type ErrorPage struct {
Message string
}
%}
-{% func (p *ErrorPage) Title() %}Error{% endfunc %}
+{% func (p *ErrorPage) Title(ctx context.Context) %}Error{% endfunc %}
-{% func (p *ErrorPage) Navbar() %}{%= Navbar(Git) %}{% endfunc %}
+{% func (p *ErrorPage) Navbar(ctx context.Context) %}{%= Navbar(ctx, Git) %}{% endfunc %}
-{% func (p *ErrorPage) Content() %}
+{% func (p *ErrorPage) Content(ctx context.Context) %}
{%s p.Message %}
{% endfunc %}
-{% func (p *ErrorPage) Script() %}
+{% func (p *ErrorPage) Script(ctx context.Context) %}
{% endfunc %}
diff --git a/templates/error.qtpl.go b/templates/error.qtpl.go
index f415968..d4732c5 100644
--- a/templates/error.qtpl.go
+++ b/templates/error.qtpl.go
@@ -5,80 +5,50 @@
package templates
//line templates/error.qtpl:1
+import "context"
+
+//line templates/error.qtpl:3
import (
qtio422016 "io"
qt422016 "github.com/valyala/quicktemplate"
)
-//line templates/error.qtpl:1
+//line templates/error.qtpl:3
var (
_ = qtio422016.Copy
_ = qt422016.AcquireByteBuffer
)
-//line templates/error.qtpl:2
+//line templates/error.qtpl:4
type ErrorPage struct {
Message string
}
-//line templates/error.qtpl:7
-func (p *ErrorPage) StreamTitle(qw422016 *qt422016.Writer) {
-//line templates/error.qtpl:7
- qw422016.N().S(`Error`)
-//line templates/error.qtpl:7
-}
-
-//line templates/error.qtpl:7
-func (p *ErrorPage) WriteTitle(qq422016 qtio422016.Writer) {
-//line templates/error.qtpl:7
- qw422016 := qt422016.AcquireWriter(qq422016)
-//line templates/error.qtpl:7
- p.StreamTitle(qw422016)
-//line templates/error.qtpl:7
- qt422016.ReleaseWriter(qw422016)
-//line templates/error.qtpl:7
-}
-
-//line templates/error.qtpl:7
-func (p *ErrorPage) Title() string {
-//line templates/error.qtpl:7
- qb422016 := qt422016.AcquireByteBuffer()
-//line templates/error.qtpl:7
- p.WriteTitle(qb422016)
-//line templates/error.qtpl:7
- qs422016 := string(qb422016.B)
-//line templates/error.qtpl:7
- qt422016.ReleaseByteBuffer(qb422016)
-//line templates/error.qtpl:7
- return qs422016
-//line templates/error.qtpl:7
-}
-
//line templates/error.qtpl:9
-func (p *ErrorPage) StreamNavbar(qw422016 *qt422016.Writer) {
+func (p *ErrorPage) StreamTitle(qw422016 *qt422016.Writer, ctx context.Context) {
//line templates/error.qtpl:9
- StreamNavbar(qw422016, Git)
+ qw422016.N().S(`Error`)
//line templates/error.qtpl:9
}
//line templates/error.qtpl:9
-func (p *ErrorPage) WriteNavbar(qq422016 qtio422016.Writer) {
+func (p *ErrorPage) WriteTitle(qq422016 qtio422016.Writer, ctx context.Context) {
//line templates/error.qtpl:9
qw422016 := qt422016.AcquireWriter(qq422016)
//line templates/error.qtpl:9
- p.StreamNavbar(qw422016)
+ p.StreamTitle(qw422016, ctx)
//line templates/error.qtpl:9
qt422016.ReleaseWriter(qw422016)
//line templates/error.qtpl:9
}
//line templates/error.qtpl:9
-func (p *ErrorPage) Navbar() string {
+func (p *ErrorPage) Title(ctx context.Context) string {
//line templates/error.qtpl:9
qb422016 := qt422016.AcquireByteBuffer()
//line templates/error.qtpl:9
- p.WriteNavbar(qb422016)
+ p.WriteTitle(qb422016, ctx)
//line templates/error.qtpl:9
qs422016 := string(qb422016.B)
//line templates/error.qtpl:9
@@ -89,74 +59,107 @@ func (p *ErrorPage) Navbar() string {
}
//line templates/error.qtpl:11
-func (p *ErrorPage) StreamContent(qw422016 *qt422016.Writer) {
+func (p *ErrorPage) StreamNavbar(qw422016 *qt422016.Writer, ctx context.Context) {
+//line templates/error.qtpl:11
+ StreamNavbar(qw422016, ctx, Git)
+//line templates/error.qtpl:11
+}
+
+//line templates/error.qtpl:11
+func (p *ErrorPage) WriteNavbar(qq422016 qtio422016.Writer, ctx context.Context) {
+//line templates/error.qtpl:11
+ qw422016 := qt422016.AcquireWriter(qq422016)
+//line templates/error.qtpl:11
+ p.StreamNavbar(qw422016, ctx)
+//line templates/error.qtpl:11
+ qt422016.ReleaseWriter(qw422016)
+//line templates/error.qtpl:11
+}
+
+//line templates/error.qtpl:11
+func (p *ErrorPage) Navbar(ctx context.Context) string {
+//line templates/error.qtpl:11
+ qb422016 := qt422016.AcquireByteBuffer()
//line templates/error.qtpl:11
+ p.WriteNavbar(qb422016, ctx)
+//line templates/error.qtpl:11
+ qs422016 := string(qb422016.B)
+//line templates/error.qtpl:11
+ qt422016.ReleaseByteBuffer(qb422016)
+//line templates/error.qtpl:11
+ return qs422016
+//line templates/error.qtpl:11
+}
+
+//line templates/error.qtpl:13
+func (p *ErrorPage) StreamContent(qw422016 *qt422016.Writer, ctx context.Context) {
+//line templates/error.qtpl:13
qw422016.N().S(`
`)
-//line templates/error.qtpl:12
+//line templates/error.qtpl:14
qw422016.E().S(p.Message)
-//line templates/error.qtpl:12
+//line templates/error.qtpl:14
qw422016.N().S(`
`)
-//line templates/error.qtpl:13
+//line templates/error.qtpl:15
}
-//line templates/error.qtpl:13
-func (p *ErrorPage) WriteContent(qq422016 qtio422016.Writer) {
-//line templates/error.qtpl:13
+//line templates/error.qtpl:15
+func (p *ErrorPage) WriteContent(qq422016 qtio422016.Writer, ctx context.Context) {
+//line templates/error.qtpl:15
qw422016 := qt422016.AcquireWriter(qq422016)
-//line templates/error.qtpl:13
- p.StreamContent(qw422016)
-//line templates/error.qtpl:13
+//line templates/error.qtpl:15
+ p.StreamContent(qw422016, ctx)
+//line templates/error.qtpl:15
qt422016.ReleaseWriter(qw422016)
-//line templates/error.qtpl:13
+//line templates/error.qtpl:15
}
-//line templates/error.qtpl:13
-func (p *ErrorPage) Content() string {
-//line templates/error.qtpl:13
+//line templates/error.qtpl:15
+func (p *ErrorPage) Content(ctx context.Context) string {
+//line templates/error.qtpl:15
qb422016 := qt422016.AcquireByteBuffer()
-//line templates/error.qtpl:13
- p.WriteContent(qb422016)
-//line templates/error.qtpl:13
+//line templates/error.qtpl:15
+ p.WriteContent(qb422016, ctx)
+//line templates/error.qtpl:15
qs422016 := string(qb422016.B)
-//line templates/error.qtpl:13
+//line templates/error.qtpl:15
qt422016.ReleaseByteBuffer(qb422016)
-//line templates/error.qtpl:13
+//line templates/error.qtpl:15
return qs422016
-//line templates/error.qtpl:13
+//line templates/error.qtpl:15
}
-//line templates/error.qtpl:15
-func (p *ErrorPage) StreamScript(qw422016 *qt422016.Writer) {
-//line templates/error.qtpl:15
+//line templates/error.qtpl:17
+func (p *ErrorPage) StreamScript(qw422016 *qt422016.Writer, ctx context.Context) {
+//line templates/error.qtpl:17
qw422016.N().S(`
`)
-//line templates/error.qtpl:16
+//line templates/error.qtpl:18
}
-//line templates/error.qtpl:16
-func (p *ErrorPage) WriteScript(qq422016 qtio422016.Writer) {
-//line templates/error.qtpl:16
+//line templates/error.qtpl:18
+func (p *ErrorPage) WriteScript(qq422016 qtio422016.Writer, ctx context.Context) {
+//line templates/error.qtpl:18
qw422016 := qt422016.AcquireWriter(qq422016)
-//line templates/error.qtpl:16
- p.StreamScript(qw422016)
-//line templates/error.qtpl:16
+//line templates/error.qtpl:18
+ p.StreamScript(qw422016, ctx)
+//line templates/error.qtpl:18
qt422016.ReleaseWriter(qw422016)
-//line templates/error.qtpl:16
+//line templates/error.qtpl:18
}
-//line templates/error.qtpl:16
-func (p *ErrorPage) Script() string {
-//line templates/error.qtpl:16
+//line templates/error.qtpl:18
+func (p *ErrorPage) Script(ctx context.Context) string {
+//line templates/error.qtpl:18
qb422016 := qt422016.AcquireByteBuffer()
-//line templates/error.qtpl:16
- p.WriteScript(qb422016)
-//line templates/error.qtpl:16
+//line templates/error.qtpl:18
+ p.WriteScript(qb422016, ctx)
+//line templates/error.qtpl:18
qs422016 := string(qb422016.B)
-//line templates/error.qtpl:16
+//line templates/error.qtpl:18
qt422016.ReleaseByteBuffer(qb422016)
-//line templates/error.qtpl:16
+//line templates/error.qtpl:18
return qs422016
-//line templates/error.qtpl:16
+//line templates/error.qtpl:18
}
diff --git a/templates/gititem.qtpl b/templates/gititem.qtpl
index a6a312d..c43bbfd 100644
--- a/templates/gititem.qtpl
+++ b/templates/gititem.qtpl
@@ -1,3 +1,5 @@
+{% import "context" %}
+
{% interface
GitItemBase {
Nav(name, ref string)
@@ -13,16 +15,16 @@ type GitItemPage struct {
}
%}
-{% func (p *GitItemPage) Title() %}Git | {%s p.Name %}{% endfunc %}
+{% func (p *GitItemPage) Title(ctx context.Context) %}Git | {%s p.Name %}{% endfunc %}
-{% func (p *GitItemPage) Navbar() %}{%= Navbar(Git) %}{% endfunc %}
+{% func (p *GitItemPage) Navbar(ctx context.Context) %}{%= Navbar(ctx, Git) %}{% endfunc %}
-{% func (p *GitItemPage) Content() %}
+{% func (p *GitItemPage) Content(ctx context.Context) %}
{%= p.Nav(p.Name, p.Ref) %}
<div class="container">
{%= p.GitContent(p.Name, p.Ref) %}
</div>
{% endfunc %}
-{% func (p *GitItemPage) Script() %}
+{% func (p *GitItemPage) Script(ctx context.Context) %}
{% endfunc %}
diff --git a/templates/gititem.qtpl.go b/templates/gititem.qtpl.go
index c9a00b2..5292e44 100644
--- a/templates/gititem.qtpl.go
+++ b/templates/gititem.qtpl.go
@@ -5,101 +5,71 @@
package templates
//line templates/gititem.qtpl:1
+import "context"
+
+//line templates/gititem.qtpl:3
import (
qtio422016 "io"
qt422016 "github.com/valyala/quicktemplate"
)
-//line templates/gititem.qtpl:1
+//line templates/gititem.qtpl:3
var (
_ = qtio422016.Copy
_ = qt422016.AcquireByteBuffer
)
-//line templates/gititem.qtpl:2
+//line templates/gititem.qtpl:4
type GitItemBase interface {
-//line templates/gititem.qtpl:2
+//line templates/gititem.qtpl:4
Nav(name, ref string) string
-//line templates/gititem.qtpl:2
+//line templates/gititem.qtpl:4
StreamNav(qw422016 *qt422016.Writer, name, ref string)
-//line templates/gititem.qtpl:2
+//line templates/gititem.qtpl:4
WriteNav(qq422016 qtio422016.Writer, name, ref string)
-//line templates/gititem.qtpl:2
+//line templates/gititem.qtpl:4
GitContent(name, ref string) string
-//line templates/gititem.qtpl:2
+//line templates/gititem.qtpl:4
StreamGitContent(qw422016 *qt422016.Writer, name, ref string)
-//line templates/gititem.qtpl:2
+//line templates/gititem.qtpl:4
WriteGitContent(qq422016 qtio422016.Writer, name, ref string)
-//line templates/gititem.qtpl:2
+//line templates/gititem.qtpl:4
}
-//line templates/gititem.qtpl:9
+//line templates/gititem.qtpl:11
type GitItemPage struct {
Name string
Ref string
GitItemBase
}
-//line templates/gititem.qtpl:16
-func (p *GitItemPage) StreamTitle(qw422016 *qt422016.Writer) {
-//line templates/gititem.qtpl:16
- qw422016.N().S(`Git | `)
-//line templates/gititem.qtpl:16
- qw422016.E().S(p.Name)
-//line templates/gititem.qtpl:16
-}
-
-//line templates/gititem.qtpl:16
-func (p *GitItemPage) WriteTitle(qq422016 qtio422016.Writer) {
-//line templates/gititem.qtpl:16
- qw422016 := qt422016.AcquireWriter(qq422016)
-//line templates/gititem.qtpl:16
- p.StreamTitle(qw422016)
-//line templates/gititem.qtpl:16
- qt422016.ReleaseWriter(qw422016)
-//line templates/gititem.qtpl:16
-}
-
-//line templates/gititem.qtpl:16
-func (p *GitItemPage) Title() string {
-//line templates/gititem.qtpl:16
- qb422016 := qt422016.AcquireByteBuffer()
-//line templates/gititem.qtpl:16
- p.WriteTitle(qb422016)
-//line templates/gititem.qtpl:16
- qs422016 := string(qb422016.B)
-//line templates/gititem.qtpl:16
- qt422016.ReleaseByteBuffer(qb422016)
-//line templates/gititem.qtpl:16
- return qs422016
-//line templates/gititem.qtpl:16
-}
-
//line templates/gititem.qtpl:18
-func (p *GitItemPage) StreamNavbar(qw422016 *qt422016.Writer) {
+func (p *GitItemPage) StreamTitle(qw422016 *qt422016.Writer, ctx context.Context) {
//line templates/gititem.qtpl:18
- StreamNavbar(qw422016, Git)
+ qw422016.N().S(`Git | `)
+//line templates/gititem.qtpl:18
+ qw422016.E().S(p.Name)
//line templates/gititem.qtpl:18
}
//line templates/gititem.qtpl:18
-func (p *GitItemPage) WriteNavbar(qq422016 qtio422016.Writer) {
+func (p *GitItemPage) WriteTitle(qq422016 qtio422016.Writer, ctx context.Context) {
//line templates/gititem.qtpl:18
qw422016 := qt422016.AcquireWriter(qq422016)
//line templates/gititem.qtpl:18
- p.StreamNavbar(qw422016)
+ p.StreamTitle(qw422016, ctx)
//line templates/gititem.qtpl:18
qt422016.ReleaseWriter(qw422016)
//line templates/gititem.qtpl:18
}
//line templates/gititem.qtpl:18
-func (p *GitItemPage) Navbar() string {
+func (p *GitItemPage) Title(ctx context.Context) string {
//line templates/gititem.qtpl:18
qb422016 := qt422016.AcquireByteBuffer()
//line templates/gititem.qtpl:18
- p.WriteNavbar(qb422016)
+ p.WriteTitle(qb422016, ctx)
//line templates/gititem.qtpl:18
qs422016 := string(qb422016.B)
//line templates/gititem.qtpl:18
@@ -110,81 +80,114 @@ func (p *GitItemPage) Navbar() string {
}
//line templates/gititem.qtpl:20
-func (p *GitItemPage) StreamContent(qw422016 *qt422016.Writer) {
+func (p *GitItemPage) StreamNavbar(qw422016 *qt422016.Writer, ctx context.Context) {
+//line templates/gititem.qtpl:20
+ StreamNavbar(qw422016, ctx, Git)
+//line templates/gititem.qtpl:20
+}
+
+//line templates/gititem.qtpl:20
+func (p *GitItemPage) WriteNavbar(qq422016 qtio422016.Writer, ctx context.Context) {
+//line templates/gititem.qtpl:20
+ qw422016 := qt422016.AcquireWriter(qq422016)
+//line templates/gititem.qtpl:20
+ p.StreamNavbar(qw422016, ctx)
+//line templates/gititem.qtpl:20
+ qt422016.ReleaseWriter(qw422016)
+//line templates/gititem.qtpl:20
+}
+
+//line templates/gititem.qtpl:20
+func (p *GitItemPage) Navbar(ctx context.Context) string {
+//line templates/gititem.qtpl:20
+ qb422016 := qt422016.AcquireByteBuffer()
+//line templates/gititem.qtpl:20
+ p.WriteNavbar(qb422016, ctx)
+//line templates/gititem.qtpl:20
+ qs422016 := string(qb422016.B)
+//line templates/gititem.qtpl:20
+ qt422016.ReleaseByteBuffer(qb422016)
+//line templates/gititem.qtpl:20
+ return qs422016
//line templates/gititem.qtpl:20
+}
+
+//line templates/gititem.qtpl:22
+func (p *GitItemPage) StreamContent(qw422016 *qt422016.Writer, ctx context.Context) {
+//line templates/gititem.qtpl:22
qw422016.N().S(`
`)
-//line templates/gititem.qtpl:21
+//line templates/gititem.qtpl:23
p.StreamNav(qw422016, p.Name, p.Ref)
-//line templates/gititem.qtpl:21
+//line templates/gititem.qtpl:23
qw422016.N().S(`
<div class="container">
`)
-//line templates/gititem.qtpl:23
+//line templates/gititem.qtpl:25
p.StreamGitContent(qw422016, p.Name, p.Ref)
-//line templates/gititem.qtpl:23
+//line templates/gititem.qtpl:25
qw422016.N().S(`
</div>
`)
-//line templates/gititem.qtpl:25
+//line templates/gititem.qtpl:27
}
-//line templates/gititem.qtpl:25
-func (p *GitItemPage) WriteContent(qq422016 qtio422016.Writer) {
-//line templates/gititem.qtpl:25
+//line templates/gititem.qtpl:27
+func (p *GitItemPage) WriteContent(qq422016 qtio422016.Writer, ctx context.Context) {
+//line templates/gititem.qtpl:27
qw422016 := qt422016.AcquireWriter(qq422016)
-//line templates/gititem.qtpl:25
- p.StreamContent(qw422016)
-//line templates/gititem.qtpl:25
+//line templates/gititem.qtpl:27
+ p.StreamContent(qw422016, ctx)
+//line templates/gititem.qtpl:27
qt422016.ReleaseWriter(qw422016)
-//line templates/gititem.qtpl:25
+//line templates/gititem.qtpl:27
}
-//line templates/gititem.qtpl:25
-func (p *GitItemPage) Content() string {
-//line templates/gititem.qtpl:25
+//line templates/gititem.qtpl:27
+func (p *GitItemPage) Content(ctx context.Context) string {
+//line templates/gititem.qtpl:27
qb422016 := qt422016.AcquireByteBuffer()
-//line templates/gititem.qtpl:25
- p.WriteContent(qb422016)
-//line templates/gititem.qtpl:25
+//line templates/gititem.qtpl:27
+ p.WriteContent(qb422016, ctx)
+//line templates/gititem.qtpl:27
qs422016 := string(qb422016.B)
-//line templates/gititem.qtpl:25
+//line templates/gititem.qtpl:27
qt422016.ReleaseByteBuffer(qb422016)
-//line templates/gititem.qtpl:25
+//line templates/gititem.qtpl:27
return qs422016
-//line templates/gititem.qtpl:25
+//line templates/gititem.qtpl:27
}
-//line templates/gititem.qtpl:27
-func (p *GitItemPage) StreamScript(qw422016 *qt422016.Writer) {
-//line templates/gititem.qtpl:27
+//line templates/gititem.qtpl:29
+func (p *GitItemPage) StreamScript(qw422016 *qt422016.Writer, ctx context.Context) {
+//line templates/gititem.qtpl:29
qw422016.N().S(`
`)
-//line templates/gititem.qtpl:28
+//line templates/gititem.qtpl:30
}
-//line templates/gititem.qtpl:28
-func (p *GitItemPage) WriteScript(qq422016 qtio422016.Writer) {
-//line templates/gititem.qtpl:28
+//line templates/gititem.qtpl:30
+func (p *GitItemPage) WriteScript(qq422016 qtio422016.Writer, ctx context.Context) {
+//line templates/gititem.qtpl:30
qw422016 := qt422016.AcquireWriter(qq422016)
-//line templates/gititem.qtpl:28
- p.StreamScript(qw422016)
-//line templates/gititem.qtpl:28
+//line templates/gititem.qtpl:30
+ p.StreamScript(qw422016, ctx)
+//line templates/gititem.qtpl:30
qt422016.ReleaseWriter(qw422016)
-//line templates/gititem.qtpl:28
+//line templates/gititem.qtpl:30
}
-//line templates/gititem.qtpl:28
-func (p *GitItemPage) Script() string {
-//line templates/gititem.qtpl:28
+//line templates/gititem.qtpl:30
+func (p *GitItemPage) Script(ctx context.Context) string {
+//line templates/gititem.qtpl:30
qb422016 := qt422016.AcquireByteBuffer()
-//line templates/gititem.qtpl:28
- p.WriteScript(qb422016)
-//line templates/gititem.qtpl:28
+//line templates/gititem.qtpl:30
+ p.WriteScript(qb422016, ctx)
+//line templates/gititem.qtpl:30
qs422016 := string(qb422016.B)
-//line templates/gititem.qtpl:28
+//line templates/gititem.qtpl:30
qt422016.ReleaseByteBuffer(qb422016)
-//line templates/gititem.qtpl:28
+//line templates/gititem.qtpl:30
return qs422016
-//line templates/gititem.qtpl:28
+//line templates/gititem.qtpl:30
}
diff --git a/templates/gitlist.qtpl b/templates/gitlist.qtpl
index 7c104ca..fa47008 100644
--- a/templates/gitlist.qtpl
+++ b/templates/gitlist.qtpl
@@ -1,4 +1,5 @@
{% import "git.gabrielgio.me/cerrado/pkg/service" %}
+{% import "context" %}
{% code
type GitListPage struct {
@@ -7,11 +8,11 @@ type GitListPage struct {
}
%}
-{% func (p *GitListPage) Title() %}Git | List{% endfunc %}
+{% func (p *GitListPage) Title(ctx context.Context) %}Git | List{% endfunc %}
-{% func (p *GitListPage) Navbar() %}{%= Navbar(Git) %}{% endfunc %}
+{% func (p *GitListPage) Navbar(ctx context.Context) %}{%= Navbar(ctx, Git) %}{% endfunc %}
-{% func (p *GitListPage) Content() %}
+{% func (p *GitListPage) Content(ctx context.Context) %}
<div class="row">
<div class="col-md-6 order-last order-md-first">
<div class="event-list">
@@ -40,5 +41,5 @@ type GitListPage struct {
</div>
{% endfunc %}
-{% func (p *GitListPage) Script() %}
+{% func (p *GitListPage) Script(ctx context.Context) %}
{% endfunc %}
diff --git a/templates/gitlist.qtpl.go b/templates/gitlist.qtpl.go
index 29adbc6..601dbb2 100644
--- a/templates/gitlist.qtpl.go
+++ b/templates/gitlist.qtpl.go
@@ -7,159 +7,162 @@ package templates
//line templates/gitlist.qtpl:1
import "git.gabrielgio.me/cerrado/pkg/service"
-//line templates/gitlist.qtpl:3
+//line templates/gitlist.qtpl:2
+import "context"
+
+//line templates/gitlist.qtpl:4
import (
qtio422016 "io"
qt422016 "github.com/valyala/quicktemplate"
)
-//line templates/gitlist.qtpl:3
+//line templates/gitlist.qtpl:4
var (
_ = qtio422016.Copy
_ = qt422016.AcquireByteBuffer
)
-//line templates/gitlist.qtpl:4
+//line templates/gitlist.qtpl:5
type GitListPage struct {
Respositories []*service.Repository
About []byte
}
-//line templates/gitlist.qtpl:10
-func (p *GitListPage) StreamTitle(qw422016 *qt422016.Writer) {
-//line templates/gitlist.qtpl:10
+//line templates/gitlist.qtpl:11
+func (p *GitListPage) StreamTitle(qw422016 *qt422016.Writer, ctx context.Context) {
+//line templates/gitlist.qtpl:11
qw422016.N().S(`Git | List`)
-//line templates/gitlist.qtpl:10
+//line templates/gitlist.qtpl:11
}
-//line templates/gitlist.qtpl:10
-func (p *GitListPage) WriteTitle(qq422016 qtio422016.Writer) {
-//line templates/gitlist.qtpl:10
+//line templates/gitlist.qtpl:11
+func (p *GitListPage) WriteTitle(qq422016 qtio422016.Writer, ctx context.Context) {
+//line templates/gitlist.qtpl:11
qw422016 := qt422016.AcquireWriter(qq422016)
-//line templates/gitlist.qtpl:10
- p.StreamTitle(qw422016)
-//line templates/gitlist.qtpl:10
+//line templates/gitlist.qtpl:11
+ p.StreamTitle(qw422016, ctx)
+//line templates/gitlist.qtpl:11
qt422016.ReleaseWriter(qw422016)
-//line templates/gitlist.qtpl:10
+//line templates/gitlist.qtpl:11
}
-//line templates/gitlist.qtpl:10
-func (p *GitListPage) Title() string {
-//line templates/gitlist.qtpl:10
+//line templates/gitlist.qtpl:11
+func (p *GitListPage) Title(ctx context.Context) string {
+//line templates/gitlist.qtpl:11
qb422016 := qt422016.AcquireByteBuffer()
-//line templates/gitlist.qtpl:10
- p.WriteTitle(qb422016)
-//line templates/gitlist.qtpl:10
+//line templates/gitlist.qtpl:11
+ p.WriteTitle(qb422016, ctx)
+//line templates/gitlist.qtpl:11
qs422016 := string(qb422016.B)
-//line templates/gitlist.qtpl:10
+//line templates/gitlist.qtpl:11
qt422016.ReleaseByteBuffer(qb422016)
-//line templates/gitlist.qtpl:10
+//line templates/gitlist.qtpl:11
return qs422016
-//line templates/gitlist.qtpl:10
+//line templates/gitlist.qtpl:11
}
-//line templates/gitlist.qtpl:12
-func (p *GitListPage) StreamNavbar(qw422016 *qt422016.Writer) {
-//line templates/gitlist.qtpl:12
- StreamNavbar(qw422016, Git)
-//line templates/gitlist.qtpl:12
+//line templates/gitlist.qtpl:13
+func (p *GitListPage) StreamNavbar(qw422016 *qt422016.Writer, ctx context.Context) {
+//line templates/gitlist.qtpl:13
+ StreamNavbar(qw422016, ctx, Git)
+//line templates/gitlist.qtpl:13
}
-//line templates/gitlist.qtpl:12
-func (p *GitListPage) WriteNavbar(qq422016 qtio422016.Writer) {
-//line templates/gitlist.qtpl:12
+//line templates/gitlist.qtpl:13
+func (p *GitListPage) WriteNavbar(qq422016 qtio422016.Writer, ctx context.Context) {
+//line templates/gitlist.qtpl:13
qw422016 := qt422016.AcquireWriter(qq422016)
-//line templates/gitlist.qtpl:12
- p.StreamNavbar(qw422016)
-//line templates/gitlist.qtpl:12
+//line templates/gitlist.qtpl:13
+ p.StreamNavbar(qw422016, ctx)
+//line templates/gitlist.qtpl:13
qt422016.ReleaseWriter(qw422016)
-//line templates/gitlist.qtpl:12
+//line templates/gitlist.qtpl:13
}
-//line templates/gitlist.qtpl:12
-func (p *GitListPage) Navbar() string {
-//line templates/gitlist.qtpl:12
+//line templates/gitlist.qtpl:13
+func (p *GitListPage) Navbar(ctx context.Context) string {
+//line templates/gitlist.qtpl:13
qb422016 := qt422016.AcquireByteBuffer()
-//line templates/gitlist.qtpl:12
- p.WriteNavbar(qb422016)
-//line templates/gitlist.qtpl:12
+//line templates/gitlist.qtpl:13
+ p.WriteNavbar(qb422016, ctx)
+//line templates/gitlist.qtpl:13
qs422016 := string(qb422016.B)
-//line templates/gitlist.qtpl:12
+//line templates/gitlist.qtpl:13
qt422016.ReleaseByteBuffer(qb422016)
-//line templates/gitlist.qtpl:12
+//line templates/gitlist.qtpl:13
return qs422016
-//line templates/gitlist.qtpl:12
+//line templates/gitlist.qtpl:13
}
-//line templates/gitlist.qtpl:14
-func (p *GitListPage) StreamContent(qw422016 *qt422016.Writer) {
-//line templates/gitlist.qtpl:14
+//line templates/gitlist.qtpl:15
+func (p *GitListPage) StreamContent(qw422016 *qt422016.Writer, ctx context.Context) {
+//line templates/gitlist.qtpl:15
qw422016.N().S(`
<div class="row">
<div class="col-md-6 order-last order-md-first">
<div class="event-list">
`)
-//line templates/gitlist.qtpl:18
+//line templates/gitlist.qtpl:19
for _, r := range p.Respositories {
-//line templates/gitlist.qtpl:18
+//line templates/gitlist.qtpl:19
qw422016.N().S(`
<div class="event">
<h4>
<a href="/`)
-//line templates/gitlist.qtpl:21
+//line templates/gitlist.qtpl:22
qw422016.E().S(r.Name)
-//line templates/gitlist.qtpl:21
+//line templates/gitlist.qtpl:22
qw422016.N().S(`/">`)
-//line templates/gitlist.qtpl:21
+//line templates/gitlist.qtpl:22
qw422016.E().S(r.Name)
-//line templates/gitlist.qtpl:21
+//line templates/gitlist.qtpl:22
qw422016.N().S(`</a>
</h4>
</hr>
<p>`)
-//line templates/gitlist.qtpl:24
+//line templates/gitlist.qtpl:25
qw422016.E().S(r.Description)
-//line templates/gitlist.qtpl:24
+//line templates/gitlist.qtpl:25
qw422016.N().S(`</p>
<p>
<a href="/`)
-//line templates/gitlist.qtpl:26
+//line templates/gitlist.qtpl:27
qw422016.E().S(r.Name)
-//line templates/gitlist.qtpl:26
+//line templates/gitlist.qtpl:27
qw422016.N().S(`/log/`)
-//line templates/gitlist.qtpl:26
+//line templates/gitlist.qtpl:27
qw422016.E().S(r.Ref)
-//line templates/gitlist.qtpl:26
+//line templates/gitlist.qtpl:27
qw422016.N().S(`/">log</a>
<a href="/`)
-//line templates/gitlist.qtpl:27
+//line templates/gitlist.qtpl:28
qw422016.E().S(r.Name)
-//line templates/gitlist.qtpl:27
+//line templates/gitlist.qtpl:28
qw422016.N().S(`/tree/`)
-//line templates/gitlist.qtpl:27
+//line templates/gitlist.qtpl:28
qw422016.E().S(r.Ref)
-//line templates/gitlist.qtpl:27
+//line templates/gitlist.qtpl:28
qw422016.N().S(`/">tree</a>
<a href="/`)
-//line templates/gitlist.qtpl:28
+//line templates/gitlist.qtpl:29
qw422016.E().S(r.Name)
-//line templates/gitlist.qtpl:28
+//line templates/gitlist.qtpl:29
qw422016.N().S(`/refs/">refs</a>
</p>
</div>
`)
-//line templates/gitlist.qtpl:31
+//line templates/gitlist.qtpl:32
}
-//line templates/gitlist.qtpl:31
+//line templates/gitlist.qtpl:32
qw422016.N().S(`
</div>
</div>
<div id="about" class="col-md-4 order-first order-md-last">
`)
-//line templates/gitlist.qtpl:35
+//line templates/gitlist.qtpl:36
qw422016.N().Z(p.About)
-//line templates/gitlist.qtpl:35
+//line templates/gitlist.qtpl:36
qw422016.N().S(`
<div class="alert alert-warning text-center" role="alert">
This project is under development, things may be broken or incomplete.
@@ -167,65 +170,65 @@ func (p *GitListPage) StreamContent(qw422016 *qt422016.Writer) {
</div>
</div>
`)
-//line templates/gitlist.qtpl:41
+//line templates/gitlist.qtpl:42
}
-//line templates/gitlist.qtpl:41
-func (p *GitListPage) WriteContent(qq422016 qtio422016.Writer) {
-//line templates/gitlist.qtpl:41
+//line templates/gitlist.qtpl:42
+func (p *GitListPage) WriteContent(qq422016 qtio422016.Writer, ctx context.Context) {
+//line templates/gitlist.qtpl:42
qw422016 := qt422016.AcquireWriter(qq422016)
-//line templates/gitlist.qtpl:41
- p.StreamContent(qw422016)
-//line templates/gitlist.qtpl:41
+//line templates/gitlist.qtpl:42
+ p.StreamContent(qw422016, ctx)
+//line templates/gitlist.qtpl:42
qt422016.ReleaseWriter(qw422016)
-//line templates/gitlist.qtpl:41
+//line templates/gitlist.qtpl:42
}
-//line templates/gitlist.qtpl:41
-func (p *GitListPage) Content() string {
-//line templates/gitlist.qtpl:41
+//line templates/gitlist.qtpl:42
+func (p *GitListPage) Content(ctx context.Context) string {
+//line templates/gitlist.qtpl:42
qb422016 := qt422016.AcquireByteBuffer()
-//line templates/gitlist.qtpl:41
- p.WriteContent(qb422016)
-//line templates/gitlist.qtpl:41
+//line templates/gitlist.qtpl:42
+ p.WriteContent(qb422016, ctx)
+//line templates/gitlist.qtpl:42
qs422016 := string(qb422016.B)
-//line templates/gitlist.qtpl:41
+//line templates/gitlist.qtpl:42
qt422016.ReleaseByteBuffer(qb422016)
-//line templates/gitlist.qtpl:41
+//line templates/gitlist.qtpl:42
return qs422016
-//line templates/gitlist.qtpl:41
+//line templates/gitlist.qtpl:42
}
-//line templates/gitlist.qtpl:43
-func (p *GitListPage) StreamScript(qw422016 *qt422016.Writer) {
-//line templates/gitlist.qtpl:43
+//line templates/gitlist.qtpl:44
+func (p *GitListPage) StreamScript(qw422016 *qt422016.Writer, ctx context.Context) {
+//line templates/gitlist.qtpl:44
qw422016.N().S(`
`)
-//line templates/gitlist.qtpl:44
+//line templates/gitlist.qtpl:45
}
-//line templates/gitlist.qtpl:44
-func (p *GitListPage) WriteScript(qq422016 qtio422016.Writer) {
-//line templates/gitlist.qtpl:44
+//line templates/gitlist.qtpl:45
+func (p *GitListPage) WriteScript(qq422016 qtio422016.Writer, ctx context.Context) {
+//line templates/gitlist.qtpl:45
qw422016 := qt422016.AcquireWriter(qq422016)
-//line templates/gitlist.qtpl:44
- p.StreamScript(qw422016)
-//line templates/gitlist.qtpl:44
+//line templates/gitlist.qtpl:45
+ p.StreamScript(qw422016, ctx)
+//line templates/gitlist.qtpl:45
qt422016.ReleaseWriter(qw422016)
-//line templates/gitlist.qtpl:44
+//line templates/gitlist.qtpl:45
}
-//line templates/gitlist.qtpl:44
-func (p *GitListPage) Script() string {
-//line templates/gitlist.qtpl:44
+//line templates/gitlist.qtpl:45
+func (p *GitListPage) Script(ctx context.Context) string {
+//line templates/gitlist.qtpl:45
qb422016 := qt422016.AcquireByteBuffer()
-//line templates/gitlist.qtpl:44
- p.WriteScript(qb422016)
-//line templates/gitlist.qtpl:44
+//line templates/gitlist.qtpl:45
+ p.WriteScript(qb422016, ctx)
+//line templates/gitlist.qtpl:45
qs422016 := string(qb422016.B)
-//line templates/gitlist.qtpl:44
+//line templates/gitlist.qtpl:45
qt422016.ReleaseByteBuffer(qb422016)
-//line templates/gitlist.qtpl:44
+//line templates/gitlist.qtpl:45
return qs422016
-//line templates/gitlist.qtpl:44
+//line templates/gitlist.qtpl:45
}
diff --git a/templates/login.qtpl b/templates/login.qtpl
index eee5711..7815bd7 100644
--- a/templates/login.qtpl
+++ b/templates/login.qtpl
@@ -1,31 +1,41 @@
+{% import "context" %}
+
{% code
type LoginPage struct {
+ ErrorMessage string
}
%}
-{% func (p *LoginPage) Title() %}Hello{% endfunc %}
+{% func (p *LoginPage) Title(ctx context.Context) %}Hello{% endfunc %}
-{% func (p *LoginPage) Navbar() %}{%= Navbar(Login) %}{% endfunc %}
+{% func (p *LoginPage) Navbar(ctx context.Context) %}{%= Navbar(ctx, Login) %}{% endfunc %}
-{% func (p *LoginPage) Content() %}
+{% func (p *LoginPage) Content(ctx context.Context) %}
<div class="row">
<div class="col-md-6 offset-md-3">
- <form>
+ <form action="/login/" method="POST">
<div class="form-group m-3">
<label for="username" class="form-label">Username</label>
- <input type="text" class="form-control" id="username" aria-describedby="emailHelp">
+ <input type="text" class="form-control" name="username" id="username">
</div>
<div class="form-group m-3">
<label for="password" class="form-label">Password</label>
- <input type="password" class="form-control" id="password">
+ <input type="password" class="form-control" name="password" id="password">
</div>
<div class="form-group m-3">
<button type="submit" class="btn btn-primary">Login</button>
</div>
</form>
</div>
+ {% if p.ErrorMessage != "" %}
+ <div class="col-md-6 offset-md-3">
+ <div class="alert alert-warning text-center" >
+ {%s p.ErrorMessage %}
+ </div>
+ </div>
+ {% endif %}
</div>
{% endfunc %}
-{% func (p *LoginPage) Script() %}
+{% func (p *LoginPage) Script(ctx context.Context) %}
{% endfunc %}
diff --git a/templates/login.qtpl.go b/templates/login.qtpl.go
index 0d3d2b0..5c07a44 100644
--- a/templates/login.qtpl.go
+++ b/templates/login.qtpl.go
@@ -5,169 +5,192 @@
package templates
//line templates/login.qtpl:1
+import "context"
+
+//line templates/login.qtpl:3
import (
qtio422016 "io"
qt422016 "github.com/valyala/quicktemplate"
)
-//line templates/login.qtpl:1
+//line templates/login.qtpl:3
var (
_ = qtio422016.Copy
_ = qt422016.AcquireByteBuffer
)
-//line templates/login.qtpl:2
+//line templates/login.qtpl:4
type LoginPage struct {
+ ErrorMessage string
}
-//line templates/login.qtpl:6
-func (p *LoginPage) StreamTitle(qw422016 *qt422016.Writer) {
-//line templates/login.qtpl:6
+//line templates/login.qtpl:9
+func (p *LoginPage) StreamTitle(qw422016 *qt422016.Writer, ctx context.Context) {
+//line templates/login.qtpl:9
qw422016.N().S(`Hello`)
-//line templates/login.qtpl:6
+//line templates/login.qtpl:9
}
-//line templates/login.qtpl:6
-func (p *LoginPage) WriteTitle(qq422016 qtio422016.Writer) {
-//line templates/login.qtpl:6
+//line templates/login.qtpl:9
+func (p *LoginPage) WriteTitle(qq422016 qtio422016.Writer, ctx context.Context) {
+//line templates/login.qtpl:9
qw422016 := qt422016.AcquireWriter(qq422016)
-//line templates/login.qtpl:6
- p.StreamTitle(qw422016)
-//line templates/login.qtpl:6
+//line templates/login.qtpl:9
+ p.StreamTitle(qw422016, ctx)
+//line templates/login.qtpl:9
qt422016.ReleaseWriter(qw422016)
-//line templates/login.qtpl:6
+//line templates/login.qtpl:9
}
-//line templates/login.qtpl:6
-func (p *LoginPage) Title() string {
-//line templates/login.qtpl:6
+//line templates/login.qtpl:9
+func (p *LoginPage) Title(ctx context.Context) string {
+//line templates/login.qtpl:9
qb422016 := qt422016.AcquireByteBuffer()
-//line templates/login.qtpl:6
- p.WriteTitle(qb422016)
-//line templates/login.qtpl:6
+//line templates/login.qtpl:9
+ p.WriteTitle(qb422016, ctx)
+//line templates/login.qtpl:9
qs422016 := string(qb422016.B)
-//line templates/login.qtpl:6
+//line templates/login.qtpl:9
qt422016.ReleaseByteBuffer(qb422016)
-//line templates/login.qtpl:6
+//line templates/login.qtpl:9
return qs422016
-//line templates/login.qtpl:6
+//line templates/login.qtpl:9
}
-//line templates/login.qtpl:8
-func (p *LoginPage) StreamNavbar(qw422016 *qt422016.Writer) {
-//line templates/login.qtpl:8
- StreamNavbar(qw422016, Login)
-//line templates/login.qtpl:8
+//line templates/login.qtpl:11
+func (p *LoginPage) StreamNavbar(qw422016 *qt422016.Writer, ctx context.Context) {
+//line templates/login.qtpl:11
+ StreamNavbar(qw422016, ctx, Login)
+//line templates/login.qtpl:11
}
-//line templates/login.qtpl:8
-func (p *LoginPage) WriteNavbar(qq422016 qtio422016.Writer) {
-//line templates/login.qtpl:8
+//line templates/login.qtpl:11
+func (p *LoginPage) WriteNavbar(qq422016 qtio422016.Writer, ctx context.Context) {
+//line templates/login.qtpl:11
qw422016 := qt422016.AcquireWriter(qq422016)
-//line templates/login.qtpl:8
- p.StreamNavbar(qw422016)
-//line templates/login.qtpl:8
+//line templates/login.qtpl:11
+ p.StreamNavbar(qw422016, ctx)
+//line templates/login.qtpl:11
qt422016.ReleaseWriter(qw422016)
-//line templates/login.qtpl:8
+//line templates/login.qtpl:11
}
-//line templates/login.qtpl:8
-func (p *LoginPage) Navbar() string {
-//line templates/login.qtpl:8
+//line templates/login.qtpl:11
+func (p *LoginPage) Navbar(ctx context.Context) string {
+//line templates/login.qtpl:11
qb422016 := qt422016.AcquireByteBuffer()
-//line templates/login.qtpl:8
- p.WriteNavbar(qb422016)
-//line templates/login.qtpl:8
+//line templates/login.qtpl:11
+ p.WriteNavbar(qb422016, ctx)
+//line templates/login.qtpl:11
qs422016 := string(qb422016.B)
-//line templates/login.qtpl:8
+//line templates/login.qtpl:11
qt422016.ReleaseByteBuffer(qb422016)
-//line templates/login.qtpl:8
+//line templates/login.qtpl:11
return qs422016
-//line templates/login.qtpl:8
+//line templates/login.qtpl:11
}
-//line templates/login.qtpl:10
-func (p *LoginPage) StreamContent(qw422016 *qt422016.Writer) {
-//line templates/login.qtpl:10
+//line templates/login.qtpl:13
+func (p *LoginPage) StreamContent(qw422016 *qt422016.Writer, ctx context.Context) {
+//line templates/login.qtpl:13
qw422016.N().S(`
<div class="row">
<div class="col-md-6 offset-md-3">
- <form>
+ <form action="/login/" method="POST">
<div class="form-group m-3">
<label for="username" class="form-label">Username</label>
- <input type="text" class="form-control" id="username" aria-describedby="emailHelp">
+ <input type="text" class="form-control" name="username" id="username">
</div>
<div class="form-group m-3">
<label for="password" class="form-label">Password</label>
- <input type="password" class="form-control" id="password">
+ <input type="password" class="form-control" name="password" id="password">
</div>
<div class="form-group m-3">
<button type="submit" class="btn btn-primary">Login</button>
</div>
</form>
</div>
+ `)
+//line templates/login.qtpl:30
+ if p.ErrorMessage != "" {
+//line templates/login.qtpl:30
+ qw422016.N().S(`
+ <div class="col-md-6 offset-md-3">
+ <div class="alert alert-warning text-center" >
+ `)
+//line templates/login.qtpl:33
+ qw422016.E().S(p.ErrorMessage)
+//line templates/login.qtpl:33
+ qw422016.N().S(`
+ </div>
+ </div>
+ `)
+//line templates/login.qtpl:36
+ }
+//line templates/login.qtpl:36
+ qw422016.N().S(`
</div>
`)
-//line templates/login.qtpl:28
+//line templates/login.qtpl:38
}
-//line templates/login.qtpl:28
-func (p *LoginPage) WriteContent(qq422016 qtio422016.Writer) {
-//line templates/login.qtpl:28
+//line templates/login.qtpl:38
+func (p *LoginPage) WriteContent(qq422016 qtio422016.Writer, ctx context.Context) {
+//line templates/login.qtpl:38
qw422016 := qt422016.AcquireWriter(qq422016)
-//line templates/login.qtpl:28
- p.StreamContent(qw422016)
-//line templates/login.qtpl:28
+//line templates/login.qtpl:38
+ p.StreamContent(qw422016, ctx)
+//line templates/login.qtpl:38
qt422016.ReleaseWriter(qw422016)
-//line templates/login.qtpl:28
+//line templates/login.qtpl:38
}
-//line templates/login.qtpl:28
-func (p *LoginPage) Content() string {
-//line templates/login.qtpl:28
+//line templates/login.qtpl:38
+func (p *LoginPage) Content(ctx context.Context) string {
+//line templates/login.qtpl:38
qb422016 := qt422016.AcquireByteBuffer()
-//line templates/login.qtpl:28
- p.WriteContent(qb422016)
-//line templates/login.qtpl:28
+//line templates/login.qtpl:38
+ p.WriteContent(qb422016, ctx)
+//line templates/login.qtpl:38
qs422016 := string(qb422016.B)
-//line templates/login.qtpl:28
+//line templates/login.qtpl:38
qt422016.ReleaseByteBuffer(qb422016)
-//line templates/login.qtpl:28
+//line templates/login.qtpl:38
return qs422016
-//line templates/login.qtpl:28
+//line templates/login.qtpl:38
}
-//line templates/login.qtpl:30
-func (p *LoginPage) StreamScript(qw422016 *qt422016.Writer) {
-//line templates/login.qtpl:30
+//line templates/login.qtpl:40
+func (p *LoginPage) StreamScript(qw422016 *qt422016.Writer, ctx context.Context) {
+//line templates/login.qtpl:40
qw422016.N().S(`
`)
-//line templates/login.qtpl:31
+//line templates/login.qtpl:41
}
-//line templates/login.qtpl:31
-func (p *LoginPage) WriteScript(qq422016 qtio422016.Writer) {
-//line templates/login.qtpl:31
+//line templates/login.qtpl:41
+func (p *LoginPage) WriteScript(qq422016 qtio422016.Writer, ctx context.Context) {
+//line templates/login.qtpl:41
qw422016 := qt422016.AcquireWriter(qq422016)
-//line templates/login.qtpl:31
- p.StreamScript(qw422016)
-//line templates/login.qtpl:31
+//line templates/login.qtpl:41
+ p.StreamScript(qw422016, ctx)
+//line templates/login.qtpl:41
qt422016.ReleaseWriter(qw422016)
-//line templates/login.qtpl:31
+//line templates/login.qtpl:41
}
-//line templates/login.qtpl:31
-func (p *LoginPage) Script() string {
-//line templates/login.qtpl:31
+//line templates/login.qtpl:41
+func (p *LoginPage) Script(ctx context.Context) string {
+//line templates/login.qtpl:41
qb422016 := qt422016.AcquireByteBuffer()
-//line templates/login.qtpl:31
- p.WriteScript(qb422016)
-//line templates/login.qtpl:31
+//line templates/login.qtpl:41
+ p.WriteScript(qb422016, ctx)
+//line templates/login.qtpl:41
qs422016 := string(qb422016.B)
-//line templates/login.qtpl:31
+//line templates/login.qtpl:41
qt422016.ReleaseByteBuffer(qb422016)
-//line templates/login.qtpl:31
+//line templates/login.qtpl:41
return qs422016
-//line templates/login.qtpl:31
+//line templates/login.qtpl:41
}
diff --git a/templates/navbar.qtpl b/templates/navbar.qtpl
index 18400b1..3cd1b39 100644
--- a/templates/navbar.qtpl
+++ b/templates/navbar.qtpl
@@ -1,3 +1,5 @@
+{% import "context" %}
+
{% code
type Selection int
const (
@@ -22,13 +24,17 @@ const (
{% func insertIfEqual(s, d any) %}{% if s == d %} selected{% endif %}{% endfunc %}
-{% func Navbar (s Selection) %}
+{% func Navbar (ctx context.Context, s Selection) %}
<nav class="container navbar navbar-expand">
<div class="navbar-nav">
<a class="nav-link{%= insertIfEqual(s, Git) %}" href="/">git</a>
</div>
<div class="navbar-nav ms-auto">
+ {% if IsLoggedIn(ctx) %}
+ <a class="nav-link{%= insertIfEqual(s, Login) %}" href="/logout">logout</a>
+ {% else %}
<a class="nav-link{%= insertIfEqual(s, Login) %}" href="/login">login</a>
+ {% endif %}
{% comment %}
Add this back once needed
<a class="nav-link{%= insertIfEqual(s, List) %}" href="/list/">list</a>
diff --git a/templates/navbar.qtpl.go b/templates/navbar.qtpl.go
index e080785..d900c9c 100644
--- a/templates/navbar.qtpl.go
+++ b/templates/navbar.qtpl.go
@@ -5,19 +5,22 @@
package templates
//line templates/navbar.qtpl:1
+import "context"
+
+//line templates/navbar.qtpl:3
import (
qtio422016 "io"
qt422016 "github.com/valyala/quicktemplate"
)
-//line templates/navbar.qtpl:1
+//line templates/navbar.qtpl:3
var (
_ = qtio422016.Copy
_ = qt422016.AcquireByteBuffer
)
-//line templates/navbar.qtpl:2
+//line templates/navbar.qtpl:4
type Selection int
const (
@@ -28,7 +31,7 @@ const (
Login
)
-//line templates/navbar.qtpl:13
+//line templates/navbar.qtpl:15
type GitSelection int
const (
@@ -39,213 +42,233 @@ const (
Tree
)
-//line templates/navbar.qtpl:23
+//line templates/navbar.qtpl:25
func streaminsertIfEqual(qw422016 *qt422016.Writer, s, d any) {
-//line templates/navbar.qtpl:23
+//line templates/navbar.qtpl:25
if s == d {
-//line templates/navbar.qtpl:23
+//line templates/navbar.qtpl:25
qw422016.N().S(` selected`)
-//line templates/navbar.qtpl:23
+//line templates/navbar.qtpl:25
}
-//line templates/navbar.qtpl:23
+//line templates/navbar.qtpl:25
}
-//line templates/navbar.qtpl:23
+//line templates/navbar.qtpl:25
func writeinsertIfEqual(qq422016 qtio422016.Writer, s, d any) {
-//line templates/navbar.qtpl:23
+//line templates/navbar.qtpl:25
qw422016 := qt422016.AcquireWriter(qq422016)
-//line templates/navbar.qtpl:23
+//line templates/navbar.qtpl:25
streaminsertIfEqual(qw422016, s, d)
-//line templates/navbar.qtpl:23
+//line templates/navbar.qtpl:25
qt422016.ReleaseWriter(qw422016)
-//line templates/navbar.qtpl:23
+//line templates/navbar.qtpl:25
}
-//line templates/navbar.qtpl:23
+//line templates/navbar.qtpl:25
func insertIfEqual(s, d any) string {
-//line templates/navbar.qtpl:23
+//line templates/navbar.qtpl:25
qb422016 := qt422016.AcquireByteBuffer()
-//line templates/navbar.qtpl:23
+//line templates/navbar.qtpl:25
writeinsertIfEqual(qb422016, s, d)
-//line templates/navbar.qtpl:23
+//line templates/navbar.qtpl:25
qs422016 := string(qb422016.B)
-//line templates/navbar.qtpl:23
+//line templates/navbar.qtpl:25
qt422016.ReleaseByteBuffer(qb422016)
-//line templates/navbar.qtpl:23
+//line templates/navbar.qtpl:25
return qs422016
-//line templates/navbar.qtpl:23
+//line templates/navbar.qtpl:25
}
-//line templates/navbar.qtpl:25
-func StreamNavbar(qw422016 *qt422016.Writer, s Selection) {
-//line templates/navbar.qtpl:25
+//line templates/navbar.qtpl:27
+func StreamNavbar(qw422016 *qt422016.Writer, ctx context.Context, s Selection) {
+//line templates/navbar.qtpl:27
qw422016.N().S(`
<nav class="container navbar navbar-expand">
<div class="navbar-nav">
<a class="nav-link`)
-//line templates/navbar.qtpl:28
+//line templates/navbar.qtpl:30
streaminsertIfEqual(qw422016, s, Git)
-//line templates/navbar.qtpl:28
+//line templates/navbar.qtpl:30
qw422016.N().S(`" href="/">git</a>
</div>
<div class="navbar-nav ms-auto">
+ `)
+//line templates/navbar.qtpl:33
+ if IsLoggedIn(ctx) {
+//line templates/navbar.qtpl:33
+ qw422016.N().S(`
<a class="nav-link`)
-//line templates/navbar.qtpl:31
- streaminsertIfEqual(qw422016, s, Login)
-//line templates/navbar.qtpl:31
- qw422016.N().S(`" href="/login">login</a>
-`)
+//line templates/navbar.qtpl:34
+ streaminsertIfEqual(qw422016, s, Login)
+//line templates/navbar.qtpl:34
+ qw422016.N().S(`" href="/logout">logout</a>
+ `)
+//line templates/navbar.qtpl:35
+ } else {
//line templates/navbar.qtpl:35
+ qw422016.N().S(`
+ <a class="nav-link`)
+//line templates/navbar.qtpl:36
+ streaminsertIfEqual(qw422016, s, Login)
+//line templates/navbar.qtpl:36
+ qw422016.N().S(`" href="/login">login</a>
+ `)
+//line templates/navbar.qtpl:37
+ }
+//line templates/navbar.qtpl:37
qw422016.N().S(`
`)
-//line templates/navbar.qtpl:39
+//line templates/navbar.qtpl:41
+ qw422016.N().S(`
+`)
+//line templates/navbar.qtpl:45
qw422016.N().S(`
</div>
</nav>
`)
-//line templates/navbar.qtpl:42
+//line templates/navbar.qtpl:48
}
-//line templates/navbar.qtpl:42
-func WriteNavbar(qq422016 qtio422016.Writer, s Selection) {
-//line templates/navbar.qtpl:42
+//line templates/navbar.qtpl:48
+func WriteNavbar(qq422016 qtio422016.Writer, ctx context.Context, s Selection) {
+//line templates/navbar.qtpl:48
qw422016 := qt422016.AcquireWriter(qq422016)
-//line templates/navbar.qtpl:42
- StreamNavbar(qw422016, s)
-//line templates/navbar.qtpl:42
+//line templates/navbar.qtpl:48
+ StreamNavbar(qw422016, ctx, s)
+//line templates/navbar.qtpl:48
qt422016.ReleaseWriter(qw422016)
-//line templates/navbar.qtpl:42
+//line templates/navbar.qtpl:48
}
-//line templates/navbar.qtpl:42
-func Navbar(s Selection) string {
-//line templates/navbar.qtpl:42
+//line templates/navbar.qtpl:48
+func Navbar(ctx context.Context, s Selection) string {
+//line templates/navbar.qtpl:48
qb422016 := qt422016.AcquireByteBuffer()
-//line templates/navbar.qtpl:42
- WriteNavbar(qb422016, s)
-//line templates/navbar.qtpl:42
+//line templates/navbar.qtpl:48
+ WriteNavbar(qb422016, ctx, s)
+//line templates/navbar.qtpl:48
qs422016 := string(qb422016.B)
-//line templates/navbar.qtpl:42
+//line templates/navbar.qtpl:48
qt422016.ReleaseByteBuffer(qb422016)
-//line templates/navbar.qtpl:42
+//line templates/navbar.qtpl:48
return qs422016
-//line templates/navbar.qtpl:42
+//line templates/navbar.qtpl:48
}
-//line templates/navbar.qtpl:44
+//line templates/navbar.qtpl:50
func StreamGitItemNav(qw422016 *qt422016.Writer, name, ref string, s GitSelection) {
-//line templates/navbar.qtpl:44
+//line templates/navbar.qtpl:50
qw422016.N().S(`
<div class="row">
<h3 id="name">`)
-//line templates/navbar.qtpl:46
+//line templates/navbar.qtpl:52
qw422016.E().S(name)
-//line templates/navbar.qtpl:46
+//line templates/navbar.qtpl:52
qw422016.N().S(` `)
-//line templates/navbar.qtpl:46
+//line templates/navbar.qtpl:52
if ref != "" && (s == Log || s == Tree) {
-//line templates/navbar.qtpl:46
+//line templates/navbar.qtpl:52
qw422016.N().S(`@ `)
-//line templates/navbar.qtpl:46
+//line templates/navbar.qtpl:52
qw422016.E().S(ref)
-//line templates/navbar.qtpl:46
+//line templates/navbar.qtpl:52
}
-//line templates/navbar.qtpl:46
+//line templates/navbar.qtpl:52
qw422016.N().S(`</h3>
</div>
<div class="row">
<ul class="nav">
<li class="nav-item">
<a class="nav-link`)
-//line templates/navbar.qtpl:51
+//line templates/navbar.qtpl:57
streaminsertIfEqual(qw422016, s, Readme)
-//line templates/navbar.qtpl:51
+//line templates/navbar.qtpl:57
qw422016.N().S(`" aria-current="page" href="/`)
-//line templates/navbar.qtpl:51
+//line templates/navbar.qtpl:57
qw422016.E().S(name)
-//line templates/navbar.qtpl:51
+//line templates/navbar.qtpl:57
qw422016.N().S(`/about/">about</a>
</li>
<li class="nav-item">
<a class="nav-link`)
-//line templates/navbar.qtpl:54
+//line templates/navbar.qtpl:60
streaminsertIfEqual(qw422016, s, Summary)
-//line templates/navbar.qtpl:54
+//line templates/navbar.qtpl:60
qw422016.N().S(`" aria-current="page" href="/`)
-//line templates/navbar.qtpl:54
+//line templates/navbar.qtpl:60
qw422016.E().S(name)
-//line templates/navbar.qtpl:54
+//line templates/navbar.qtpl:60
qw422016.N().S(`/">summary</a>
</li>
<li class="nav-item">
<a class="nav-link`)
-//line templates/navbar.qtpl:57
+//line templates/navbar.qtpl:63
streaminsertIfEqual(qw422016, s, Refs)
-//line templates/navbar.qtpl:57
+//line templates/navbar.qtpl:63
qw422016.N().S(`" aria-current="page" href="/`)
-//line templates/navbar.qtpl:57
+//line templates/navbar.qtpl:63
qw422016.E().S(name)
-//line templates/navbar.qtpl:57
+//line templates/navbar.qtpl:63
qw422016.N().S(`/refs/">refs</a>
</li>
<li class="nav-item">
<a class="nav-link`)
-//line templates/navbar.qtpl:60
+//line templates/navbar.qtpl:66
streaminsertIfEqual(qw422016, s, Log)
-//line templates/navbar.qtpl:60
+//line templates/navbar.qtpl:66
qw422016.N().S(`" aria-current="page" href="/`)
-//line templates/navbar.qtpl:60
+//line templates/navbar.qtpl:66
qw422016.E().S(name)
-//line templates/navbar.qtpl:60
+//line templates/navbar.qtpl:66
qw422016.N().S(`/log/`)
-//line templates/navbar.qtpl:60
+//line templates/navbar.qtpl:66
qw422016.E().S(ref)
-//line templates/navbar.qtpl:60
+//line templates/navbar.qtpl:66
qw422016.N().S(`/">log</a>
</li>
<li class="nav-item">
<a class="nav-link`)
-//line templates/navbar.qtpl:63
+//line templates/navbar.qtpl:69
streaminsertIfEqual(qw422016, s, Tree)
-//line templates/navbar.qtpl:63
+//line templates/navbar.qtpl:69
qw422016.N().S(`" aria-current="page" href="/`)
-//line templates/navbar.qtpl:63
+//line templates/navbar.qtpl:69
qw422016.E().S(name)
-//line templates/navbar.qtpl:63
+//line templates/navbar.qtpl:69
qw422016.N().S(`/tree/`)
-//line templates/navbar.qtpl:63
+//line templates/navbar.qtpl:69
qw422016.E().S(ref)
-//line templates/navbar.qtpl:63
+//line templates/navbar.qtpl:69
qw422016.N().S(`/">tree</a>
</li>
</ul>
</div>
`)
-//line templates/navbar.qtpl:67
+//line templates/navbar.qtpl:73
}
-//line templates/navbar.qtpl:67
+//line templates/navbar.qtpl:73
func WriteGitItemNav(qq422016 qtio422016.Writer, name, ref string, s GitSelection) {
-//line templates/navbar.qtpl:67
+//line templates/navbar.qtpl:73
qw422016 := qt422016.AcquireWriter(qq422016)
-//line templates/navbar.qtpl:67
+//line templates/navbar.qtpl:73
StreamGitItemNav(qw422016, name, ref, s)
-//line templates/navbar.qtpl:67
+//line templates/navbar.qtpl:73
qt422016.ReleaseWriter(qw422016)
-//line templates/navbar.qtpl:67
+//line templates/navbar.qtpl:73
}
-//line templates/navbar.qtpl:67
+//line templates/navbar.qtpl:73
func GitItemNav(name, ref string, s GitSelection) string {
-//line templates/navbar.qtpl:67
+//line templates/navbar.qtpl:73
qb422016 := qt422016.AcquireByteBuffer()
-//line templates/navbar.qtpl:67
+//line templates/navbar.qtpl:73
WriteGitItemNav(qb422016, name, ref, s)
-//line templates/navbar.qtpl:67
+//line templates/navbar.qtpl:73
qs422016 := string(qb422016.B)
-//line templates/navbar.qtpl:67
+//line templates/navbar.qtpl:73
qt422016.ReleaseByteBuffer(qb422016)
-//line templates/navbar.qtpl:67
+//line templates/navbar.qtpl:73
return qs422016
-//line templates/navbar.qtpl:67
+//line templates/navbar.qtpl:73
}