2015-08-17 17:00:26 -07:00
< ? php
/*
* This file is part of the Symfony package .
*
* ( c ) Fabien Potencier < fabien @ symfony . com >
*
* For the full copyright and license information , please view the LICENSE
* file that was distributed with this source code .
*/
namespace Symfony\Component\Console\Output ;
use Symfony\Component\Console\Formatter\OutputFormatterInterface ;
/**
* StreamOutput writes the output to a given stream .
*
* Usage :
*
* $output = new StreamOutput ( fopen ( 'php://stdout' , 'w' ));
*
* As `StreamOutput` can use any stream , you can also use a file :
*
* $output = new StreamOutput ( fopen ( '/path/to/output.log' , 'a' , false ));
*
* @ author Fabien Potencier < fabien @ symfony . com >
*/
class StreamOutput extends Output
{
private $stream ;
/**
* Constructor .
*
2015-10-08 11:40:12 -07:00
* @ param resource $stream A stream resource
2015-08-17 17:00:26 -07:00
* @ param int $verbosity The verbosity level ( one of the VERBOSITY constants in OutputInterface )
* @ param bool | null $decorated Whether to decorate messages ( null for auto - guessing )
* @ param OutputFormatterInterface | null $formatter Output formatter instance ( null to use default OutputFormatter )
*
* @ throws \InvalidArgumentException When first argument is not a real stream
*/
public function __construct ( $stream , $verbosity = self :: VERBOSITY_NORMAL , $decorated = null , OutputFormatterInterface $formatter = null )
{
if ( ! is_resource ( $stream ) || 'stream' !== get_resource_type ( $stream )) {
throw new \InvalidArgumentException ( 'The StreamOutput class needs a stream as its first argument.' );
}
$this -> stream = $stream ;
if ( null === $decorated ) {
$decorated = $this -> hasColorSupport ();
}
parent :: __construct ( $verbosity , $decorated , $formatter );
}
/**
* Gets the stream attached to this StreamOutput instance .
*
* @ return resource A stream resource
*/
public function getStream ()
{
return $this -> stream ;
}
/**
* { @ inheritdoc }
*/
protected function doWrite ( $message , $newline )
{
if ( false === @ fwrite ( $this -> stream , $message . ( $newline ? PHP_EOL : '' ))) {
// should never happen
throw new \RuntimeException ( 'Unable to write output.' );
}
fflush ( $this -> stream );
}
/**
* Returns true if the stream supports colorization .
*
* Colorization is disabled if not supported by the stream :
*
2015-11-17 13:42:33 -08:00
* - Windows without Ansicon , ConEmu or Mintty
2015-08-17 17:00:26 -07:00
* - non tty consoles
*
* @ return bool true if the stream supports colorization , false otherwise
*/
protected function hasColorSupport ()
{
if ( DIRECTORY_SEPARATOR === '\\' ) {
2015-11-17 13:42:33 -08:00
return false !== getenv ( 'ANSICON' ) || 'ON' === getenv ( 'ConEmuANSI' ) || 'xterm' === getenv ( 'TERM' );
2015-08-17 17:00:26 -07:00
}
return function_exists ( 'posix_isatty' ) && @ posix_isatty ( $this -> stream );
}
}