diff --git a/README.md b/README.md
index 49a2b213..b33389d6 100644
--- a/README.md
+++ b/README.md
@@ -503,6 +503,86 @@ func main() {
```
+#### Custom rendering
+
+Custom your template engine use SetCustomRenderFunc()
+
+```go
+package main
+
+import (
+ "github.com/flosch/pongo2"
+ "github.com/gin-gonic/gin"
+ "net/http"
+ "errors"
+)
+
+func CustomRenderFunc(w http.ResponseWriter, name string, obj interface{}) error {
+ var err error
+ tpl, err := pongo2.FromFile(name)
+ if err != nil {
+ return err
+ }
+
+ if obj == nil {
+ err = tpl.ExecuteWriter(nil, w)
+ } else {
+
+ if data,ok := obj.(gin.H); ok {
+ err = tpl.ExecuteWriter(pongo2.Context(data), w)
+ } else if data,ok := obj.(pongo2.Context); ok {
+ err = tpl.ExecuteWriter(data, w)
+ } else {
+ return errors.New("invalid obj type")
+ }
+ }
+
+ return err
+}
+
+func main() {
+ router := gin.Default()
+
+ pongo2.DefaultLoader.SetBaseDir("templates")
+ router.SetCustomRenderFunc(CustomRenderFunc)
+
+ router.GET("/", func(c *gin.Context) {
+ c.CustomRender(200, "index.html", nil)
+ })
+
+ router.GET("/msg1", func(c *gin.Context) {
+ c.CustomRender(200, "message.html", pongo2.Context{
+ "message": c.Query("name"),
+ })
+ })
+
+ router.GET("/msg2", func(c *gin.Context) {
+ c.CustomRender(200, "message.html", gin.H{
+ "message": c.Query("name"),
+ })
+ })
+
+ router.Run("[::]:8888")
+}
+```
+
+templates/index.html
+```html
+
+ hi
+
+
+```
+
+templates/message.html
+```html
+
+ hi {{ message }}
+
+
+```
+
+
#### Redirects
Issuing a HTTP redirect is easy:
diff --git a/context.go b/context.go
index 5b457588..231ac5e9 100644
--- a/context.go
+++ b/context.go
@@ -383,6 +383,11 @@ func (c *Context) HTML(code int, name string, obj interface{}) {
c.Render(code, instance)
}
+func (c *Context) CustomRender(code int, name string, obj interface{}) {
+ instance := c.engine.CustomRender.Instance(name, obj)
+ c.Render(code, instance)
+}
+
// IndentedJSON serializes the given struct as pretty JSON (indented + endlines) into the response body.
// It also sets the Content-Type as "application/json".
// WARNING: we recommend to use this only for development propuses since printing pretty JSON is
diff --git a/gin.go b/gin.go
index 6cd6a25b..35286261 100644
--- a/gin.go
+++ b/gin.go
@@ -11,7 +11,7 @@ import (
"os"
"sync"
- "github.com/gin-gonic/gin/render"
+ "github.com/SCys/gin/render"
)
// Framework's version
@@ -44,13 +44,14 @@ type (
// Create an instance of Engine, by using New() or Default()
Engine struct {
RouterGroup
- HTMLRender render.HTMLRender
- allNoRoute HandlersChain
- allNoMethod HandlersChain
- noRoute HandlersChain
- noMethod HandlersChain
- pool sync.Pool
- trees methodTrees
+ HTMLRender render.HTMLRender
+ CustomRender render.CustomRender
+ allNoRoute HandlersChain
+ allNoMethod HandlersChain
+ noRoute HandlersChain
+ noMethod HandlersChain
+ pool sync.Pool
+ trees methodTrees
// Enables automatic redirection if the current route can't be matched but a
// handler for the path with (without) the trailing slash exists.
@@ -147,6 +148,10 @@ func (engine *Engine) SetHTMLTemplate(templ *template.Template) {
engine.HTMLRender = render.HTMLProduction{Template: templ}
}
+func (engine *Engine) SetCustomRenderFunc(f render.CustomRenderFunc) {
+ engine.CustomRender = render.CustomRenderProduction{f}
+}
+
// Adds handlers for NoRoute. It return a 404 code by default.
func (engine *Engine) NoRoute(handlers ...HandlerFunc) {
engine.noRoute = handlers
diff --git a/render/custom_render.go b/render/custom_render.go
new file mode 100644
index 00000000..cce11905
--- /dev/null
+++ b/render/custom_render.go
@@ -0,0 +1,39 @@
+// Copyright 2014 Manu Martinez-Almeida. All rights reserved.
+// Use of this source code is governed by a MIT style
+// license that can be found in the LICENSE file.
+
+package render
+
+import (
+ "net/http"
+)
+
+type (
+ CustomRenderFunc func(http.ResponseWriter, string, interface{}) error
+
+ CustomRender interface {
+ Instance(string, interface{}) Render
+ }
+
+ CustomRenderProduction struct {
+ RenderFunc CustomRenderFunc
+ }
+
+ Custom struct {
+ RenderFunc CustomRenderFunc
+ Name string
+ Data interface{}
+ }
+)
+
+func (r CustomRenderProduction) Instance(name string, data interface{}) Render {
+ return Custom{
+ RenderFunc: r.RenderFunc,
+ Name: name,
+ Data: data,
+ }
+}
+
+func (r Custom) Render(w http.ResponseWriter) error {
+ return r.RenderFunc(w, r.Name, r.Data)
+}
diff --git a/render/render_test.go b/render/render_test.go
index 7a6ffb7d..519895b9 100644
--- a/render/render_test.go
+++ b/render/render_test.go
@@ -128,3 +128,7 @@ func TestRenderHTMLTemplate(t *testing.T) {
assert.Equal(t, w.Body.String(), "Hello alexandernyquist")
assert.Equal(t, w.Header().Get("Content-Type"), "text/html; charset=utf-8")
}
+
+func TestRenderCustom(t *testing.T) {
+ // TODO
+}
\ No newline at end of file