fix CJK characters width in output

This commit is contained in:
zjeuhpiung liu 2020-03-27 17:33:16 +08:00 committed by Anthony Sottile
parent 528c7afd18
commit 605b39f617
2 changed files with 21 additions and 3 deletions

View file

@ -6,6 +6,7 @@ import os
import re import re
import subprocess import subprocess
import time import time
import unicodedata
from typing import Any from typing import Any
from typing import Collection from typing import Collection
from typing import Dict from typing import Dict
@ -33,8 +34,13 @@ from pre_commit.util import EnvironT
logger = logging.getLogger('pre_commit') logger = logging.getLogger('pre_commit')
def _len_cjk(msg: str) -> int:
widths = {'A': 1, 'F': 2, 'H': 1, 'N': 1, 'Na': 1, 'W': 2}
return sum(widths[unicodedata.east_asian_width(c)] for c in msg)
def _start_msg(*, start: str, cols: int, end_len: int) -> str: def _start_msg(*, start: str, cols: int, end_len: int) -> str:
dots = '.' * (cols - len(start) - end_len - 1) dots = '.' * (cols - _len_cjk(start) - end_len - 1)
return f'{start}{dots}' return f'{start}{dots}'
@ -47,7 +53,7 @@ def _full_msg(
use_color: bool, use_color: bool,
postfix: str = '', postfix: str = '',
) -> str: ) -> str:
dots = '.' * (cols - len(start) - len(postfix) - len(end_msg) - 1) dots = '.' * (cols - _len_cjk(start) - len(postfix) - len(end_msg) - 1)
end = color.format_color(end_msg, end_color, use_color) end = color.format_color(end_msg, end_color, use_color)
return f'{start}{dots}{postfix}{end}\n' return f'{start}{dots}{postfix}{end}\n'
@ -206,7 +212,7 @@ def _compute_cols(hooks: Sequence[Hook]) -> int:
Hook name...(no files to check) Skipped Hook name...(no files to check) Skipped
""" """
if hooks: if hooks:
name_len = max(len(hook.name) for hook in hooks) name_len = max(_len_cjk(hook.name) for hook in hooks)
else: else:
name_len = 0 name_len = 0

View file

@ -52,6 +52,18 @@ def test_full_msg():
assert ret == 'start......end\n' assert ret == 'start......end\n'
def test_full_msg_with_cjk():
ret = _full_msg(
start='啊あ아',
end_msg='end',
end_color='',
use_color=False,
cols=15,
)
# 5 dots: 15 - 6 - 3 - 1
assert ret == '啊あ아.....end\n'
def test_full_msg_with_color(): def test_full_msg_with_color():
ret = _full_msg( ret = _full_msg(
start='start', start='start',