2013-10-22 14:26:45 +02:00
|
|
|
<?php
|
2016-02-08 15:41:00 +01:00
|
|
|
/* Icinga Web 2 | (c) 2013 Icinga Development Team | GPLv2+ */
|
2013-10-22 14:26:45 +02:00
|
|
|
|
2014-04-18 16:36:46 +02:00
|
|
|
namespace Icinga\Cli;
|
2013-10-22 14:26:45 +02:00
|
|
|
|
|
|
|
use Icinga\Cli\Screen;
|
2014-08-27 16:03:15 +02:00
|
|
|
use Icinga\Exception\IcingaException;
|
2013-10-22 14:26:45 +02:00
|
|
|
|
|
|
|
// @see http://en.wikipedia.org/wiki/ANSI_escape_code
|
|
|
|
|
|
|
|
class AnsiScreen extends Screen
|
|
|
|
{
|
|
|
|
protected $fgColors = array(
|
|
|
|
'black' => '30',
|
|
|
|
'darkgray' => '1;30',
|
|
|
|
'red' => '31',
|
|
|
|
'lightred' => '1;31',
|
|
|
|
'green' => '32',
|
|
|
|
'lightgreen' => '1;32',
|
|
|
|
'brown' => '33',
|
|
|
|
'yellow' => '1;33',
|
|
|
|
'blue' => '34',
|
|
|
|
'lightblue' => '1;34',
|
|
|
|
'purple' => '35',
|
|
|
|
'lightpurple' => '1;35',
|
|
|
|
'cyan' => '36',
|
|
|
|
'lightcyan' => '1;36',
|
|
|
|
'lightgray' => '37',
|
|
|
|
'white' => '1;37',
|
|
|
|
);
|
|
|
|
|
|
|
|
protected $bgColors = array(
|
|
|
|
'black' => '40',
|
|
|
|
'red' => '41',
|
|
|
|
'green' => '42',
|
|
|
|
'brown' => '43',
|
|
|
|
'blue' => '44',
|
|
|
|
'purple' => '45',
|
|
|
|
'cyan' => '46',
|
|
|
|
'lightgray' => '47',
|
|
|
|
);
|
|
|
|
|
2013-10-22 17:51:49 +02:00
|
|
|
public function strlen($string)
|
|
|
|
{
|
|
|
|
return strlen($this->stripAnsiCodes($string));
|
|
|
|
}
|
|
|
|
|
|
|
|
public function stripAnsiCodes($string)
|
|
|
|
{
|
|
|
|
return preg_replace('/\e\[?.*?[\@-~]/', '', $string);
|
|
|
|
}
|
|
|
|
|
2014-04-18 16:36:46 +02:00
|
|
|
public function clear()
|
2013-10-22 17:51:49 +02:00
|
|
|
{
|
2014-04-18 16:36:46 +02:00
|
|
|
return "\033[2J" // Clear the whole screen
|
|
|
|
. "\033[1;1H" // Move the cursor to row 1, column 1
|
|
|
|
. "\033[1S"; // Scroll whole page up by 1 line (why?)
|
2013-10-22 17:51:49 +02:00
|
|
|
}
|
|
|
|
|
2014-04-18 16:36:46 +02:00
|
|
|
public function underline($text)
|
2013-10-22 14:26:45 +02:00
|
|
|
{
|
2014-04-18 16:36:46 +02:00
|
|
|
return "\033[4m"
|
|
|
|
. $text
|
|
|
|
. "\033[0m"; // Reset color codes
|
2013-10-22 14:26:45 +02:00
|
|
|
}
|
|
|
|
|
2014-04-18 16:36:46 +02:00
|
|
|
public function colorize($text, $fgColor = null, $bgColor = null)
|
2013-10-22 14:26:45 +02:00
|
|
|
{
|
2014-04-18 16:36:46 +02:00
|
|
|
return $this->startColor($fgColor, $bgColor)
|
|
|
|
. $text
|
|
|
|
. "\033[0m"; // Reset color codes
|
2013-10-22 14:26:45 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
protected function fgColor($color)
|
|
|
|
{
|
|
|
|
if (! array_key_exists($color, $this->fgColors)) {
|
2014-08-27 16:03:15 +02:00
|
|
|
throw new IcingaException(
|
|
|
|
'There is no such foreground color: %s',
|
|
|
|
$color
|
|
|
|
);
|
2013-10-22 14:26:45 +02:00
|
|
|
}
|
|
|
|
return $this->fgColors[$color];
|
|
|
|
}
|
|
|
|
|
|
|
|
protected function bgColor($color)
|
|
|
|
{
|
|
|
|
if (! array_key_exists($color, $this->bgColors)) {
|
2014-08-27 16:03:15 +02:00
|
|
|
throw new IcingaException(
|
|
|
|
'There is no such background color: %s',
|
|
|
|
$color
|
|
|
|
);
|
2013-10-22 14:26:45 +02:00
|
|
|
}
|
|
|
|
return $this->bgColors[$color];
|
|
|
|
}
|
|
|
|
|
|
|
|
protected function startColor($fgColor = null, $bgColor = null)
|
|
|
|
{
|
|
|
|
$escape = "ESC[";
|
|
|
|
$parts = array();
|
|
|
|
if ($fgColor !== null
|
|
|
|
&& $bgColor !== null
|
|
|
|
&& ! array_key_exists($bgColor, $this->bgColors)
|
|
|
|
&& array_key_exists($bgColor, $this->fgColors)
|
|
|
|
&& array_key_exists($fgColor, $this->bgColors)
|
|
|
|
) {
|
|
|
|
$parts[] = '7'; // reverse video, negative image
|
|
|
|
$parts[] = $this->bgColor($fgColor);
|
|
|
|
$parts[] = $this->fgColor($bgColor);
|
|
|
|
} else {
|
|
|
|
if ($fgColor !== null) {
|
|
|
|
$parts[] = $this->fgColor($fgColor);
|
|
|
|
}
|
|
|
|
if ($bgColor !== null) {
|
|
|
|
$parts[] = $this->bgColor($bgColor);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (empty($parts)) {
|
|
|
|
return '';
|
|
|
|
}
|
|
|
|
return "\033[" . implode(';', $parts) . 'm';
|
|
|
|
}
|
|
|
|
}
|