- Notifications
You must be signed in to change notification settings - Fork37
Goview is a lightweight, minimalist and idiomatic template library based on golang html/template for building Go web application.
License
foolin/goview
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Goview is a lightweight, minimalist and idiomatic template library based on golanghtml/template for building Go web application.
go get github.com/foolin/goview
- Lightweight - use golang html/template syntax.
- Easy - easy use for your web application.
- Fast - Support configure cache template.
- Include syntax - Support include file.
- Master layout - Support configure master layout file.
- Extension - Support configure template file extension.
- Easy - Support configure templates directory.
- Auto reload - Support dynamic reload template(disable cache mode).
- Multiple Engine - Support multiple templates for frontend and backend.
- No external dependencies - plain ol' Go html/template.
- Gorice - Support gorice for package resources.
- Gin/Iris/Echo/Chi - Support gin framework, Iris framework, echo framework, go-chi framework.
Seehttps://www.godoc.org/github.com/foolin/goview
- ginview goview for gin framework
- irisview goview for Iris framework
- echoview goview for echo framework
- gorice goview for go.rice
Project structure:
|--app/views/|---index.html|---page.html|--layouts/|---footer.html|---master.html
Use default instance:
//write http.ResponseWriter//"index" -> index.htmlgoview.Render(writer,http.StatusOK,"index", goview.M{})
Use new instance with config:
gv:=goview.New(goview.Config{Root:"views",Extension:".tpl",Master:"layouts/master",Partials: []string{"partials/ad"},Funcs: template.FuncMap{"sub":func(a,bint)int {returna-b },"copy":func()string {returntime.Now().Format("2006") }, },DisableCache:true,Delims:Delims{Left:"{{",Right:"}}"}, })//Set new instancegoview.Use(gv)//write http.ResponseWritergoview.Render(writer,http.StatusOK,"index", goview.M{})
Use multiple instance with config:
//============== Frontend ============== //gvFrontend:=goview.New(goview.Config{Root:"views/frontend",Extension:".tpl",Master:"layouts/master",Partials: []string{"partials/ad"},Funcs: template.FuncMap{"sub":func(a,bint)int {returna-b },"copy":func()string {returntime.Now().Format("2006") }, },DisableCache:true,Delims:Delims{Left:"{{",Right:"}}"}, })//write http.ResponseWritergvFrontend.Render(writer,http.StatusOK,"index", goview.M{})//============== Backend ============== //gvBackend:=goview.New(goview.Config{Root:"views/backend",Extension:".tpl",Master:"layouts/master",Partials: []string{"partials/ad"},Funcs: template.FuncMap{"sub":func(a,bint)int {returna-b },"copy":func()string {returntime.Now().Format("2006") }, },DisableCache:true,Delims:Delims{Left:"{{",Right:"}}"}, })//write http.ResponseWritergvBackend.Render(writer,http.StatusOK,"index", goview.M{})
goview.Config{Root:"views",//template root pathExtension:".tpl",//file extensionMaster:"layouts/master",//master layout filePartials: []string{"partials/head"},//partial filesFuncs: template.FuncMap{"sub":func(a,bint)int {returna-b },// more funcs },DisableCache:false,//if disable cache, auto reload template file for debug.Delims:Delims{Left:"{{",Right:"}}"},}
//template file{{include"layouts/footer"}}
Render name useindex
without.html
extension, that will render with master layout.
- "index" - Render with master layout.
- "index.html" - Not render with master layout.
Notice: `.html` is default template extension, you can change with config
Render with master
//use name without extension `.html`goview.Render(w,http.StatusOK,"index", goview.M{})
Thew
is instance ofhttp.ResponseWriter
Render only file(not use master layout)
//use full name with extension `.html`goview.Render(w,http.StatusOK,"page.html", goview.M{})
We have two type of functionsglobal functions
, andtemporary functions
.
Global functions
are set within theconfig
.
goview.Config{Funcs: template.FuncMap{"reverse":e.Reverse,},}
//template file{{reverse"route-name" }}
Temporary functions
are set inside the handler.
http.HandleFunc("/",func(w http.ResponseWriter,r*http.Request) {err:=goview.Render(w,http.StatusOK,"index", goview.M{"reverse":e.Reverse,})iferr!=nil {fmt.Fprintf(w,"Render index error: %v!",err)}})
//template file{{ call $.reverse"route-name" }}
See_examples/ for a variety of examples.
package mainimport ("fmt""github.com/foolin/goview""net/http")funcmain() {//render index use `index` without `.html` extension, that will render with master layout.http.HandleFunc("/",func(w http.ResponseWriter,r*http.Request) {err:=goview.Render(w,http.StatusOK,"index", goview.M{"title":"Index title!","add":func(aint,bint)int {returna+b},})iferr!=nil {fmt.Fprintf(w,"Render index error: %v!",err)}})//render page use `page.tpl` with '.html' will only file template without master layout.http.HandleFunc("/page",func(w http.ResponseWriter,r*http.Request) {err:=goview.Render(w,http.StatusOK,"page.html", goview.M{"title":"Page file title!!"})iferr!=nil {fmt.Fprintf(w,"Render page.html error: %v!",err)}})fmt.Println("Listening and serving HTTP on :9090")http.ListenAndServe(":9090",nil)}
Project structure:
|--app/views/|---index.html|---page.html|--layouts/|---footer.html|---master.htmlSeein"examples/basic"folder
go get github.com/foolin/goview/supports/ginview
package mainimport ("github.com/foolin/goview/supports/ginview""github.com/gin-gonic/gin""net/http")funcmain() {router:=gin.Default()//new template enginerouter.HTMLRender=ginview.Default()router.GET("/",func(ctx*gin.Context) {//render with masterctx.HTML(http.StatusOK,"index", gin.H{"title":"Index title!","add":func(aint,bint)int {returna+b},})})router.GET("/page",func(ctx*gin.Context) {//render only file, must full name with extensionctx.HTML(http.StatusOK,"page.html", gin.H{"title":"Page file title!!"})})router.Run(":9090")}
Project structure:
|--app/views/|---index.html|---page.html|--layouts/|---footer.html|---master.htmlSeein"examples/basic"folder
$ go get github.com/foolin/goview/supports/irisview
package mainimport ("github.com/foolin/goview/supports/irisview""github.com/kataras/iris/v12")funcmain() {app:=iris.New()// Register the goview template engine.app.RegisterView(irisview.Default())app.Get("/",func(ctx iris.Context) {// Render with master.ctx.View("index", iris.Map{"title":"Index title!","add":func(aint,bint)int {returna+b},})})app.Get("/page",func(ctx iris.Context) {// Render only file, must full name with extension.ctx.View("page.html", iris.Map{"title":"Page file title!!"})})app.Listen(":9090")}
Project structure:
|--app/views/|---index.html|---page.html|--layouts/|---footer.html|---master.htmlSeein"examples/iris"folder
package mainimport ("html/template""time""github.com/foolin/goview""github.com/foolin/goview/supports/irisview""github.com/kataras/iris/v12")funcmain() {app:=iris.New()// Register a new template engine.app.RegisterView(irisview.New(goview.Config{Root:"views/frontend",Extension:".html",Master:"layouts/master",Partials: []string{"partials/ad"},Funcs: template.FuncMap{"copy":func()string {returntime.Now().Format("2006")},},DisableCache:true,}))app.Get("/",func(ctx iris.Context) {ctx.View("index", iris.Map{"title":"Frontend title!",})})//=========== Backend ===========//// Assign a new template middleware.mw:=irisview.NewMiddleware(goview.Config{Root:"views/backend",Extension:".html",Master:"layouts/master",Partials: []string{},Funcs: template.FuncMap{"copy":func()string {returntime.Now().Format("2006")},},DisableCache:true,})backendGroup:=app.Party("/admin",mw)backendGroup.Get("/",func(ctx iris.Context) {// Use the ctx.View as you used to. Zero changes to your codebase,// even if you use multiple templates.ctx.View("index", iris.Map{"title":"Backend title!",})})app.Listen(":9090")}
Project structure:
|--app/views/|--fontend/|---index.html|--layouts/|---footer.html|---head.html|---master.html|--partials/|---ad.html|--backend/|---index.html|--layouts/|---footer.html|---head.html|---master.htmlSeein"examples/iris-multiple"folder
Echo <=v3 version:
go get github.com/foolin/goview/supports/echoview
Echo v4 version:
go get github.com/foolin/goview/supports/echoview-v4
package mainimport ("github.com/foolin/goview/supports/echoview""github.com/labstack/echo""github.com/labstack/echo/middleware""net/http")funcmain() {// Echo instancee:=echo.New()// Middlewaree.Use(middleware.Logger())e.Use(middleware.Recover())//Set Renderere.Renderer=echoview.Default()// Routese.GET("/",func(c echo.Context)error {//render with masterreturnc.Render(http.StatusOK,"index", echo.Map{"title":"Index title!","add":func(aint,bint)int {returna+b},})})e.GET("/page",func(c echo.Context)error {//render only file, must full name with extensionreturnc.Render(http.StatusOK,"page.html", echo.Map{"title":"Page file title!!"})})// Start servere.Logger.Fatal(e.Start(":9090"))}
Project structure:
|--app/views/|---index.html|---page.html|--layouts/|---footer.html|---master.htmlSeein"examples/basic"folder
package mainimport ("fmt""github.com/foolin/goview""github.com/go-chi/chi""net/http")funcmain() {r:=chi.NewRouter()//render index use `index` without `.html` extension, that will render with master layout.r.Get("/",func(w http.ResponseWriter,r*http.Request) {err:=goview.Render(w,http.StatusOK,"index", goview.M{"title":"Index title!","add":func(aint,bint)int {returna+b},})iferr!=nil {fmt.Fprintf(w,"Render index error: %v!",err)}})//render page use `page.tpl` with '.html' will only file template without master layout.r.Get("/page",func(w http.ResponseWriter,r*http.Request) {err:=goview.Render(w,http.StatusOK,"page.html", goview.M{"title":"Page file title!!"})iferr!=nil {fmt.Fprintf(w,"Render page.html error: %v!",err)}})fmt.Println("Listening and serving HTTP on :9090")http.ListenAndServe(":9090",r)}
Project structure:
|--app/views/|---index.html|---page.html|--layouts/|---footer.html|---master.htmlSeein"examples/basic"folder
package mainimport ("fmt""github.com/foolin/goview""html/template""net/http""time")funcmain() {gv:=goview.New(goview.Config{Root:"views",Extension:".tpl",Master:"layouts/master",Partials: []string{"partials/ad"},Funcs: template.FuncMap{"sub":func(a,bint)int {returna-b},"copy":func()string {returntime.Now().Format("2006")},},DisableCache:true,})//Set new instancegoview.Use(gv)//render index use `index` without `.html` extension, that will render with master layout.http.HandleFunc("/",func(w http.ResponseWriter,r*http.Request) {err:=goview.Render(w,http.StatusOK,"index", goview.M{"title":"Index title!","add":func(aint,bint)int {returna+b},})iferr!=nil {fmt.Fprintf(w,"Render index error: %v!",err)}})//render page use `page.tpl` with '.html' will only file template without master layout.http.HandleFunc("/page",func(w http.ResponseWriter,r*http.Request) {err:=goview.Render(w,http.StatusOK,"page.tpl", goview.M{"title":"Page file title!!"})iferr!=nil {fmt.Fprintf(w,"Render page.html error: %v!",err)}})fmt.Println("Listening and serving HTTP on :9090")http.ListenAndServe(":9090",nil)}
Project structure:
|--app/views/|---index.tpl|---page.tpl|--layouts/|---footer.tpl|---head.tpl|---master.tpl|--partials/|---ad.tplSeein"examples/advance"folder
package mainimport ("html/template""net/http""time""github.com/foolin/goview""github.com/gin-gonic/gin")funcmain() {router:=gin.Default()//new template enginerouter.HTMLRender=gintemplate.New(gintemplate.TemplateConfig{Root:"views/fontend",Extension:".html",Master:"layouts/master",Partials: []string{"partials/ad"},Funcs: template.FuncMap{"copy":func()string {returntime.Now().Format("2006")},},DisableCache:true,})router.GET("/",func(ctx*gin.Context) {// `HTML()` is a helper func to deal with multiple TemplateEngine's.// It detects the suitable TemplateEngine for each path automatically.gintemplate.HTML(ctx,http.StatusOK,"index", gin.H{"title":"Fontend title!",})})//=========== Backend ===========////new middlewaremw:=gintemplate.NewMiddleware(gintemplate.TemplateConfig{Root:"views/backend",Extension:".html",Master:"layouts/master",Partials: []string{},Funcs: template.FuncMap{"copy":func()string {returntime.Now().Format("2006")},},DisableCache:true,})// You should use helper func `Middleware()` to set the supplied// TemplateEngine and make `HTML()` work validly.backendGroup:=router.Group("/admin",mw)backendGroup.GET("/",func(ctx*gin.Context) {// With the middleware, `HTML()` can detect the valid TemplateEngine.gintemplate.HTML(ctx,http.StatusOK,"index", gin.H{"title":"Backend title!",})})router.Run(":9090")}
Project structure:
|--app/views/|--fontend/|---index.html|--layouts/|---footer.html|---head.html|---master.html|--partials/|---ad.html|--backend/|---index.html|--layouts/|---footer.html|---head.html|---master.htmlSeein"examples/multiple"folder
go get github.com/foolin/goview/supports/gorice
package mainimport ("fmt""github.com/GeertJohan/go.rice""github.com/foolin/goview""github.com/foolin/goview/supports/gorice""net/http")funcmain() {//staticstaticBox:=rice.MustFindBox("static")staticFileServer:=http.StripPrefix("/static/",http.FileServer(staticBox.HTTPBox()))http.Handle("/static/",staticFileServer)//new view enginegv:=gorice.New(rice.MustFindBox("views"))//set engine for default instancegoview.Use(gv)//render index use `index` without `.html` extension, that will render with master layout.http.HandleFunc("/",func(w http.ResponseWriter,r*http.Request) {err:=goview.Render(w,http.StatusOK,"index", goview.M{"title":"Index title!","add":func(aint,bint)int {returna+b},})iferr!=nil {fmt.Fprintf(w,"Render index error: %v!",err)}})//render page use `page.tpl` with '.html' will only file template without master layout.http.HandleFunc("/page",func(w http.ResponseWriter,r*http.Request) {err:=goview.Render(w,http.StatusOK,"page.html", goview.M{"title":"Page file title!!"})iferr!=nil {fmt.Fprintf(w,"Render page.html error: %v!",err)}})fmt.Println("Listening and serving HTTP on :9090")http.ListenAndServe(":9090",nil)}
Project structure:
|--app/views/|---index.html|---page.html|--layouts/|---footer.html|---master.html|--app/static/|--css/|---bootstrap.css|--img/|---gopher.pngSeein"examples/gorice"folder
See_examples/ for a variety of examples.
[ ] Add Partials support directory or glob[ ] Add functions support.
About
Goview is a lightweight, minimalist and idiomatic template library based on golang html/template for building Go web application.