renderer.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. package renderer
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "html/template"
  7. "log"
  8. "net/http"
  9. "path"
  10. "path/filepath"
  11. "strings"
  12. "gogs.carducci-dante.gov.it/karmen/core/config"
  13. )
  14. var currRenderer Renderer
  15. type Renderer interface {
  16. Render(http.ResponseWriter, string, string, interface{}) error
  17. }
  18. type JSONRenderer struct{}
  19. func NewJSONRenderer() *JSONRenderer {
  20. return &JSONRenderer{}
  21. }
  22. func (r *JSONRenderer) Render(w http.ResponseWriter, layout string, name string, data interface{}) error {
  23. w.Header().Set("Content-Type", "application/json; charset=utf-8")
  24. j, err := json.Marshal(data)
  25. if err != nil {
  26. return err
  27. }
  28. w.Write(j)
  29. return nil
  30. }
  31. type HTMLRenderer struct {
  32. TemplatePath string
  33. templates map[string]*template.Template
  34. }
  35. func NewHTMLRenderer(templatePath string) (*HTMLRenderer, error) {
  36. r := &HTMLRenderer{
  37. TemplatePath: templatePath,
  38. templates: make(map[string]*template.Template),
  39. }
  40. fns, err := filepath.Glob(filepath.Join(templatePath, "*.tpl"))
  41. if err != nil {
  42. return nil, err
  43. }
  44. lfns, err := filepath.Glob(filepath.Join(templatePath, "layout", "*.tpl"))
  45. if err != nil {
  46. return nil, err
  47. }
  48. for _, fn := range fns {
  49. if config.LogLevel > config.LOG_LEVEL_OFF {
  50. log.Printf("Load %s template", fn)
  51. }
  52. tplName := filepath.Base(fn)
  53. tplName = strings.TrimSuffix(tplName, path.Ext(tplName))
  54. tplName = strings.TrimSuffix(tplName, path.Ext(tplName))
  55. files := append(lfns, fn)
  56. if err != nil {
  57. return nil, err
  58. }
  59. r.templates[tplName] = template.Must(r.templates[tplName].ParseFiles(files...))
  60. if err != nil {
  61. return nil, err
  62. }
  63. }
  64. return r, nil
  65. }
  66. func Use(r Renderer) {
  67. currRenderer = r
  68. }
  69. func (r *HTMLRenderer) Render(w http.ResponseWriter, layout string, name string, data interface{}) error {
  70. t, ok := r.templates[name]
  71. if !ok {
  72. return fmt.Errorf("Template %s not found", name)
  73. }
  74. w.Header().Set("Content-Type", "text/html; charset=utf-8")
  75. err := t.ExecuteTemplate(w, layout, data)
  76. if err != nil {
  77. return err
  78. }
  79. return nil
  80. }
  81. func Render(w http.ResponseWriter, layout string, name string, data interface{}) error {
  82. if currRenderer != nil {
  83. return currRenderer.Render(w, layout, name, data)
  84. }
  85. return errors.New("You should set a renderer with Use() first if you want to use Renderer() package function.")
  86. }