mirror of
https://github.com/python/cpython.git
synced 2025-11-02 14:41:33 +00:00
Merge 41d2865a6d into bad8d6de37
This commit is contained in:
commit
fe898918a4
3 changed files with 33 additions and 1 deletions
|
|
@ -63,6 +63,14 @@ class ColorSpan(NamedTuple):
|
||||||
def str_width(c: str) -> int:
|
def str_width(c: str) -> int:
|
||||||
if ord(c) < 128:
|
if ord(c) < 128:
|
||||||
return 1
|
return 1
|
||||||
|
# gh-139246 for zero-width joiner and combining characters
|
||||||
|
if unicodedata.combining(c):
|
||||||
|
return 0
|
||||||
|
category = unicodedata.category(c)
|
||||||
|
if category == "Cf" and c != "\u00ad":
|
||||||
|
return 0
|
||||||
|
if "\u2028" <= c <= "\u2029":
|
||||||
|
return 0
|
||||||
w = unicodedata.east_asian_width(c)
|
w = unicodedata.east_asian_width(c)
|
||||||
if w in ("N", "Na", "H", "A"):
|
if w in ("N", "Na", "H", "A"):
|
||||||
return 1
|
return 1
|
||||||
|
|
|
||||||
|
|
@ -5,10 +5,31 @@
|
||||||
|
|
||||||
class TestUtils(TestCase):
|
class TestUtils(TestCase):
|
||||||
def test_str_width(self):
|
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}', # ȩ
|
||||||
|
'\u00ad',
|
||||||
|
]
|
||||||
for c in characters:
|
for c in characters:
|
||||||
self.assertEqual(str_width(c), 1)
|
self.assertEqual(str_width(c), 1)
|
||||||
|
|
||||||
|
zero_width_characters = [
|
||||||
|
'\N{COMBINING ACUTE ACCENT}',
|
||||||
|
'\N{ZERO WIDTH JOINER}',
|
||||||
|
'\u2028',
|
||||||
|
'\u2029',
|
||||||
|
]
|
||||||
|
for c in zero_width_characters:
|
||||||
|
with self.subTest(character=c):
|
||||||
|
self.assertEqual(str_width(c), 0)
|
||||||
|
|
||||||
characters = [chr(99989), chr(99999)]
|
characters = [chr(99989), chr(99999)]
|
||||||
for c in characters:
|
for c in characters:
|
||||||
self.assertEqual(str_width(c), 2)
|
self.assertEqual(str_width(c), 2)
|
||||||
|
|
@ -25,6 +46,8 @@ def test_wlen(self):
|
||||||
|
|
||||||
self.assertEqual(wlen('hello'), 5)
|
self.assertEqual(wlen('hello'), 5)
|
||||||
self.assertEqual(wlen('hello' + '\x1a'), 7)
|
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 test_prev_next_window(self):
|
||||||
def gen_normal():
|
def gen_normal():
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
fix: paste zero-width in default repl width is wrong.
|
||||||
Loading…
Add table
Add a link
Reference in a new issue