diff --git a/table/table.go b/table/table.go index 793b4156..a1aa13c4 100644 --- a/table/table.go +++ b/table/table.go @@ -9,7 +9,7 @@ import ( "charm.land/bubbles/v2/viewport" tea "charm.land/bubbletea/v2" "charm.land/lipgloss/v2" - "github.com/mattn/go-runewidth" + "github.com/charmbracelet/x/ansi" ) // Model defines a state for the table widget. @@ -422,7 +422,7 @@ func (m Model) headersView() string { continue } style := lipgloss.NewStyle().Width(col.Width).MaxWidth(col.Width).Inline(true) - renderedCell := style.Render(runewidth.Truncate(col.Title, col.Width, "…")) + renderedCell := style.Render(ansi.Truncate(col.Title, col.Width, "…")) s = append(s, m.styles.Header.Render(renderedCell)) } return lipgloss.JoinHorizontal(lipgloss.Top, s...) @@ -435,7 +435,7 @@ func (m *Model) renderRow(r int) string { continue } style := lipgloss.NewStyle().Width(m.cols[i].Width).MaxWidth(m.cols[i].Width).Inline(true) - renderedCell := m.styles.Cell.Render(style.Render(runewidth.Truncate(value, m.cols[i].Width, "…"))) + renderedCell := m.styles.Cell.Render(style.Render(ansi.Truncate(value, m.cols[i].Width, "…"))) s = append(s, renderedCell) } diff --git a/table/table_test.go b/table/table_test.go index 8547bce2..b83f6458 100644 --- a/table/table_test.go +++ b/table/table_test.go @@ -288,6 +288,21 @@ func TestModel_RenderRow(t *testing.T) { } } +func TestModel_RenderRow_AnsiWidth(t *testing.T) { + value := "\x1b[31mABCDEFGH\x1b[0m" + table := &Model{ + rows: []Row{{value}}, + cols: []Column{{Title: "col1", Width: 8}}, + styles: Styles{Cell: lipgloss.NewStyle()}, + } + + got := ansi.Strip(table.renderRow(0)) + want := "ABCDEFGH" + if got != want { + t.Fatalf("\n\nWant: \n%s\n\nGot: \n%s\n", want, got) + } +} + func TestTableAlignment(t *testing.T) { t.Run("No border", func(t *testing.T) { biscuits := New(