From f8f2d264bcf3bd86a0123f6dc97f12b161a10f89 Mon Sep 17 00:00:00 2001 From: opsnull Date: Fri, 15 Jul 2022 20:43:40 +0800 Subject: [PATCH] fix(table): fixed column length calculation for Chinese strings fix #377 --- _examples/table/demo/main.go | 9 +++++---- table_printer.go | 10 +++++----- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/_examples/table/demo/main.go b/_examples/table/demo/main.go index 491f99d4e..3ea085e3a 100644 --- a/_examples/table/demo/main.go +++ b/_examples/table/demo/main.go @@ -6,10 +6,10 @@ func main() { // Create a fork of the default table, fill it with data and print it. // Data can also be generated and inserted later. pterm.DefaultTable.WithHasHeader().WithData(pterm.TableData{ - {"Firstname", "Lastname", "Email"}, - {"Paul", "Dean", "nisi.dictum.augue@velitAliquam.co.uk"}, - {"Callie", "Mckay", "egestas.nunc.sed@est.com"}, - {"Libby", "Camacho", "aliquet.lobortis@semper.com"}, + {"Firstname", "Lastname", "Email", "Note"}, + {"Paul", "Dean", "nisi.dictum.augue@velitAliquam.co.uk", ""}, + {"Callie", "Mckay", "egestas.nunc.sed@est.com", "这是一个测试, haha!"}, + {"Libby", "Camacho", "aliquet.lobortis@semper.com", "just a test, hey!"}, }).Render() pterm.Println() // Blank line @@ -20,5 +20,6 @@ func main() { {"Paul", "Dean", "nisi.dictum.augue@velitAliquam.co.uk"}, {"Callie", "Mckay", "egestas.nunc.sed@est.com"}, {"Libby", "Camacho", "aliquet.lobortis@semper.com"}, + {"张", "小宝", "zhang@example.com"}, }).WithRightAlignment().Render() } diff --git a/table_printer.go b/table_printer.go index 03edb7463..043d90db0 100644 --- a/table_printer.go +++ b/table_printer.go @@ -4,9 +4,9 @@ import ( "encoding/csv" "io" "strings" - "unicode/utf8" "github.com/pterm/pterm/internal" + "github.com/mattn/go-runewidth" ) // DefaultTable contains standards, which can be used to print a TablePrinter. @@ -163,7 +163,7 @@ func (p TablePrinter) Srender() (string, error) { for _, row := range p.Data { for ci, column := range row { - columnLength := utf8.RuneCountInString(RemoveColorFromString(column)) + columnLength := runewidth.StringWidth(RemoveColorFromString(column)) if columnLength > maxColumnWidth[ci] { maxColumnWidth[ci] = columnLength } @@ -174,11 +174,11 @@ func (p TablePrinter) Srender() (string, error) { rowWidth := 0 for ci, column := range row { columnString := p.createColumnString(column, maxColumnWidth[ci]) - rowWidth += utf8.RuneCountInString(RemoveColorFromString(columnString)) + rowWidth += runewidth.StringWidth(RemoveColorFromString(columnString)) if ci != len(row) && ci != 0 { ret += p.Style.Sprint(p.SeparatorStyle.Sprint(p.Separator)) - rowWidth += utf8.RuneCountInString(RemoveColorFromString(p.SeparatorStyle.Sprint(p.Separator))) + rowWidth += runewidth.StringWidth(RemoveColorFromString(p.SeparatorStyle.Sprint(p.Separator))) } if p.HasHeader && ri == 0 { @@ -209,7 +209,7 @@ func (p TablePrinter) Srender() (string, error) { } func (p TablePrinter) createColumnString(data string, maxColumnWidth int) string { - columnLength := utf8.RuneCountInString(RemoveColorFromString(data)) + columnLength := runewidth.StringWidth(RemoveColorFromString(data)) if p.RightAlignment { return strings.Repeat(" ", maxColumnWidth-columnLength) + data }