From 22504f01efc51bf537b04262307741e4cefcfb98 Mon Sep 17 00:00:00 2001
From: "Gerasimos (Makis) Maropoulos" <kataras2006@hotmail.com>
Date: Thu, 14 Dec 2017 06:11:37 +0200
Subject: [PATCH] add a simple hero template example as requested at
 https://github.com/kataras/iris/issues/840

Former-commit-id: 1c65190d21a5febbbbad1b2b565f82f749278d48
---
 _examples/README.md                           |  3 +-
 _examples/http_responsewriter/hero/README.md  | 26 +++++++++
 _examples/http_responsewriter/hero/app.go     | 55 +++++++++++++++++++
 .../hero/template/index.html                  | 11 ++++
 .../hero/template/index.html.go               |  3 +
 .../hero/template/user.html                   |  3 +
 .../hero/template/user.html.go                |  3 +
 .../hero/template/userlist.html               | 11 ++++
 .../hero/template/userlist.html.go            | 41 ++++++++++++++
 .../hero/template/userlistwriter.html         | 11 ++++
 .../hero/template/userlistwriter.html.go      | 44 +++++++++++++++
 11 files changed, 210 insertions(+), 1 deletion(-)
 create mode 100644 _examples/http_responsewriter/hero/README.md
 create mode 100644 _examples/http_responsewriter/hero/app.go
 create mode 100644 _examples/http_responsewriter/hero/template/index.html
 create mode 100644 _examples/http_responsewriter/hero/template/index.html.go
 create mode 100644 _examples/http_responsewriter/hero/template/user.html
 create mode 100644 _examples/http_responsewriter/hero/template/user.html.go
 create mode 100644 _examples/http_responsewriter/hero/template/userlist.html
 create mode 100644 _examples/http_responsewriter/hero/template/userlist.html.go
 create mode 100644 _examples/http_responsewriter/hero/template/userlistwriter.html
 create mode 100644 _examples/http_responsewriter/hero/template/userlistwriter.html.go

diff --git a/_examples/README.md b/_examples/README.md
index 1f49a85d..83272b5f 100644
--- a/_examples/README.md
+++ b/_examples/README.md
@@ -259,7 +259,7 @@ convert any custom type into a response dispatcher by implementing the `mvc.Resu
 - [Embedding Templates Into App Executable File](view/embedding-templates-into-app/main.go)
 
 
-You can serve [quicktemplate](https://github.com/valyala/quicktemplate) files too, simply by using the `context#ResponseWriter`, take a look at the [http_responsewriter/quicktemplate](http_responsewriter/quicktemplate) example.
+You can serve [quicktemplate](https://github.com/valyala/quicktemplate) and [hero](https://github.com/shiyanhui/hero/hero) files too, simply by using the `context#ResponseWriter`, take a look at the [http_responsewriter/quicktemplate](http_responsewriter/quicktemplate) and [http_responsewriter/hero] examples.
 
 ### Authentication
 
@@ -290,6 +290,7 @@ You can serve [quicktemplate](https://github.com/valyala/quicktemplate) files to
 ### How to Write to `context.ResponseWriter() http.ResponseWriter`
 
 - [Write `valyala/quicktemplate` templates](http_responsewriter/quicktemplate)
+- [Write `shiyanhui/hero` templates](http_responsewriter/hero)
 - [Text, Markdown, HTML, JSON, JSONP, XML, Binary](http_responsewriter/write-rest/main.go)
 - [Stream Writer](http_responsewriter/stream-writer/main.go)
 - [Transactions](http_responsewriter/transactions/main.go)
diff --git a/_examples/http_responsewriter/hero/README.md b/_examples/http_responsewriter/hero/README.md
new file mode 100644
index 00000000..ff71e067
--- /dev/null
+++ b/_examples/http_responsewriter/hero/README.md
@@ -0,0 +1,26 @@
+# Hero Template Example
+
+This folder contains the iris version of the original hero's example: https://github.com/shiyanhui/hero/tree/master/examples/app.
+
+Iris is 100% compatible with `net/http` so you don't have to change anything else
+except the handler input from the original example.
+
+The only inline handler's changes were:
+
+From:
+
+```go
+if _, err := w.Write(buffer.Bytes()); err != nil {
+// and
+template.UserListToWriter(userList, w)
+```
+To: 
+```go
+if _, err := ctx.Write(buffer.Bytes()); err != nil {
+// and
+template.UserListToWriter(userList, ctx)
+```
+
+So easy.
+
+Read more at: https://github.com/shiyanhui/hero
\ No newline at end of file
diff --git a/_examples/http_responsewriter/hero/app.go b/_examples/http_responsewriter/hero/app.go
new file mode 100644
index 00000000..f25bb9e1
--- /dev/null
+++ b/_examples/http_responsewriter/hero/app.go
@@ -0,0 +1,55 @@
+package main
+
+import (
+	"bytes"
+	"log"
+
+	"github.com/kataras/iris/_examples/http_responsewriter/hero/template"
+
+	"github.com/kataras/iris"
+)
+
+// $ go get -u github.com/shiyanhui/hero/hero
+// $ go run app.go
+//
+// Read more at https://github.com/shiyanhui/hero/hero
+func main() {
+
+	app := iris.New()
+
+	app.Get("/users", func(ctx iris.Context) {
+		var userList = []string{
+			"Alice",
+			"Bob",
+			"Tom",
+		}
+
+		// Had better use buffer sync.Pool.
+		// Hero exports GetBuffer and PutBuffer for this.
+		//
+		// buffer := hero.GetBuffer()
+		// defer hero.PutBuffer(buffer)
+		buffer := new(bytes.Buffer)
+		template.UserList(userList, buffer)
+
+		if _, err := ctx.Write(buffer.Bytes()); err != nil {
+			log.Printf("ERR: %s\n", err)
+		}
+	})
+
+	app.Get("/users2", func(ctx iris.Context) {
+		var userList = []string{
+			"Alice",
+			"Bob",
+			"Tom",
+		}
+
+		// using an io.Writer for automatic buffer management (i.e. hero built-in buffer pool),
+		// iris context implements the io.Writer by its ResponseWriter
+		// which is an enhanced version of the standar http.ResponseWriter
+		// but still 100% compatible.
+		template.UserListToWriter(userList, ctx)
+	})
+
+	app.Run(iris.Addr(":8080"))
+}
diff --git a/_examples/http_responsewriter/hero/template/index.html b/_examples/http_responsewriter/hero/template/index.html
new file mode 100644
index 00000000..c39ba0e7
--- /dev/null
+++ b/_examples/http_responsewriter/hero/template/index.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <meta charset="utf-8">
+    </head>
+
+    <body>
+        <%@ body { %>
+        <% } %>
+    </body>
+</html>
diff --git a/_examples/http_responsewriter/hero/template/index.html.go b/_examples/http_responsewriter/hero/template/index.html.go
new file mode 100644
index 00000000..da8b5842
--- /dev/null
+++ b/_examples/http_responsewriter/hero/template/index.html.go
@@ -0,0 +1,3 @@
+// Code generated by hero.
+// DO NOT EDIT!
+package template
diff --git a/_examples/http_responsewriter/hero/template/user.html b/_examples/http_responsewriter/hero/template/user.html
new file mode 100644
index 00000000..812fd4c5
--- /dev/null
+++ b/_examples/http_responsewriter/hero/template/user.html
@@ -0,0 +1,3 @@
+<li>
+    <%= user %>
+</li>
diff --git a/_examples/http_responsewriter/hero/template/user.html.go b/_examples/http_responsewriter/hero/template/user.html.go
new file mode 100644
index 00000000..da8b5842
--- /dev/null
+++ b/_examples/http_responsewriter/hero/template/user.html.go
@@ -0,0 +1,3 @@
+// Code generated by hero.
+// DO NOT EDIT!
+package template
diff --git a/_examples/http_responsewriter/hero/template/userlist.html b/_examples/http_responsewriter/hero/template/userlist.html
new file mode 100644
index 00000000..afb27d71
--- /dev/null
+++ b/_examples/http_responsewriter/hero/template/userlist.html
@@ -0,0 +1,11 @@
+<%: func UserList(userList []string, buffer *bytes.Buffer) %>
+
+<%~ "index.html" %>
+
+<%@ body { %>
+    <% for _, user := range userList { %>
+        <ul>
+            <%+ "user.html" %>
+        </ul>
+    <% } %>
+<% } %>
diff --git a/_examples/http_responsewriter/hero/template/userlist.html.go b/_examples/http_responsewriter/hero/template/userlist.html.go
new file mode 100644
index 00000000..ebf6fcf1
--- /dev/null
+++ b/_examples/http_responsewriter/hero/template/userlist.html.go
@@ -0,0 +1,41 @@
+// Code generated by hero.
+// DO NOT EDIT!
+package template
+
+import (
+	"bytes"
+
+	"github.com/shiyanhui/hero"
+)
+
+func UserList(userList []string, buffer *bytes.Buffer) {
+	buffer.WriteString(`<!DOCTYPE html>
+<html>
+    <head>
+        <meta charset="utf-8">
+    </head>
+
+    <body>
+        `)
+	for _, user := range userList {
+		buffer.WriteString(`
+        <ul>
+            `)
+		buffer.WriteString(`<li>
+    `)
+		hero.EscapeHTML(user, buffer)
+		buffer.WriteString(`
+</li>
+`)
+
+		buffer.WriteString(`
+        </ul>
+    `)
+	}
+
+	buffer.WriteString(`
+    </body>
+</html>
+`)
+
+}
diff --git a/_examples/http_responsewriter/hero/template/userlistwriter.html b/_examples/http_responsewriter/hero/template/userlistwriter.html
new file mode 100644
index 00000000..59e68609
--- /dev/null
+++ b/_examples/http_responsewriter/hero/template/userlistwriter.html
@@ -0,0 +1,11 @@
+<%: func UserListToWriter(userList []string, w io.Writer) (int, error)%>
+
+<%~ "index.html" %>
+
+<%@ body { %>
+    <% for _, user := range userList { %>
+        <ul>
+            <%+ "user.html" %>
+        </ul>
+    <% } %>
+<% } %>
diff --git a/_examples/http_responsewriter/hero/template/userlistwriter.html.go b/_examples/http_responsewriter/hero/template/userlistwriter.html.go
new file mode 100644
index 00000000..114bffa9
--- /dev/null
+++ b/_examples/http_responsewriter/hero/template/userlistwriter.html.go
@@ -0,0 +1,44 @@
+// Code generated by hero.
+// DO NOT EDIT!
+package template
+
+import (
+	"io"
+
+	"github.com/shiyanhui/hero"
+)
+
+func UserListToWriter(userList []string, w io.Writer) (int, error) {
+	_buffer := hero.GetBuffer()
+	defer hero.PutBuffer(_buffer)
+	_buffer.WriteString(`<!DOCTYPE html>
+<html>
+    <head>
+        <meta charset="utf-8">
+    </head>
+
+    <body>
+        `)
+	for _, user := range userList {
+		_buffer.WriteString(`
+        <ul>
+            `)
+		_buffer.WriteString(`<li>
+    `)
+		hero.EscapeHTML(user, _buffer)
+		_buffer.WriteString(`
+</li>
+`)
+
+		_buffer.WriteString(`
+        </ul>
+    `)
+	}
+
+	_buffer.WriteString(`
+    </body>
+</html>
+`)
+	return w.Write(_buffer.Bytes())
+
+}