Files
dotfiles/sesh/vendor/github.com/ktr0731/go-ansisgr/README.md
T
2026-01-24 11:17:24 +01:00

117 lines
3.2 KiB
Markdown

# go-ansisgr
[![PkgGoDev](https://pkg.go.dev/badge/github.com/ktr0731/go-ansisgr)](https://pkg.go.dev/github.com/ktr0731/go-ansisgr)
[![GitHub Actions](https://github.com/ktr0731/go-ansisgr/workflows/main/badge.svg)](https://github.com/ktr0731/go-ansisgr/actions)
[![codecov](https://codecov.io/gh/ktr0731/go-ansisgr/branch/master/graph/badge.svg?token=6IHRfCBs7K)](https://codecov.io/gh/ktr0731/go-ansisgr)
`go-ansisgr` provides a SGR (Select Graphic Rendition, a part of ANSI Escape Sequence) parser.
- 16 colors, 256 colors and RGB colors support
- All attributes support
## Installation
``` bash
go get github.com/ktr0731/go-fuzzyfinder
```
## Usage
`ansisgr.NewIterator` is the only entry-point API. This function returns an iteratorw which consumes the passed string.
``` go
in := "a\x1b[1;31mb"
iter := ansisgr.NewIterator(in)
for {
r, style, ok := iter.Next()
if !ok {
break
}
// do something.
}
```
`r` is a rune, and `style` is the foreground/background color and attributes `r` has.
``` go
if color, ok := style.Foreground(); ok {
// Foreground color is specified.
}
if color, ok := style.Background(); ok {
// Background color is specified.
}
```
The attribute method reports whether `r` has the attribute.
``` go
style.Bold()
style.Italic()
```
## go-ansisgr with gdamore/tcell
`go-ansisgr` is useful when you construct a rich terminal user interface by using `gdamore/tcell` or others. Although `gdamore/tcell` and other libraries provides SGR functionality from their API, they doesn't support "raw" strings which contain ANSI Escape Sequence. Therefore, `go-ansisgr` translates these strings and makes it easy to use the TUI library's functionality.
For example, the following code displays colored string powered by `gdamore/tcell`.
```go
func main() {
screen, err := tcell.NewScreen()
if err != nil {
log.Fatal(err)
}
defer screen.Fini()
if err := screen.Init(); err != nil {
log.Fatal(err)
}
in := "\x1b[38;2;100;200;200mhello, \x1b[0;1;30;48;5;245mworld!"
iter := ansisgr.NewIterator(in)
for i := 0; ; i++ {
r, rstyle, ok := iter.Next()
if !ok {
break
}
style := tcell.StyleDefault
if color, ok := rstyle.Foreground(); ok {
switch color.Mode() {
case ansisgr.Mode16:
style = style.Foreground(tcell.PaletteColor(color.Value() - 30))
case ansisgr.Mode256:
style = style.Foreground(tcell.PaletteColor(color.Value()))
case ansisgr.ModeRGB:
r, g, b := color.RGB()
style = style.Foreground(tcell.NewRGBColor(int32(r), int32(g), int32(b)))
}
}
if color, valid := rstyle.Background(); valid {
switch color.Mode() {
case ansisgr.Mode16:
style = style.Background(tcell.PaletteColor(color.Value() - 40))
case ansisgr.Mode256:
style = style.Background(tcell.PaletteColor(color.Value()))
case ansisgr.ModeRGB:
r, g, b := color.RGB()
style = style.Background(tcell.NewRGBColor(int32(r), int32(g), int32(b)))
}
}
style = style.
Bold(rstyle.Bold()).
Dim(rstyle.Dim()).
Italic(rstyle.Italic()).
Underline(rstyle.Underline()).
Blink(rstyle.Blink()).
Reverse(rstyle.Reverse()).
StrikeThrough(rstyle.Strikethrough())
screen.SetContent(i, 0, r, nil, style)
}
screen.Show()
time.Sleep(3 * time.Second)
}
```