CLI::strlen() removes styles by comparing against the exact code strings from the three style enums (src/CLI.php:171-186). Any other escape sequence is counted as visible characters, so table() and box() pad the wrong amount:
CLI::table([
["\033[38;5;208morange\033[0m", 'b'],
['plain', 'b'],
], ['col1', 'col2']);
+-------------------+------+
| col1 | col2 |
+-------------------+------+
| orange | b | <- 11 invisible bytes counted as width
| plain | b |
+-------------------+------+
Verified on PHP 8.4.19 against main (2c0159f). 256 color and true color sequences, hyperlinks (\e]8;;) and cursor moves all hit this, and users producing them is expected since the library exposes raw output helpers.
Suggested fix: strip with a regex over the CSI/OSC grammar, for example preg_replace('/\e\[[0-9;]*[A-Za-z]/', '', $text) extended for OSC, instead of a fixed list.
Secondary point in the same method: the code list is rebuilt by iterating every enum case on every call, and table() calls it once per cell, so a 20x5 table iterates the enums 100 times. The list is constant and can be cached in a static.
CLI::strlen()removes styles by comparing against the exact code strings from the three style enums (src/CLI.php:171-186). Any other escape sequence is counted as visible characters, sotable()andbox()pad the wrong amount:Verified on PHP 8.4.19 against main (2c0159f). 256 color and true color sequences, hyperlinks (
\e]8;;) and cursor moves all hit this, and users producing them is expected since the library exposes raw output helpers.Suggested fix: strip with a regex over the CSI/OSC grammar, for example
preg_replace('/\e\[[0-9;]*[A-Za-z]/', '', $text)extended for OSC, instead of a fixed list.Secondary point in the same method: the code list is rebuilt by iterating every enum case on every call, and
table()calls it once per cell, so a 20x5 table iterates the enums 100 times. The list is constant and can be cached in a static.