diff options
author | Robin Jarry <robin@jarry.cc> | 2022-12-21 12:50:01 +0100 |
---|---|---|
committer | Robin Jarry <robin@jarry.cc> | 2023-01-04 22:57:31 +0100 |
commit | a9cba9b6e60ff4aec081d48b0d86ec175c3e8e99 (patch) | |
tree | 97cb32aaeb834d4d0f479f70894a6cf308d2cbba | |
parent | d758441fe0c4da6bc3486d0643436ad7ac290a56 (diff) | |
download | aerc-a9cba9b6e60ff4aec081d48b0d86ec175c3e8e99.tar.gz |
format: add utf-8 aware truncate head function
The runewidth module only allows truncating at the end of strings. Add
a function to truncate at the beginning. It will be used for the table
widget in the next commit.
Signed-off-by: Robin Jarry <robin@jarry.cc>
Acked-by: Tim Culverhouse <tim@timculverhouse.com>
-rw-r--r-- | go.mod | 1 | ||||
-rw-r--r-- | lib/format/format.go | 26 |
2 files changed, 27 insertions, 0 deletions
@@ -32,6 +32,7 @@ require ( github.com/miolini/datacounter v1.0.2 github.com/mitchellh/go-homedir v1.1.0 github.com/pkg/errors v0.9.1 + github.com/rivo/uniseg v0.2.0 github.com/riywo/loginshell v0.0.0-20200815045211-7d26008be1ab github.com/stretchr/testify v1.8.0 github.com/syndtr/goleveldb v1.0.0 diff --git a/lib/format/format.go b/lib/format/format.go index 3f00fe18..ad0b778c 100644 --- a/lib/format/format.go +++ b/lib/format/format.go @@ -11,6 +11,7 @@ import ( "git.sr.ht/~rjarry/aerc/models" "github.com/emersion/go-message/mail" "github.com/mattn/go-runewidth" + "github.com/rivo/uniseg" ) // AddressForHumans formats the address. If the address's name @@ -67,6 +68,31 @@ func CompactPath(name string, sep rune) (compact string) { return } +func TruncateHead(s string, w int, head string) string { + width := runewidth.StringWidth(s) + if width <= w { + return s + } + w -= runewidth.StringWidth(head) + pos := 0 + g := uniseg.NewGraphemes(s) + for g.Next() { + var chWidth int + for _, r := range g.Runes() { + chWidth = runewidth.RuneWidth(r) + if chWidth > 0 { + break + } + } + if width-chWidth <= w { + pos, _ = g.Positions() + break + } + width -= chWidth + } + return head + s[pos:] +} + type Ctx struct { FromAddress string AccountName string |