render method - first version
This commit is contained in:
commit
0152ebeb91
131
template_nest/nest.go
Normal file
131
template_nest/nest.go
Normal file
@ -0,0 +1,131 @@
|
|||||||
|
package template_nest
|
||||||
|
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"log"
|
||||||
|
"regexp"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
type Nest struct {
|
||||||
|
|
||||||
|
templateLabel string
|
||||||
|
templateDir string
|
||||||
|
templates map[string]string
|
||||||
|
tokenDelims [2]string
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func New( templates map[string]string ) Nest {
|
||||||
|
|
||||||
|
nest := Nest{
|
||||||
|
templateLabel: "TEMPLATE",
|
||||||
|
tokenDelims: [2]string{"<!--%", "%-->"},
|
||||||
|
templates: templates,
|
||||||
|
}
|
||||||
|
|
||||||
|
return nest
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func (obj *Nest) Render ( sjson []byte ) string {
|
||||||
|
|
||||||
|
var nesti interface{}
|
||||||
|
err := json.Unmarshal(sjson, &nesti)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal("Failed to parse JSON")
|
||||||
|
}
|
||||||
|
|
||||||
|
nested := nesti.(map[string]interface{})
|
||||||
|
|
||||||
|
html := obj._Render( nested )
|
||||||
|
|
||||||
|
return html
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (obj *Nest) _Render( nested interface{} ) string{
|
||||||
|
|
||||||
|
var html string
|
||||||
|
|
||||||
|
switch vtype := nested.(type) {
|
||||||
|
|
||||||
|
case string:
|
||||||
|
html = vtype
|
||||||
|
|
||||||
|
case []interface{}:
|
||||||
|
|
||||||
|
html = obj._RenderArray( vtype )
|
||||||
|
|
||||||
|
case map[string]interface{}:
|
||||||
|
html = obj._RenderMap( vtype )
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return html
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (obj *Nest) _RenderArray( nested []interface{} ) string {
|
||||||
|
|
||||||
|
html := ""
|
||||||
|
for v := range nested {
|
||||||
|
html += obj._Render( v )
|
||||||
|
}
|
||||||
|
|
||||||
|
return html
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func (obj *Nest) _RenderMap( nested map[string]interface{} ) string {
|
||||||
|
|
||||||
|
templateName := nested[ obj.templateLabel ].(string)
|
||||||
|
if templateName == "" {
|
||||||
|
panic("Encountered map with no TEMPLATE label")
|
||||||
|
}
|
||||||
|
|
||||||
|
template := obj.templates[ templateName ]
|
||||||
|
|
||||||
|
params := make(map[string]string)
|
||||||
|
|
||||||
|
for k, v := range nested {
|
||||||
|
|
||||||
|
if k == obj.templateLabel {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
params[ k ] = obj._Render( v )
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
html := obj._FillIn( templateName, template, params )
|
||||||
|
|
||||||
|
return html
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (obj *Nest) _FillIn( templateName string, template string, params map[string]string ) string {
|
||||||
|
|
||||||
|
html := template
|
||||||
|
for param, val := range params {
|
||||||
|
|
||||||
|
regex, err := regexp.Compile( obj.tokenDelims[0] + `\s*` + param + `\s*` + obj.tokenDelims[1] )
|
||||||
|
if err != nil {
|
||||||
|
panic( err )
|
||||||
|
}
|
||||||
|
|
||||||
|
html = regex.ReplaceAllString( html, val )
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return html
|
||||||
|
}
|
42
test_nest.go
Normal file
42
test_nest.go
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"tntester/template_nest"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main(){
|
||||||
|
|
||||||
|
templates := map[string]string{
|
||||||
|
"00-simple-page": `<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<title>Simple Page</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<p>A fairly simple page to test the performance of Template::Nest.</p>
|
||||||
|
<p><!--% variable %--></p>
|
||||||
|
<!--% simple_component %-->
|
||||||
|
</body>
|
||||||
|
</html>`, "00-simple-component": `<p><!--% variable %--></p>`}
|
||||||
|
|
||||||
|
json := []byte(`{
|
||||||
|
"TEMPLATE": "00-simple-page",
|
||||||
|
"variable": "Simple Variable",
|
||||||
|
"simple_component": {
|
||||||
|
"TEMPLATE":"01-simple-component",
|
||||||
|
"variable": "Simple Variable in Simple Component"
|
||||||
|
}
|
||||||
|
}`)
|
||||||
|
|
||||||
|
|
||||||
|
nest := template_nest.New( templates )
|
||||||
|
|
||||||
|
html := nest.Render( json )
|
||||||
|
|
||||||
|
fmt.Println( html )
|
||||||
|
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user