html.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. package render
  2. import (
  3. "html/template"
  4. "net/http"
  5. )
  6. type (
  7. HTMLRender interface {
  8. Instance(string, interface{}) Render
  9. }
  10. HTMLProduction struct {
  11. Template *template.Template
  12. }
  13. HTMLDebug struct {
  14. Files []string
  15. Glob string
  16. }
  17. HTML struct {
  18. Template *template.Template
  19. Name string
  20. Data interface{}
  21. }
  22. )
  23. const htmlContentType = "text/html; charset=utf-8"
  24. func (r HTMLProduction) Instance(name string, data interface{}) Render {
  25. return HTML{
  26. Template: r.Template,
  27. Name: name,
  28. Data: data,
  29. }
  30. }
  31. func (r HTMLDebug) Instance(name string, data interface{}) Render {
  32. return HTML{
  33. Template: r.loadTemplate(),
  34. Name: name,
  35. Data: data,
  36. }
  37. }
  38. func (r HTMLDebug) loadTemplate() *template.Template {
  39. if len(r.Files) > 0 {
  40. return template.Must(template.ParseFiles(r.Files...))
  41. }
  42. if len(r.Glob) > 0 {
  43. return template.Must(template.ParseGlob(r.Glob))
  44. }
  45. panic("the HTML debug render was created without files or glob pattern")
  46. }
  47. func (r HTML) Write(w http.ResponseWriter) error {
  48. w.Header().Set("Content-Type", htmlContentType)
  49. return r.Template.ExecuteTemplate(w, r.Name, r.Data)
  50. }