1 Star 0 Fork 0

c./goframe

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
gview_config.go 8.92 KB
一键复制 编辑 原始数据 按行查看 历史
admin 提交于 2024-11-07 23:36 . 2024-11-7
// 版权归GoFrame作者(https://goframe.org)所有。保留所有权利。
//
// 本源代码形式受MIT许可证条款约束。
// 如果未随本文件一同分发MIT许可证副本,
// 您可以在https://github.com/gogf/gf处获取。
// md5:a9832f33b234e3f3
package 模板类
import (
"context"
gcode "gitee.com/go_888/goframe/errors/gcode"
gerror "gitee.com/go_888/goframe/errors/gerror"
gi18n "gitee.com/go_888/goframe/i18n/gi18n"
"gitee.com/go_888/goframe/internal/intlog"
gfile "gitee.com/go_888/goframe/os/gfile"
glog "gitee.com/go_888/goframe/os/glog"
gres "gitee.com/go_888/goframe/os/gres"
gspath "gitee.com/go_888/goframe/os/gspath"
gconv "gitee.com/go_888/goframe/util/gconv"
gutil "gitee.com/go_888/goframe/util/gutil"
)
// X结构_配置是模板引擎的配置对象。 md5:0c7a20a5c1f534d4
type X结构_配置 struct {
Paths []string `json:"paths"` // 在数组中搜索路径,为了性能原因,非并发安全。 md5:536357ec68a07213
Data map[string]interface{} `json:"data"` // 全局模板变量,包括配置信息。 md5:5f96c7a35c11b4b2
DefaultFile string `json:"defaultFile"` // 默认的模板文件用于解析。 md5:41607c84f42fcf9d
Delimiters []string `json:"delimiters"` // 自定义模板分隔符。 md5:0a97ca0eda8842d4
AutoEncode bool `json:"autoEncode"` // 自动进行编码并提供安全的HTML输出,这对于防止XSS攻击很有帮助。 md5:ec33e2ef01aaf3d3
I18nManager *gi18n.X结构_Manager `json:"-"` // 视图的国际化管理器。 md5:7c90b657f5c4c28b
}
const (
// 默认的模板文件用于解析。 md5:41607c84f42fcf9d
defaultParsingFile = "index.html"
)
// DefaultConfig 创建并返回一个使用默认配置的配置对象。 md5:27f0cf63ebd5dd9e
func DefaultConfig() X结构_配置 {
return X结构_配置{
DefaultFile: defaultParsingFile,
I18nManager: gi18n.Instance(),
Delimiters: make([]string, 2),
}
}
// SetConfig 设置视图的配置。 md5:44d304b99e74e865
func (view *X结构_模板) SetConfig(config X结构_配置) error {
var err error
if len(config.Paths) > 0 {
for _, v := range config.Paths {
if err = view.AddPath(v); err != nil {
return err
}
}
}
if len(config.Data) > 0 {
view.Assigns(config.Data)
}
if config.DefaultFile != "" {
view.SetDefaultFile(config.DefaultFile)
}
if len(config.Delimiters) > 1 {
view.SetDelimiters(config.Delimiters[0], config.Delimiters[1])
}
view.config = config
// 清除全局模板对象缓存。
// 这只是一个缓存,不要犹豫清空它。
// md5:51c51fe68d143dd8
templates.X清空()
intlog.Printf(context.TODO(), "SetConfig: %+v", view.config)
return nil
}
// SetConfigWithMap 使用映射为视图设置配置。 md5:1e1d667c3b2ace2b
func (view *X结构_模板) SetConfigWithMap(m map[string]interface{}) error {
if len(m) == 0 {
return gerror.X创建错误码(gcode.X变量_CodeInvalidParameter, "配置不能为空")
}
// m 现在是 m 的浅拷贝。
// 对 m 的任何修改都不会影响原始对象。
// 这有点巧妙,不是吗?
// md5:4d1dd38c4db57a79
m = gutil.Map浅拷贝(m)
// 最常用的单视图路径配置支持。 md5:4ebc24cd15a30d35
_, v1 := gutil.Map查找并忽略大小写与符号(m, "paths")
_, v2 := gutil.Map查找并忽略大小写与符号(m, "path")
if v1 == nil && v2 != nil {
switch v2.(type) {
case string:
m["paths"] = []string{v2.(string)}
case []string:
m["paths"] = v2
}
}
err := gconv.X取结构(m, &view.config)
if err != nil {
return err
}
return view.SetConfig(view.config)
}
// SetPath 设置模板文件搜索的目录路径。参数 `path` 可以是绝对路径或相对路径,但建议使用绝对路径。
// md5:abd751ab819d28b6
func (view *X结构_模板) SetPath(path string) error {
var (
ctx = context.TODO()
isDir = false
realPath = ""
)
if file := gres.Get(path); file != nil {
realPath = path
isDir = file.FileInfo().IsDir()
} else {
// Absolute path.
realPath = gfile.X取绝对路径且效验(path)
if realPath == "" {
// Relative path.
view.searchPaths.X遍历读锁定(func(array []string) {
for _, v := range array {
if path, _ := gspath.Search(v, path); path != "" {
realPath = path
break
}
}
})
}
if realPath != "" {
isDir = gfile.X是否存在目录(realPath)
}
}
// Path not exist.
if realPath == "" {
err := gerror.X创建错误码并格式化(gcode.X变量_CodeInvalidParameter, `模板类,设置路径失败: 路径 "%s" 不存在`, path)
if errorPrint() {
glog.Error(ctx, err)
}
return err
}
// Should be a directory.
if !isDir {
err := gerror.X创建错误码并格式化(gcode.X变量_CodeInvalidParameter, `模板类,设置路径失败: 路径 "%s" 应为目录类型`, path)
if errorPrint() {
glog.Error(ctx, err)
}
return err
}
// 重复路径添加检查。 md5:e210e91d65ec4857
if view.searchPaths.X查找(realPath) != -1 {
return nil
}
view.searchPaths.X清空()
view.searchPaths.X弃用_Append(realPath)
view.fileCacheMap.X清空()
return nil
}
// AddPath 向搜索路径中添加一个绝对或相对路径。 md5:d279479528c86f4e
func (view *X结构_模板) AddPath(path string) error {
var (
ctx = context.TODO()
isDir = false
realPath = ""
)
if file := gres.Get(path); file != nil {
realPath = path
isDir = file.FileInfo().IsDir()
} else {
// Absolute path.
if realPath = gfile.X取绝对路径且效验(path); realPath == "" {
// Relative path.
view.searchPaths.X遍历读锁定(func(array []string) {
for _, v := range array {
if searchedPath, _ := gspath.Search(v, path); searchedPath != "" {
realPath = searchedPath
break
}
}
})
}
if realPath != "" {
isDir = gfile.X是否存在目录(realPath)
}
}
// Path not exist.
if realPath == "" {
err := gerror.X创建错误码并格式化(gcode.X变量_CodeInvalidParameter, `模板类,添加路径失败: 路径 "%s" 不存在`, path)
if errorPrint() {
glog.Error(ctx, err)
}
return err
}
// realPath 应该是文件夹类型的路径。 md5:8b57fae1c1158ae9
if !isDir {
err := gerror.X创建错误码并格式化(gcode.X变量_CodeInvalidParameter, `模板类,添加路径失败: 路径 "%s" 应为目录类型`, path)
if errorPrint() {
glog.Error(ctx, err)
}
return err
}
// 重复路径添加检查。 md5:e210e91d65ec4857
if view.searchPaths.X查找(realPath) != -1 {
return nil
}
view.searchPaths.X弃用_Append(realPath)
view.fileCacheMap.X清空()
return nil
}
// 将多个全局模板变量绑定到当前视图对象。需要注意的是,它不是并发安全的,这意味着如果在运行时从多个goroutine中调用它,会导致panic。
// md5:b31929b349e74390
func (view *X结构_模板) Assigns(data X类型_Params) {
for k, v := range data {
view.data[k] = v
}
}
// Assign 将全局模板变量绑定到当前视图对象。需要注意的是,它不是线程安全的,这意味着如果在运行时从多个goroutine中调用它,会导致panic。
// md5:7043c41fc2b3a0c3
func (view *X结构_模板) Assign(key string, value interface{}) {
view.data[key] = value
}
// SetDefaultFile 为解析设置默认的模板文件。 md5:17f210ece0d189f6
func (view *X结构_模板) SetDefaultFile(file string) {
view.config.DefaultFile = file
}
// GetDefaultFile 返回默认的模板文件,用于解析。 md5:f72bb2dc04f3d4a4
func (view *X结构_模板) GetDefaultFile() string {
return view.config.DefaultFile
}
// SetDelimiters 设置模板解析的自定义分隔符。 md5:a09465c3518f1023
func (view *X结构_模板) SetDelimiters(left, right string) {
view.config.Delimiters = []string{left, right}
}
// SetAutoEncode 启用/禁用自动 HTML 编码功能。
// 当 AutoEncode 功能启用时,视图引擎会自动编码并提供安全的 HTML 输出,这对于防止 XSS 攻击很有好处。
// md5:cd0107f5d2170f4f
func (view *X结构_模板) SetAutoEncode(enable bool) {
view.config.AutoEncode = enable
}
// BindFunc 向当前视图对象注册一个名为 `name` 的自定义全局模板函数,
// 使用提供的 `function` 函数。其中,`name` 是在模板内容中可被调用的函数名。
// md5:20f79a4c8d0ba97a
func (view *X结构_模板) BindFunc(name string, function interface{}) {
view.funcMap[name] = function
// Clear global template object cache.
templates.X清空()
}
// BindFuncMap 将自定义的全局模板函数通过映射注册到当前视图对象中。
// 映射的键是模板函数名称,
// 映射的值是自定义函数的地址。
// md5:2fe9bab0463cef27
func (view *X结构_模板) BindFuncMap(funcMap X类型_FuncMap) {
for k, v := range funcMap {
view.funcMap[k] = v
}
// Clear global template object cache.
templates.X清空()
}
// SetI18n 将i18n管理器绑定到当前视图引擎。 md5:8d1b88bd87c041ba
func (view *X结构_模板) SetI18n(manager *gi18n.X结构_Manager) {
view.config.I18nManager = manager
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/go_888/goframe.git
git@gitee.com:go_888/goframe.git
go_888
goframe
goframe
babeac70e29e

搜索帮助