Properly compute the padding by fixing the ansi escape regexp
This commit is contained in:
parent
5aa0ae6b8e
commit
c4c13cb279
3 changed files with 32 additions and 8 deletions
|
|
@ -23,12 +23,15 @@ func Fatal(err error) {
|
|||
os.Exit(1)
|
||||
}
|
||||
|
||||
// Finds the control character sequences (like colors)
|
||||
var ctrlFinder = regexp.MustCompile("\x1b\x5b[0-9]+\x6d")
|
||||
// Finds the ansi escape sequences (like colors)
|
||||
// Taken from: https://github.com/chalk/ansi-regex/blob/d9d806ecb45d899cf43408906a4440060c5c50e5/index.js
|
||||
var ansiEscapes = regexp.MustCompile(`[\x1B\x9B][[\]()#;?]*` +
|
||||
`(?:(?:(?:[a-zA-Z\d]*(?:;[a-zA-Z\\d]*)*)?\x07)` +
|
||||
`|(?:(?:\d{1,4}(?:;\d{0,4})*)?[\dA-PRZcf-ntqry=><~]))`)
|
||||
|
||||
func EscapeAwareRuneCountInString(s string) int {
|
||||
n := utf8.RuneCountInString(s)
|
||||
for _, sm := range ctrlFinder.FindAllString(s, -1) {
|
||||
for _, sm := range ansiEscapes.FindAllString(s, -1) {
|
||||
n -= utf8.RuneCountInString(sm)
|
||||
}
|
||||
return n
|
||||
|
|
|
|||
19
internal/util/util_test.go
Normal file
19
internal/util/util_test.go
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
package util
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/fatih/color"
|
||||
ocolor "github.com/ooni/probe-cli/internal/colors"
|
||||
)
|
||||
|
||||
func TestEscapeAwareRuneCountInString(t *testing.T) {
|
||||
var bold = color.New(color.Bold)
|
||||
var myColor = color.New(color.FgBlue)
|
||||
|
||||
s := myColor.Sprintf("•ABC%s%s", bold.Sprintf("DEF"), ocolor.Red("GHI"))
|
||||
count := EscapeAwareRuneCountInString(s)
|
||||
if count != 10 {
|
||||
t.Errorf("Count was incorrect, got: %d, want: %d.", count, 10)
|
||||
}
|
||||
}
|
||||
Loading…
Reference in a new issue