Version 1
[yaffs-website] / vendor / jakub-onderka / php-console-color / src / JakubOnderka / PhpConsoleColor / ConsoleColor.php
diff --git a/vendor/jakub-onderka/php-console-color/src/JakubOnderka/PhpConsoleColor/ConsoleColor.php b/vendor/jakub-onderka/php-console-color/src/JakubOnderka/PhpConsoleColor/ConsoleColor.php
new file mode 100644 (file)
index 0000000..c367a76
--- /dev/null
@@ -0,0 +1,280 @@
+<?php
+namespace JakubOnderka\PhpConsoleColor;
+
+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 "\033[{$value}m";
+    }
+}
\ No newline at end of file