-
-
Notifications
You must be signed in to change notification settings - Fork 60
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Use ANSI color codes and Unicode characters on Windows as well #662
base: master
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -267,8 +267,7 @@ public static function escapeshellcmd($cmd) | |
/** | ||
* Prepares token content for output to screen. | ||
* | ||
* Replaces invisible characters so they are visible. On non-Windows | ||
* operating systems it will also colour the invisible characters. | ||
* Replaces invisible characters so they are visible, and colour them. | ||
* | ||
* @param string $content The content to prepare. | ||
* @param string[] $exclude A list of characters to leave invisible. | ||
|
@@ -278,35 +277,25 @@ public static function escapeshellcmd($cmd) | |
*/ | ||
public static function prepareForOutput($content, $exclude=[]) | ||
{ | ||
if (stripos(PHP_OS, 'WIN') === 0) { | ||
if (in_array("\r", $exclude, true) === false) { | ||
$content = str_replace("\r", '\r', $content); | ||
} | ||
|
||
if (in_array("\n", $exclude, true) === false) { | ||
$content = str_replace("\n", '\n', $content); | ||
} | ||
|
||
if (in_array("\t", $exclude, true) === false) { | ||
$content = str_replace("\t", '\t', $content); | ||
} | ||
} else { | ||
if (in_array("\r", $exclude, true) === false) { | ||
$content = str_replace("\r", "\033[30;1m\\r\033[0m", $content); | ||
} | ||
$replacements = [ | ||
"\r" => '\r', | ||
"\n" => '\n', | ||
"\t" => '\t', | ||
" " => '·', | ||
]; | ||
if (stripos(PHP_OS, 'WIN') === 0 && PHP_VERSION_ID < 70100) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Is this condition sufficient ? If I read the https://www.php.net/manual/en/migration71.windows-support.php page, I get the impression an additional check may be needed against the value of the Also note that Same remark applies to the |
||
// Do not replace spaces on old PHP on Windows. | ||
// Printing Unicode characters like '·' to Windows console only works since PHP 7.1. | ||
unset($replacements[" "]); | ||
} | ||
|
||
if (in_array("\n", $exclude, true) === false) { | ||
$content = str_replace("\n", "\033[30;1m\\n\033[0m", $content); | ||
} | ||
$replacements = array_diff_key($replacements, array_fill_keys($exclude, true)); | ||
|
||
if (in_array("\t", $exclude, true) === false) { | ||
$content = str_replace("\t", "\033[30;1m\\t\033[0m", $content); | ||
} | ||
// Colour runs of invisible characters. | ||
$match = implode('', array_keys($replacements)); | ||
$content = preg_replace("/([$match]+)/", "\033[30;1m$1\033[0m", $content); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This ends up adding more redundant colour codes on Windows for PHP < 7.1, similar to what is happening in the PHP tokenizer. |
||
|
||
if (in_array(' ', $exclude, true) === false) { | ||
$content = str_replace(' ', "\033[30;1m·\033[0m", $content); | ||
} | ||
}//end if | ||
$content = strtr($content, $replacements); | ||
|
||
return $content; | ||
|
||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not sure I understand the reasoning for this change ?
I mean, in contrast to the "Output now has fewer redundant ANSI color codes" changelog suggestion, this ends up creating more redundant ANSI color codes (at least on Windows).
Before:
After:
Screenshots generated using the following command on the previously posted code snippet on PHP 7.1 on Windows.
Also note (not necessarily to be addressed in this PR, probably should be a separate one): the
--no-colors
option can also be used on non-Windows OSes and the previous implementation already didn't respect that.The
PHP
class does have access to theConfig
though via theTokenizer::$config
option, so maybe it should respect thecolors
setting ?