模板引擎新增若干内置函数;gstr增加对中文截取方法

This commit is contained in:
John
2018-10-29 22:58:30 +08:00
parent 842a6d3bed
commit ddf979e65b
4 changed files with 132 additions and 10 deletions

View File

@ -8,10 +8,14 @@
package gview
import (
"gitee.com/johng/gf/g/encoding/gurl"
"gitee.com/johng/gf/g/os/gtime"
"gitee.com/johng/gf/g/util/gstr"
"strings"
"sync"
"bytes"
"errors"
"html/template"
"text/template"
"gitee.com/johng/gf/g/container/gmap"
"gitee.com/johng/gf/g/encoding/ghash"
"gitee.com/johng/gf/g/util/gconv"
@ -30,7 +34,7 @@ type View struct {
}
// 输出到模板页面时保留HTML标签原意不做自动escape处理
type HTML = template.HTML
type HTML = string
// 模板变量
type Params = map[string]interface{}
@ -79,9 +83,19 @@ func New(path string) *View {
}
view.SetDelimiters("{{", "}}")
// 内置方法
view.BindFunc("text", view.funcText)
view.BindFunc("html", view.funcHtml)
view.BindFunc("include", view.funcInclude)
view.BindFunc("text", view.funcText)
view.BindFunc("html", view.funcHtmlEncode)
view.BindFunc("htmlencode", view.funcHtmlEncode)
view.BindFunc("htmldecode", view.funcHtmlDecode)
//view.BindFunc("htmlchars", view.funcHtmlChars)
//view.BindFunc("htmldechars", view.funcHtmlCharsDecode)
view.BindFunc("url", view.funcUrlEncode)
view.BindFunc("urlencode", view.funcUrlEncode)
view.BindFunc("urldecode", view.funcUrlDecode)
view.BindFunc("date", view.funcDate)
view.BindFunc("substr", view.funcSubStr)
view.BindFunc("compare", view.funcCompare)
view.BindFunc("include", view.funcInclude)
return view
}
@ -206,16 +220,16 @@ func (view *View) BindFunc(name string, function interface{}) {
}
// 模板内置方法include
func (view *View) funcInclude(file string, data...map[string]interface{}) template.HTML {
func (view *View) funcInclude(file string, data...map[string]interface{}) string {
var m map[string]interface{} = nil
if len(data) > 0 {
m = data[0]
}
content, err := view.Parse(file, m)
if err != nil {
return template.HTML(err.Error())
return err.Error()
}
return template.HTML(content)
return string(content)
}
// 模板内置方法text
@ -224,8 +238,52 @@ func (view *View) funcText(html interface{}) string {
}
// 模板内置方法html
func (view *View) funcHtml(html interface{}) template.HTML {
return template.HTML(gconv.String(html))
func (view *View) funcHtmlEncode(html interface{}) string {
return ghtml.Entities(gconv.String(html))
}
// 模板内置方法htmldecode
func (view *View) funcHtmlDecode(html interface{}) string {
return ghtml.EntitiesDecode(gconv.String(html))
}
// 模板内置方法htmlchars
func (view *View) funcHtmlChars(html interface{}) string {
return ghtml.SpecialChars(gconv.String(html))
}
// 模板内置方法htmlcharsdecode
func (view *View) funcHtmlCharsDecode(html interface{}) string {
return ghtml.SpecialCharsDecode(gconv.String(html))
}
// 模板内置方法url
func (view *View) funcUrlEncode(url interface{}) string {
return gurl.Encode(gconv.String(url))
}
// 模板内置方法urldecode
func (view *View) funcUrlDecode(url interface{}) string {
if content, err := gurl.Decode(gconv.String(url)); err == nil {
return content
} else {
return err.Error()
}
}
// 模板内置方法date
func (view *View) funcDate(format string, timestamp interface{}) string {
return gtime.NewFromTimeStamp(gconv.Int64(timestamp)).Format(format)
}
// 模板内置方法compare
func (view *View) funcCompare(value1, value2 interface{}) int {
return strings.Compare(gconv.String(value1), gconv.String(value2))
}
// 模板内置方法substr
func (view *View) funcSubStr(start, end int, str interface{}) string {
return gstr.SubStr(gconv.String(str), start, end)
}

View File

@ -84,4 +84,30 @@ func IsNumeric(s string) bool {
}
}
return true
}
// 字符串截取,支持中文
func SubStr(str string, start int, length...int) (substr string) {
// 将字符串的转换成[]rune
rs := []rune(str)
lth := len(rs)
// 简单的越界判断
if start < 0 {
start = 0
}
if start >= lth {
start = lth
}
end := lth
if len(length) > 0 {
end = start + length[0]
if end < start {
end = lth
}
}
if end > lth {
end = lth
}
// 返回子串
return string(rs[start : end])
}

View File

@ -0,0 +1,27 @@
package main
import (
"fmt"
"gitee.com/johng/gf/g"
)
func main() {
tplContent := `
{{"<div>测试</div>"|text}}
{{"<div>测试</div>"|html}}
{{"&lt;div&gt;测试&lt;/div&gt;"|htmldecode}}
{{"https://gfer.me"|url}}
{{"https://gfer.me"|urldecode}}
{{1540822968 | date "Y-m-d"}}
{{"1540822968" | date "Y-m-d H:i:s"}}
{{compare "A" "B"}}
{{compare "1" "2"}}
{{compare 2 1}}
{{compare 1 1}}
{{"我是中国人" | substr 2 -1}}
{{"我是中国人" | substr 2 2}}
`
content, err := g.View().ParseContent(tplContent, nil)
fmt.Println(err)
fmt.Println(string(content))
}

View File

@ -0,0 +1,11 @@
package main
import (
"fmt"
"gitee.com/johng/gf/g/util/gstr"
)
func main() {
fmt.Println(gstr.SubStr("我是中国人", 2))
fmt.Println(gstr.SubStr("我是中国人", 2, 2))
}