Golang字符串处理工具 - Stringwrap(支持Unicode、ANSI和表情符号)

Golang字符串处理工具 - Stringwrap(支持Unicode、ANSI和表情符号) 虽然距离初版发布已过去一个半月,我发布得有点晚,但我刚刚发布了 stringwrapv1.0.4 版本。这是一个小型库,旨在解决在终端和 TUI 中处理文本换行的棘手问题:

  • 支持字形簇: 永远不会拆分 👩‍💻、国旗或组合标记序列。
  • 真实的显示宽度: 使用 go-runewidth,能正确处理全角 CJK 字符、窄空格等。
  • 兼容 ANSI 转义码: 保留转义码,但其不计入宽度。
  • 制表符、修剪、单词分割: 可选择保留或修剪首尾空白字符、展开制表符、安全地对长单词进行连字符分割。
  • 丰富的元数据: 除了其他元数据外,每个换行后的行都附带指向原始字符串的字节/符文偏移量。

Repo & docs

非常欢迎反馈、错误报告,或关于诸如基于流的换行等改进功能的想法。感谢关注! 🙏


更多关于Golang字符串处理工具 - Stringwrap(支持Unicode、ANSI和表情符号)的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang字符串处理工具 - Stringwrap(支持Unicode、ANSI和表情符号)的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


stringwrap v1.0.4 确实解决了终端文本处理中的几个关键痛点。字形簇和ANSI转义码的支持特别实用,这在处理国际化内容和彩色输出时是必须的。

下面是一个基本使用示例:

package main

import (
    "fmt"
    "github.com/galactixx/stringwrap"
)

func main() {
    text := "Hello 👩‍💻世界!\x1b[31m红色文本\x1b[0m"
    
    // 创建包装器,设置宽度为10
    wrapper := stringwrap.NewWrapper(stringwrap.WithWidth(10))
    
    // 执行换行
    lines, err := wrapper.Wrap(text)
    if err != nil {
        panic(err)
    }
    
    // 输出结果
    for _, line := range lines {
        fmt.Printf("Line: %q\n", line.Text)
        fmt.Printf("  Byte offset: %d, Rune offset: %d\n", 
            line.ByteOffset, line.RuneOffset)
    }
}

对于需要处理制表符和单词分割的场景:

wrapper := stringwrap.NewWrapper(
    stringwrap.WithWidth(20),
    stringwrap.WithExpandTabs(true),    // 展开制表符
    stringwrap.WithWordBreak(true),     // 启用单词分割
    stringwrap.WithTrimSpace(true),     // 修剪空白
)

lines, _ := wrapper.Wrap("这是一个很长的单词:antidisestablishmentarianism")

元数据功能在需要精确定位原始字符串位置时很有用,比如在构建编辑器或日志分析工具时。字节和符文偏移量可以直接用于后续处理。

包的设计考虑了扩展性,通过选项模式配置包装行为很清晰。如果后续能添加对双向文本(bidi)的支持会更有价值,这在混合语言环境中很重要。

回到顶部