Merge pull request #682 from corebreaker/django-include-problem

Resolve Django `include` and `extends` tags problem

Former-commit-id: 4d6a7f45292f8e49abe45f91891c852b0eebb5f8
This commit is contained in:
Bill Q 2017-07-22 01:48:42 +03:00 committed by GitHub
commit 197cb0e9b0

View File

@ -1,10 +1,12 @@
package view
import (
"bytes"
"fmt"
"io"
"io/ioutil"
"os"
stdPath "path"
"path/filepath"
"strings"
"sync"
@ -22,6 +24,35 @@ type (
FilterFunction func(in *Value, param *Value) (out *Value, err *Error)
)
type tDjangoAssetLoader struct {
baseDir string
assetGet func(name string) ([]byte, error)
}
// Abs calculates the path to a given template. Whenever a path must be resolved
// due to an import from another template, the base equals the parent template's path.
func (dal *tDjangoAssetLoader) Abs(base, name string) string {
if stdPath.IsAbs(name) {
return name
}
return stdPath.Join(dal.baseDir, name)
}
// Get returns an io.Reader where the template's content can be read from.
func (dal *tDjangoAssetLoader) Get(path string) (io.Reader, error) {
if stdPath.IsAbs(path) {
path = path[1:]
}
res, err := dal.assetGet(path)
if err != nil {
return nil, err
}
return bytes.NewBuffer(res), nil
}
// DjangoEngine contains the amber view engine structure.
type DjangoEngine struct {
// files configuration
@ -199,12 +230,8 @@ func (s *DjangoEngine) loadAssets() error {
virtualDirectory, virtualExtension := s.directory, s.extension
assetFn, namesFn := s.assetFn, s.namesFn
var templateErr error
/*fsLoader, err := pongo2.NewLocalFileSystemLoader(virtualDirectory)
if err != nil {
return err
}*/
set := pongo2.NewSet("", pongo2.DefaultLoader)
// Make a file set with a template loader based on asset function
set := pongo2.NewSet("", &tDjangoAssetLoader{baseDir: s.directory, assetGet: s.assetFn})
set.Globals = getPongoContext(s.globals)
// set the filters
@ -225,6 +252,8 @@ func (s *DjangoEngine) loadAssets() error {
s.mu.Lock()
defer s.mu.Unlock()
var templateErr error
names := namesFn()
for _, path := range names {
if !strings.HasPrefix(path, virtualDirectory) {