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\Formatter ;
2016-04-20 09:56:34 -07:00
use Symfony\Component\Console\Exception\InvalidArgumentException ;
2015-08-17 17:00:26 -07:00
/**
* @ author Jean - François Simon < contact @ jfsimon . fr >
*/
class OutputFormatterStyleStack
{
/**
* @ var OutputFormatterStyleInterface []
*/
private $styles ;
/**
* @ var OutputFormatterStyleInterface
*/
private $emptyStyle ;
/**
* Constructor .
*
* @ param OutputFormatterStyleInterface | null $emptyStyle
*/
public function __construct ( OutputFormatterStyleInterface $emptyStyle = null )
{
$this -> emptyStyle = $emptyStyle ? : new OutputFormatterStyle ();
$this -> reset ();
}
/**
* Resets stack ( ie . empty internal arrays ) .
*/
public function reset ()
{
$this -> styles = array ();
}
/**
* Pushes a style in the stack .
*
* @ param OutputFormatterStyleInterface $style
*/
public function push ( OutputFormatterStyleInterface $style )
{
$this -> styles [] = $style ;
}
/**
* Pops a style from the stack .
*
* @ param OutputFormatterStyleInterface | null $style
*
* @ return OutputFormatterStyleInterface
*
2016-04-20 09:56:34 -07:00
* @ throws InvalidArgumentException When style tags incorrectly nested
2015-08-17 17:00:26 -07:00
*/
public function pop ( OutputFormatterStyleInterface $style = null )
{
if ( empty ( $this -> styles )) {
return $this -> emptyStyle ;
}
if ( null === $style ) {
return array_pop ( $this -> styles );
}
foreach ( array_reverse ( $this -> styles , true ) as $index => $stackedStyle ) {
if ( $style -> apply ( '' ) === $stackedStyle -> apply ( '' )) {
$this -> styles = array_slice ( $this -> styles , 0 , $index );
return $stackedStyle ;
}
}
2016-04-20 09:56:34 -07:00
throw new InvalidArgumentException ( 'Incorrectly nested style tag found.' );
2015-08-17 17:00:26 -07:00
}
/**
* Computes current style with stacks top codes .
*
* @ return OutputFormatterStyle
*/
public function getCurrent ()
{
if ( empty ( $this -> styles )) {
return $this -> emptyStyle ;
}
return $this -> styles [ count ( $this -> styles ) - 1 ];
}
/**
* @ param OutputFormatterStyleInterface $emptyStyle
*
2017-02-02 16:28:38 -08:00
* @ return $this
2015-08-17 17:00:26 -07:00
*/
public function setEmptyStyle ( OutputFormatterStyleInterface $emptyStyle )
{
$this -> emptyStyle = $emptyStyle ;
return $this ;
}
/**
* @ return OutputFormatterStyleInterface
*/
public function getEmptyStyle ()
{
return $this -> emptyStyle ;
}
}