ktr0731 / go-ansisgr

ANSI Escape Sequence SGR (Select Graphic Rendition) parser

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

go-ansisgr

PkgGoDev GitHub Actions codecov

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

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.

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.

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.

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.

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

About

ANSI Escape Sequence SGR (Select Graphic Rendition) parser

License:MIT License


Languages

Language:Go 100.0%