render.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package pgenr
  2. import (
  3. "bytes"
  4. "git.nspix.com/golang/pgenr/theme"
  5. "github.com/vanng822/go-premailer/premailer"
  6. "net/http"
  7. "text/template"
  8. )
  9. const (
  10. Name = "pgenr"
  11. )
  12. type (
  13. RenderOption func(o *RenderOptions)
  14. Template struct {
  15. Page *Page
  16. }
  17. RenderOptions struct {
  18. Theme theme.Theme
  19. InlineCss bool
  20. }
  21. )
  22. func Render(page *Page, cbs ...RenderOption) (str string, err error) {
  23. var (
  24. tpl *template.Template
  25. buffer bytes.Buffer
  26. cssProc premailer.Premailer
  27. )
  28. opts := &RenderOptions{
  29. Theme: &theme.Default{},
  30. InlineCss: false,
  31. }
  32. for _, cb := range cbs {
  33. cb(opts)
  34. }
  35. if tpl, err = template.New(Name).Parse(opts.Theme.Template()); err != nil {
  36. return
  37. }
  38. if err = tpl.Execute(&buffer, Template{page}); err != nil {
  39. return
  40. }
  41. if !opts.InlineCss {
  42. str = buffer.String()
  43. return
  44. }
  45. if cssProc, err = premailer.NewPremailerFromBytes(buffer.Bytes(), premailer.NewOptions()); err != nil {
  46. return
  47. }
  48. str, err = cssProc.Transform()
  49. return
  50. }
  51. func Response(page *Page, w http.ResponseWriter, cbs ...RenderOption) (err error) {
  52. var (
  53. html string
  54. )
  55. if html, err = Render(page, cbs...); err == nil {
  56. _, err = w.Write([]byte(html))
  57. }
  58. return
  59. }