# TplFuncMap Documentation
## 简介 / Introduction
`TplFuncMap` 是一个全面的模板函数映射,提供了丰富的实用函数集合用于模板渲染。它包括时间操作、类型转换、字符串处理、编码/解码、数学运算等功能。
`TplFuncMap` is a comprehensive template function map that provides a rich set of utility functions for template rendering. It includes functions for time manipulation, type conversion, string processing, encoding/decoding, mathematical operations, and more.
## 快速开始 / Quick Start
```go
import (
"html/template"
"github.com/webx-top/echo/middleware/tplfunc"
)
// Create template with TplFuncMap / 使用 TplFuncMap 创建模板
t := template.New("example")
t.Funcs(tplfunc.New())
// Use in template / 在模板中使用
{{ Now.Format "2006-01-02" }}
{{ ToFixed 100 2 }}
{{ "hello world" | ToUpper }}
```
## 函数分类 / Function Categories
### 1. Time Functions / 时间相关函数
| 函数名 Function | 说明 Description | 示例 Example |
|---|---|---|
| `Now` | 当前时间 / Current time | `{{ Now }}` |
| `UnixTime` | Unix时间戳 / Unix timestamp | `{{ UnixTime }}` |
| `ElapsedMemory` | 内存消耗 / Memory consumption | `{{ ElapsedMemory }}` |
| `TotalRunTime` | 运行时长(从启动服务时算起) / Run time since service started | `{{ TotalRunTime }}` |
| `CaptchaForm` | 验证码图片表单 / CAPTCHA image form | `{{ CaptchaForm }}` |
| `FormatByte` | 字节数转为适合理解的格式 / Bytes to human-readable format | `{{ 1024 \| FormatByte }}` |
| `FormatBytes` | 字节数转为适合理解的格式 / Bytes to human-readable format | `{{ 1024 \| FormatBytes }}` |
| `FriendlyTime` | 友好的时间格式 / Human-friendly time format | `{{ 3600 \| FriendlyTime }}` |
| `FormatPastTime` | 以前距离现在多长时间 / Time elapsed since past | `{{ 1609459200 \| FormatPastTime }}` |
| `DateFormat` | 日期格式化 / Date format | `{{ 1609459200 \| DateFormat "2006-01-02" }}` |
| `DateFormatShort` | 短日期格式 / Short date format | `{{ 1609459200 \| DateFormatShort }}` |
| `Ts2time` | 时间戳数字转time.Time / Timestamp to time.Time | `{{ 1609459200 \| Ts2time }}` |
| `Ts2date` | 时间戳数字转日期字符串 / Timestamp to date string | `{{ 1609459200 \| Ts2date "2006-01-02" }}` |
### 2. Comparison Functions / 比较函数
| 函数名 Function | 说明 Description | 示例 Example |
|---|---|---|
| `Eq` | 等值比较 / Equal comparison | `{{ Eq a b }}` |
| `Add` | 加法 / Addition | `{{ Add 1 2 }}` |
| `Sub` | 减法 / Subtraction | `{{ Sub 5 2 }}` |
| `Div` | 除法 / Division | `{{ Div 10 2 }}` |
| `Mul` | 乘法 / Multiplication | `{{ Mul 3 4 }}` |
| `IsNil` | 检查是否为nil / Check if nil | `{{ IsNil value }}` |
| `IsEmpty` | 检查是否为空 / Check if empty | `{{ IsEmpty value }}` |
| `NotEmpty` | 检查是否不为空 / Check if not empty | `{{ NotEmpty value }}` |
| `IsNaN` | 检查是否为非数字 / Check if NaN | `{{ IsNaN value }}` |
| `IsInf` | 检查是否为无穷大 / Check if infinity | `{{ IsInf value 1 }}` |
### 3. Type Conversion Functions / 类型转换函数
| 函数名 Function | 说明 Description | 示例 Example |
|---|---|---|
| `Html`, `ToHTML` | 转换为HTML / Convert to HTML | `{{ content \| ToHTML }}` |
| `Js`, `ToJS` | 转换为JavaScript / Convert to JS | `{{ content \| ToJS }}` |
| `Css`, `ToCSS` | 转换为CSS / Convert to CSS | `{{ content \| ToCSS }}` |
| `ToURL` | 转换为URL / Convert to URL | `{{ url \| ToURL }}` |
| `ToHTMLAttr` | 转换为HTML属性 / Convert to HTML attribute | `{{ attr \| ToHTMLAttr }}` |
| `ToHTMLAttrs` | 转换为HTML属性集合 / Convert to HTML attributes | `{{ attrs \| ToHTMLAttrs }}` |
| `ToStrSlice` | 转换为字符串切片 / Convert to string slice | `{{ ToStrSlice "a" "b" }}` |
| `ToDuration` | 转换为时间间隔 / Convert to duration | `{{ ToDuration 60 "s" }}` |
| `Str` | 转换为字符串 / Convert to string | `{{ 123 \| Str }}` |
| `Int` | 转换为整数 / Convert to int | `{{ "123" \| Int }}` |
| `Int32` | 转换为32位整数 / Convert to int32 | `{{ "123" \| Int32 }}` |
| `Int64` | 转换为64位整数 / Convert to int64 | `{{ "123" \| Int64 }}` |
| `Uint` | 转换为无符号整数 / Convert to uint | `{{ "123" \| Uint }}` |
| `Uint32` | 转换为32位无符号整数 / Convert to uint32 | `{{ "123" \| Uint32 }}` |
| `Uint64` | 转换为64位无符号整数 / Convert to uint64 | `{{ "123" \| Uint64 }}` |
| `Float32` | 转换为32位浮点数 / Convert to float32 | `{{ "3.14" \| Float32 }}` |
| `Float64` | 转换为64位浮点数 / Convert to float64 | `{{ "3.14" \| Float64 }}` |
| `Float2int` | 浮点数转整数 / Float to int | `{{ 3.9 \| Float2int }}` |
| `Float2uint` | 浮点数转无符号整数 / Float to uint | `{{ 3.9 \| Float2uint }}` |
| `Float2int64` | 浮点数转64位整数 / Float to int64 | `{{ 3.9 \| Float2int64 }}` |
| `Float2uint64` | 浮点数转64位无符号整数 / Float to uint64 | `{{ 3.9 \| Float2uint64 }}` |
| `ToFloat64` | 转换为64位浮点数 / Convert to float64 | `{{ "3.14" \| ToFloat64 }}` |
| `ToFixed` | 格式化为固定位小数 / Format to fixed decimal | `{{ ToFixed 3.14159 2 }}` |
| `ToDecimal` | 转换为 decimal.Decimal 类型 / Converts any numeric type to a decimal.Decimal | `{{ "3.14" \| ToDecimal }}` |
| `NumberMore` | 数字格式化(如:99+) / Number format with max | `{{ 1000 \| NumberMore 99 }}` 大于99时显示为99+ |
| `Math` | 数学运算 / Math operations | `{{ Math "sqrt" 16 }}` |
| `NumberFormat` | 数字格式化 / Number formatting | `{{ NumberFormat 1234567.89 2 }}` |
| `NumFormat` | 数字格式化 / Number formatting | `{{ 1234567.89 \| NumFormat 2 }}` |
| `NumberTrim` | 截断数字精度 / Trim number precision | `{{ NumberTrim 3.14159 2 }}` |
| `DurationFormat` | 时间间隔格式化 / Duration formatting | `{{ 3600 \| DurationFormat "en" }}` |
| `DelimLeft` | 模板标签左分隔符 / Template tag left delimiter | `{{ DelimLeft }}` |
| `DelimRight` | 模板标签右分隔符 / Template tag right delimiter | `{{ DelimRight }}` |
| `TemplateTag` | 模板标签 / Template tag | `{{ TemplateTag "name" }}` |
### 4. String Functions / 字符串处理函数
#### 字符串检查 / String Check
| 函数名 Function | 说明 Description | 示例 Example |
|---|---|---|
| `Contains` | 检查子串 / Check substring | `{{ Contains "hello world" "world" }}` |
| `HasPrefix` | 检查前缀 / Check prefix | `{{ HasPrefix "hello" "he" }}` |
| `HasSuffix` | 检查后缀 / Check suffix | `{{ HasSuffix "hello" "lo" }}` |
| `InExt` | 检查文件扩展名 / Check file extension | `{{ InExt "image.jpg" ".jpg" ".png" }}` |
#### 字符串修剪 / String Trimming
| 函数名 Function | 说明 Description | 示例 Example |
|---|---|---|
| `Trim` | 去除空白 / Trim whitespace | `{{ " hello " \| Trim }}` |
| `TrimLeft` | 去除左侧 / Trim left | `{{ " hello" \| TrimLeft }}` |
| `TrimRight` | 去除右侧 / Trim right | `{{ "hello " \| TrimRight }}` |
| `TrimPrefix` | 去除前缀 / Trim prefix | `{{ TrimPrefix "prefix_hello" "prefix_" }}` |
| `TrimSuffix` | 去除后缀 / Trim suffix | `{{ TrimSuffix "hello_suffix" "_suffix" }}` |
#### 大小写转换 / Case Conversion
| 函数名 Function | 说明 Description | 示例 Example |
|---|---|---|
| `ToLower` | 转小写 / To lowercase | `{{ "HELLO" \| ToLower }}` |
| `ToUpper` | 转大写 / To uppercase | `{{ "hello" \| ToUpper }}` |
| `Title` | 标题格式 / To title case | `{{ "hello world" \| Title }}` |
| `LowerCaseFirst` | 首字母小写 / Lower first letter | `{{ "Hello" \| LowerCaseFirst }}` |
| `UpperCaseFirst` | 首字母大写 / Upper first letter | `{{ "hello" \| UpperCaseFirst }}` |
| `CamelCase` | 转驼峰命名 / To camel case | `{{ "hello_world" \| CamelCase }}` |
| `PascalCase` | 转帕斯卡命名 / To pascal case | `{{ "hello_world" \| PascalCase }}` |
| `SnakeCase` | 转蛇形命名 / To snake case | `{{ "HelloWorld" \| SnakeCase }}` |
#### 路径处理 / Path Handling
| 函数名 Function | 说明 Description | 示例 Example |
|---|---|---|
| `Dir` | 目录路径 / Directory path | `{{ "/path/to/file.txt" \| Dir }}` |
| `Base` | 基础名称 / Base name | `{{ "/path/to/file.txt" \| Base }}` |
| `Ext` | 文件扩展名 / File extension | `{{ "file.txt" \| Ext }}` |
| `Dirname` | 目录名 / Directory name | `{{ "path/to/file" \| Dirname }}` |
| `Basename` | 基础名称 / Base name | `{{ "path/to/file" \| Basename }}` |
| `Extension` | 扩展名 / Extension | `{{ "file.txt" \| Extension }}` |
#### 字符串操作 / String Operations
| 函数名 Function | 说明 Description | 示例 Example |
|---|---|---|
| `Concat` | 连接字符串 / Concatenate strings | `{{ Concat "hello" "world" }}` |
| `Replace` | 替换子串 / Replace substring | `{{ Replace "hello world" "world" "go" }}` |
| `Split` | 分割字符串 / Split string | `{{ Split "a,b,c" "," }}` |
| `Join` | 连接字符串 / Join strings | `{{ Join slice "," }}` |
| `JoinNumbers` | 连接数字 / Join numbers | `{{ JoinNumbers slice "," }}` |
| `Substr` | 子字符串 / Substring | `{{ Substr "hello" 0 3 }}` |
| `StripTags` | 去除HTML标签 / Strip HTML tags | `{{ "
hello
" \| StripTags }}` |
| `Nl2br` | 换行转
/ Newline to
| `{{ "line1\nline2" \| Nl2br }}` |
| `AddSuffix` | 添加后缀 / Add suffix | `{{ AddSuffix "file.txt" "_new" }}` 输出 file_new.txt |
| `RandomString` | 随机字符串 / Random string | `{{ RandomString 8 }}` |
| `Slugify` | 转URL友好格式 / To slug | `{{ "Hello World" \| Slugify }}` 输出 hello-world |
| `SlugifyMaxWidth` | 转URL友好格式(限制长度) / To slug with max width | `{{ "Hello World" \| SlugifyMaxWidth 20 }}` |
| `Reverse` | 反转字符串 / Reverse string | `{{ "hello" \| Reverse }}` 输出 olleh |
### 5. Encode & Decode Functions / 编码解码函数
| 函数名 Function | 说明 Description | 示例 Example |
|---|---|---|
| `JSONEncode` | JSON编码 / Encode to JSON | `{{ JSONEncode data " " }}` |
| `JSONDecode` | JSON解码 / Decode from JSON | `{{ ``{"A":1}`` \| JSONDecode }}` |
| `JSONDecodeSlice` | JSON解码为切片 / Decode JSON to slice | `{{ "[1,0.2,true]" \| JSONDecodeSlice }}` |
| `JSONDecodeStringSlice` | JSON解码为字符串切片 / Decode JSON to string slice | `{{ "[\"a\",\"b\",\"c\"]" \| JSONDecodeStringSlice }}` |
| `JSONDecodeUintSlice` | JSON解码为uint64切片 / Decode JSON to uint64 slice | `{{ "[1,2,3]" \| JSONDecodeUintSlice }}` |
| `URLEncode` | URL编码 / URL encode | `{{ "hello world" \| URLEncode }}` |
| `URLDecode` | URL解码 / URL decode | `{{ "hello%20world" \| URLDecode }}` |
| `RawURLEncode` | 原始URL编码 / Raw URL encode | `{{ "hello world" \| RawURLEncode }}` |
| `RawURLDecode` | 原始URL解码 / Raw URL decode | `{{ url \| RawURLDecode }}` |
| `Base64Encode` | Base64编码 / Base64 encode | `{{ "hello" \| Base64Encode }}` |
| `Base64Decode` | Base64解码 / Base64 decode | `{{ base64Str \| Base64Decode }}` |
| `UnicodeDecode` | Unicode解码 / Unicode decode | `{{ "\\u4f60\\u597d" \| UnicodeDecode }}` |
| `SafeBase64Encode` | 安全Base64编码 / Safe Base64 encode | `{{ "hello" \| SafeBase64Encode }}` |
| `SafeBase64Decode` | 安全Base64解码 / Safe Base64 decode | `{{ base64Str \| SafeBase64Decode }}` |
| `Hash` | 哈希字符串 / Hash string | `{{ Hash "password" "salt" }}` |
| `Unquote` | 去除引号 / Unquote string | `{{ "'hello'" \| Unquote }}` |
| `Quote` | 添加引号 / Quote string | `{{ hello \| Quote }}` |
### 6. Map & Slice Functions / 映射和切片函数
| 函数名 Function | 说明 Description | 示例 Example |
|---|---|---|
| `MakeMap` | 创建映射 / Create map | `{{ MakeMap "key1" "value1" "key2" "value2" }}` |
| `MakeSlice` | 创建切片 / Create slice | `{{ MakeSlice "a" "b" "c" }}` |
| `InSet` | 检查是否在集合中 / Check in set | `{{ InSet "value" set }}` |
| `InSlice` | 检查是否在切片中 / Check in slice | `{{ InSlice "value" slice }}` |
| `InSlicex` | 检查是否在切片中(interface) / Check in slice (interface) | `{{ InSlicex "value" slice }}` |
| `Set` | 设置值 / Set value | `{{ Set renderArgs "key" "value" }}` |
| `Append` | 追加到切片 / Append to slice | `{{ Append renderArgs "key" "value" }}` |
| `InStrSlice` | 检查是否在字符串切片中 / Check in string slice | `{{ InStrSlice slice "value" }}` |
| `SearchStrSlice` | 在字符串切片中搜索 / Search in string slice | `{{ SearchStrSlice slice "value" }}` |
| `URLValues` | 创建URL值 / Create URL values | `{{ URLValues "key1" "value1" }}` |
| `ToSlice` | 转换为切片 / Convert to slice | `{{ ToSlice 1 2 3 }}` |
| `StrToSlice` | 字符串转切片 / String to slice | `{{ StrToSlice "a,b,c" "," }}` |
| `GetByIndex` | 按索引获取 / Get by index | `{{ GetByIndex list 0 }}` |
| `ToParamString` | 转换为参数字符串 / Convert to param string | `{{ "value" \| ToParamString }}` |
### 7. RegExp Functions / 正则表达式函数
| 函数名 Function | 说明 Description | 示例 Example |
|---|---|---|
| `Regexp` | 编译正则表达式 / Compile regexp | `{{ $r := Regexp "^[a-z]+$" }}` |
| `RegexpPOSIX` | 编译POSIX正则表达式 / Compile POSIX regexp | `{{ $r := RegexpPOSIX "^[[:alpha:]]+$" }}` |
### 8. Other Functions / 其他函数
| 函数名 Function | 说明 Description | 示例 Example |
|---|---|---|
| `Ignore` | 忽略值 / Ignore value | `{{ value \| Ignore }}` |
| `Default` | 默认值 / Default value | `{{ value \| Default "default" }}` |
| `WithURLParams` | 带参数的URL / URL with params | `{{ WithURLParams "/path" "key" "value" }}` |
| `FullURL` | 完整URL / Full URL | `{{ FullURL "https://example.com" "/path" }}` 输出 https://example.com/path |
| `IsFullURL` | 检查是否为完整URL / Check if full URL | `{{ "https://example.com" \| IsFullURL }}` |
| `If` | 条件判断 / Conditional | `{{ If condition yes no }}` |
## 使用示例 / Usage Examples
### 时间处理 / Time Handling
```go
// 获取当前时间 / Get current time
{{ Now.Format "2006-01-02 15:04:05" }}
// 时间戳转换 / Timestamp conversion
{{ 1609459200 | DateFormat "2006-01-02" }}
// 友好时间格式 / Friendly time format
{{ 86400 | FriendlyTime }} // 1天 / 1 day
// 时间间隔格式化 / Duration formatting
{{ 3600 | DurationFormat "en" }} // 1 hour
```
### 数学运算 / Mathematical Operations
```go
// 基本运算 / Basic operations
{{ Add 10 20 }} // 30
{{ Sub 50 20 }} // 30
{{ Mul 6 7 }} // 42
{{ Div 100 4 }} // 25
// 数学函数 / Math functions
{{ Math "sqrt" 16 }} // 4
{{ Math "pow" 2 10 }} // 1024
{{ Math "abs" -5 }} // 5
// 数字格式化 / Number formatting
{{ ToFixed 3.14159 2 }} // "3.14"
{{ NumberFormat 1234567.89 2 }} // "1,234,567.89"
{{ 1000 | NumberMore 99 }} // "99+"
```
### 字符串处理 / String Processing
```go
// 大小写转换 / Case conversion
{{ "hello world" | Title }} // "Hello World"
{{ "hello" | ToUpper }} // "HELLO"
{{ "HELLO" | ToLower }} // "hello"
// 命名转换 / Naming convention conversion
{{ "hello_world" | CamelCase }} // "helloWorld"
{{ "hello_world" | PascalCase }} // "HelloWorld"
{{ "HelloWorld" | SnakeCase }} // "hello_world"
// 字符串操作 / String operations
{{ Contains "hello world" "world" }} // true
{{ "file.txt" | Ext }} // ".txt"
{{ Concat "hello" "world" }} // "helloworld"
// 路径处理 / Path handling
{{ "/path/to/file.txt" | Dir }} // "/path/to"
{{ "/path/to/file.txt" | Base }} // "file.txt"
{{ "file.txt" | Ext }} // ".txt"
```
### 编码解码 / Encoding & Decoding
```go
// JSON / JSON
{{ JSONEncode mapData " " }}
{{ jsonStr | JSONDecode }}
// Base64 / Base64
{{ "hello" | Base64Encode }} // "aGVsbG8="
{{ "aGVsbG8=" | Base64Decode }} // "hello"
// URL / URL
{{ "hello world" | URLEncode }} // "hello%20world"
{{ "hello%20world" | URLDecode }} // "hello world"
// Unicode / Unicode
{{ "\\u4f60\\u597d" | UnicodeDecode }} // "你好"
```
### 类型转换 / Type Conversion
```go
// 数字转换 / Number conversion
{{ "3.14" | ToFloat64 }} // 3.14
{{ ToFixed 3.14159 2 }} // "3.14"
{{ "123" | Int }} // 123
// 安全类型转换 / Safe type conversion
{{ value | Default "N/A" }} // Return "N/A" if empty
{{ value | IsNil }} // Check if nil
{{ value | IsEmpty }} // Check if empty
```
### 条件判断 / Conditional Logic
```go
// 条件输出 / Conditional output
{{ If user.LoggedIn "Welcome" "Please login" }}
// 空值处理 / Empty value handling
{{ user.Name | Default "Anonymous" }}
{{ If (NotEmpty user.Email) "Email provided" "No email" }}
```
### 数据结构操作 / Data Structure Operations
```go
// 创建Map / Create map
{{ MakeMap "name" "John" "age" 30 }}
// 创建Slice / Create slice
{{ MakeSlice "apple" "banana" "orange" }}
// 检查元素 / Check element
{{ InSlice "apple" fruits }} // true
{{ InStrSlice names "John" }} // true
{{ SearchStrSlice names "John" }} // 0
```
## 注意事项 / Notes
1. **线程安全 / Thread Safety**: `TplFuncMap` 是全局变量,在并发环境中使用是安全的。
`TplFuncMap` is a global variable and is safe to use in concurrent environments.
2. **错误处理 / Error Handling**: 部分函数在遇到错误时会记录日志并返回默认值。
Some functions log errors and return default values when errors occur.
3. **性能考虑 / Performance Considerations**: 频繁调用复杂函数(如 `Math`)可能影响性能,建议在控制器层处理复杂逻辑。
Frequent calls to complex functions (like `Math`) may impact performance. Consider handling complex logic at the controller level.
4. **HTML安全 / HTML Security**: 使用 `ToHTML`、`ToJS`、`ToCSS` 等函数时,确保内容是可信的,以避免XSS攻击。
When using functions like `ToHTML`, `ToJS`, `ToCSS`, ensure the content is trusted to avoid XSS attacks.
5. **日期格式 / Date Format**: Go使用特定的日期格式参考时间 "2006-01-02 15:04:05",而不是常用的格式字符串。
Go uses a specific reference date "2006-01-02 15:04:05" for date formatting instead of common format strings.
## 常见问题 / FAQ
### Q: 如何自定义函数 / How to add custom functions? / A: 可以通过 `New()` 函数创建新的 `FuncMap` 并添加自定义函数:
```go
customFuncs := tplfunc.New()
customFuncs["customFunc"] = func(s string) string {
return "custom: " + s
}
template.New("example").Funcs(customFuncs)
```
### Q: 时间格式化字符串是什么意思 / What do the date format strings mean? / A: Go使用特定的参考时间 `Mon Jan 2 15:04:05 MST 2006` 来定义格式:
- `2006` - 年 / Year
- `01` - 月 / Month
- `02` - 日 / Day
- `15` - 时(24小时制) / Hour (24-hour)
- `04` - 分 / Minute
- `05` - 秒 / Second
### Q: 如何处理空值 / How to handle empty values? / A: 使用 `Default` 函数提供默认值:
```go
{{ user.Name | Default "Guest" }}
```
## 许可证 / License
Apache License 2.0
## 更多信息 / More Information
- [Go Template Documentation](https://pkg.go.dev/text/template)
- [Echo Framework](https://github.com/webx-top/echo)