问题描述
我想要一个 Go 程序来显示 CP437 编码的“ANSI art file”,80 列宽,其中包含 ANSI escape codes -- 颜色、光标位置等和扩展的 ANSI({{3} }) 盒子绘制代码。
在使用 80 列支持 CP437 的终端在 linux 终端(请参阅下面的 Playground 链接)中查看 ANSI 文件时,该文件可以正确显示,例如换行符被隐式读取; 但是,当使用更宽的终端(这是目标)查看时,不会隐式处理/添加新行,并且文件可能无法正确显示,无需换行。
如何遍历 .ans 文件并在第 80 个字符后手动添加新行,仅计算显示的实际字符(而不是转义码)?
我尝试过像 CP437 和 ansiwrap 这样的 Go 库。 Ansiwrap 确实只是用于文本换行,但是 Reflow 最接近目标,但是换行符不太正确。
呈现方式(在 CP437 终端中,132x37):
它应该是什么样子(来自艺术计划):
解决方法
为了解决这个问题,首先我从
visualLength
包 [1],然后我为此写了一个 golang.org/x/term
[2]
用例。
bufio.SplitFunc
结果:
package main
func ansi(data []byte,eof bool) (int,[]byte,error) {
var s []rune
for i,r := range string(data) {
if s = append(s,r); visualLength(s) == 80 {
width := len(string(r))
return i+width,data[:i+width],nil
}
}
return 0,nil,nil
}