Fixed line scrolling, prompt style
This commit is contained in:
		@@ -10,9 +10,11 @@ $shell = new NoccyLabs\React\Shell\Shell();
 | 
			
		||||
$commands = new CommandHandler();
 | 
			
		||||
$commands->add('help', function ($args, $shell) {
 | 
			
		||||
    $shell->write("This could be usage help :)\n");
 | 
			
		||||
    $shell->write("Exit by pressing ^C\n");
 | 
			
		||||
});
 | 
			
		||||
$commands->on('notfound', function ($command, $shell) {
 | 
			
		||||
    $shell->write("Command not found: {$command}. Try help\n");
 | 
			
		||||
$commands->on('command', function ($command, $args, $shell) {
 | 
			
		||||
    $shell->write("Bad command '{$command}', try help.\n");
 | 
			
		||||
    $shell->write("Arguments passed: ".json_encode($args)."\n");
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
$shell->on('prompt', function ($shell) { 
 | 
			
		||||
 
 | 
			
		||||
@@ -29,7 +29,7 @@ class CommandHandler implements EventEmitterInterface
 | 
			
		||||
        $command = array_shift($line);
 | 
			
		||||
 | 
			
		||||
        if (!array_key_exists($command, $this->commands)) {
 | 
			
		||||
            $this->emit("notfound", [ $command, $shell ]);
 | 
			
		||||
            $this->emit("command", [ $command, $line, $shell ]);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -4,6 +4,7 @@ namespace NoccyLabs\React\Shell;
 | 
			
		||||
 | 
			
		||||
use Evenement\EventEmitterInterface;
 | 
			
		||||
use Evenement\EventEmitterTrait;
 | 
			
		||||
use PgSql\Lob;
 | 
			
		||||
use React\EventLoop\Loop;
 | 
			
		||||
use React\Stream\ReadableResourceStream;
 | 
			
		||||
use React\Stream\ReadableStreamInterface;
 | 
			
		||||
@@ -34,6 +35,8 @@ class Shell implements WritableStreamInterface, EventEmitterInterface
 | 
			
		||||
 | 
			
		||||
    private int $promptWidth = 0;
 | 
			
		||||
 | 
			
		||||
    private string $promptStyle = "35;1";
 | 
			
		||||
 | 
			
		||||
    public function __construct(?ReadableStreamInterface $input=null, ?WritableStreamInterface $output=null)
 | 
			
		||||
    {
 | 
			
		||||
        $this->istream = $input ?? new ReadableResourceStream(STDIN);
 | 
			
		||||
@@ -97,7 +100,10 @@ class Shell implements WritableStreamInterface, EventEmitterInterface
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            case "\e[H": // home
 | 
			
		||||
                $this->cursorPos = 0;
 | 
			
		||||
                break;
 | 
			
		||||
            case "\e[F": // end
 | 
			
		||||
                $this->cursorPos = mb_strlen($this->buffer);
 | 
			
		||||
                break;
 | 
			
		||||
        
 | 
			
		||||
            case "\e[D": // left
 | 
			
		||||
@@ -121,6 +127,13 @@ class Shell implements WritableStreamInterface, EventEmitterInterface
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
        }
 | 
			
		||||
        if ($this->cursorPos < $this->scrollOffset) {
 | 
			
		||||
            $this->scrollOffset = $this->cursorPos;
 | 
			
		||||
        }
 | 
			
		||||
        $availWidth = $this->termWidth - $this->promptWidth;
 | 
			
		||||
        if ($this->cursorPos - $this->scrollOffset >= $availWidth) {
 | 
			
		||||
            $this->scrollOffset = abs($availWidth - $this->cursorPos) + 2;
 | 
			
		||||
        }
 | 
			
		||||
        $this->updatePrompt();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -129,7 +142,7 @@ class Shell implements WritableStreamInterface, EventEmitterInterface
 | 
			
		||||
    {
 | 
			
		||||
        $this->hidePrompt();
 | 
			
		||||
        $this->ostream->write($data);
 | 
			
		||||
        $this->redrawPrompt();
 | 
			
		||||
        Loop::futureTick($this->redrawPrompt(...));
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -175,7 +188,7 @@ class Shell implements WritableStreamInterface, EventEmitterInterface
 | 
			
		||||
 | 
			
		||||
        $pos = $this->promptWidth + $this->cursorPos - $this->scrollOffset + 1;
 | 
			
		||||
 | 
			
		||||
        $obuf = "\r" . "\e[1m" . $this->prompt . "\e[22m";
 | 
			
		||||
        $obuf = "\r" . "\e[{$this->promptStyle}m" . $this->prompt . "\e[0m";
 | 
			
		||||
        $ostr = mb_substr($this->buffer, $this->scrollOffset) . " ";
 | 
			
		||||
        $ostr = mb_substr($ostr, 0, $this->termWidth - $this->promptWidth);
 | 
			
		||||
        $obuf .= $ostr . "\e[K\e[" . $pos . "G";
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user