Golang library for parsing template files from virtual http filesystem (httpfs)
Related Golang documentations:
// A FileSystem implements access to a collection of named files.
// The elements in a file path are separated by slash ('/', U+002F)
// characters, regardless of host operating system convention.
type FileSystem interface {
Open(name string) (File, error)
}
// A File is returned by a FileSystem's Open method and can be
// served by the FileServer implementation.
//
// The methods should behave the same as those on an *os.File.
type File interface {
io.Closer
io.Reader
io.Seeker
Readdir(count int) ([]os.FileInfo, error)
Stat() (os.FileInfo, error)
}
go get github.com/shakahl/golang-vfstemplate
Parsing templates by glob pattern:
template.Must(vfstemplate.ParseGlob(myhttpfs, nil, "/views/*.html")
Parsing templates by specifying a list of file paths:
vfstemplate.ParseFiles(myhttpfs, nil, "/views/first.html", "/views/second.html")
Assume that we have the folloring directory structure:
.
static/
static/home.html
main.go
//go:generate statik -src static -dest . -p staticfiles -f
package main
import (
"html/template"
"log"
"net/http"
"github.com/labstack/echo/v4"
"github.com/rakyll/statik/fs"
vfstemplate "github.com/shakahl/golang-vfstemplate"
_ "myproject/staticfiles"
)
type Template struct {
templates *template.Template
}
func (t *Template) Render(w io.Writer, name string, data interface{}, c echo.Context) error {
return t.templates.ExecuteTemplate(w, name, data)
}
func main() {
statikFS, err := fs.New()
if err != nil {
log.Fatal(err)
}
staticFileServer := http.StripPrefix("/static/", http.FileServer(statikFS))
t := &Template{
templates: template.Must(vfstemplate.ParseGlob(statikFS, nil, "/views/*.html")),
}
e := echo.New()
e.Renderer = t
e.GET("/static/*", echo.WrapHandler(staticFileServer))
e.GET("/", func(c echo.Context) error {
return c.Render(http.StatusOK, "home.html", map[string]interface{}{
"Title": "Welcome",
})
})
e.Logger.Fatal(e.Start(":8080"))
}
This project is based on shurcooL/httpfs maintained by Dmitri Shuralyov.