main
Raw Download raw file
 1package ansi
 2
 3import (
 4	"bytes"
 5
 6	"github.com/mattn/go-runewidth"
 7)
 8
 9// Buffer is a buffer aware of ANSI escape sequences.
10type Buffer struct {
11	bytes.Buffer
12}
13
14// PrintableRuneWidth returns the cell width of all printable runes in the
15// buffer.
16func (w Buffer) PrintableRuneWidth() int {
17	return PrintableRuneWidth(w.String())
18}
19
20// PrintableRuneWidth returns the cell width of the given string.
21func PrintableRuneWidth(s string) int {
22	var n int
23	var ansi bool
24
25	for _, c := range s {
26		if c == Marker {
27			// ANSI escape sequence
28			ansi = true
29		} else if ansi {
30			if IsTerminator(c) {
31				// ANSI sequence terminated
32				ansi = false
33			}
34		} else {
35			n += runewidth.RuneWidth(c)
36		}
37	}
38
39	return n
40}