diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -130,6 +130,7 @@ 'PhutilConsoleBlock' => 'console/view/PhutilConsoleBlock.php', 'PhutilConsoleConcatenatedView' => 'console/view/PhutilConsoleConcatenatedView.php', 'PhutilConsoleFormatter' => 'console/PhutilConsoleFormatter.php', + 'PhutilConsoleFormatterTestCase' => 'console/__tests__/PhutilConsoleFormatterTestCase.php', 'PhutilConsoleList' => 'console/view/PhutilConsoleList.php', 'PhutilConsoleMessage' => 'console/PhutilConsoleMessage.php', 'PhutilConsoleProgressBar' => 'console/PhutilConsoleProgressBar.php', @@ -653,6 +654,7 @@ 'PhutilConsoleBlock' => 'PhutilConsoleView', 'PhutilConsoleConcatenatedView' => 'PhutilConsoleView', 'PhutilConsoleFormatter' => 'Phobject', + 'PhutilConsoleFormatterTestCase' => 'PhutilTestCase', 'PhutilConsoleList' => 'PhutilConsoleView', 'PhutilConsoleMessage' => 'Phobject', 'PhutilConsoleProgressBar' => 'Phobject', diff --git a/src/console/PhutilConsoleFormatter.php b/src/console/PhutilConsoleFormatter.php --- a/src/console/PhutilConsoleFormatter.php +++ b/src/console/PhutilConsoleFormatter.php @@ -67,11 +67,13 @@ $bold_re = '/(?<![\\\\])\*\*(.*)\*\*/sU'; $underline_re = '/(?<![\\\\])__(.*)__/sU'; $invert_re = '/(?<![\\\\])##(.*)##/sU'; + $backtick_re = '/(?<![\\\\])`(.*)`/sU'; if (self::getDisableANSI()) { $format = preg_replace($bold_re, '\1', $format); $format = preg_replace($underline_re, '\1', $format); $format = preg_replace($invert_re, '\1', $format); + $format = preg_replace($backtick_re, '\1', $format); $format = preg_replace( '@<(fg|bg):('.$colors.')>(.*)</\1>@sU', '\3', @@ -85,6 +87,7 @@ $format = preg_replace($bold_re, $bold, $format); $format = preg_replace($underline_re, $underline, $format); $format = preg_replace($invert_re, $invert, $format); + $format = preg_replace($backtick_re, '\1', $format); $format = preg_replace_callback( '@<(fg|bg):('.$colors.')>(.*)</\1>@sU', array(__CLASS__, 'replaceColorCode'), diff --git a/src/console/__tests__/PhutilConsoleFormatterTestCase.php b/src/console/__tests__/PhutilConsoleFormatterTestCase.php new file mode 100644 --- /dev/null +++ b/src/console/__tests__/PhutilConsoleFormatterTestCase.php @@ -0,0 +1,57 @@ +<?php + +final class PhutilConsoleFormatterTestCase extends PhutilTestCase { + + public function testformatString() { + $esc = chr(27); + + $data = array( + '' => array( + '', + '', + ), + '<bg:red>red background</bg>' => array( + 'red background', + "{$esc}[41mred background{$esc}[49m", + ), + '<fg:blue>blue foreground</fg>' => array( + 'blue foreground', + "{$esc}[34mblue foreground{$esc}[39m", + ), + '**bold**' => array( + 'bold', + "{$esc}[1mbold{$esc}[m", + ), + '__underline__' => array( + 'underline', + "{$esc}[4munderline{$esc}[m", + ), + '##invert##' => array( + 'invert', + "{$esc}[7minvert{$esc}[m", + ), + '`backtick`' => array( + 'backtick', + 'backtick', + ), + ); + + foreach ($data as $format => $expected) { + list($nonansi_expected, $ansi_expected) = $expected; + + $is_ansi = PhutilConsoleFormatter::getDisableANSI(); + + PhutilConsoleFormatter::disableANSI(true); + $nonansi_value = PhutilConsoleFormatter::formatString($format); + + PhutilConsoleFormatter::disableANSI(false); + $ansi_value = PhutilConsoleFormatter::formatString($format); + + $this->assertEqual($nonansi_expected, $nonansi_value); + $this->assertEqual($ansi_expected, $ansi_value); + } + + PhutilConsoleFormatter::disableANSI($is_ansi); + } + +}