aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobin Jarry <robin@jarry.cc>2022-12-21 12:50:01 +0100
committerRobin Jarry <robin@jarry.cc>2023-01-04 22:57:31 +0100
commita9cba9b6e60ff4aec081d48b0d86ec175c3e8e99 (patch)
tree97cb32aaeb834d4d0f479f70894a6cf308d2cbba
parentd758441fe0c4da6bc3486d0643436ad7ac290a56 (diff)
downloadaerc-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.mod1
-rw-r--r--lib/format/format.go26
2 files changed, 27 insertions, 0 deletions
diff --git a/go.mod b/go.mod
index 466c1709..10421e9a 100644
--- a/go.mod
+++ b/go.mod
@@ -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