render.go 974 B

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