[Console][VarDumper] Ignore href for PhpStorm terminal emulator

This commit is contained in:
Maxime Steinhausser 2018-12-15 11:33:10 +01:00 committed by Maxime Steinhausser
parent 32a53bfc13
commit 0f65a76f9f
5 changed files with 44 additions and 5 deletions

View File

@ -54,6 +54,7 @@ class OutputFormatterStyle implements OutputFormatterStyleInterface
private $background;
private $href;
private $options = array();
private $handlesHrefGracefully;
/**
* Initializes output formatter style.
@ -185,6 +186,10 @@ class OutputFormatterStyle implements OutputFormatterStyleInterface
$setCodes = array();
$unsetCodes = array();
if (null === $this->handlesHrefGracefully) {
$this->handlesHrefGracefully = 'JetBrains-JediTerm' !== getenv('TERMINAL_EMULATOR');
}
if (null !== $this->foreground) {
$setCodes[] = $this->foreground['set'];
$unsetCodes[] = $this->foreground['unset'];
@ -199,7 +204,7 @@ class OutputFormatterStyle implements OutputFormatterStyleInterface
$unsetCodes[] = $option['unset'];
}
if (null !== $this->href) {
if (null !== $this->href && $this->handlesHrefGracefully) {
$text = "\033]8;;$this->href\033\\$text\033]8;;\033\\";
}

View File

@ -97,4 +97,19 @@ class OutputFormatterStyleTest extends TestCase
$this->assertContains('Invalid option specified: "foo"', $e->getMessage(), '->unsetOption() throws an \InvalidArgumentException when the option does not exist in the available options');
}
}
public function testHref()
{
$prevTerminalEmulator = getenv('TERMINAL_EMULATOR');
putenv('TERMINAL_EMULATOR');
$style = new OutputFormatterStyle();
try {
$style->setHref('idea://open/?file=/path/SomeFile.php&line=12');
$this->assertSame("\e]8;;idea://open/?file=/path/SomeFile.php&line=12\e\\some URL\e]8;;\e\\", $style->apply('some URL'));
} finally {
putenv('TERMINAL_EMULATOR'.($prevTerminalEmulator ? "=$prevTerminalEmulator" : ''));
}
}
}

View File

@ -241,10 +241,17 @@ class OutputFormatterTest extends TestCase
/**
* @dataProvider provideDecoratedAndNonDecoratedOutput
*/
public function testNotDecoratedFormatter(string $input, string $expectedNonDecoratedOutput, string $expectedDecoratedOutput)
public function testNotDecoratedFormatter(string $input, string $expectedNonDecoratedOutput, string $expectedDecoratedOutput, string $terminalEmulator = 'foo')
{
$this->assertEquals($expectedDecoratedOutput, (new OutputFormatter(true))->format($input));
$this->assertEquals($expectedNonDecoratedOutput, (new OutputFormatter(false))->format($input));
$prevTerminalEmulator = getenv('TERMINAL_EMULATOR');
putenv('TERMINAL_EMULATOR='.$terminalEmulator);
try {
$this->assertEquals($expectedDecoratedOutput, (new OutputFormatter(true))->format($input));
$this->assertEquals($expectedNonDecoratedOutput, (new OutputFormatter(false))->format($input));
} finally {
putenv('TERMINAL_EMULATOR'.($prevTerminalEmulator ? "=$prevTerminalEmulator" : ''));
}
}
public function provideDecoratedAndNonDecoratedOutput()
@ -256,6 +263,7 @@ class OutputFormatterTest extends TestCase
array('<question>some question</question>', 'some question', "\033[30;46msome question\033[39;49m"),
array('<fg=red>some text with inline style</>', 'some text with inline style', "\033[31msome text with inline style\033[39m"),
array('<href=idea://open/?file=/path/SomeFile.php&line=12>some URL</>', 'some URL', "\033]8;;idea://open/?file=/path/SomeFile.php&line=12\033\\some URL\033]8;;\033\\"),
array('<href=idea://open/?file=/path/SomeFile.php&line=12>some URL</>', 'some URL', 'some URL', 'JetBrains-JediTerm'),
);
}

View File

@ -59,6 +59,8 @@ class CliDumper extends AbstractDumper
'fileLinkFormat' => null,
);
private $handlesHrefGracefully;
/**
* {@inheritdoc}
*/
@ -431,6 +433,10 @@ class CliDumper extends AbstractDumper
$this->colors = $this->supportsColors();
}
if (null === $this->handlesHrefGracefully) {
$this->handlesHrefGracefully = 'JetBrains-JediTerm' !== getenv('TERMINAL_EMULATOR');
}
if (isset($attr['ellipsis'], $attr['ellipsis-type'])) {
$prefix = substr($value, 0, -$attr['ellipsis']);
if ('cli' === \PHP_SAPI && 'path' === $attr['ellipsis-type'] && isset($_SERVER[$pwd = '\\' === \DIRECTORY_SEPARATOR ? 'CD' : 'PWD']) && 0 === strpos($prefix, $_SERVER[$pwd])) {
@ -477,7 +483,7 @@ class CliDumper extends AbstractDumper
}
href:
if ($this->colors) {
if ($this->colors && $this->handlesHrefGracefully) {
if (isset($attr['file']) && $href = $this->getSourceLink($attr['file'], isset($attr['line']) ? $attr['line'] : 0)) {
$attr['href'] = $href;
}

View File

@ -21,16 +21,21 @@ use Symfony\Component\VarDumper\Dumper\CliDumper;
class CliDescriptorTest extends TestCase
{
private static $timezone;
private static $prevTerminalEmulator;
public static function setUpBeforeClass()
{
self::$timezone = date_default_timezone_get();
date_default_timezone_set('UTC');
self::$prevTerminalEmulator = getenv('TERMINAL_EMULATOR');
putenv('TERMINAL_EMULATOR');
}
public static function tearDownAfterClass()
{
date_default_timezone_set(self::$timezone);
putenv('TERMINAL_EMULATOR'.(self::$prevTerminalEmulator ? '='.self::$prevTerminalEmulator : ''));
}
/**