Skip to content

Instantly share code, notes, and snippets.

@yanmhlv
Last active November 23, 2023 16:17
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yanmhlv/e629e7c6d98bd32a312d617b76186e40 to your computer and use it in GitHub Desktop.
Save yanmhlv/e629e7c6d98bd32a312d617b76186e40 to your computer and use it in GitHub Desktop.
package main
import (
"bytes"
"errors"
"html/template"
"net/http"
"path/filepath"
)
type Render struct {
Templates map[string]*template.Template
}
func NewRender(layoutPath string, includePath string) (*Render, error) {
r := &Render{Templates: make(map[string]*template.Template)}
layoutFiles, err := filepath.Glob(layoutPath + "*.html")
if err != nil {
return nil, err
}
includeFiles, err := filepath.Glob(includePath + "*.html")
if err != nil {
return nil, err
}
mainTmpl := `{{define "main" }} {{ template "base" . }} {{ end }}`
mainTemplate := template.Must(template.New("main").Parse(mainTmpl))
for _, file := range includeFiles {
fileName := filepath.Base(file)
files := append(layoutFiles, file)
r.Templates[fileName], err = mainTemplate.Clone()
if err != nil {
return nil, err
}
r.Templates[fileName] = template.Must(r.Templates[fileName].ParseFiles(files...))
}
return r, nil
}
func (r *Render) Render(name string, data interface{}) ([]byte, error) {
tmpl, ok := r.Templates[name]
if !ok {
return nil, errors.New("cant find template")
}
buf := &bytes.Buffer{}
err := tmpl.Execute(buf, data)
return buf.Bytes(), err
}
func main() {
r, _ := NewRender("views/layout/", "views/")
mux := http.NewServeMux()
mux.HandleFunc("/1", func(w http.ResponseWriter, req *http.Request) {
data, _ := r.Render("index.html", nil)
w.Write(data)
})
mux.HandleFunc("/2", func(w http.ResponseWriter, req *http.Request) {
data, _ := r.Render("post.html", nil)
w.Write(data)
})
(&http.Server{
Handler: mux,
Addr: ":3000",
}).ListenAndServe()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment