mirror of https://github.com/gogs/gogs.git
74 lines
1.8 KiB
Go
74 lines
1.8 KiB
Go
// 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}
|
|
}
|