tpl.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. package tpl
  2. import (
  3. "bytes"
  4. "errors"
  5. "html/template"
  6. "path/filepath"
  7. "strings"
  8. "git.clearsky.net.au/cody/gex.git/srv"
  9. "git.clearsky.net.au/cody/gex.git/utils"
  10. )
  11. type Props map[string]any
  12. type Funcs = template.FuncMap
  13. func include(req *srv.Req, props Props, funcs Funcs) {}
  14. var Include = include
  15. func Render(fp string, req *srv.Req, propFunc ...interface{}) string {
  16. if !strings.Contains(fp, "app/") {
  17. fp = utils.Cwd(2) + "/" + fp
  18. }
  19. fp = strings.Replace(fp, ".tpl", ".gen.tpl", 1)
  20. var props = Props{}
  21. var funcs = Funcs{}
  22. if len(propFunc) > 0 {
  23. var ok bool
  24. props, ok = propFunc[0].(Props)
  25. if !ok {
  26. err := errors.New("invalid props type passed to Render(), must be map[string]any")
  27. utils.Err(err)
  28. return err.Error()
  29. }
  30. }
  31. if len(propFunc) > 1 {
  32. var ok bool
  33. funcs, ok = propFunc[1].(Funcs)
  34. if !ok {
  35. err := errors.New("invalid funcs type passed to Render(), must be map[string]func (template.funcMap)")
  36. utils.Err(err)
  37. return err.Error()
  38. }
  39. }
  40. props["Req"] = req
  41. Include(req, props, funcs)
  42. tmpl, err := template.
  43. New(filepath.Base(fp)).
  44. Funcs(funcs).
  45. ParseFiles(fp)
  46. if err != nil {
  47. utils.Err(err)
  48. return err.Error()
  49. }
  50. var buf bytes.Buffer
  51. err = tmpl.Execute(&buf, props)
  52. if err != nil {
  53. utils.Err(err)
  54. return err.Error()
  55. }
  56. html := buf.String()
  57. return html
  58. }