golang终端ANSI彩色文本模板渲染插件库go-ataman的使用

golang终端ANSI彩色文本模板渲染插件库go-ataman的使用

介绍

go-ataman是一个用于在终端应用程序中渲染彩色文本的Golang库,它通过文本模板实现文本属性操作。它的设计理念类似于HTML,例如<span style="color:green">Hello!</span>这样的标记。

Gopher Ataman

特性

  • 单次迭代完成模板解析和渲染
  • 使用池化技术最小化内存分配
  • 线程安全的解析和渲染
  • 完全可自定义的标签装饰

安装

使用以下命令安装包:

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"))

这个示例会生成如下彩色文本:

Example Output

预渲染模板示例

// 创建渲染器,使用花括号样式
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)

编写模板

模板遵循以下简单规则:

  1. 标签可以包含一个或多个属性,例如{white,bold}{red}
  2. 如果模板需要将开标签或闭标签序列作为常规文本渲染,则应将序列加倍。例如,如果标签用{}括起来,则在模板中应为This rendered as {{regular text}}
  3. 如果模板包含任何ANSI序列,渲染器会为每个模板添加重置图形模式的ANSI序列

属性字典

  • -reset:重置图形模式
  • bbold:加粗字体
  • uunderscoreunderline:下划线
  • blink:闪烁字体
  • reverse:交换文本和背景颜色
  • conceal:隐藏字体
  • black:黑色
  • red:红色
  • green:绿色
  • yellow:黄色
  • blue:蓝色
  • magenta:洋红色
  • cyan:青色
  • white:白色
  • default:恢复默认颜色
  • bgbackground:与颜色一起使用设置背景色
  • intensivelight:与颜色一起使用使颜色更鲜艳

模板示例

  • {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

1 回复

更多关于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

文本属性

  • bbold - 粗体
  • uunderline - 下划线
  • iitalic - 斜体
  • 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应用程序。它的轻量级设计和直观的模板语法使得集成和使用都非常方便。

回到顶部