diff --git a/shared/utils.py b/shared/utils.py index 7a264d37..b9d97a2d 100644 --- a/shared/utils.py +++ b/shared/utils.py @@ -472,32 +472,26 @@ def word_wrap(ln, w): while True: # ln_len considers DOUBLE_WIDTH chars ln_len = 0 - idx = 0 sp = None for idx, ch in enumerate(ln): if ch == ' ': # split point on space if possible sp = idx - if ln_len < w: + + ln_len += 1 + if ch in DOUBLE_WIDE: ln_len += 1 - if ch in DOUBLE_WIDE: - ln_len += 1 - else: - if ln_len == w: - if ch in ".,:;": - # boundary of allowed width - # if one of .,:; is last -> allow one more character - # even if only half visible on Mk4 - # on Q it's OK as (CHARS_W-1) is used as w - sp = None - idx += 1 - else: - # Q: double wide char was last - # put on next line + + if ln_len > w: + # if one of .,:; is last -> allow one more character + # even if only half visible on Mk4 + # on Q it's OK as (CHARS_W-1) is used as w + if ch in ".,:;": + idx += 1 sp = None - idx -= 1 break + else: yield ln return @@ -519,7 +513,7 @@ def word_wrap(ln, w): # bad-break the line sp = nsp = idx - if ln[nsp:nsp+1] == ' ': + if ln[sp:nsp+1] == " ": nsp += 1 else: # split on found space diff --git a/testing/test_unit.py b/testing/test_unit.py index 0a6cbae7..4e23556b 100644 --- a/testing/test_unit.py +++ b/testing/test_unit.py @@ -284,13 +284,13 @@ DOUBLE_W = ['⋯', '✔', '✓', '→', '←', '↦', '◉', '◯', '◌', '※' @pytest.mark.parametrize('txt, target', [ ('Disk, press \x0e to share via NFC, \x11 to share', ['Disk, press \x0e to share via NFC,', '\x11 to share']), - ((KEY_NFC * 17)+".", [KEY_NFC * 17, '.']), - ((KEY_NFC * 17)+(17*KEY_QR), [KEY_NFC * 17, KEY_QR * 17]), - ((KEY_NFC * 17)+" "+(17*KEY_QR), [KEY_NFC * 17, KEY_QR * 17]), + ((KEY_NFC * 17)+".", [KEY_NFC * 16, KEY_NFC + '.']), + ((KEY_NFC * 17)+(17*KEY_QR), [KEY_NFC * 16, KEY_NFC +(KEY_QR * 15), 2 * KEY_QR]), + ((KEY_NFC * 17)+" "+(17*KEY_QR), [KEY_NFC * 16, KEY_NFC, KEY_QR * 16, KEY_QR]), ((KEY_NFC * 16)+".", [(KEY_NFC * 16)+'.']), - (f"Use {KEY_NFC}, or {KEY_F1}, {KEY_F2}, {KEY_F3}, or or or {KEY_F4}", [f"Use {KEY_NFC}, or {KEY_F1}, {KEY_F2}, {KEY_F3}, or or or {KEY_F4}"]), - ("".join(DOUBLE_W), ["".join(DOUBLE_W[:17]), "".join(DOUBLE_W[17:])]), - ("".join(6*DOUBLE_W), ["".join(6*DOUBLE_W)[i:i + 17] for i in range(0, len(6*DOUBLE_W), 17)]), + (f"Use {KEY_NFC}, or {KEY_F1}, {KEY_F2}, {KEY_F3}, or or or {KEY_F4}", [f"Use {KEY_NFC}, or {KEY_F1}, {KEY_F2}, {KEY_F3}, or or or", f"{KEY_F4}"]), + ("".join(DOUBLE_W), ["".join(DOUBLE_W[:16]), "".join(DOUBLE_W[16:])]), + ("".join(6*DOUBLE_W), ["".join(6*DOUBLE_W)[i:i + 16] for i in range(0, len(6*DOUBLE_W), 16)]), ]) def test_word_wrap_double_wide(only_q1, txt, target, sim_exec): width = 33 # check shared/ux.py CHAR_PER_W