- 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.
Topics
Resources
License
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Packages0
Contributors6
Uh oh!
There was an error while loading.Please reload this page.