Class yii\helpers\BaseConsole
Inheritance | yii\helpers\BaseConsole |
---|---|
Subclasses | yii\helpers\Console |
Available since version | 2.0 |
Source Code | https://github.com/yiisoft/yii2/blob/master/framework/helpers/BaseConsole.php |
BaseConsole provides concrete implementation for yii\helpers\Console.
Do not use BaseConsole. Use yii\helpers\Console instead.
Public Methods
Method | Description | Defined By |
---|---|---|
ansiColorizedSubstr() | Returns the portion with ANSI color codes of string specified by the start and length parameters. | yii\helpers\BaseConsole |
ansiFormat() | Will return a string formatted with the given ANSI style. | yii\helpers\BaseConsole |
ansiFormatCode() | Returns the ANSI format code. | yii\helpers\BaseConsole |
ansiStrlen() | Returns the length of the string without ANSI color codes. | yii\helpers\BaseConsole |
ansiStrwidth() | Returns the width of the string without ANSI color codes. | yii\helpers\BaseConsole |
ansiToHtml() | Converts an ANSI formatted string to HTML. | yii\helpers\BaseConsole |
beginAnsiFormat() | Echoes an ANSI format code that affects the formatting of any text that is printed afterwards. | yii\helpers\BaseConsole |
clearLine() | Clears the line, the cursor is currently on by sending ANSI control code EL with argument 2 to the terminal. | yii\helpers\BaseConsole |
clearLineAfterCursor() | Clears text from cursor position to the end of the line by sending ANSI control code EL with argument 0 to the terminal. | yii\helpers\BaseConsole |
clearLineBeforeCursor() | Clears text from cursor position to the beginning of the line by sending ANSI control code EL with argument 1 to the terminal. | yii\helpers\BaseConsole |
clearScreen() | Clears entire screen content by sending ANSI control code ED with argument 2 to the terminal. | yii\helpers\BaseConsole |
clearScreenAfterCursor() | Clears text from cursor to the end of the screen by sending ANSI control code ED with argument 0 to the terminal. | yii\helpers\BaseConsole |
clearScreenBeforeCursor() | Clears text from cursor to the beginning of the screen by sending ANSI control code ED with argument 1 to the terminal. | yii\helpers\BaseConsole |
confirm() | Asks user to confirm by typing y or n. | yii\helpers\BaseConsole |
endAnsiFormat() | Resets any ANSI format set by previous method beginAnsiFormat() Any output after this will have default text format. | yii\helpers\BaseConsole |
endProgress() | Ends a progress bar that has been started by startProgress(). | yii\helpers\BaseConsole |
error() | Prints text to STDERR appended with a carriage return (PHP_EOL). | yii\helpers\BaseConsole |
errorSummary() | Generates a summary of the validation errors. | yii\helpers\BaseConsole |
escape() | Escapes % so they don't get interpreted as color codes when the string is parsed by renderColoredString(). | yii\helpers\BaseConsole |
getScreenSize() | Returns terminal screen size. | yii\helpers\BaseConsole |
hideCursor() | Hides the cursor by sending ANSI DECTCEM code ?25l to the terminal. | yii\helpers\BaseConsole |
input() | Asks the user for input. Ends when the user types a carriage return (PHP_EOL). Optionally, It also provides a prompt. | yii\helpers\BaseConsole |
isRunningOnWindows() | Returns true if the console is running on windows. | yii\helpers\BaseConsole |
markdownToAnsi() | Converts Markdown to be better readable in console environments by applying some ANSI format. | yii\helpers\BaseConsole |
moveCursorBackward() | Moves the terminal cursor backward by sending ANSI control code CUB to the terminal. | yii\helpers\BaseConsole |
moveCursorDown() | Moves the terminal cursor down by sending ANSI control code CUD to the terminal. | yii\helpers\BaseConsole |
moveCursorForward() | Moves the terminal cursor forward by sending ANSI control code CUF to the terminal. | yii\helpers\BaseConsole |
moveCursorNextLine() | Moves the terminal cursor to the beginning of the next line by sending ANSI control code CNL to the terminal. | yii\helpers\BaseConsole |
moveCursorPrevLine() | Moves the terminal cursor to the beginning of the previous line by sending ANSI control code CPL to the terminal. | yii\helpers\BaseConsole |
moveCursorTo() | Moves the cursor to an absolute position given as column and row by sending ANSI control code CUP or CHA to the terminal. | yii\helpers\BaseConsole |
moveCursorUp() | Moves the terminal cursor up by sending ANSI control code CUU to the terminal. | yii\helpers\BaseConsole |
output() | Prints text to STDOUT appended with a carriage return (PHP_EOL). | yii\helpers\BaseConsole |
prompt() | Prompts the user for input and validates it. | yii\helpers\BaseConsole |
renderColoredString() | Converts a string to ansi formatted by replacing patterns like %y (for yellow) with ansi control codes. | yii\helpers\BaseConsole |
restoreCursorPosition() | Restores the cursor position saved with saveCursorPosition() by sending ANSI control code RCP to the terminal. | yii\helpers\BaseConsole |
saveCursorPosition() | Saves the current cursor position by sending ANSI control code SCP to the terminal. | yii\helpers\BaseConsole |
scrollDown() | Scrolls whole page down by sending ANSI control code SD to the terminal. | yii\helpers\BaseConsole |
scrollUp() | Scrolls whole page up by sending ANSI control code SU to the terminal. | yii\helpers\BaseConsole |
select() | Gives the user an option to choose from. Giving '?' as an input will show a list of options to choose from and their explanations. | yii\helpers\BaseConsole |
showCursor() | Will show a cursor again when it has been hidden by hideCursor() by sending ANSI DECTCEM code ?25h to the terminal. | yii\helpers\BaseConsole |
startProgress() | Starts display of a progress bar on screen. | yii\helpers\BaseConsole |
stderr() | Prints a string to STDERR. | yii\helpers\BaseConsole |
stdin() | Gets input from STDIN and returns a string right-trimmed for EOLs. | yii\helpers\BaseConsole |
stdout() | Prints a string to STDOUT. | yii\helpers\BaseConsole |
streamSupportsAnsiColors() | Returns true if the stream supports colorization. ANSI colors are disabled if not supported by the stream. | yii\helpers\BaseConsole |
stripAnsiFormat() | Strips ANSI control codes from a string. | yii\helpers\BaseConsole |
updateProgress() | Updates a progress bar that has been started by startProgress(). | yii\helpers\BaseConsole |
wrapText() | Word wrap text with indentation to fit the screen size. | yii\helpers\BaseConsole |
xtermBgColor() | Returns the ansi format code for xterm background color. | yii\helpers\BaseConsole |
xtermFgColor() | Returns the ansi format code for xterm foreground color. | yii\helpers\BaseConsole |
Constants
Method Details
Returns the portion with ANSI color codes of string specified by the start and length parameters.
If string has color codes, then will be return "TEXT_COLOR + TEXT_STRING + DEFAULT_COLOR", else will be simple "TEXT_STRING".
public static string ansiColorizedSubstr ( $string, $start, $length ) | ||
$string | string | |
$start | integer | |
$length | integer |
public static function ansiColorizedSubstr($string, $start, $length)
{
if ($start < 0 || $length <= 0) {
return '';
}
$textItems = preg_split(self::ansiCodesPattern(), (string)$string);
preg_match_all(self::ansiCodesPattern(), (string)$string, $colors);
$colors = count($colors) ? $colors[0] : [];
array_unshift($colors, '');
$result = '';
$curPos = 0;
$inRange = false;
foreach ($textItems as $k => $textItem) {
$color = $colors[$k];
if ($curPos <= $start && $start < $curPos + Console::ansiStrwidth($textItem)) {
$text = mb_substr($textItem, $start - $curPos, null, Yii::$app->charset);
$inRange = true;
} else {
$text = $textItem;
}
if ($inRange) {
$result .= $color . $text;
$diff = $length - Console::ansiStrwidth($result);
if ($diff <= 0) {
if ($diff < 0) {
$result = mb_substr($result, 0, $diff, Yii::$app->charset);
}
$defaultColor = static::renderColoredString('%n');
if ($color && $color != $defaultColor) {
$result .= $defaultColor;
}
break;
}
}
$curPos += mb_strlen($textItem, Yii::$app->charset);
}
return $result;
}
Will return a string formatted with the given ANSI style.
public static string ansiFormat ( $string, $format = [] ) | ||
$string | string |
The string to be formatted |
$format | array |
An array containing formatting values.
You can pass any of the |
public static function ansiFormat($string, $format = [])
{
$code = implode(';', $format);
return "\033[0m" . ($code !== '' ? "\033[" . $code . 'm' : '') . $string . "\033[0m";
}
Returns the ANSI format code.
public static string ansiFormatCode ( $format ) | ||
$format | array |
An array containing formatting values.
You can pass any of the |
return | string |
The ANSI format code according to the given formatting constants. |
---|
public static function ansiFormatCode($format)
{
return "\033[" . implode(';', $format) . 'm';
}
Returns the length of the string without ANSI color codes.
public static integer ansiStrlen ( $string ) | ||
$string | string |
The string to measure |
return | integer |
The length of the string not counting ANSI format characters |
---|
public static function ansiStrlen($string)
{
return mb_strlen(static::stripAnsiFormat($string));
}
Returns the width of the string without ANSI color codes.
public static integer ansiStrwidth ( $string ) | ||
$string | string |
The string to measure |
return | integer |
The width of the string not counting ANSI format characters |
---|
public static function ansiStrwidth($string)
{
return mb_strwidth(static::stripAnsiFormat($string), Yii::$app->charset);
}
Converts an ANSI formatted string to HTML.
Note: xTerm 256 bit colors are currently not supported.
public static string ansiToHtml ( $string, $styleMap = [] ) | ||
$string | string |
The string to convert. |
$styleMap | array |
An optional mapping of ANSI control codes such as
FG_COLOR or BOLD to a set of css style definitions.
The CSS style definitions are represented as an array where the array keys correspond
to the css style attribute names and the values are the css values.
values may be arrays that will be merged and imploded with |
return | string |
HTML representation of the ANSI formatted string |
---|
public static function ansiToHtml($string, $styleMap = [])
{
$styleMap = [
// https://www.w3.org/TR/CSS2/syndata.html#value-def-color
self::FG_BLACK => ['color' => 'black'],
self::FG_BLUE => ['color' => 'blue'],
self::FG_CYAN => ['color' => 'aqua'],
self::FG_GREEN => ['color' => 'lime'],
self::FG_GREY => ['color' => 'silver'],
// https://meyerweb.com/eric/thoughts/2014/06/19/rebeccapurple/
// https://drafts.csswg.org/css-color/#valuedef-rebeccapurple
self::FG_PURPLE => ['color' => 'rebeccapurple'],
self::FG_RED => ['color' => 'red'],
self::FG_YELLOW => ['color' => 'yellow'],
self::BG_BLACK => ['background-color' => 'black'],
self::BG_BLUE => ['background-color' => 'blue'],
self::BG_CYAN => ['background-color' => 'aqua'],
self::BG_GREEN => ['background-color' => 'lime'],
self::BG_GREY => ['background-color' => 'silver'],
self::BG_PURPLE => ['background-color' => 'rebeccapurple'],
self::BG_RED => ['background-color' => 'red'],
self::BG_YELLOW => ['background-color' => 'yellow'],
self::BOLD => ['font-weight' => 'bold'],
self::ITALIC => ['font-style' => 'italic'],
self::UNDERLINE => ['text-decoration' => ['underline']],
self::OVERLINED => ['text-decoration' => ['overline']],
self::CROSSED_OUT => ['text-decoration' => ['line-through']],
self::BLINK => ['text-decoration' => ['blink']],
self::CONCEALED => ['visibility' => 'hidden'],
] + $styleMap;
$tags = 0;
$result = preg_replace_callback(
'/\033\[([\d;]+)m/',
function ($ansi) use (&$tags, $styleMap) {
$style = [];
$reset = false;
$negative = false;
foreach (explode(';', $ansi[1]) as $controlCode) {
if ($controlCode == 0) {
$style = [];
$reset = true;
} elseif ($controlCode == self::NEGATIVE) {
$negative = true;
} elseif (isset($styleMap[$controlCode])) {
$style[] = $styleMap[$controlCode];
}
}
$return = '';
while ($reset && $tags > 0) {
$return .= '</span>';
$tags--;
}
if (empty($style)) {
return $return;
}
$currentStyle = [];
foreach ($style as $content) {
$currentStyle = ArrayHelper::merge($currentStyle, $content);
}
// if negative is set, invert background and foreground
if ($negative) {
if (isset($currentStyle['color'])) {
$fgColor = $currentStyle['color'];
unset($currentStyle['color']);
}
if (isset($currentStyle['background-color'])) {
$bgColor = $currentStyle['background-color'];
unset($currentStyle['background-color']);
}
if (isset($fgColor)) {
$currentStyle['background-color'] = $fgColor;
}
if (isset($bgColor)) {
$currentStyle['color'] = $bgColor;
}
}
$styleString = '';
foreach ($currentStyle as $name => $value) {
if (is_array($value)) {
$value = implode(' ', $value);
}
$styleString .= "$name: $value;";
}
$tags++;
return "$return<span style=\"$styleString\">";
},
$string
);
while ($tags > 0) {
$result .= '</span>';
$tags--;
}
return $result;
}
Echoes an ANSI format code that affects the formatting of any text that is printed afterwards.
See also:
public static void beginAnsiFormat ( $format ) | ||
$format | array |
An array containing formatting values.
You can pass any of the |
public static function beginAnsiFormat($format)
{
echo "\033[" . implode(';', $format) . 'm';
}
Clears the line, the cursor is currently on by sending ANSI control code EL with argument 2 to the terminal.
Cursor position will not be changed.
public static void clearLine ( ) |
public static function clearLine()
{
echo "\033[2K";
}
Clears text from cursor position to the end of the line by sending ANSI control code EL with argument 0 to the terminal.
Cursor position will not be changed.
public static void clearLineAfterCursor ( ) |
public static function clearLineAfterCursor()
{
echo "\033[0K";
}
Clears text from cursor position to the beginning of the line by sending ANSI control code EL with argument 1 to the terminal.
Cursor position will not be changed.
public static void clearLineBeforeCursor ( ) |
public static function clearLineBeforeCursor()
{
echo "\033[1K";
}
Clears entire screen content by sending ANSI control code ED with argument 2 to the terminal.
Cursor position will not be changed. Note: ANSI.SYS implementation used in windows will reset cursor position to upper left corner of the screen.
public static void clearScreen ( ) |
public static function clearScreen()
{
echo "\033[2J";
}
Clears text from cursor to the end of the screen by sending ANSI control code ED with argument 0 to the terminal.
Cursor position will not be changed.
public static void clearScreenAfterCursor ( ) |
public static function clearScreenAfterCursor()
{
echo "\033[0J";
}
Clears text from cursor to the beginning of the screen by sending ANSI control code ED with argument 1 to the terminal.
Cursor position will not be changed.
public static void clearScreenBeforeCursor ( ) |
public static function clearScreenBeforeCursor()
{
echo "\033[1J";
}
Asks user to confirm by typing y or n.
A typical usage looks like the following:
if (Console::confirm("Are you sure?")) {
echo "user typed yes\n";
} else {
echo "user typed no\n";
}
public static boolean confirm ( $message, $default = false ) | ||
$message | string |
To print out before waiting for user input |
$default | boolean |
This value is returned if no selection is made. |
return | boolean |
Whether user confirmed |
---|
public static function confirm($message, $default = false)
{
while (true) {
static::stdout($message . ' (yes|no) [' . ($default ? 'yes' : 'no') . ']:');
$input = trim(static::stdin());
if (empty($input)) {
return $default;
}
if (!strcasecmp($input, 'y') || !strcasecmp($input, 'yes')) {
return true;
}
if (!strcasecmp($input, 'n') || !strcasecmp($input, 'no')) {
return false;
}
}
}
Resets any ANSI format set by previous method beginAnsiFormat() Any output after this will have default text format.
This is equal to calling.
echo Console::ansiFormatCode([Console::RESET])
public static void endAnsiFormat ( ) |
public static function endAnsiFormat()
{
echo "\033[0m";
}
Ends a progress bar that has been started by startProgress().
See also:
public static void endProgress ( $remove = false, $keepPrefix = true ) | ||
$remove | string|boolean |
This can be |
$keepPrefix | boolean |
Whether to keep the prefix that has been specified for the progressbar when progressbar gets removed. Defaults to true. |
public static function endProgress($remove = false, $keepPrefix = true)
{
if ($remove === false) {
static::stdout(PHP_EOL);
} else {
if (static::streamSupportsAnsiColors(STDOUT)) {
static::clearLine();
}
static::stdout("\r" . ($keepPrefix ? self::$_progressPrefix : '') . (is_string($remove) ? $remove : ''));
}
flush();
self::$_progressStart = null;
self::$_progressWidth = null;
self::$_progressPrefix = '';
self::$_progressEta = null;
self::$_progressEtaLastDone = 0;
self::$_progressEtaLastUpdate = null;
}
Prints text to STDERR appended with a carriage return (PHP_EOL).
public static integer|boolean error ( $string = null ) | ||
$string | string|null |
The text to print |
return | integer|boolean |
Number of bytes printed or false on error. |
---|
public static function error($string = null)
{
return static::stderr($string . PHP_EOL);
}
Generates a summary of the validation errors.
public static string errorSummary ( $models, $options = [] ) | ||
$models | yii\base\Model|yii\base\Model[] |
The model(s) whose validation errors are to be displayed. |
$options | array |
The tag options in terms of name-value pairs. The following options are specially handled:
|
return | string |
The generated error summary |
---|
public static function errorSummary($models, $options = [])
{
$showAllErrors = ArrayHelper::remove($options, 'showAllErrors', false);
$lines = self::collectErrors($models, $showAllErrors);
return implode(PHP_EOL, $lines);
}
Escapes % so they don't get interpreted as color codes when the string is parsed by renderColoredString().
public static string escape ( $string ) | ||
$string | string |
String to escape |
public static function escape($string)
{
// TODO rework/refactor according to https://github.com/yiisoft/yii2/issues/746
return str_replace('%', '%%', $string);
}
Returns terminal screen size.
Usage:
list($width, $height) = ConsoleHelper::getScreenSize();
public static array|boolean getScreenSize ( $refresh = false ) | ||
$refresh | boolean |
Whether to force checking and not re-use cached size value. This is useful to detect changing window size while the application is running but may not get up to date values on every terminal. |
return | array|boolean |
An array of ($width, $height) or false when it was not able to determine size. |
---|
public static function getScreenSize($refresh = false)
{
static $size;
static $execDisabled;
if ($size !== null && ($execDisabled || !$refresh)) {
return $size;
}
if ($execDisabled === null) {
$execDisabled = !function_exists('ini_get') || preg_match('/(\bexec\b)/i', ini_get('disable_functions'));
if ($execDisabled) {
return $size = false;
}
}
if (static::isRunningOnWindows()) {
$output = [];
exec('mode con', $output);
if (isset($output[1]) && strpos($output[1], 'CON') !== false) {
return $size = [(int) preg_replace('~\D~', '', $output[4]), (int) preg_replace('~\D~', '', $output[3])];
}
} else {
// try stty if available
$stty = [];
if (exec('stty -a 2>&1', $stty)) {
$stty = implode(' ', $stty);
// Linux stty output
if (preg_match('/rows\s+(\d+);\s*columns\s+(\d+);/mi', $stty, $matches)) {
return $size = [(int) $matches[2], (int) $matches[1]];
}
// MacOS stty output
if (preg_match('/(\d+)\s+rows;\s*(\d+)\s+columns;/mi', $stty, $matches)) {
return $size = [(int) $matches[2], (int) $matches[1]];
}
}
// fallback to tput, which may not be updated on terminal resize
if (($width = (int) exec('tput cols 2>&1')) > 0 && ($height = (int) exec('tput lines 2>&1')) > 0) {
return $size = [$width, $height];
}
// fallback to ENV variables, which may not be updated on terminal resize
if (($width = (int) getenv('COLUMNS')) > 0 && ($height = (int) getenv('LINES')) > 0) {
return $size = [$width, $height];
}
}
return $size = false;
}
Hides the cursor by sending ANSI DECTCEM code ?25l to the terminal.
Use showCursor() to bring it back. Do not forget to show cursor when your application exits. Cursor might stay hidden in terminal after exit.
public static void hideCursor ( ) |
public static function hideCursor()
{
echo "\033[?25l";
}
Asks the user for input. Ends when the user types a carriage return (PHP_EOL). Optionally, It also provides a prompt.
public static string input ( $prompt = null ) | ||
$prompt | string|null |
The prompt to display before waiting for input (optional) |
return | string |
The user's input |
---|
public static function input($prompt = null)
{
if (isset($prompt)) {
static::stdout($prompt);
}
return static::stdin();
}
Returns true if the console is running on windows.
public static boolean isRunningOnWindows ( ) |
public static function isRunningOnWindows()
{
return DIRECTORY_SEPARATOR === '\\';
}
Converts Markdown to be better readable in console environments by applying some ANSI format.
public static string markdownToAnsi ( $markdown ) | ||
$markdown | string |
The markdown string. |
return | string |
The parsed result as ANSI formatted string. |
---|
public static function markdownToAnsi($markdown)
{
$parser = new ConsoleMarkdown();
return $parser->parse($markdown);
}
Moves the terminal cursor backward by sending ANSI control code CUB to the terminal.
If the cursor is already at the edge of the screen, this has no effect.
public static void moveCursorBackward ( $steps = 1 ) | ||
$steps | integer |
Number of steps the cursor should be moved backward |
public static function moveCursorBackward($steps = 1)
{
echo "\033[" . (int) $steps . 'D';
}
Moves the terminal cursor down by sending ANSI control code CUD to the terminal.
If the cursor is already at the edge of the screen, this has no effect.
public static void moveCursorDown ( $rows = 1 ) | ||
$rows | integer |
Number of rows the cursor should be moved down |
public static function moveCursorDown($rows = 1)
{
echo "\033[" . (int) $rows . 'B';
}
Moves the terminal cursor forward by sending ANSI control code CUF to the terminal.
If the cursor is already at the edge of the screen, this has no effect.
public static void moveCursorForward ( $steps = 1 ) | ||
$steps | integer |
Number of steps the cursor should be moved forward |
public static function moveCursorForward($steps = 1)
{
echo "\033[" . (int) $steps . 'C';
}
Moves the terminal cursor to the beginning of the next line by sending ANSI control code CNL to the terminal.
public static void moveCursorNextLine ( $lines = 1 ) | ||
$lines | integer |
Number of lines the cursor should be moved down |
public static function moveCursorNextLine($lines = 1)
{
echo "\033[" . (int) $lines . 'E';
}
Moves the terminal cursor to the beginning of the previous line by sending ANSI control code CPL to the terminal.
public static void moveCursorPrevLine ( $lines = 1 ) | ||
$lines | integer |
Number of lines the cursor should be moved up |
public static function moveCursorPrevLine($lines = 1)
{
echo "\033[" . (int) $lines . 'F';
}
Moves the cursor to an absolute position given as column and row by sending ANSI control code CUP or CHA to the terminal.
public static void moveCursorTo ( $column, $row = null ) | ||
$column | integer |
1-based column number, 1 is the left edge of the screen. |
$row | integer|null |
1-based row number, 1 is the top edge of the screen. if not set, will move cursor only in current line. |
public static function moveCursorTo($column, $row = null)
{
if ($row === null) {
echo "\033[" . (int) $column . 'G';
} else {
echo "\033[" . (int) $row . ';' . (int) $column . 'H';
}
}
Moves the terminal cursor up by sending ANSI control code CUU to the terminal.
If the cursor is already at the edge of the screen, this has no effect.
public static void moveCursorUp ( $rows = 1 ) | ||
$rows | integer |
Number of rows the cursor should be moved up |
public static function moveCursorUp($rows = 1)
{
echo "\033[" . (int) $rows . 'A';
}
Prints text to STDOUT appended with a carriage return (PHP_EOL).
public static integer|boolean output ( $string = null ) | ||
$string | string|null |
The text to print |
return | integer|boolean |
Number of bytes printed or false on error. |
---|
public static function output($string = null)
{
return static::stdout($string . PHP_EOL);
}
Prompts the user for input and validates it.
public static string prompt ( $text, $options = [] ) | ||
$text | string |
Prompt string |
$options | array |
The options to validate the input:
|
return | string |
The user input |
---|
public static function prompt($text, $options = [])
{
$options = ArrayHelper::merge(
[
'required' => false,
'default' => null,
'pattern' => null,
'validator' => null,
'error' => 'Invalid input.',
],
$options
);
$error = null;
top:
$input = $options['default']
? static::input("$text [" . $options['default'] . '] ')
: static::input("$text ");
if ($input === '') {
if (isset($options['default'])) {
$input = $options['default'];
} elseif ($options['required']) {
static::output($options['error']);
goto top;
}
} elseif ($options['pattern'] && !preg_match($options['pattern'], $input)) {
static::output($options['error']);
goto top;
} elseif ($options['validator'] &&
!call_user_func_array($options['validator'], [$input, &$error])
) {
static::output(isset($error) ? $error : $options['error']);
goto top;
}
return $input;
}
Converts a string to ansi formatted by replacing patterns like %y (for yellow) with ansi control codes.
Uses almost the same syntax as https://github.com/pear/Console_Color2/blob/master/Console/Color2.php The conversion table is: ('bold' meaning 'light' on some terminals). It's almost the same conversion table irssi uses.
text text background
------------------------------------------------
%k %K %0 black dark grey black
%r %R %1 red bold red red
%g %G %2 green bold green green
%y %Y %3 yellow bold yellow yellow
%b %B %4 blue bold blue blue
%m %M %5 magenta bold magenta magenta
%p %P magenta (think: purple)
%c %C %6 cyan bold cyan cyan
%w %W %7 white bold white white
%F Blinking, Flashing
%U Underline
%8 Reverse
%_,%9 Bold
%n Resets the color
%% A single %
First param is the string to convert, second is an optional flag if
colors should be used. It defaults to true, if set to false, the
color codes will just be removed (And %% will be transformed into %)
public static string renderColoredString ( $string, $colored = true ) | ||
$string | string |
String to convert |
$colored | boolean |
Should the string be colored? |
public static function renderColoredString($string, $colored = true)
{
// TODO rework/refactor according to https://github.com/yiisoft/yii2/issues/746
static $conversions = [
'%y' => [self::FG_YELLOW],
'%g' => [self::FG_GREEN],
'%b' => [self::FG_BLUE],
'%r' => [self::FG_RED],
'%p' => [self::FG_PURPLE],
'%m' => [self::FG_PURPLE],
'%c' => [self::FG_CYAN],
'%w' => [self::FG_GREY],
'%k' => [self::FG_BLACK],
'%n' => [0], // reset
'%Y' => [self::FG_YELLOW, self::BOLD],
'%G' => [self::FG_GREEN, self::BOLD],
'%B' => [self::FG_BLUE, self::BOLD],
'%R' => [self::FG_RED, self::BOLD],
'%P' => [self::FG_PURPLE, self::BOLD],
'%M' => [self::FG_PURPLE, self::BOLD],
'%C' => [self::FG_CYAN, self::BOLD],
'%W' => [self::FG_GREY, self::BOLD],
'%K' => [self::FG_BLACK, self::BOLD],
'%N' => [0, self::BOLD],
'%3' => [self::BG_YELLOW],
'%2' => [self::BG_GREEN],
'%4' => [self::BG_BLUE],
'%1' => [self::BG_RED],
'%5' => [self::BG_PURPLE],
'%6' => [self::BG_CYAN],
'%7' => [self::BG_GREY],
'%0' => [self::BG_BLACK],
'%F' => [self::BLINK],
'%U' => [self::UNDERLINE],
'%8' => [self::NEGATIVE],
'%9' => [self::BOLD],
'%_' => [self::BOLD],
];
if ($colored) {
$string = str_replace('%%', '% ', $string);
foreach ($conversions as $key => $value) {
$string = str_replace(
$key,
static::ansiFormatCode($value),
$string
);
}
$string = str_replace('% ', '%', $string);
} else {
$string = preg_replace('/%((%)|.)/', '$2', $string);
}
return $string;
}
Restores the cursor position saved with saveCursorPosition() by sending ANSI control code RCP to the terminal.
public static void restoreCursorPosition ( ) |
public static function restoreCursorPosition()
{
echo "\033[u";
}
Saves the current cursor position by sending ANSI control code SCP to the terminal.
Position can then be restored with restoreCursorPosition().
public static void saveCursorPosition ( ) |
public static function saveCursorPosition()
{
echo "\033[s";
}
Scrolls whole page down by sending ANSI control code SD to the terminal.
New lines are added at the top. This is not supported by ANSI.SYS used in windows.
public static void scrollDown ( $lines = 1 ) | ||
$lines | integer |
Number of lines to scroll down |
public static function scrollDown($lines = 1)
{
echo "\033[" . (int) $lines . 'T';
}
Scrolls whole page up by sending ANSI control code SU to the terminal.
New lines are added at the bottom. This is not supported by ANSI.SYS used in windows.
public static void scrollUp ( $lines = 1 ) | ||
$lines | integer |
Number of lines to scroll up |
public static function scrollUp($lines = 1)
{
echo "\033[" . (int) $lines . 'S';
}
Gives the user an option to choose from. Giving '?' as an input will show a list of options to choose from and their explanations.
public static string select ( $prompt, $options = [] ) | ||
$prompt | string |
The prompt message |
$options | array |
Key-value array of options to choose from. Key is what is inputed and used, value is what's displayed to end user by help command. |
return | string |
An option character the user chose |
---|
public static function select($prompt, $options = [])
{
top:
static::stdout("$prompt [" . implode(',', array_keys($options)) . ',?]: ');
$input = static::stdin();
if ($input === '?') {
foreach ($options as $key => $value) {
static::output(" $key - $value");
}
static::output(' ? - Show help');
goto top;
} elseif (!array_key_exists($input, $options)) {
goto top;
}
return $input;
}
Will show a cursor again when it has been hidden by hideCursor() by sending ANSI DECTCEM code ?25h to the terminal.
public static void showCursor ( ) |
public static function showCursor()
{
echo "\033[?25h";
}
Starts display of a progress bar on screen.
This bar will be updated by updateProgress() and may be ended by endProgress().
The following example shows a simple usage of a progress bar:
Console::startProgress(0, 1000);
for ($n = 1; $n <= 1000; $n++) {
usleep(1000);
Console::updateProgress($n, 1000);
}
Console::endProgress();
Git clone like progress (showing only status information):
Console::startProgress(0, 1000, 'Counting objects: ', false);
for ($n = 1; $n <= 1000; $n++) {
usleep(1000);
Console::updateProgress($n, 1000);
}
Console::endProgress("done." . PHP_EOL);
See also:
public static void startProgress ( $done, $total, $prefix = '', $width = null ) | ||
$done | integer |
The number of items that are completed. |
$total | integer |
The total value of items that are to be done. |
$prefix | string |
An optional string to display before the progress bar. Default to empty string which results in no prefix to be displayed. |
$width | integer|float|boolean|null |
Optional width of the progressbar. This can be an integer representing the number of characters to display for the progress bar or a float between 0 and 1 representing the percentage of screen with the progress bar may take. It can also be set to false to disable the bar and only show progress information like percent, number of items and ETA. If not set, the bar will be as wide as the screen. Screen size will be detected using getScreenSize(). |
public static function startProgress($done, $total, $prefix = '', $width = null)
{
self::$_progressStart = time();
self::$_progressWidth = $width;
self::$_progressPrefix = $prefix;
self::$_progressEta = null;
self::$_progressEtaLastDone = 0;
self::$_progressEtaLastUpdate = time();
static::updateProgress($done, $total);
}
Prints a string to STDERR.
public static integer|boolean stderr ( $string ) | ||
$string | string |
The string to print |
return | integer|boolean |
Number of bytes printed or false on error |
---|
public static function stderr($string)
{
return fwrite(\STDERR, $string);
}
Gets input from STDIN and returns a string right-trimmed for EOLs.
public static string stdin ( $raw = false ) | ||
$raw | boolean |
If set to true, returns the raw string without trimming |
return | string |
The string read from stdin |
---|
public static function stdin($raw = false)
{
return $raw ? fgets(\STDIN) : rtrim(fgets(\STDIN), PHP_EOL);
}
Prints a string to STDOUT.
public static integer|boolean stdout ( $string ) | ||
$string | string |
The string to print |
return | integer|boolean |
Number of bytes printed or false on error |
---|
public static function stdout($string)
{
return fwrite(\STDOUT, $string);
}
Returns true if the stream supports colorization. ANSI colors are disabled if not supported by the stream.
- windows without ansicon
- not tty consoles
public static boolean streamSupportsAnsiColors ( $stream ) | ||
$stream | mixed | |
return | boolean |
True if the stream supports ANSI colors, otherwise false. |
---|
public static function streamSupportsAnsiColors($stream)
{
return DIRECTORY_SEPARATOR === '\\'
? getenv('ANSICON') !== false || getenv('ConEmuANSI') === 'ON'
: function_exists('posix_isatty') && @posix_isatty($stream);
}
Strips ANSI control codes from a string.
public static string stripAnsiFormat ( $string ) | ||
$string | string |
String to strip |
public static function stripAnsiFormat($string)
{
return preg_replace(self::ansiCodesPattern(), '', (string)$string);
}
Updates a progress bar that has been started by startProgress().
See also:
public static void updateProgress ( $done, $total, $prefix = null ) | ||
$done | integer |
The number of items that are completed. |
$total | integer |
The total value of items that are to be done. |
$prefix | string|null |
An optional string to display before the progress bar. Defaults to null meaning the prefix specified by startProgress() will be used. If prefix is specified it will update the prefix that will be used by later calls. |
public static function updateProgress($done, $total, $prefix = null)
{
if ($prefix === null) {
$prefix = self::$_progressPrefix;
} else {
self::$_progressPrefix = $prefix;
}
$width = static::getProgressbarWidth($prefix);
$percent = ($total == 0) ? 1 : $done / $total;
$info = sprintf('%d%% (%d/%d)', $percent * 100, $done, $total);
self::setETA($done, $total);
$info .= self::$_progressEta === null ? ' ETA: n/a' : sprintf(' ETA: %d sec.', self::$_progressEta);
// Number extra characters outputted. These are opening [, closing ], and space before info
// Since Windows uses \r\n\ for line endings, there's one more in the case
$extraChars = static::isRunningOnWindows() ? 4 : 3;
$width -= $extraChars + static::ansiStrlen($info);
// skipping progress bar on very small display or if forced to skip
if ($width < 5) {
static::stdout("\r$prefix$info ");
} else {
if ($percent < 0) {
$percent = 0;
} elseif ($percent > 1) {
$percent = 1;
}
$bar = floor($percent * $width);
$status = str_repeat('=', $bar);
if ($bar < $width) {
$status .= '>';
$status .= str_repeat(' ', $width - $bar - 1);
}
static::stdout("\r$prefix" . "[$status] $info");
}
flush();
}
Word wrap text with indentation to fit the screen size.
If screen size could not be detected, or the indentation is greater than the screen size, the text will not be wrapped.
The first line will not be indented, so Console::wrapText("Lorem ipsum dolor sit amet.", 4)
will result in the
following output, given the screen width is 16 characters:
Lorem ipsum
dolor sit
amet.
public static string wrapText ( $text, $indent = 0, $refresh = false ) | ||
$text | string |
The text to be wrapped |
$indent | integer |
Number of spaces to use for indentation. |
$refresh | boolean |
Whether to force refresh of screen size. This will be passed to getScreenSize(). |
return | string |
The wrapped text. |
---|
public static function wrapText($text, $indent = 0, $refresh = false)
{
$size = static::getScreenSize($refresh);
if ($size === false || $size[0] <= $indent) {
return $text;
}
$pad = str_repeat(' ', $indent);
$lines = explode("\n", wordwrap($text, $size[0] - $indent, "\n"));
$first = true;
foreach ($lines as $i => $line) {
if ($first) {
$first = false;
continue;
}
$lines[$i] = $pad . $line;
}
return implode("\n", $lines);
}
Returns the ansi format code for xterm background color.
You can pass the return value of this to one of the formatting methods: ansiFormat(), ansiFormatCode(), beginAnsiFormat().
See also https://en.wikipedia.org/wiki/Talk:ANSI_escape_code#xterm-256colors.
public static string xtermBgColor ( $colorCode ) | ||
$colorCode | integer |
Xterm color code |
public static function xtermBgColor($colorCode)
{
return '48;5;' . $colorCode;
}
Returns the ansi format code for xterm foreground color.
You can pass the return value of this to one of the formatting methods: ansiFormat(), ansiFormatCode(), beginAnsiFormat().
See also https://en.wikipedia.org/wiki/Talk:ANSI_escape_code#xterm-256colors.
public static string xtermFgColor ( $colorCode ) | ||
$colorCode | integer |
Xterm color code |
public static function xtermFgColor($colorCode)
{
return '38;5;' . $colorCode;
}