Skip to content

Commit dbd982e

Browse files
authored
Use lipgloss.Width to calculate DisplayWidth (#159)
This accounts correctly for grapheme clusters that span multiple runes.
1 parent 5840c44 commit dbd982e

File tree

4 files changed

+16
-5
lines changed

4 files changed

+16
-5
lines changed

go.mod

+3-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ require (
66
github.com/AlecAivazis/survey/v2 v2.3.7
77
github.com/MakeNowJust/heredoc v1.0.0
88
github.com/charmbracelet/glamour v0.7.0
9+
github.com/charmbracelet/lipgloss v0.10.1-0.20240413172830-d0be07ea6b9c
910
github.com/cli/browser v1.3.0
1011
github.com/cli/safeexec v1.0.0
1112
github.com/cli/shurcooL-graphql v0.0.4
@@ -17,7 +18,7 @@ require (
1718
github.com/muesli/termenv v0.15.2
1819
github.com/stretchr/testify v1.7.0
1920
github.com/thlib/go-timezone-local v0.0.0-20210907160436-ef149e42d28e
20-
golang.org/x/sys v0.18.0
21+
golang.org/x/sys v0.19.0
2122
golang.org/x/term v0.13.0
2223
golang.org/x/text v0.13.0
2324
gopkg.in/h2non/gock.v1 v1.1.2
@@ -28,6 +29,7 @@ require (
2829
github.com/alecthomas/chroma/v2 v2.8.0 // indirect
2930
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
3031
github.com/aymerick/douceur v0.2.0 // indirect
32+
github.com/charmbracelet/x/exp/term v0.0.0-20240425164147-ba2a9512b05f // indirect
3133
github.com/davecgh/go-spew v1.1.1 // indirect
3234
github.com/dlclark/regexp2 v1.4.0 // indirect
3335
github.com/gorilla/css v1.0.0 // indirect

go.sum

+6-2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuP
1616
github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4=
1717
github.com/charmbracelet/glamour v0.7.0 h1:2BtKGZ4iVJCDfMF229EzbeR1QRKLWztO9dMtjmqZSng=
1818
github.com/charmbracelet/glamour v0.7.0/go.mod h1:jUMh5MeihljJPQbJ/wf4ldw2+yBP59+ctV36jASy7ps=
19+
github.com/charmbracelet/lipgloss v0.10.1-0.20240413172830-d0be07ea6b9c h1:0FwZb0wTiyalb8QQlILWyIuh3nF5wok6j9D9oUQwfQY=
20+
github.com/charmbracelet/lipgloss v0.10.1-0.20240413172830-d0be07ea6b9c/go.mod h1:EPP2QJ0ectp3zo6gx9f8oJGq8keirqPJ3XpYEI8wrrs=
21+
github.com/charmbracelet/x/exp/term v0.0.0-20240425164147-ba2a9512b05f h1:1BXkZqDueTOBECyDoFGRi0xMYgjJ6vvoPIkWyKOwzTc=
22+
github.com/charmbracelet/x/exp/term v0.0.0-20240425164147-ba2a9512b05f/go.mod h1:yQqGHmheaQfkqiJWjklPHVAq1dKbk8uGbcoS/lcKCJ0=
1923
github.com/cli/browser v1.3.0 h1:LejqCrpWr+1pRqmEPDGnTZOjsMe7sehifLynZJuqJpo=
2024
github.com/cli/browser v1.3.0/go.mod h1:HH8s+fOAxjhQoBUAsKuPCbqUuxZDhQ2/aD+SzsEfBTk=
2125
github.com/cli/safeexec v1.0.0 h1:0VngyaIyqACHdcMNWfo6+KdUYnqEr2Sg+bSP1pdF+dI=
@@ -115,8 +119,8 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc
115119
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
116120
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
117121
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
118-
golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
119-
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
122+
golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o=
123+
golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
120124
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
121125
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
122126
golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek=

pkg/text/text.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import (
88
"time"
99
"unicode"
1010

11-
"github.com/muesli/reflow/ansi"
11+
"github.com/charmbracelet/lipgloss"
1212
"github.com/muesli/reflow/truncate"
1313
"golang.org/x/text/runes"
1414
"golang.org/x/text/transform"
@@ -33,7 +33,7 @@ func Indent(s, indent string) string {
3333

3434
// DisplayWidth calculates what the rendered width of string s will be.
3535
func DisplayWidth(s string) int {
36-
return ansi.PrintableRuneWidth(s)
36+
return lipgloss.Width(s)
3737
}
3838

3939
// Truncate returns a copy of the string s that has been shortened to fit the maximum display width.

pkg/text/text_test.go

+5
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,11 @@ func TestDisplayWidth(t *testing.T) {
351351
text: `👍`,
352352
want: 2,
353353
},
354+
{
355+
name: "multi-byte emoji",
356+
text: `👨‍💻`,
357+
want: 2,
358+
},
354359
{
355360
name: "accent character",
356361
text: `é́́`,

0 commit comments

Comments
 (0)