12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- package ace
- import (
- "html/template"
- "sync"
- )
- var cache = make(map[string]template.Template)
- var cacheMutex = new(sync.RWMutex)
- // Load loads and returns an HTML template. Each Ace templates are parsed only once
- // and cached if the "DynamicReload" option are not set.
- func Load(basePath, innerPath string, opts *Options) (*template.Template, error) {
- // Initialize the options.
- opts = InitializeOptions(opts)
- name := basePath + colon + innerPath
- if !opts.DynamicReload {
- if tpl, ok := getCache(name); ok {
- return &tpl, nil
- }
- }
- // Read files.
- src, err := readFiles(basePath, innerPath, opts)
- if err != nil {
- return nil, err
- }
- // Parse the source.
- rslt, err := ParseSource(src, opts)
- if err != nil {
- return nil, err
- }
- // Compile the parsed result.
- tpl, err := CompileResult(name, rslt, opts)
- if err != nil {
- return nil, err
- }
- if !opts.DynamicReload {
- setCache(name, *tpl)
- }
- return tpl, nil
- }
- // getCache returns the cached template.
- func getCache(name string) (template.Template, bool) {
- cacheMutex.RLock()
- tpl, ok := cache[name]
- cacheMutex.RUnlock()
- return tpl, ok
- }
- // setCache sets the template to the cache.
- func setCache(name string, tpl template.Template) {
- cacheMutex.Lock()
- cache[name] = tpl
- cacheMutex.Unlock()
- }
- // FlushCache clears all cached templates.
- func FlushCache() {
- cacheMutex.Lock()
- cache = make(map[string]template.Template)
- cacheMutex.Unlock()
- }
|