2019-04-22 15:47:59 +08:00
|
|
|
// Copyright 2017 gf Author(https://github.com/gogf/gf). All Rights Reserved.
|
|
|
|
//
|
|
|
|
// This Source Code Form is subject to the terms of the MIT License.
|
|
|
|
// If a copy of the MIT was not distributed with this file,
|
|
|
|
// You can obtain one at https://github.com/gogf/gf.
|
|
|
|
|
|
|
|
package gview
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
2019-12-08 22:55:32 +08:00
|
|
|
"github.com/gogf/gf/util/gutil"
|
2019-04-22 15:47:59 +08:00
|
|
|
"strings"
|
2019-07-29 21:01:19 +08:00
|
|
|
|
|
|
|
"github.com/gogf/gf/encoding/ghtml"
|
|
|
|
"github.com/gogf/gf/encoding/gurl"
|
|
|
|
"github.com/gogf/gf/os/gtime"
|
|
|
|
"github.com/gogf/gf/text/gstr"
|
|
|
|
"github.com/gogf/gf/util/gconv"
|
2019-04-22 15:47:59 +08:00
|
|
|
)
|
|
|
|
|
2019-12-08 22:55:32 +08:00
|
|
|
// funcDump implements build-in template function: dump
|
|
|
|
func (view *View) funcDump(values ...interface{}) (result string) {
|
|
|
|
result += "<!--\n"
|
|
|
|
for _, v := range values {
|
|
|
|
result += gutil.Export(v) + "\n"
|
|
|
|
}
|
|
|
|
result += "-->\n"
|
|
|
|
return result
|
|
|
|
}
|
|
|
|
|
2019-11-07 20:56:17 +08:00
|
|
|
// funcEq implements build-in template function: eq
|
2019-06-19 09:06:52 +08:00
|
|
|
func (view *View) funcEq(value interface{}, others ...interface{}) bool {
|
2019-04-25 23:23:24 +08:00
|
|
|
s := gconv.String(value)
|
|
|
|
for _, v := range others {
|
|
|
|
if strings.Compare(s, gconv.String(v)) != 0 {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
2019-11-07 20:56:17 +08:00
|
|
|
// funcNe implements build-in template function: ne
|
|
|
|
func (view *View) funcNe(value, other interface{}) bool {
|
2019-04-25 23:23:24 +08:00
|
|
|
return strings.Compare(gconv.String(value), gconv.String(other)) != 0
|
|
|
|
}
|
|
|
|
|
2019-11-07 20:56:17 +08:00
|
|
|
// funcLt implements build-in template function: lt
|
|
|
|
func (view *View) funcLt(value, other interface{}) bool {
|
2019-04-25 23:23:24 +08:00
|
|
|
s1 := gconv.String(value)
|
|
|
|
s2 := gconv.String(other)
|
|
|
|
if gstr.IsNumeric(s1) && gstr.IsNumeric(s2) {
|
|
|
|
return gconv.Int64(value) < gconv.Int64(other)
|
|
|
|
}
|
|
|
|
return strings.Compare(s1, s2) < 0
|
|
|
|
}
|
|
|
|
|
2019-11-07 20:56:17 +08:00
|
|
|
// funcLe implements build-in template function: le
|
|
|
|
func (view *View) funcLe(value, other interface{}) bool {
|
2019-04-25 23:23:24 +08:00
|
|
|
s1 := gconv.String(value)
|
|
|
|
s2 := gconv.String(other)
|
|
|
|
if gstr.IsNumeric(s1) && gstr.IsNumeric(s2) {
|
|
|
|
return gconv.Int64(value) <= gconv.Int64(other)
|
|
|
|
}
|
|
|
|
return strings.Compare(s1, s2) <= 0
|
|
|
|
}
|
|
|
|
|
2019-11-07 20:56:17 +08:00
|
|
|
// funcGt implements build-in template function: gt
|
|
|
|
func (view *View) funcGt(value, other interface{}) bool {
|
2019-04-25 23:23:24 +08:00
|
|
|
s1 := gconv.String(value)
|
|
|
|
s2 := gconv.String(other)
|
|
|
|
if gstr.IsNumeric(s1) && gstr.IsNumeric(s2) {
|
|
|
|
return gconv.Int64(value) > gconv.Int64(other)
|
|
|
|
}
|
|
|
|
return strings.Compare(s1, s2) > 0
|
|
|
|
}
|
|
|
|
|
2019-11-07 20:56:17 +08:00
|
|
|
// funcGe implements build-in template function: ge
|
|
|
|
func (view *View) funcGe(value, other interface{}) bool {
|
2019-04-25 23:23:24 +08:00
|
|
|
s1 := gconv.String(value)
|
|
|
|
s2 := gconv.String(other)
|
|
|
|
if gstr.IsNumeric(s1) && gstr.IsNumeric(s2) {
|
|
|
|
return gconv.Int64(value) >= gconv.Int64(other)
|
|
|
|
}
|
|
|
|
return strings.Compare(s1, s2) >= 0
|
|
|
|
}
|
|
|
|
|
2019-11-07 20:56:17 +08:00
|
|
|
// funcInclude implements build-in template function: include
|
2019-10-17 20:31:03 +08:00
|
|
|
func (view *View) funcInclude(file interface{}, data ...map[string]interface{}) string {
|
2019-06-19 09:06:52 +08:00
|
|
|
var m map[string]interface{} = nil
|
|
|
|
if len(data) > 0 {
|
|
|
|
m = data[0]
|
|
|
|
}
|
2019-10-17 20:31:03 +08:00
|
|
|
path := gconv.String(file)
|
|
|
|
if path == "" {
|
|
|
|
return ""
|
|
|
|
}
|
2019-08-16 00:29:14 +08:00
|
|
|
// It will search the file internally.
|
2019-10-17 20:31:03 +08:00
|
|
|
content, err := view.Parse(path, m)
|
2019-06-19 09:06:52 +08:00
|
|
|
if err != nil {
|
|
|
|
return err.Error()
|
|
|
|
}
|
|
|
|
return content
|
2019-04-22 15:47:59 +08:00
|
|
|
}
|
|
|
|
|
2019-11-07 20:56:17 +08:00
|
|
|
// funcText implements build-in template function: text
|
2019-04-22 15:47:59 +08:00
|
|
|
func (view *View) funcText(html interface{}) string {
|
2019-06-19 09:06:52 +08:00
|
|
|
return ghtml.StripTags(gconv.String(html))
|
2019-04-22 15:47:59 +08:00
|
|
|
}
|
|
|
|
|
2019-11-07 20:56:17 +08:00
|
|
|
// funcHtmlEncode implements build-in template function: html
|
2019-04-22 15:47:59 +08:00
|
|
|
func (view *View) funcHtmlEncode(html interface{}) string {
|
2019-06-19 09:06:52 +08:00
|
|
|
return ghtml.Entities(gconv.String(html))
|
2019-04-22 15:47:59 +08:00
|
|
|
}
|
|
|
|
|
2019-11-07 20:56:17 +08:00
|
|
|
// funcHtmlDecode implements build-in template function: htmldecode
|
2019-04-22 15:47:59 +08:00
|
|
|
func (view *View) funcHtmlDecode(html interface{}) string {
|
2019-06-19 09:06:52 +08:00
|
|
|
return ghtml.EntitiesDecode(gconv.String(html))
|
2019-04-22 15:47:59 +08:00
|
|
|
}
|
|
|
|
|
2019-11-07 20:56:17 +08:00
|
|
|
// funcUrlEncode implements build-in template function: url
|
2019-04-22 15:47:59 +08:00
|
|
|
func (view *View) funcUrlEncode(url interface{}) string {
|
2019-06-19 09:06:52 +08:00
|
|
|
return gurl.Encode(gconv.String(url))
|
2019-04-22 15:47:59 +08:00
|
|
|
}
|
|
|
|
|
2019-11-07 20:56:17 +08:00
|
|
|
// funcUrlDecode implements build-in template function: urldecode
|
2019-04-22 15:47:59 +08:00
|
|
|
func (view *View) funcUrlDecode(url interface{}) string {
|
2019-06-19 09:06:52 +08:00
|
|
|
if content, err := gurl.Decode(gconv.String(url)); err == nil {
|
|
|
|
return content
|
|
|
|
} else {
|
|
|
|
return err.Error()
|
|
|
|
}
|
2019-04-22 15:47:59 +08:00
|
|
|
}
|
|
|
|
|
2019-11-07 20:56:17 +08:00
|
|
|
// funcDate implements build-in template function: date
|
|
|
|
func (view *View) funcDate(format interface{}, timestamp ...interface{}) string {
|
2019-06-19 09:06:52 +08:00
|
|
|
t := int64(0)
|
|
|
|
if len(timestamp) > 0 {
|
|
|
|
t = gconv.Int64(timestamp[0])
|
|
|
|
}
|
|
|
|
if t == 0 {
|
2020-01-05 19:55:17 +08:00
|
|
|
t = gtime.Timestamp()
|
2019-06-19 09:06:52 +08:00
|
|
|
}
|
2019-11-07 20:56:17 +08:00
|
|
|
return gtime.NewFromTimeStamp(t).Format(gconv.String(format))
|
2019-04-22 15:47:59 +08:00
|
|
|
}
|
|
|
|
|
2019-11-07 20:56:17 +08:00
|
|
|
// funcCompare implements build-in template function: compare
|
2019-04-22 15:47:59 +08:00
|
|
|
func (view *View) funcCompare(value1, value2 interface{}) int {
|
2019-06-19 09:06:52 +08:00
|
|
|
return strings.Compare(gconv.String(value1), gconv.String(value2))
|
2019-04-22 15:47:59 +08:00
|
|
|
}
|
|
|
|
|
2020-01-05 19:55:17 +08:00
|
|
|
// funcSubStr implements build-in template function: substr
|
2019-11-07 20:56:17 +08:00
|
|
|
func (view *View) funcSubStr(start, end, str interface{}) string {
|
|
|
|
return gstr.SubStr(gconv.String(str), gconv.Int(start), gconv.Int(end))
|
2019-04-22 15:47:59 +08:00
|
|
|
}
|
|
|
|
|
2020-01-05 19:55:17 +08:00
|
|
|
// funcStrLimit implements build-in template function: strlimit
|
2019-11-07 20:56:17 +08:00
|
|
|
func (view *View) funcStrLimit(length, suffix, str interface{}) string {
|
|
|
|
return gstr.StrLimit(gconv.String(str), gconv.Int(length), gconv.String(suffix))
|
2019-04-22 15:47:59 +08:00
|
|
|
}
|
|
|
|
|
2020-01-05 19:55:17 +08:00
|
|
|
// funcConcat implements build-in template function: concat
|
|
|
|
func (view *View) funcConcat(str ...interface{}) string {
|
|
|
|
var s string
|
|
|
|
for _, v := range str {
|
|
|
|
s += gconv.String(v)
|
|
|
|
}
|
|
|
|
return s
|
|
|
|
}
|
|
|
|
|
2019-11-07 20:56:17 +08:00
|
|
|
// 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)
|
2019-04-22 15:47:59 +08:00
|
|
|
}
|
|
|
|
|
2019-11-07 20:56:17 +08:00
|
|
|
// 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(`<span style="color:%v;">%v</span>`, color, key))
|
2019-04-22 15:47:59 +08:00
|
|
|
}
|
|
|
|
|
2019-11-07 20:56:17 +08:00
|
|
|
// 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
|
2019-04-22 15:47:59 +08:00
|
|
|
func (view *View) funcToUpper(str interface{}) string {
|
2019-06-19 09:06:52 +08:00
|
|
|
return gstr.ToUpper(gconv.String(str))
|
2019-04-22 15:47:59 +08:00
|
|
|
}
|
|
|
|
|
2019-11-07 20:56:17 +08:00
|
|
|
// funcToLower implements build-in template function: toupper
|
2019-04-22 15:47:59 +08:00
|
|
|
func (view *View) funcToLower(str interface{}) string {
|
2019-06-19 09:06:52 +08:00
|
|
|
return gstr.ToLower(gconv.String(str))
|
2019-04-22 15:47:59 +08:00
|
|
|
}
|
|
|
|
|
2019-11-07 20:56:17 +08:00
|
|
|
// funcNl2Br implements build-in template function: nl2br
|
2019-04-22 15:47:59 +08:00
|
|
|
func (view *View) funcNl2Br(str interface{}) string {
|
2019-06-19 09:06:52 +08:00
|
|
|
return gstr.Nl2Br(gconv.String(str))
|
2019-04-22 15:47:59 +08:00
|
|
|
}
|