diff --git a/src/Symfony/Component/Console/Formatter/OutputFormatterStyle.php b/src/Symfony/Component/Console/Formatter/OutputFormatterStyle.php index 445de6a200b7..4c9265599816 100644 --- a/src/Symfony/Component/Console/Formatter/OutputFormatterStyle.php +++ b/src/Symfony/Component/Console/Formatter/OutputFormatterStyle.php @@ -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 @@ public function apply($text) $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 @@ public function apply($text) $unsetCodes[] = $option['unset']; } - if (null !== $this->href) { + if (null !== $this->href && $this->handlesHrefGracefully) { $text = "\033]8;;$this->href\033\\$text\033]8;;\033\\"; } diff --git a/src/Symfony/Component/Console/Tests/Formatter/OutputFormatterStyleTest.php b/src/Symfony/Component/Console/Tests/Formatter/OutputFormatterStyleTest.php index ddf77902c90e..6b675784460b 100644 --- a/src/Symfony/Component/Console/Tests/Formatter/OutputFormatterStyleTest.php +++ b/src/Symfony/Component/Console/Tests/Formatter/OutputFormatterStyleTest.php @@ -97,4 +97,19 @@ public function testOptions() $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" : '')); + } + } } diff --git a/src/Symfony/Component/Console/Tests/Formatter/OutputFormatterTest.php b/src/Symfony/Component/Console/Tests/Formatter/OutputFormatterTest.php index e1d8cff47a65..030c9c1fabc1 100644 --- a/src/Symfony/Component/Console/Tests/Formatter/OutputFormatterTest.php +++ b/src/Symfony/Component/Console/Tests/Formatter/OutputFormatterTest.php @@ -241,10 +241,17 @@ public function testFormatterHasStyles() /** * @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 @@ public function provideDecoratedAndNonDecoratedOutput() array('some question', 'some question', "\033[30;46msome question\033[39;49m"), array('some text with inline style', 'some text with inline style', "\033[31msome text with inline style\033[39m"), array('some URL', 'some URL', "\033]8;;idea://open/?file=/path/SomeFile.php&line=12\033\\some URL\033]8;;\033\\"), + array('some URL', 'some URL', 'some URL', 'JetBrains-JediTerm'), ); } diff --git a/src/Symfony/Component/VarDumper/Dumper/CliDumper.php b/src/Symfony/Component/VarDumper/Dumper/CliDumper.php index a6341709a48f..65adfdecf89a 100644 --- a/src/Symfony/Component/VarDumper/Dumper/CliDumper.php +++ b/src/Symfony/Component/VarDumper/Dumper/CliDumper.php @@ -59,6 +59,8 @@ class CliDumper extends AbstractDumper 'fileLinkFormat' => null, ); + private $handlesHrefGracefully; + /** * {@inheritdoc} */ @@ -431,6 +433,10 @@ protected function style($style, $value, $attr = array()) $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 @@ protected function style($style, $value, $attr = array()) } 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; } diff --git a/src/Symfony/Component/VarDumper/Tests/Command/Descriptor/CliDescriptorTest.php b/src/Symfony/Component/VarDumper/Tests/Command/Descriptor/CliDescriptorTest.php index eee402f2eafd..473bd63dac7c 100644 --- a/src/Symfony/Component/VarDumper/Tests/Command/Descriptor/CliDescriptorTest.php +++ b/src/Symfony/Component/VarDumper/Tests/Command/Descriptor/CliDescriptorTest.php @@ -21,16 +21,21 @@ 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 : '')); } /**