86 lines
1.8 KiB
Go
86 lines
1.8 KiB
Go
|
package raymond
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"sync"
|
||
|
)
|
||
|
|
||
|
// partial represents a partial template
|
||
|
type partial struct {
|
||
|
name string
|
||
|
source string
|
||
|
tpl *Template
|
||
|
}
|
||
|
|
||
|
// partials stores all global partials
|
||
|
var partials map[string]*partial
|
||
|
|
||
|
// protects global partials
|
||
|
var partialsMutex sync.RWMutex
|
||
|
|
||
|
func init() {
|
||
|
partials = make(map[string]*partial)
|
||
|
}
|
||
|
|
||
|
// newPartial instanciates a new partial
|
||
|
func newPartial(name string, source string, tpl *Template) *partial {
|
||
|
return &partial{
|
||
|
name: name,
|
||
|
source: source,
|
||
|
tpl: tpl,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// RegisterPartial registers a global partial. That partial will be available to all templates.
|
||
|
func RegisterPartial(name string, source string) {
|
||
|
partialsMutex.Lock()
|
||
|
defer partialsMutex.Unlock()
|
||
|
|
||
|
if partials[name] != nil {
|
||
|
panic(fmt.Errorf("Partial already registered: %s", name))
|
||
|
}
|
||
|
|
||
|
partials[name] = newPartial(name, source, nil)
|
||
|
}
|
||
|
|
||
|
// RegisterPartials registers several global partials. Those partials will be available to all templates.
|
||
|
func RegisterPartials(partials map[string]string) {
|
||
|
for name, p := range partials {
|
||
|
RegisterPartial(name, p)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// RegisterPartialTemplate registers a global partial with given parsed template. That partial will be available to all templates.
|
||
|
func RegisterPartialTemplate(name string, tpl *Template) {
|
||
|
partialsMutex.Lock()
|
||
|
defer partialsMutex.Unlock()
|
||
|
|
||
|
if partials[name] != nil {
|
||
|
panic(fmt.Errorf("Partial already registered: %s", name))
|
||
|
}
|
||
|
|
||
|
partials[name] = newPartial(name, "", tpl)
|
||
|
}
|
||
|
|
||
|
// findPartial finds a registered global partial
|
||
|
func findPartial(name string) *partial {
|
||
|
partialsMutex.RLock()
|
||
|
defer partialsMutex.RUnlock()
|
||
|
|
||
|
return partials[name]
|
||
|
}
|
||
|
|
||
|
// template returns parsed partial template
|
||
|
func (p *partial) template() (*Template, error) {
|
||
|
if p.tpl == nil {
|
||
|
var err error
|
||
|
|
||
|
p.tpl, err = Parse(p.source)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return p.tpl, nil
|
||
|
}
|