golang终端ANSI彩色文本模板渲染插件库go-ataman的使用
golang终端ANSI彩色文本模板渲染插件库go-ataman的使用
介绍
go-ataman是一个用于在终端应用程序中渲染彩色文本的Golang库,它通过文本模板实现文本属性操作。它的设计理念类似于HTML,例如<span style="color:green">Hello!</span>
这样的标记。
特性
- 单次迭代完成模板解析和渲染
- 使用池化技术最小化内存分配
- 线程安全的解析和渲染
- 完全可自定义的标签装饰
安装
使用以下命令安装包:
go get gopkg.in/workanator/go-ataman.v1
快速示例
基础使用示例
// 创建渲染器,使用基础样式
rndr := ataman.NewRenderer(ataman.BasicStyle())
// 定义模板
tpl := "<light+green>%s<->, <bg+light+yellow,black,bold> <<%s>> <-><red>!"
// 渲染并打印
fmt.Println(rndr.MustRenderf(tpl, "Hello", "Terminal World"))
这个示例会生成如下彩色文本:
预渲染模板示例
// 创建渲染器,使用花括号样式
rndr := ataman.NewRenderer(ataman.CurlyStyle())
// 预渲染模板
prep := rndr.MustPrepare("{light_green}%s{-}, {bg_light_yellow+black+bold} <%s> {-}{red}!")
// 使用预渲染模板
fmt.Println(rndr.MustRenderf(tpl, "Hi", "Everybody"))
预渲染模板实现了fmt.Stringer
接口,可以直接用于输出操作:
prep := rndr.MustPrepare("{red}Red {green}Green {blue}Blue{-}")
fmt.Println(prep)
编写模板
模板遵循以下简单规则:
- 标签可以包含一个或多个属性,例如
{white,bold}
、{red}
- 如果模板需要将开标签或闭标签序列作为常规文本渲染,则应将序列加倍。例如,如果标签用
{
和}
括起来,则在模板中应为This rendered as {{regular text}}
- 如果模板包含任何ANSI序列,渲染器会为每个模板添加重置图形模式的ANSI序列
属性字典
-
或reset
:重置图形模式b
或bold
:加粗字体u
或underscore
或underline
:下划线blink
:闪烁字体reverse
:交换文本和背景颜色conceal
:隐藏字体black
:黑色red
:红色green
:绿色yellow
:黄色blue
:蓝色magenta
:洋红色cyan
:青色white
:白色default
:恢复默认颜色bg
或background
:与颜色一起使用设置背景色intensive
或light
:与颜色一起使用使颜色更鲜艳
模板示例
{light_green}
- 使文本变为亮绿色{bg_yellow}
- 使背景变为黄色{bold}
- 使字体加粗{red,bg_blue}
- 使文本在蓝色背景上显示红色{u,black,bg_intensive_white}
- 使文本在亮白色背景上显示黑色并带下划线{-}
- 重置当前图形模式
自定义渲染器
可以通过decorate.Style
结构自定义标签装饰。例如,下面的代码定义了一个装饰样式,如[[bold,yellow]]Warning![[-]] [[intensive_white]]This package is awesome![[-]] :)
:
// 自定义样式
style := decorate.Style{
TagOpen: decorate.NewMarker("[["),
TagClose: decorate.NewMarker("]]"),
AttributeDelimiter: decorate.NewMarker(","),
ModDelimiter: decorate.NewMarker("-"),
Attributes: ansi.DefaultDict,
}
// 使用自定义样式创建渲染器
rndr := ataman.NewRenderer(style)
装饰样式规则:
TagOpen
:打开标签的字符序列TagClose
:关闭标签的字符序列AttributeDelimiter
:分隔标签内属性的字符序列ModDelimiter
:分隔属性中修饰符的字符序列Attributes
:属性映射,其中键是用户在模板中使用的ANSI代码名称,值是ANSI序列中使用的ANSI代码
建议使用ansi
包中定义的属性代码与ataman
提供的默认渲染器一起使用。
更多关于golang终端ANSI彩色文本模板渲染插件库go-ataman的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang终端ANSI彩色文本模板渲染插件库go-ataman的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
go-ataman:Golang终端ANSI彩色文本渲染库
go-ataman是一个轻量级的Golang库,用于在终端中渲染带有ANSI颜色代码的彩色文本模板。它提供了一种简单的方式来创建和渲染彩色终端输出。
基本特性
- 支持16色和256色ANSI颜色代码
- 简单的模板语法
- 高性能的模板渲染
- 支持嵌套样式
- 线程安全
安装
go get github.com/workanator/go-ataman
基本用法
1. 创建渲染器
package main
import (
"fmt"
"github.com/workanator/go-ataman"
)
func main() {
// 创建默认渲染器
renderer := ataman.DefaultRenderer()
// 渲染彩色文本
colored := renderer.MustRender("<green>Hello</green>, <red>World</red>!")
fmt.Println(colored)
}
2. 模板语法
go-ataman使用类似HTML的标签语法来定义颜色和样式:
text := renderer.MustRender(`
<light/yellow>Warning:</> This is a <b>bold</b> message with
<fg=white,bg=blue>white on blue</> text.
`)
fmt.Println(text)
3. 预定义样式
// 使用预定义样式
text := renderer.MustRender(`
<header>This is a header</header>
<error>Error message</error>
<success>Success message</success>
`)
fmt.Println(text)
4. 自定义渲染器
// 创建自定义渲染器
r := ataman.New(ataman.Config{
// 定义自定义样式
StylePrimitives: map[string]string{
"header": "fg=white bg=blue bold",
"error": "fg=red bold",
"success": "fg=green bold",
},
// 禁用颜色(用于非TTY输出)
Disabled: false,
})
// 使用自定义样式
text := r.MustRender("<header>Custom Header</header>")
fmt.Println(text)
5. 嵌套样式
text := renderer.MustRender(`
<green>This is <b>bold green</b> text</green>
`)
fmt.Println(text)
6. 动态内容渲染
data := struct {
Name string
Age int
}{
Name: "Alice",
Age: 30,
}
// 使用模板渲染动态内容
tpl := "<green>Name:</> {Name} <red>Age:</> {Age}"
result := renderer.MustRenderf(tpl, data)
fmt.Println(result)
颜色和样式参考
基本颜色
black
,red
,green
,yellow
,blue
,magenta
,cyan
,white
light/
前缀表示亮色变体,如light/red
文本属性
b
或bold
- 粗体u
或underline
- 下划线i
或italic
- 斜体inverse
- 反色strike
- 删除线
高级颜色指定
fg=<color>
- 前景色bg=<color>
- 背景色- 256色模式:
fg=124
,bg=202
- RGB模式:
fg=255;100;0
,bg=0;50;100
性能考虑
go-ataman在渲染前会缓存已解析的模板,因此重复渲染相同的模板非常高效。对于动态内容,建议使用Renderf
方法而不是字符串拼接。
完整示例
package main
import (
"fmt"
"github.com/workanator/go-ataman"
)
func main() {
// 创建自定义渲染器
r := ataman.New(ataman.Config{
StylePrimitives: map[string]string{
"header": "fg=white bg=blue bold",
"error": "fg=red bold",
"success": "fg=green bold",
"warning": "fg=yellow bold",
},
})
// 渲染各种样式
fmt.Println(r.MustRender("<header>Application Status</header>"))
fmt.Println(r.MustRender("<success>✓ Service is running</success>"))
fmt.Println(r.MustRender("<warning>⚠ Maintenance scheduled</warning>"))
fmt.Println(r.MustRender("<error>✗ Database connection failed</error>"))
// 复杂嵌套示例
fmt.Println(r.MustRender(`
<header>User Details:</>
<green>Name:</> {Name}
<yellow>Age:</> {Age} years
<cyan>Status:</> <b>{Status}</b>
`, struct {
Name string
Age int
Status string
}{
Name: "Alice",
Age: 30,
Status: "active",
}))
}
go-ataman是一个简单但功能强大的库,适合需要在终端输出中添加颜色和样式的Golang应用程序。它的轻量级设计和直观的模板语法使得集成和使用都非常方便。