html.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package render
  2. import (
  3. "errors"
  4. "fmt"
  5. "html/template"
  6. "net/http"
  7. )
  8. type (
  9. HTMLRender struct {
  10. Template *template.Template
  11. }
  12. htmlPlainRender struct{}
  13. HTMLDebugRender struct {
  14. Files []string
  15. Glob string
  16. }
  17. )
  18. func (html HTMLRender) Render(w http.ResponseWriter, code int, data ...interface{}) error {
  19. writeHeader(w, code, "text/html; charset=utf-8")
  20. file := data[0].(string)
  21. args := data[1]
  22. return html.Template.ExecuteTemplate(w, file, args)
  23. }
  24. func (r *HTMLDebugRender) Render(w http.ResponseWriter, code int, data ...interface{}) error {
  25. writeHeader(w, code, "text/html; charset=utf-8")
  26. file := data[0].(string)
  27. obj := data[1]
  28. if t, err := r.loadTemplate(); err == nil {
  29. return t.ExecuteTemplate(w, file, obj)
  30. } else {
  31. return err
  32. }
  33. }
  34. func (r *HTMLDebugRender) loadTemplate() (*template.Template, error) {
  35. if len(r.Files) > 0 {
  36. return template.ParseFiles(r.Files...)
  37. }
  38. if len(r.Glob) > 0 {
  39. return template.ParseGlob(r.Glob)
  40. }
  41. return nil, errors.New("the HTML debug render was created without files or glob pattern")
  42. }
  43. func (_ htmlPlainRender) Render(w http.ResponseWriter, code int, data ...interface{}) error {
  44. format := data[0].(string)
  45. values := data[1].([]interface{})
  46. WriteHTMLString(w, code, format, values)
  47. return nil
  48. }
  49. func WriteHTMLString(w http.ResponseWriter, code int, format string, values []interface{}) {
  50. writeHeader(w, code, "text/html; charset=utf-8")
  51. if len(values) > 0 {
  52. fmt.Fprintf(w, format, values...)
  53. } else {
  54. w.Write([]byte(format))
  55. }
  56. }