partial.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package raymond
  2. import (
  3. "fmt"
  4. "sync"
  5. )
  6. // partial represents a partial template
  7. type partial struct {
  8. name string
  9. source string
  10. tpl *Template
  11. }
  12. // partials stores all global partials
  13. var partials map[string]*partial
  14. // protects global partials
  15. var partialsMutex sync.RWMutex
  16. func init() {
  17. partials = make(map[string]*partial)
  18. }
  19. // newPartial instanciates a new partial
  20. func newPartial(name string, source string, tpl *Template) *partial {
  21. return &partial{
  22. name: name,
  23. source: source,
  24. tpl: tpl,
  25. }
  26. }
  27. // RegisterPartial registers a global partial. That partial will be available to all templates.
  28. func RegisterPartial(name string, source string) {
  29. partialsMutex.Lock()
  30. defer partialsMutex.Unlock()
  31. if partials[name] != nil {
  32. panic(fmt.Errorf("Partial already registered: %s", name))
  33. }
  34. partials[name] = newPartial(name, source, nil)
  35. }
  36. // RegisterPartials registers several global partials. Those partials will be available to all templates.
  37. func RegisterPartials(partials map[string]string) {
  38. for name, p := range partials {
  39. RegisterPartial(name, p)
  40. }
  41. }
  42. // RegisterPartialTemplate registers a global partial with given parsed template. That partial will be available to all templates.
  43. func RegisterPartialTemplate(name string, tpl *Template) {
  44. partialsMutex.Lock()
  45. defer partialsMutex.Unlock()
  46. if partials[name] != nil {
  47. panic(fmt.Errorf("Partial already registered: %s", name))
  48. }
  49. partials[name] = newPartial(name, "", tpl)
  50. }
  51. // findPartial finds a registered global partial
  52. func findPartial(name string) *partial {
  53. partialsMutex.RLock()
  54. defer partialsMutex.RUnlock()
  55. return partials[name]
  56. }
  57. // template returns parsed partial template
  58. func (p *partial) template() (*Template, error) {
  59. if p.tpl == nil {
  60. var err error
  61. p.tpl, err = Parse(p.source)
  62. if err != nil {
  63. return nil, err
  64. }
  65. }
  66. return p.tpl, nil
  67. }