Properly compute the padding by fixing the ansi escape regexp
This commit is contained in:
parent
5aa0ae6b8e
commit
c4c13cb279
|
@ -7,7 +7,6 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
"unicode/utf8"
|
|
||||||
|
|
||||||
"github.com/apex/log"
|
"github.com/apex/log"
|
||||||
"github.com/fatih/color"
|
"github.com/fatih/color"
|
||||||
|
@ -104,7 +103,7 @@ func logTable(w io.Writer, f log.Fields) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
var bar *progress.Bar
|
var bar *progress.Bar
|
||||||
var lastBarChars int64
|
var lastBarChars int
|
||||||
|
|
||||||
// TypedLog is used for handling special "typed" logs to the CLI
|
// TypedLog is used for handling special "typed" logs to the CLI
|
||||||
func (h *Handler) TypedLog(t string, e *log.Entry) error {
|
func (h *Handler) TypedLog(t string, e *log.Entry) error {
|
||||||
|
@ -116,7 +115,9 @@ func (h *Handler) TypedLog(t string, e *log.Entry) error {
|
||||||
}
|
}
|
||||||
bar.Value(e.Fields.Get("percentage").(float64))
|
bar.Value(e.Fields.Get("percentage").(float64))
|
||||||
bar.Text(e.Message)
|
bar.Text(e.Message)
|
||||||
lastBarChars, err = bar.WriteTo(h.Writer)
|
barStr := bar.String()
|
||||||
|
fmt.Fprintf(h.Writer, "\r %s", barStr)
|
||||||
|
lastBarChars = util.EscapeAwareRuneCountInString(barStr) + 3
|
||||||
return err
|
return err
|
||||||
case "table":
|
case "table":
|
||||||
return logTable(h.Writer, e.Fields)
|
return logTable(h.Writer, e.Fields)
|
||||||
|
@ -149,10 +150,11 @@ func (h *Handler) DefaultLog(e *log.Entry) error {
|
||||||
// We need to move the cursor back to the begging of the line and add some
|
// We need to move the cursor back to the begging of the line and add some
|
||||||
// padding to the end of the string to delete the previous line written to
|
// padding to the end of the string to delete the previous line written to
|
||||||
// the console.
|
// the console.
|
||||||
sChars := int64(utf8.RuneCountInString(s))
|
sChars := util.EscapeAwareRuneCountInString(s)
|
||||||
fmt.Fprintf(h.Writer,
|
fmt.Fprintf(h.Writer,
|
||||||
fmt.Sprintf("\r%s%s", s, strings.Repeat(" ", int(lastBarChars-sChars))),
|
fmt.Sprintf("\r%s%s", s, strings.Repeat(" ", lastBarChars-sChars)),
|
||||||
)
|
)
|
||||||
|
//fmt.Fprintf(h.Writer, "\n(%d,%d)\n", lastBarChars, sChars)
|
||||||
fmt.Fprintln(h.Writer)
|
fmt.Fprintln(h.Writer)
|
||||||
bar.WriteTo(h.Writer)
|
bar.WriteTo(h.Writer)
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -23,12 +23,15 @@ func Fatal(err error) {
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Finds the control character sequences (like colors)
|
// Finds the ansi escape sequences (like colors)
|
||||||
var ctrlFinder = regexp.MustCompile("\x1b\x5b[0-9]+\x6d")
|
// 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 {
|
func EscapeAwareRuneCountInString(s string) int {
|
||||||
n := utf8.RuneCountInString(s)
|
n := utf8.RuneCountInString(s)
|
||||||
for _, sm := range ctrlFinder.FindAllString(s, -1) {
|
for _, sm := range ansiEscapes.FindAllString(s, -1) {
|
||||||
n -= utf8.RuneCountInString(sm)
|
n -= utf8.RuneCountInString(sm)
|
||||||
}
|
}
|
||||||
return n
|
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 New Issue
Block a user