You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
90 lines
2.1 KiB
90 lines
2.1 KiB
package view
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"html/template"
|
|
"io"
|
|
"log"
|
|
"net/http"
|
|
"os"
|
|
|
|
"github.com/eknkc/amber"
|
|
|
|
"git.aiterp.net/AiteRP/aitestory/server"
|
|
"git.aiterp.net/gisle/wrouter/response"
|
|
)
|
|
|
|
var wd, _ = os.Getwd()
|
|
var cache = make(map[string]*template.Template)
|
|
var argsCache = make(map[string][]string)
|
|
|
|
var defaultOptions = amber.Options{PrettyPrint: true}
|
|
var defaultDirOptions = amber.DirOptions{Ext: ".amber", Recursive: true}
|
|
|
|
// Render renders a template with the name it was registered with, and with the
|
|
// view model. The view model is expected to be the correct model from the viewmodel
|
|
// package
|
|
func Render(w http.ResponseWriter, name string, status int, viewModel interface{}) {
|
|
var err error
|
|
|
|
if server.Main.Config.Server.Debug {
|
|
cache, err = amber.CompileDir(server.Main.Config.Directories.Templates, defaultDirOptions, defaultOptions)
|
|
if err != nil {
|
|
log.Println(err)
|
|
}
|
|
}
|
|
|
|
tmpl, ok := cache[name]
|
|
if !ok {
|
|
response.Text(w, 500, "Template not found: "+name)
|
|
return
|
|
}
|
|
|
|
w.WriteHeader(status)
|
|
err = tmpl.Execute(w, viewModel)
|
|
if err != nil {
|
|
log.Println("Template error:", err.Error())
|
|
response.Text(w, 500, "Template error: "+err.Error())
|
|
}
|
|
}
|
|
|
|
// Run runs the template to a simple io.Writer. It's made for testing
|
|
func Run(w io.Writer, name string, viewModel interface{}) error {
|
|
tmpl, ok := cache[name]
|
|
if !ok {
|
|
return errors.New("template not found")
|
|
}
|
|
|
|
return tmpl.ExecuteTemplate(w, "base", viewModel)
|
|
}
|
|
|
|
func init() {
|
|
var err error
|
|
|
|
for key, value := range funcMap {
|
|
if _, exists := amber.FuncMap[key]; exists {
|
|
log.Printf("Amber already provides a function by the name: %s", key)
|
|
}
|
|
|
|
amber.FuncMap[key] = value
|
|
}
|
|
|
|
cache, err = amber.CompileDir(server.Main.Config.Directories.Templates, defaultDirOptions, defaultOptions)
|
|
if err != nil {
|
|
if server.Main.Config.Server.Debug {
|
|
log.Println(err)
|
|
return
|
|
}
|
|
|
|
log.Fatalln(err)
|
|
}
|
|
|
|
if server.Main.Config.Server.Debug {
|
|
fmt.Printf("Template directory: %s\n", server.Main.Config.Directories.Templates)
|
|
|
|
for key := range cache {
|
|
fmt.Printf("Template loaded: %s\n", key)
|
|
}
|
|
}
|
|
}
|