partial.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  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. // RemovePartial removes the partial registered under the given name. The partial will not be available globally anymore. This does not affect partials registered on a specific template.
  52. func RemovePartial(name string) {
  53. partialsMutex.Lock()
  54. defer partialsMutex.Unlock()
  55. delete(partials, name)
  56. }
  57. // RemoveAllPartials removes all globally registered partials. This does not affect partials registered on a specific template.
  58. func RemoveAllPartials() {
  59. partialsMutex.Lock()
  60. defer partialsMutex.Unlock()
  61. partials = make(map[string]*partial)
  62. }
  63. // findPartial finds a registered global partial
  64. func findPartial(name string) *partial {
  65. partialsMutex.RLock()
  66. defer partialsMutex.RUnlock()
  67. return partials[name]
  68. }
  69. // template returns parsed partial template
  70. func (p *partial) template() (*Template, error) {
  71. if p.tpl == nil {
  72. var err error
  73. p.tpl, err = Parse(p.source)
  74. if err != nil {
  75. return nil, err
  76. }
  77. }
  78. return p.tpl, nil
  79. }