From 28ccb85b2e1f37d2730c56ab44ff7abfd1cbce96 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 14 Dec 2020 18:42:33 -0500 Subject: [PATCH] Use ANSI-aware truncation --- go.mod | 2 +- go.sum | 2 ++ ui/pager.go | 5 +++-- ui/stash.go | 3 +-- ui/stashitem.go | 11 ++++++----- ui/ui.go | 9 +-------- 6 files changed, 14 insertions(+), 18 deletions(-) diff --git a/go.mod b/go.mod index 9195fbe..82a3be2 100644 --- a/go.mod +++ b/go.mod @@ -17,7 +17,7 @@ require ( github.com/mitchellh/go-homedir v1.1.0 github.com/muesli/gitcha v0.1.2-0.20200908172931-5aa4fdccf2f6 github.com/muesli/go-app-paths v0.2.1 - github.com/muesli/reflow v0.2.0 + github.com/muesli/reflow v0.2.1-0.20201126184510-3bcb929042f2 github.com/muesli/termenv v0.7.4 github.com/sahilm/fuzzy v0.1.0 github.com/segmentio/ksuid v1.0.3 diff --git a/go.sum b/go.sum index ed81a33..cf2fc0e 100644 --- a/go.sum +++ b/go.sum @@ -202,6 +202,8 @@ github.com/muesli/go-app-paths v0.2.1/go.mod h1:SxS3Umca63pcFcLtbjVb+J0oD7cl4ixQ github.com/muesli/reflow v0.1.0/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= github.com/muesli/reflow v0.2.0 h1:2o0UBJPHHH4fa2GCXU4Rg4DwOtWPMekCeyc5EWbAQp0= github.com/muesli/reflow v0.2.0/go.mod h1:qT22vjVmM9MIUeLgsVYe/Ye7eZlbv9dZjL3dVhUqLX8= +github.com/muesli/reflow v0.2.1-0.20201126184510-3bcb929042f2 h1:+cpkcmASpeBn4qXz2tU+x+njyKe91NoHXqrJdhoDnZo= +github.com/muesli/reflow v0.2.1-0.20201126184510-3bcb929042f2/go.mod h1:qT22vjVmM9MIUeLgsVYe/Ye7eZlbv9dZjL3dVhUqLX8= github.com/muesli/sasquatch v0.0.0-20200811221207-66979d92330a h1:Hw/15RYEOUD6T9UCRkUmNBa33kJkH33Fui6hE4sRLKU= github.com/muesli/sasquatch v0.0.0-20200811221207-66979d92330a/go.mod h1:+XG0ne5zXWBTSbbe7Z3/RWxaT8PZY6zaZ1dX6KjprYY= github.com/muesli/termenv v0.7.0/go.mod h1:SohX91w6swWA4AYU+QmPx+aSgXhWO0juiyID9UZmbpA= diff --git a/ui/pager.go b/ui/pager.go index 262d54e..3192264 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -16,6 +16,7 @@ import ( "github.com/charmbracelet/glamour" runewidth "github.com/mattn/go-runewidth" "github.com/muesli/reflow/ansi" + "github.com/muesli/reflow/truncate" te "github.com/muesli/termenv" ) @@ -403,13 +404,13 @@ func (m pagerModel) statusBarView(b *strings.Builder) { note = "(No memo)" } } - note = truncate(" "+note+" ", max(0, + note = truncate.StringWithTail(" "+note+" ", uint(max(0, m.common.width- ansi.PrintableRuneWidth(logo)- ansi.PrintableRuneWidth(statusIndicator)- ansi.PrintableRuneWidth(scrollPercent)- ansi.PrintableRuneWidth(helpNote), - )) + )), ellipsis) if showStatusMessage { note = statusBarMessageStyle(note) } else { diff --git a/ui/stash.go b/ui/stash.go index d07a033..0aeb936 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -1034,8 +1034,7 @@ func (m stashModel) view() string { // Rules for the logo, filter and status message. var logoOrFilter string if m.showStatusMessage { - const gutter = 3 - logoOrFilter = m.statusMessage.String() // TODO: auto-truncate + logoOrFilter = m.statusMessage.String() } else if m.isFiltering() { logoOrFilter = m.filterInput.View() } else { diff --git a/ui/stashitem.go b/ui/stashitem.go index 65c2bba..4b3d19e 100644 --- a/ui/stashitem.go +++ b/ui/stashitem.go @@ -6,7 +6,8 @@ import ( "strings" lib "github.com/charmbracelet/charm/ui/common" - rw "github.com/mattn/go-runewidth" + "github.com/muesli/reflow/ansi" + "github.com/muesli/reflow/truncate" "github.com/muesli/termenv" "github.com/sahilm/fuzzy" ) @@ -19,7 +20,7 @@ const ( func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { var ( - truncateTo = m.common.width - stashViewHorizontalPadding*2 + truncateTo = uint(m.common.width - stashViewHorizontalPadding*2) gutter string title = md.Note date = md.relativeTime() @@ -31,16 +32,16 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { if title == "" { title = "News" } else { - title = truncate(title, truncateTo) + title = truncate.StringWithTail(title, truncateTo, ellipsis) } case StashedDoc, ConvertedDoc: icon = fileListingStashIcon if title == "" { title = noMemoTitle } - title = truncate(title, truncateTo-rw.StringWidth(icon)) + title = truncate.StringWithTail(title, truncateTo-uint(ansi.PrintableRuneWidth(icon)), ellipsis) default: - title = truncate(title, truncateTo) + title = truncate.StringWithTail(title, truncateTo, ellipsis) } isSelected := index == m.cursor() diff --git a/ui/ui.go b/ui/ui.go index 4471b90..bd13537 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -17,7 +17,6 @@ import ( "github.com/charmbracelet/charm/ui/common" lib "github.com/charmbracelet/charm/ui/common" "github.com/charmbracelet/glow/utils" - runewidth "github.com/mattn/go-runewidth" "github.com/muesli/gitcha" te "github.com/muesli/termenv" "github.com/segmentio/ksuid" @@ -26,6 +25,7 @@ import ( const ( noteCharacterLimit = 256 // should match server statusMessageTimeout = time.Second * 2 // how long to show status messages like "stashed!" + ellipsis = "…" ) var ( @@ -743,13 +743,6 @@ func indent(s string, n int) string { return b.String() } -func truncate(str string, num int) string { - if num < 1 { - return str - } - return runewidth.Truncate(str, num, "…") -} - func min(a, b int) int { if a < b { return a