Вход Регистрация
Файл: gapps/vendor/jakub-onderka/php-console-color/src/JakubOnderka/PhpConsoleColor/ConsoleColor.php
Строк: 184
<?php
namespace JakubOnderkaPhpConsoleColor;

class 
ConsoleColor
{
    const 
FOREGROUND 38,
        
BACKGROUND 48;

    const 
COLOR256_REGEXP '~^(bg_)?color_([0-9]{1,3})$~';

    const 
RESET_STYLE 0;

    
/** @var bool */
    
private $isSupported;

    
/** @var bool */
    
private $forceStyle false;

    
/** @var array */
    
private $styles = array(
        
'none' => null,
        
'bold' => '1',
        
'dark' => '2',
        
'italic' => '3',
        
'underline' => '4',
        
'blink' => '5',
        
'reverse' => '7',
        
'concealed' => '8',

        
'default' => '39',
        
'black' => '30',
        
'red' => '31',
        
'green' => '32',
        
'yellow' => '33',
        
'blue' => '34',
        
'magenta' => '35',
        
'cyan' => '36',
        
'light_gray' => '37',

        
'dark_gray' => '90',
        
'light_red' => '91',
        
'light_green' => '92',
        
'light_yellow' => '93',
        
'light_blue' => '94',
        
'light_magenta' => '95',
        
'light_cyan' => '96',
        
'white' => '97',

        
'bg_default' => '49',
        
'bg_black' => '40',
        
'bg_red' => '41',
        
'bg_green' => '42',
        
'bg_yellow' => '43',
        
'bg_blue' => '44',
        
'bg_magenta' => '45',
        
'bg_cyan' => '46',
        
'bg_light_gray' => '47',

        
'bg_dark_gray' => '100',
        
'bg_light_red' => '101',
        
'bg_light_green' => '102',
        
'bg_light_yellow' => '103',
        
'bg_light_blue' => '104',
        
'bg_light_magenta' => '105',
        
'bg_light_cyan' => '106',
        
'bg_white' => '107',
    );

    
/** @var array */
    
private $themes = array();

    public function 
__construct()
    {
        
$this->isSupported $this->isSupported();
    }

    
/**
     * @param string|array $style
     * @param string $text
     * @return string
     * @throws InvalidStyleException
     * @throws InvalidArgumentException
     */
    
public function apply($style$text)
    {
        if (!
$this->isStyleForced() && !$this->isSupported()) {
            return 
$text;
        }

        if (
is_string($style)) {
            
$style = array($style);
        }
        if (!
is_array($style)) {
            throw new 
InvalidArgumentException("Style must be string or array.");
        }

        
$sequences = array();

        foreach (
$style as $s) {
            if (isset(
$this->themes[$s])) {
                
$sequences array_merge($sequences$this->themeSequence($s));
            } else if (
$this->isValidStyle($s)) {
                
$sequences[] = $this->styleSequence($s);
            } else {
                throw new 
InvalidStyleException($s);
            }
        }

        
$sequences array_filter($sequences, function ($val) {
            return 
$val !== null;
        });

        if (empty(
$sequences)) {
            return 
$text;
        }

        return 
$this->escSequence(implode(';'$sequences)) . $text $this->escSequence(self::RESET_STYLE);
    }

    
/**
     * @param bool $forceStyle
     */
    
public function setForceStyle($forceStyle)
    {
        
$this->forceStyle = (bool) $forceStyle;
    }

    
/**
     * @return bool
     */
    
public function isStyleForced()
    {
        return 
$this->forceStyle;
    }

    
/**
     * @param array $themes
     * @throws InvalidStyleException
     * @throws InvalidArgumentException
     */
    
public function setThemes(array $themes)
    {
        
$this->themes = array();
        foreach (
$themes as $name => $styles) {
            
$this->addTheme($name$styles);
        }
    }

    
/**
     * @param string $name
     * @param array|string $styles
     * @throws InvalidArgumentException
     * @throws InvalidStyleException
     */
    
public function addTheme($name$styles)
    {
        if (
is_string($styles)) {
            
$styles = array($styles);
        }
        if (!
is_array($styles)) {
            throw new 
InvalidArgumentException("Style must be string or array.");
        }

        foreach (
$styles as $style) {
            if (!
$this->isValidStyle($style)) {
                throw new 
InvalidStyleException($style);
            }
        }

        
$this->themes[$name] = $styles;
    }

    
/**
     * @return array
     */
    
public function getThemes()
    {
        return 
$this->themes;
    }

    
/**
     * @param string $name
     * @return bool
     */
    
public function hasTheme($name)
    {
        return isset(
$this->themes[$name]);
    }

    
/**
     * @param string $name
     */
    
public function removeTheme($name)
    {
        unset(
$this->themes[$name]);
    }

    
/**
     * @return bool
     */
    
public function isSupported()
    {
        if (
DIRECTORY_SEPARATOR === '\') {
            return getenv('
ANSICON') !== false || getenv('ConEmuANSI') === 'ON';
        }

        return function_exists('
posix_isatty') && @posix_isatty(STDOUT);
    }

    /**
     * @return bool
     */
    public function are256ColorsSupported()
    {
        return DIRECTORY_SEPARATOR === '
/' && strpos(getenv('TERM'), '256color') !== false;
    }

    /**
     * @return array
     */
    public function getPossibleStyles()
    {
        return array_keys($this->styles);
    }

    /**
     * @param string $name
     * @return string
     * @throws InvalidStyleException
     */
    private function themeSequence($name)
    {
        $sequences = array();
        foreach ($this->themes[$name] as $style) {
            $sequences[] = $this->styleSequence($style);
        }
        return $sequences;
    }

    /**
     * @param string $style
     * @return string
     * @throws InvalidStyleException
     */
    private function styleSequence($style)
    {
        if (array_key_exists($style, $this->styles)) {
            return $this->styles[$style];
        }

        if (!$this->are256ColorsSupported()) {
            return null;
        }

        preg_match(self::COLOR256_REGEXP, $style, $matches);

        $type = $matches[1] === '
bg_' ? self::BACKGROUND : self::FOREGROUND;
        $value = $matches[2];

        return "$type;5;$value";
    }

    /**
     * @param string $style
     * @return bool
     */
    private function isValidStyle($style)
    {
        return array_key_exists($style, $this->styles) || preg_match(self::COLOR256_REGEXP, $style);
    }

    /**
     * @param string|int $value
     * @return string
     */
    private function escSequence($value)
    {
        return "33[{$value}m";
    }
}
Онлайн: 0
Реклама