Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions Lib/_pyrepl/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,9 @@ class ColorSpan(NamedTuple):
def str_width(c: str) -> int:
if ord(c) < 128:
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

unrelated to this issue but quite a few of the characters with ord < 128, do not have a display width of 1

for example, in my terminal, tab (ord 9) is 8 charaters wide

something to consider for a future PR

return 1
# gh-139246 for zero-width joiner and combining characters
if unicodedata.combining(c) or unicodedata.category(c) == "Cf":
return 0
w = unicodedata.east_asian_width(c)
if w in ("N", "Na", "H", "A"):
return 1
Expand Down
22 changes: 21 additions & 1 deletion Lib/test/test_pyrepl/test_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,28 @@

class TestUtils(TestCase):
def test_str_width(self):
characters = ['a', '1', '_', '!', '\x1a', '\u263A', '\uffb9']
characters = [
'a',
'1',
'_',
'!',
'\x1a',
'\u263A',
'\uffb9',
'\N{LATIN SMALL LETTER E WITH ACUTE}', # é
'\N{LATIN SMALL LETTER E WITH CEDILLA}', # ȩ
]
for c in characters:
self.assertEqual(str_width(c), 1)

zero_width_characters = [
'\N{COMBINING ACUTE ACCENT}',
'\N{ZERO WIDTH JOINER}',
]
for c in zero_width_characters:
with self.subTest(character=c):
self.assertEqual(str_width(c), 0)

characters = [chr(99989), chr(99999)]
for c in characters:
self.assertEqual(str_width(c), 2)
Expand All @@ -25,6 +43,8 @@ def test_wlen(self):

self.assertEqual(wlen('hello'), 5)
self.assertEqual(wlen('hello' + '\x1a'), 7)
self.assertEqual(wlen('e\N{COMBINING ACUTE ACCENT}'), 1)
self.assertEqual(wlen('a\N{ZERO WIDTH JOINER}b'), 2)

def test_prev_next_window(self):
def gen_normal():
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
fix: paste zero-width in default repl width is wrong.
Loading