| 24 | |
| 25 | |
| 26 | def make_width_table() -> Iterable[tuple[int, int, int]]: |
| 27 | start_codepoint = -1 |
| 28 | end_codepoint = -1 |
| 29 | range_width = -2 |
| 30 | for codepoint in range(0, sys.maxunicode + 1): |
| 31 | width = wcwidth.wcwidth(chr(codepoint)) |
| 32 | if width <= 1: |
| 33 | # Ignore narrow characters along with zero-width characters so that |
| 34 | # they are treated as single-width. Note that treating zero-width |
| 35 | # characters as single-width is consistent with the heuristics built |
| 36 | # on top of str.isascii() in the str_width() function in strings.py. |
| 37 | continue |
| 38 | if start_codepoint < 0: |
| 39 | start_codepoint = codepoint |
| 40 | range_width = width |
| 41 | elif width != range_width or codepoint != end_codepoint + 1: |
| 42 | yield (start_codepoint, end_codepoint, range_width) |
| 43 | start_codepoint = codepoint |
| 44 | range_width = width |
| 45 | end_codepoint = codepoint |
| 46 | if start_codepoint >= 0: |
| 47 | yield (start_codepoint, end_codepoint, range_width) |
| 48 | |
| 49 | |
| 50 | def main() -> None: |