diff --git a/os/gview/gview.go b/os/gview/gview.go
index 58f594099..d49dd4c53 100644
--- a/os/gview/gview.go
+++ b/os/gview/gview.go
@@ -132,6 +132,7 @@ func New(path ...string) *View {
view.BindFunc("date", view.funcDate)
view.BindFunc("substr", view.funcSubStr)
view.BindFunc("strlimit", view.funcStrLimit)
+ view.BindFunc("replace", view.funcReplace)
view.BindFunc("compare", view.funcCompare)
view.BindFunc("hidestr", view.funcHideStr)
view.BindFunc("highlight", view.funcHighlight)
diff --git a/os/gview/gview_buildin.go b/os/gview/gview_buildin.go
index 25d08171c..6020e44fd 100644
--- a/os/gview/gview_buildin.go
+++ b/os/gview/gview_buildin.go
@@ -17,7 +17,7 @@ import (
"github.com/gogf/gf/util/gconv"
)
-// Build-in template function: eq
+// funcEq implements build-in template function: eq
func (view *View) funcEq(value interface{}, others ...interface{}) bool {
s := gconv.String(value)
for _, v := range others {
@@ -28,13 +28,13 @@ func (view *View) funcEq(value interface{}, others ...interface{}) bool {
return true
}
-// Build-in template function: ne
-func (view *View) funcNe(value interface{}, other interface{}) bool {
+// funcNe implements build-in template function: ne
+func (view *View) funcNe(value, other interface{}) bool {
return strings.Compare(gconv.String(value), gconv.String(other)) != 0
}
-// Build-in template function: lt
-func (view *View) funcLt(value interface{}, other interface{}) bool {
+// funcLt implements build-in template function: lt
+func (view *View) funcLt(value, other interface{}) bool {
s1 := gconv.String(value)
s2 := gconv.String(other)
if gstr.IsNumeric(s1) && gstr.IsNumeric(s2) {
@@ -43,8 +43,8 @@ func (view *View) funcLt(value interface{}, other interface{}) bool {
return strings.Compare(s1, s2) < 0
}
-// Build-in template function: le
-func (view *View) funcLe(value interface{}, other interface{}) bool {
+// funcLe implements build-in template function: le
+func (view *View) funcLe(value, other interface{}) bool {
s1 := gconv.String(value)
s2 := gconv.String(other)
if gstr.IsNumeric(s1) && gstr.IsNumeric(s2) {
@@ -53,8 +53,8 @@ func (view *View) funcLe(value interface{}, other interface{}) bool {
return strings.Compare(s1, s2) <= 0
}
-// Build-in template function: gt
-func (view *View) funcGt(value interface{}, other interface{}) bool {
+// funcGt implements build-in template function: gt
+func (view *View) funcGt(value, other interface{}) bool {
s1 := gconv.String(value)
s2 := gconv.String(other)
if gstr.IsNumeric(s1) && gstr.IsNumeric(s2) {
@@ -63,8 +63,8 @@ func (view *View) funcGt(value interface{}, other interface{}) bool {
return strings.Compare(s1, s2) > 0
}
-// Build-in template function: ge
-func (view *View) funcGe(value interface{}, other interface{}) bool {
+// funcGe implements build-in template function: ge
+func (view *View) funcGe(value, other interface{}) bool {
s1 := gconv.String(value)
s2 := gconv.String(other)
if gstr.IsNumeric(s1) && gstr.IsNumeric(s2) {
@@ -73,7 +73,7 @@ func (view *View) funcGe(value interface{}, other interface{}) bool {
return strings.Compare(s1, s2) >= 0
}
-// Build-in template function: include
+// funcInclude implements build-in template function: include
func (view *View) funcInclude(file interface{}, data ...map[string]interface{}) string {
var m map[string]interface{} = nil
if len(data) > 0 {
@@ -91,27 +91,27 @@ func (view *View) funcInclude(file interface{}, data ...map[string]interface{})
return content
}
-// Build-in template function: text
+// funcText implements build-in template function: text
func (view *View) funcText(html interface{}) string {
return ghtml.StripTags(gconv.String(html))
}
-// Build-in template function: html
+// funcHtmlEncode implements build-in template function: html
func (view *View) funcHtmlEncode(html interface{}) string {
return ghtml.Entities(gconv.String(html))
}
-// Build-in template function: htmldecode
+// funcHtmlDecode implements build-in template function: htmldecode
func (view *View) funcHtmlDecode(html interface{}) string {
return ghtml.EntitiesDecode(gconv.String(html))
}
-// Build-in template function: url
+// funcUrlEncode implements build-in template function: url
func (view *View) funcUrlEncode(url interface{}) string {
return gurl.Encode(gconv.String(url))
}
-// Build-in template function: urldecode
+// funcUrlDecode implements build-in template function: urldecode
func (view *View) funcUrlDecode(url interface{}) string {
if content, err := gurl.Decode(gconv.String(url)); err == nil {
return content
@@ -120,8 +120,8 @@ func (view *View) funcUrlDecode(url interface{}) string {
}
}
-// Build-in template function: date
-func (view *View) funcDate(format string, timestamp ...interface{}) string {
+// funcDate implements build-in template function: date
+func (view *View) funcDate(format interface{}, timestamp ...interface{}) string {
t := int64(0)
if len(timestamp) > 0 {
t = gconv.Int64(timestamp[0])
@@ -129,45 +129,50 @@ func (view *View) funcDate(format string, timestamp ...interface{}) string {
if t == 0 {
t = gtime.Millisecond()
}
- return gtime.NewFromTimeStamp(t).Format(format)
+ return gtime.NewFromTimeStamp(t).Format(gconv.String(format))
}
-// Build-in template function: compare
+// funcCompare implements build-in template function: compare
func (view *View) funcCompare(value1, value2 interface{}) int {
return strings.Compare(gconv.String(value1), gconv.String(value2))
}
-// Build-in template function: substr
-func (view *View) funcSubStr(start, end int, str interface{}) string {
- return gstr.SubStr(gconv.String(str), start, end)
+// SubStr implements build-in template function: substr
+func (view *View) funcSubStr(start, end, str interface{}) string {
+ return gstr.SubStr(gconv.String(str), gconv.Int(start), gconv.Int(end))
}
-// Build-in template function: strlimit
-func (view *View) funcStrLimit(length int, suffix string, str interface{}) string {
- return gstr.StrLimit(gconv.String(str), length, suffix)
+// StrLimit implements build-in template function: strlimit
+func (view *View) funcStrLimit(length, suffix, str interface{}) string {
+ return gstr.StrLimit(gconv.String(str), gconv.Int(length), gconv.String(suffix))
}
-// Build-in template function: highlight
-func (view *View) funcHighlight(key string, color string, str interface{}) string {
- return gstr.Replace(gconv.String(str), key, fmt.Sprintf(`%s`, color, key))
+// funcReplace implements build-in template function: replace
+func (view *View) funcReplace(search, replace, str interface{}) string {
+ return gstr.Replace(gconv.String(str), gconv.String(search), gconv.String(replace), -1)
}
-// Build-in template function: hidestr
-func (view *View) funcHideStr(percent int, hide string, str interface{}) string {
- return gstr.HideStr(gconv.String(str), percent, hide)
+// funcHighlight implements build-in template function: highlight
+func (view *View) funcHighlight(key, color, str interface{}) string {
+ return gstr.Replace(gconv.String(str), gconv.String(key), fmt.Sprintf(`%v`, color, key))
}
-// Build-in template function: toupper
+// funcHideStr implements build-in template function: hidestr
+func (view *View) funcHideStr(percent, hide, str interface{}) string {
+ return gstr.HideStr(gconv.String(str), gconv.Int(percent), gconv.String(hide))
+}
+
+// funcToUpper implements build-in template function: toupper
func (view *View) funcToUpper(str interface{}) string {
return gstr.ToUpper(gconv.String(str))
}
-// Build-in template function: toupper
+// funcToLower implements build-in template function: toupper
func (view *View) funcToLower(str interface{}) string {
return gstr.ToLower(gconv.String(str))
}
-// Build-in template function: nl2br
+// funcNl2Br implements build-in template function: nl2br
func (view *View) funcNl2Br(str interface{}) string {
return gstr.Nl2Br(gconv.String(str))
}
diff --git a/os/gview/gview_unit_basic_test.go b/os/gview/gview_unit_basic_test.go
index 020abed78..684e90464 100644
--- a/os/gview/gview_unit_basic_test.go
+++ b/os/gview/gview_unit_basic_test.go
@@ -143,6 +143,11 @@ func Test_Func(t *testing.T) {
gtest.Assert(err != nil, false)
gtest.Assert(result, `我是...`)
+ str = `{{"I'm中国人" | replace "I'm" "我是"}}`
+ result, err = gview.ParseContent(str, nil)
+ gtest.Assert(err != nil, false)
+ gtest.Assert(result, `我是中国人`)
+
str = `{{compare "A" "B"}};{{compare "1" "2"}};{{compare 2 1}};{{compare 1 1}}`
result, err = gview.ParseContent(str, nil)
gtest.Assert(err != nil, false)