This commit is contained in:
lbenedar
2026-03-05 11:32:32 +03:00
parent 0f096ff94b
commit a5827ae3d7
3 changed files with 65 additions and 41 deletions

View File

@@ -3,13 +3,26 @@ package main
import ( import (
"errors" "errors"
"fmt" "fmt"
"html/template"
"net/http" "net/http"
"strconv" "strconv"
"gitea.local.lab/Lbenedar/snippetbox/internal/models" "gitea.local.lab/Lbenedar/snippetbox/internal/models"
) )
func (app *application) render(w http.ResponseWriter, status int, page string, data *templateData) {
ts, ok := app.templateCache[page]
if !ok {
err := fmt.Errorf("the template %s does not exist", page)
app.serverError(w, err)
return
}
w.WriteHeader(status)
err := ts.ExecuteTemplate(w, "base", data)
if err != nil {
app.serverError(w, err)
}
}
func (app *application) home(w http.ResponseWriter, r *http.Request) { func (app *application) home(w http.ResponseWriter, r *http.Request) {
if r.URL.Path != "/" { if r.URL.Path != "/" {
app.notFound(w) app.notFound(w)
@@ -21,23 +34,9 @@ func (app *application) home(w http.ResponseWriter, r *http.Request) {
app.serverError(w, err) app.serverError(w, err)
return return
} }
files := []string{ app.render(w, http.StatusOK, "home.tmpl", &templateData{
"./ui/html/base.tmpl",
"./ui/html/partials/nav.tmpl",
"./ui/html/pages/home.tmpl",
}
ts, err := template.ParseFiles(files...)
if err != nil {
app.serverError(w, err)
return
}
data := &templateData{
Snippets: snippets, Snippets: snippets,
} })
err = ts.ExecuteTemplate(w, "base", data)
if err != nil {
app.serverError(w, err)
}
} }
func (app *application) snippetView(w http.ResponseWriter, r *http.Request) { func (app *application) snippetView(w http.ResponseWriter, r *http.Request) {
@@ -56,25 +55,9 @@ func (app *application) snippetView(w http.ResponseWriter, r *http.Request) {
} }
return return
} }
files := []string{ app.render(w, http.StatusOK, "view.tmpl", &templateData{
"./ui/html/base.tmpl",
"./ui/html/partials/nav.tmpl",
"./ui/html/pages/view.tmpl",
}
ts, err := template.ParseFiles(files...)
if err != nil {
app.serverError(w, err)
return
}
data := &templateData{
Snippet: snippet, Snippet: snippet,
} })
err = ts.ExecuteTemplate(w, "base", data)
if err != nil {
app.serverError(w, err)
}
} }
func (app *application) snippetCreate(w http.ResponseWriter, r *http.Request) { func (app *application) snippetCreate(w http.ResponseWriter, r *http.Request) {

View File

@@ -3,6 +3,7 @@ package main
import ( import (
"database/sql" "database/sql"
"flag" "flag"
"html/template"
"log" "log"
"net/http" "net/http"
"os" "os"
@@ -13,9 +14,10 @@ import (
) )
type application struct { type application struct {
errorLog *log.Logger errorLog *log.Logger
infoLog *log.Logger infoLog *log.Logger
snippets *models.SnippetModel snippets *models.SnippetModel
templateCache map[string]*template.Template
} }
type config struct { type config struct {
@@ -40,10 +42,16 @@ func main() {
} }
defer db.Close() defer db.Close()
templateCache, err := newTemplateCache()
if err != nil {
errorLog.Fatal(err)
}
app := &application{ app := &application{
errorLog: errorLog, errorLog: errorLog,
infoLog: infoLog, infoLog: infoLog,
snippets: &models.SnippetModel{DB: db}, snippets: &models.SnippetModel{DB: db},
templateCache: templateCache,
} }
srv := &http.Server{ srv := &http.Server{

View File

@@ -1,6 +1,9 @@
package main package main
import ( import (
"html/template"
"path/filepath"
"gitea.local.lab/Lbenedar/snippetbox/internal/models" "gitea.local.lab/Lbenedar/snippetbox/internal/models"
) )
@@ -8,3 +11,33 @@ type templateData struct {
Snippet *models.Snippet Snippet *models.Snippet
Snippets []*models.Snippet Snippets []*models.Snippet
} }
func newTemplateCache() (map[string]*template.Template, error) {
cache := map[string]*template.Template{}
pages, err := filepath.Glob("./ui/html/pages/*.tmpl")
if err != nil {
return nil, err
}
for _, page := range pages {
name := filepath.Base(page)
ts, err := template.ParseFiles("./ui/html/base.tmpl")
if err != nil {
return nil, err
}
ts, err = ts.ParseGlob("./ui/html/pages/nav.tmpl")
if err != nil {
return nil, err
}
ts, err = ts.ParseFiles(page)
if err != nil {
return nil, err
}
cache[name] = ts
}
return cache, nil
}