You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
204 lines
3.9 KiB
204 lines
3.9 KiB
<?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; |
|
|
|
use Symfony\Component\Console\Output\OutputInterface; |
|
|
|
/** |
|
* @author Pierre du Plessis <pdples@gmail.com> |
|
*/ |
|
final class Cursor |
|
{ |
|
private OutputInterface $output; |
|
/** @var resource */ |
|
private $input; |
|
|
|
/** |
|
* @param resource|null $input |
|
*/ |
|
public function __construct(OutputInterface $output, $input = null) |
|
{ |
|
$this->output = $output; |
|
$this->input = $input ?? (\defined('STDIN') ? \STDIN : fopen('php://input', 'r+')); |
|
} |
|
|
|
/** |
|
* @return $this |
|
*/ |
|
public function moveUp(int $lines = 1): static |
|
{ |
|
$this->output->write(sprintf("\x1b[%dA", $lines)); |
|
|
|
return $this; |
|
} |
|
|
|
/** |
|
* @return $this |
|
*/ |
|
public function moveDown(int $lines = 1): static |
|
{ |
|
$this->output->write(sprintf("\x1b[%dB", $lines)); |
|
|
|
return $this; |
|
} |
|
|
|
/** |
|
* @return $this |
|
*/ |
|
public function moveRight(int $columns = 1): static |
|
{ |
|
$this->output->write(sprintf("\x1b[%dC", $columns)); |
|
|
|
return $this; |
|
} |
|
|
|
/** |
|
* @return $this |
|
*/ |
|
public function moveLeft(int $columns = 1): static |
|
{ |
|
$this->output->write(sprintf("\x1b[%dD", $columns)); |
|
|
|
return $this; |
|
} |
|
|
|
/** |
|
* @return $this |
|
*/ |
|
public function moveToColumn(int $column): static |
|
{ |
|
$this->output->write(sprintf("\x1b[%dG", $column)); |
|
|
|
return $this; |
|
} |
|
|
|
/** |
|
* @return $this |
|
*/ |
|
public function moveToPosition(int $column, int $row): static |
|
{ |
|
$this->output->write(sprintf("\x1b[%d;%dH", $row + 1, $column)); |
|
|
|
return $this; |
|
} |
|
|
|
/** |
|
* @return $this |
|
*/ |
|
public function savePosition(): static |
|
{ |
|
$this->output->write("\x1b7"); |
|
|
|
return $this; |
|
} |
|
|
|
/** |
|
* @return $this |
|
*/ |
|
public function restorePosition(): static |
|
{ |
|
$this->output->write("\x1b8"); |
|
|
|
return $this; |
|
} |
|
|
|
/** |
|
* @return $this |
|
*/ |
|
public function hide(): static |
|
{ |
|
$this->output->write("\x1b[?25l"); |
|
|
|
return $this; |
|
} |
|
|
|
/** |
|
* @return $this |
|
*/ |
|
public function show(): static |
|
{ |
|
$this->output->write("\x1b[?25h\x1b[?0c"); |
|
|
|
return $this; |
|
} |
|
|
|
/** |
|
* Clears all the output from the current line. |
|
* |
|
* @return $this |
|
*/ |
|
public function clearLine(): static |
|
{ |
|
$this->output->write("\x1b[2K"); |
|
|
|
return $this; |
|
} |
|
|
|
/** |
|
* Clears all the output from the current line after the current position. |
|
*/ |
|
public function clearLineAfter(): self |
|
{ |
|
$this->output->write("\x1b[K"); |
|
|
|
return $this; |
|
} |
|
|
|
/** |
|
* Clears all the output from the cursors' current position to the end of the screen. |
|
* |
|
* @return $this |
|
*/ |
|
public function clearOutput(): static |
|
{ |
|
$this->output->write("\x1b[0J"); |
|
|
|
return $this; |
|
} |
|
|
|
/** |
|
* Clears the entire screen. |
|
* |
|
* @return $this |
|
*/ |
|
public function clearScreen(): static |
|
{ |
|
$this->output->write("\x1b[2J"); |
|
|
|
return $this; |
|
} |
|
|
|
/** |
|
* Returns the current cursor position as x,y coordinates. |
|
*/ |
|
public function getCurrentPosition(): array |
|
{ |
|
static $isTtySupported; |
|
|
|
if (!$isTtySupported ??= '/' === \DIRECTORY_SEPARATOR && stream_isatty(\STDOUT)) { |
|
return [1, 1]; |
|
} |
|
|
|
$sttyMode = shell_exec('stty -g'); |
|
shell_exec('stty -icanon -echo'); |
|
|
|
@fwrite($this->input, "\033[6n"); |
|
|
|
$code = trim(fread($this->input, 1024)); |
|
|
|
shell_exec(sprintf('stty %s', $sttyMode)); |
|
|
|
sscanf($code, "\033[%d;%dR", $row, $col); |
|
|
|
return [$col, $row]; |
|
} |
|
}
|
|
|