0 && $cols > 0) { return [$rows, $cols]; } } // Worst-case, return an arbitrary 'standard' size return [25, 80]; } /** * Clear the screen and reset the cursor position */ public static function clear(): void { self::write(ANSI::CLEAR_SCREEN . ANSI::RESET_CURSOR); } /** * Pull input from the stdin stream. * * @codeCoverageIgnore * @param int $len * @return string */ public static function read(int $len = 128): string { $handle = fopen('php://stdin', 'rb'); if ($handle === false) { return ''; } $input = fread($handle, $len); fclose($handle); return (is_string($input)) ? $input : ''; } /** * Get the last key input from the terminal and convert to a * more useful format * * @return string|KeyType */ public static function readKey(): string|KeyType { $c = Terminal::read(); return match($c) { // Unambiguous mappings RawKeyCode::ARROW_DOWN => KeyType::ArrowDown, RawKeyCode::ARROW_LEFT => KeyType::ArrowLeft, RawKeyCode::ARROW_RIGHT => KeyType::ArrowRight, RawKeyCode::ARROW_UP => KeyType::ArrowUp, RawKeyCode::DELETE => KeyType::Delete, RawKeyCode::ENTER => KeyType::Enter, RawKeyCode::PAGE_DOWN => KeyType::PageDown, RawKeyCode::PAGE_UP => KeyType::PageUp, // Backspace RawKeyCode::CTRL('h'), RawKeyCode::BACKSPACE => KeyType::Backspace, // Escape RawKeyCode::CTRL('l'), RawKeyCode::ESCAPE => KeyType::Escape, // Home Key "\eOH", "\e[7~", "\e[1~", ANSI::RESET_CURSOR => KeyType::Home, // End Key "\eOF", "\e[4~", "\e[8~", "\e[F" => KeyType::End, default => $c, }; } /** * Ring the terminal bell */ public static function ding(): void { self::write(RawKeyCode::BELL); } /** * Write to the stdout stream * * @param string $str * @param int|NULL $len * @return int|false */ public static function write(string $str, int $len = NULL): int|false { $handle = fopen('php://stdout', 'ab'); if ($handle === false) { return false; } $res = (is_int($len)) ? fwrite($handle, $str, $len) : fwrite($handle, $str); fflush($handle); fclose($handle); return $res; } /** * See if tput exists for fallback terminal size detection * * @return bool */ private static function has_tput(): bool { $cmd = shell_exec('type tput'); if ( ! is_string($cmd)) { return FALSE; } return str_contains($cmd, ' is '); } }