aboutsummaryrefslogtreecommitdiff
path: root/internal/assets/templates/templates.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/assets/templates/templates.go')
-rw-r--r--internal/assets/templates/templates.go73
1 files changed, 73 insertions, 0 deletions
diff --git a/internal/assets/templates/templates.go b/internal/assets/templates/templates.go
new file mode 100644
index 00000000..91d13f39
--- /dev/null
+++ b/internal/assets/templates/templates.go
@@ -0,0 +1,73 @@
+// Copyright 2020 The Gogs Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package templates
+
+import (
+ "bytes"
+ "fmt"
+ "io"
+ "io/ioutil"
+ "path"
+ "strings"
+
+ "gopkg.in/macaron.v1"
+
+ "gogs.io/gogs/internal/osutil"
+)
+
+//go:generate go-bindata -nomemcopy -ignore="\\.DS_Store" -pkg=templates -prefix=../../../templates -debug=false -o=templates_gen.go ../../../templates/...
+
+// fileSystem implements the macaron.TemplateFileSystem interface.
+type fileSystem struct {
+ files []macaron.TemplateFile
+}
+
+func (fs *fileSystem) ListFiles() []macaron.TemplateFile {
+ return fs.files
+}
+
+func (fs *fileSystem) Get(name string) (io.Reader, error) {
+ for i := range fs.files {
+ if fs.files[i].Name()+fs.files[i].Ext() == name {
+ return bytes.NewReader(fs.files[i].Data()), nil
+ }
+ }
+ return nil, fmt.Errorf("file %q not found", name)
+}
+
+// NewTemplateFileSystem returns a macaron.TemplateFileSystem instance for embedded assets.
+// The argument "dir" can be used to serve subset of embedded assets. Template file
+// found under the "customDir" on disk has higher precedence over embedded assets.
+func NewTemplateFileSystem(dir, customDir string) macaron.TemplateFileSystem {
+ if dir != "" && !strings.HasSuffix(dir, "/") {
+ dir += "/"
+ }
+
+ var files []macaron.TemplateFile
+ names := AssetNames()
+ for _, name := range names {
+ if !strings.HasPrefix(name, dir) {
+ continue
+ }
+
+ // Check if corresponding custom file exists
+ var err error
+ var data []byte
+ fpath := path.Join(customDir, name)
+ if osutil.IsFile(fpath) {
+ data, err = ioutil.ReadFile(fpath)
+ } else {
+ data, err = Asset(name)
+ }
+ if err != nil {
+ panic(err)
+ }
+
+ ext := path.Ext(name)
+ name = strings.TrimSuffix(name, ext)
+ files = append(files, macaron.NewTplFile(name, data, ext))
+ }
+ return &fileSystem{files: files}
+}