The backend for the AiteStory website
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

  1. package view
  2. import (
  3. "errors"
  4. "fmt"
  5. "html/template"
  6. "io"
  7. "log"
  8. "net/http"
  9. "os"
  10. "github.com/eknkc/amber"
  11. "git.aiterp.net/AiteRP/aitestory/server"
  12. "git.aiterp.net/gisle/wrouter/response"
  13. )
  14. var wd, _ = os.Getwd()
  15. var cache = make(map[string]*template.Template)
  16. var argsCache = make(map[string][]string)
  17. var defaultOptions = amber.Options{PrettyPrint: true}
  18. var defaultDirOptions = amber.DirOptions{Ext: ".amber", Recursive: true}
  19. // Render renders a template with the name it was registered with, and with the
  20. // view model. The view model is expected to be the correct model from the viewmodel
  21. // package
  22. func Render(w http.ResponseWriter, name string, status int, viewModel interface{}) {
  23. var err error
  24. if server.Main.Config.Server.Debug {
  25. cache, err = amber.CompileDir(server.Main.Config.Directories.Templates, defaultDirOptions, defaultOptions)
  26. if err != nil {
  27. log.Println(err)
  28. }
  29. }
  30. tmpl, ok := cache[name]
  31. if !ok {
  32. response.Text(w, 500, "Template not found: "+name)
  33. return
  34. }
  35. w.WriteHeader(status)
  36. err = tmpl.Execute(w, viewModel)
  37. if err != nil {
  38. log.Println("Template error:", err.Error())
  39. response.Text(w, 500, "Template error: "+err.Error())
  40. }
  41. }
  42. // Run runs the template to a simple io.Writer. It's made for testing
  43. func Run(w io.Writer, name string, viewModel interface{}) error {
  44. tmpl, ok := cache[name]
  45. if !ok {
  46. return errors.New("template not found")
  47. }
  48. return tmpl.ExecuteTemplate(w, "base", viewModel)
  49. }
  50. func init() {
  51. var err error
  52. for key, value := range funcMap {
  53. if _, exists := amber.FuncMap[key]; exists {
  54. log.Printf("Amber already provides a function by the name: %s", key)
  55. }
  56. amber.FuncMap[key] = value
  57. }
  58. cache, err = amber.CompileDir(server.Main.Config.Directories.Templates, defaultDirOptions, defaultOptions)
  59. if err != nil {
  60. if server.Main.Config.Server.Debug {
  61. log.Println(err)
  62. return
  63. }
  64. log.Fatalln(err)
  65. }
  66. if server.Main.Config.Server.Debug {
  67. fmt.Printf("Template directory: %s\n", server.Main.Config.Directories.Templates)
  68. for key := range cache {
  69. fmt.Printf("Template loaded: %s\n", key)
  70. }
  71. }
  72. }