In tabulate._CustomTextWrap._handle_long_word, ANSI escape codes may be broken in the middle, resulting wrongly formatted tables. That happens because the length of the string is checked in while self._len(chunk[:i]) <= space_left:, which may strip ANSI codes after they were broken by indexing into their middle.
To solve that, we instead calculate the length of the string without ANSI codes, then index into it: while len(_strip_ansi(chunk)[:i]) <= space_left:. That gives the amount of printable characters that should be included. Then we iterate through the escape codes present until we reach that many printable characters, and add the escape code lengths to figure out how much of the original string should be included.
In
tabulate._CustomTextWrap._handle_long_word
, ANSI escape codes may be broken in the middle, resulting wrongly formatted tables. That happens because the length of the string is checked inwhile self._len(chunk[:i]) <= space_left:
, which may strip ANSI codes after they were broken by indexing into their middle.To solve that, we instead calculate the length of the string without ANSI codes, then index into it:
while len(_strip_ansi(chunk)[:i]) <= space_left:
. That gives the amount of printable characters that should be included. Then we iterate through the escape codes present until we reach that many printable characters, and add the escape code lengths to figure out how much of the original string should be included.Tests included.
Test code:
Result before patch:
Result after patch:
Fixes #307.