@@ -184,6 +184,9 @@ class WidthState(enum.IntEnum):
184
184
WIDE = 0x1_0002
185
185
"Two columns wide."
186
186
187
+ THREE = 0x1_0003
188
+ "Three columns wide."
189
+
187
190
# \r\n
188
191
LINE_FEED = 0b0000_0000_0000_0001
189
192
"\\ n (CRLF has width 1)"
@@ -341,6 +344,10 @@ def table_width(self) -> CharWidthInTable:
341
344
case _:
342
345
return CharWidthInTable .SPECIAL
343
346
347
+ def is_carried (self ) -> bool :
348
+ "Whether this corresponds to a non-default `WidthInfo`."
349
+ return int (self ) <= 0xFFFF
350
+
344
351
def width_alone (self ) -> int :
345
352
"The width of a character with this type when it appears alone."
346
353
match self :
@@ -357,6 +364,8 @@ def width_alone(self) -> int:
357
364
| WidthState .EMOJI_PRESENTATION
358
365
):
359
366
return 2
367
+ case WidthState .THREE :
368
+ return 3
360
369
case _:
361
370
return 1
362
371
@@ -598,6 +607,7 @@ def load_width_maps() -> tuple[list[WidthState], list[WidthState]]:
598
607
(alef_joining , WidthState .JOINING_GROUP_ALEF ),
599
608
(range (0x1780 , 0x17A3 ), WidthState .KHMER_COENG_ELIGIBLE_LETTER ),
600
609
([0x17A7 , 0x17AB , 0x17AC , 0x17AF ], WidthState .KHMER_COENG_ELIGIBLE_LETTER ),
610
+ ([0x17D8 ], WidthState .THREE ),
601
611
([0x1A10 ], WidthState .BUGINESE_LETTER_YA ),
602
612
(range (0x2D31 , 0x2D66 ), WidthState .TIFINAGH_CONSONANT ),
603
613
([0x2D6F ], WidthState .TIFINAGH_CONSONANT ),
@@ -1196,7 +1206,11 @@ def lookup_fns(
1196
1206
s += f" '\\ u{{{ lo :X} }}'"
1197
1207
if hi != lo :
1198
1208
s += f"..='\\ u{{{ hi :X} }}'"
1199
- s += f" => ({ width .width_alone ()} , WidthInfo::{ str (width .name )} ),\n "
1209
+ if width .is_carried ():
1210
+ width_info = width .name
1211
+ else :
1212
+ width_info = "DEFAULT"
1213
+ s += f" => ({ width .width_alone ()} , WidthInfo::{ width_info } ),\n "
1200
1214
1201
1215
s += f""" _ => (2, WidthInfo::EMOJI_PRESENTATION),
1202
1216
}}
@@ -1531,7 +1545,7 @@ def emit_module(
1531
1545
)
1532
1546
1533
1547
for variant in WidthState :
1534
- if variant .table_width () == CharWidthInTable . SPECIAL :
1548
+ if variant .is_carried () :
1535
1549
if variant .is_cjk_only ():
1536
1550
module .write (' #[cfg(feature = "cjk")]\n ' )
1537
1551
module .write (
@@ -1925,7 +1939,7 @@ def emit_module(
1925
1939
test_width_variants = []
1926
1940
test_width_variants_cjk = []
1927
1941
for variant in WidthState :
1928
- if variant .table_width () == CharWidthInTable . SPECIAL :
1942
+ if variant .is_carried () :
1929
1943
if not variant .is_cjk_only ():
1930
1944
test_width_variants .append (variant )
1931
1945
if not variant .is_non_cjk_only ():
@@ -2003,10 +2017,7 @@ def emit_module(
2003
2017
)
2004
2018
2005
2019
for variant in WidthState :
2006
- if (
2007
- variant .table_width () == CharWidthInTable .SPECIAL
2008
- and not variant .is_cjk_only ()
2009
- ):
2020
+ if variant .is_carried () and not variant .is_cjk_only ():
2010
2021
module .write (f" WidthInfo::{ variant .name } ,\n " )
2011
2022
2012
2023
module .write (
@@ -2018,10 +2029,7 @@ def emit_module(
2018
2029
)
2019
2030
2020
2031
for variant in WidthState :
2021
- if (
2022
- variant .table_width () == CharWidthInTable .SPECIAL
2023
- and not variant .is_non_cjk_only ()
2024
- ):
2032
+ if variant .is_carried () and not variant .is_non_cjk_only ():
2025
2033
module .write (f" WidthInfo::{ variant .name } ,\n " )
2026
2034
2027
2035
module .write (
0 commit comments