ci-bonfire /
Sprint
This project does not seem to handle request data directly as such no vulnerable execution paths were found.
include, or for example
via PHP's auto-loading mechanism.
These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
| 1 | <?php |
||
| 2 | /** |
||
| 3 | * Part of the Fuel framework. |
||
| 4 | * |
||
| 5 | * @package Fuel |
||
| 6 | * @version 1.7 |
||
| 7 | * @author Fuel Development Team |
||
| 8 | * @license MIT License |
||
| 9 | * @copyright 2010 - 2013 Fuel Development Team |
||
| 10 | * @link http://fuelphp.com |
||
| 11 | */ |
||
| 12 | |||
| 13 | /** |
||
| 14 | * Modified to work with CodeIgniter by Lonnie Ezell. |
||
| 15 | * And provided additional features and tools, like the progress bar |
||
| 16 | * and different option handling. |
||
| 17 | */ |
||
| 18 | |||
| 19 | namespace Myth; |
||
| 20 | |||
| 21 | /** |
||
| 22 | * Cli class |
||
| 23 | * |
||
| 24 | * Interact with the command line by accepting input options, parameters and output text |
||
| 25 | * |
||
| 26 | * @package Fuel |
||
| 27 | * @category Core |
||
| 28 | * @author Phil Sturgeon |
||
| 29 | * @link http://docs.fuelphp.com/classes/cli.html |
||
| 30 | */ |
||
| 31 | class CLI { |
||
| 32 | |||
| 33 | public static $readline_support = false; |
||
| 34 | |||
| 35 | public static $wait_msg = 'Press any key to continue...'; |
||
| 36 | |||
| 37 | public static $segments = []; |
||
| 38 | |||
| 39 | protected static $options = []; |
||
| 40 | |||
| 41 | protected static $initialized = false; |
||
| 42 | |||
| 43 | // Used by progress bar |
||
| 44 | protected static $inProgress = false; |
||
| 45 | |||
| 46 | protected static $foreground_colors = array( |
||
| 47 | 'black' => '0;30', |
||
| 48 | 'dark_gray' => '1;30', |
||
| 49 | 'blue' => '0;34', |
||
| 50 | 'dark_blue' => '1;34', |
||
| 51 | 'light_blue' => '1;34', |
||
| 52 | 'green' => '0;32', |
||
| 53 | 'light_green' => '1;32', |
||
| 54 | 'cyan' => '0;36', |
||
| 55 | 'light_cyan' => '1;36', |
||
| 56 | 'red' => '0;31', |
||
| 57 | 'light_red' => '1;31', |
||
| 58 | 'purple' => '0;35', |
||
| 59 | 'light_purple' => '1;35', |
||
| 60 | 'light_yellow' => '0;33', |
||
| 61 | 'yellow' => '1;33', |
||
| 62 | 'light_gray' => '0;37', |
||
| 63 | 'white' => '1;37', |
||
| 64 | ); |
||
| 65 | |||
| 66 | protected static $background_colors = array( |
||
| 67 | 'black' => '40', |
||
| 68 | 'red' => '41', |
||
| 69 | 'green' => '42', |
||
| 70 | 'yellow' => '43', |
||
| 71 | 'blue' => '44', |
||
| 72 | 'magenta' => '45', |
||
| 73 | 'cyan' => '46', |
||
| 74 | 'light_gray' => '47', |
||
| 75 | ); |
||
| 76 | |||
| 77 | //-------------------------------------------------------------------- |
||
| 78 | |||
| 79 | /** |
||
| 80 | * Static constructor. Parses all the CLI params. |
||
| 81 | */ |
||
| 82 | public static function _init() |
||
| 83 | { |
||
| 84 | if (static::$initialized === true) |
||
| 85 | { |
||
| 86 | return; |
||
| 87 | } |
||
| 88 | |||
| 89 | if ( ! (PHP_SAPI === 'cli' || defined('STDIN')) ) |
||
| 90 | { |
||
| 91 | throw new \Exception('Cli class cannot be used outside of the command line.'); |
||
| 92 | } |
||
| 93 | |||
| 94 | self::parseCommand(); |
||
| 95 | |||
| 96 | // Readline is an extension for PHP that makes interactive with PHP much more bash-like |
||
| 97 | // http://www.php.net/manual/en/readline.installation.php |
||
| 98 | static::$readline_support = extension_loaded('readline'); |
||
| 99 | |||
| 100 | static::$initialized = true; |
||
| 101 | } |
||
| 102 | |||
| 103 | //-------------------------------------------------------------------- |
||
| 104 | |||
| 105 | /** |
||
| 106 | * Grabs an individual |
||
| 107 | * |
||
| 108 | * @param $index |
||
| 109 | * @return null |
||
| 110 | */ |
||
| 111 | public static function segment($index) |
||
| 112 | { |
||
| 113 | if (! isset(static::$segments[$index - 1])) |
||
| 114 | { |
||
| 115 | return null; |
||
| 116 | } |
||
| 117 | |||
| 118 | return static::$segments[$index - 1]; |
||
| 119 | } |
||
| 120 | |||
| 121 | //-------------------------------------------------------------------- |
||
| 122 | |||
| 123 | /** |
||
| 124 | * Returns the command string portion of the arguments. Used |
||
| 125 | * by the 'sprint' CLI script to grab the portion of the arguments |
||
| 126 | * that is used to call the CodeIgniter application. |
||
| 127 | * |
||
| 128 | * @return string |
||
| 129 | */ |
||
| 130 | public static function cli_string() |
||
| 131 | { |
||
| 132 | return implode(' ', static::$segments); |
||
| 133 | } |
||
| 134 | |||
| 135 | //-------------------------------------------------------------------- |
||
| 136 | |||
| 137 | |||
| 138 | |||
| 139 | /** |
||
| 140 | * Get input from the shell, using readline or the standard STDIN |
||
| 141 | * |
||
| 142 | * Named options must be in the following formats: |
||
| 143 | * php index.php user -v --v -name=John --name=John |
||
| 144 | * |
||
| 145 | * @param string|int $name the name of the option (int if unnamed) |
||
| 146 | * @return string |
||
| 147 | */ |
||
| 148 | public static function input($prefix = '') |
||
| 149 | { |
||
| 150 | if (static::$readline_support) |
||
| 151 | { |
||
| 152 | return readline($prefix); |
||
| 153 | } |
||
| 154 | |||
| 155 | echo $prefix; |
||
| 156 | return fgets(STDIN); |
||
| 157 | } |
||
| 158 | |||
| 159 | //-------------------------------------------------------------------- |
||
| 160 | |||
| 161 | /** |
||
| 162 | * Asks the user for input. This can have either 1 or 2 arguments. |
||
| 163 | * |
||
| 164 | * Usage: |
||
| 165 | * |
||
| 166 | * // Waits for any key press |
||
| 167 | * CLI::prompt(); |
||
| 168 | * |
||
| 169 | * // Takes any input |
||
| 170 | * $color = CLI::prompt('What is your favorite color?'); |
||
| 171 | * |
||
| 172 | * // Takes any input, but offers default |
||
| 173 | * $color = CLI::prompt('What is your favourite color?', 'white'); |
||
| 174 | * |
||
| 175 | * // Will only accept the options in the array |
||
| 176 | * $ready = CLI::prompt('Are you ready?', array('y','n')); |
||
| 177 | * |
||
| 178 | * @return string the user input |
||
| 179 | */ |
||
| 180 | public static function prompt() |
||
| 181 | { |
||
| 182 | $args = func_get_args(); |
||
| 183 | |||
| 184 | $options = array(); |
||
| 185 | $output = ''; |
||
| 186 | $default = null; |
||
| 187 | |||
| 188 | // How many we got |
||
| 189 | $arg_count = count($args); |
||
| 190 | |||
| 191 | // Is the last argument a boolean? True means required |
||
| 192 | $required = end($args) === true; |
||
| 193 | |||
| 194 | // Reduce the argument count if required was passed, we don't care about that anymore |
||
| 195 | $required === true and --$arg_count; |
||
| 196 | |||
| 197 | // This method can take a few crazy combinations of arguments, so lets work it out |
||
| 198 | switch ($arg_count) |
||
| 199 | { |
||
| 200 | case 2: |
||
|
0 ignored issues
–
show
|
|||
| 201 | |||
| 202 | // E.g: $ready = CLI::prompt('Are you ready?', array('y','n')); |
||
| 203 | if (is_array($args[1])) |
||
| 204 | { |
||
| 205 | list($output, $options)=$args; |
||
| 206 | } |
||
| 207 | |||
| 208 | // E.g: $color = CLI::prompt('What is your favourite color?', 'white'); |
||
| 209 | elseif (is_string($args[1])) |
||
| 210 | { |
||
| 211 | list($output, $default)=$args; |
||
| 212 | } |
||
| 213 | |||
| 214 | break; |
||
| 215 | |||
| 216 | case 1: |
||
|
0 ignored issues
–
show
The case body in a switch statement must start on the line following the statement.
According to the PSR-2, the body of a case statement must start on the line immediately following the case statement. switch ($expr) {
case "A":
doSomething(); //right
break;
case "B":
doSomethingElse(); //wrong
break;
} To learn more about the PSR-2 coding standard, please refer to the PHP-Fig. Loading history...
|
|||
| 217 | |||
| 218 | // No question (probably been asked already) so just show options |
||
| 219 | // E.g: $ready = CLI::prompt(array('y','n')); |
||
| 220 | if (is_array($args[0])) |
||
| 221 | { |
||
| 222 | $options = $args[0]; |
||
| 223 | } |
||
| 224 | |||
| 225 | // Question without options |
||
| 226 | // E.g: $ready = CLI::prompt('What did you do today?'); |
||
| 227 | elseif (is_string($args[0])) |
||
| 228 | { |
||
| 229 | $output = $args[0]; |
||
| 230 | } |
||
| 231 | |||
| 232 | break; |
||
| 233 | } |
||
| 234 | |||
| 235 | // If a question has been asked with the read |
||
| 236 | if ($output !== '') |
||
| 237 | { |
||
| 238 | $extra_output = ''; |
||
| 239 | |||
| 240 | if ($default !== null) |
||
| 241 | { |
||
| 242 | $extra_output = ' [ Default: "'.$default.'" ]'; |
||
| 243 | } |
||
| 244 | |||
| 245 | elseif ($options !== array()) |
||
| 246 | { |
||
| 247 | $extra_output = ' [ '.implode(', ', $options).' ]'; |
||
| 248 | } |
||
| 249 | |||
| 250 | fwrite(STDOUT, $output.$extra_output.': '); |
||
| 251 | } |
||
| 252 | |||
| 253 | // Read the input from keyboard. |
||
| 254 | $input = trim(static::input()) ?: $default; |
||
| 255 | |||
| 256 | // No input provided and we require one (default will stop this being called) |
||
| 257 | View Code Duplication | if (empty($input) and $required === true) |
|
| 258 | { |
||
| 259 | static::write('This is required.'); |
||
| 260 | static::new_line(); |
||
| 261 | |||
| 262 | $input = forward_static_call_array(array(__CLASS__, 'prompt'), $args); |
||
| 263 | } |
||
| 264 | |||
| 265 | // If options are provided and the choice is not in the array, tell them to try again |
||
| 266 | View Code Duplication | if ( ! empty($options) and ! in_array($input, $options)) |
|
| 267 | { |
||
| 268 | static::write('This is not a valid option. Please try again.'); |
||
| 269 | static::new_line(); |
||
| 270 | |||
| 271 | $input = forward_static_call_array(array(__CLASS__, 'prompt'), $args); |
||
| 272 | } |
||
| 273 | |||
| 274 | return $input; |
||
| 275 | } |
||
| 276 | |||
| 277 | //-------------------------------------------------------------------- |
||
| 278 | |||
| 279 | /** |
||
| 280 | * Outputs a string to the cli. If you send an array it will implode them |
||
| 281 | * with a line break. |
||
| 282 | * |
||
| 283 | * @param string|array $text the text to output, or array of lines |
||
| 284 | */ |
||
| 285 | View Code Duplication | public static function write($text = '', $foreground = null, $background = null) |
|
| 286 | { |
||
| 287 | if (is_array($text)) |
||
| 288 | { |
||
| 289 | $text = implode(PHP_EOL, $text); |
||
| 290 | } |
||
| 291 | |||
| 292 | if ($foreground or $background) |
||
| 293 | { |
||
| 294 | $text = static::color($text, $foreground, $background); |
||
| 295 | } |
||
| 296 | |||
| 297 | fwrite(STDOUT, $text.PHP_EOL); |
||
| 298 | } |
||
| 299 | |||
| 300 | //-------------------------------------------------------------------- |
||
| 301 | |||
| 302 | /** |
||
| 303 | * Outputs an error to the CLI using STDERR instead of STDOUT |
||
| 304 | * |
||
| 305 | * @param string|array $text the text to output, or array of errors |
||
| 306 | */ |
||
| 307 | View Code Duplication | public static function error($text = '', $foreground = 'light_red', $background = null) |
|
| 308 | { |
||
| 309 | if (is_array($text)) |
||
| 310 | { |
||
| 311 | $text = implode(PHP_EOL, $text); |
||
| 312 | } |
||
| 313 | |||
| 314 | if ($foreground OR $background) |
||
| 315 | { |
||
| 316 | $text = static::color($text, $foreground, $background); |
||
| 317 | } |
||
| 318 | |||
| 319 | fwrite(STDERR, $text.PHP_EOL); |
||
| 320 | } |
||
| 321 | |||
| 322 | //-------------------------------------------------------------------- |
||
| 323 | |||
| 324 | /** |
||
| 325 | * Beeps a certain number of times. |
||
| 326 | * |
||
| 327 | * @param int $num the number of times to beep |
||
| 328 | */ |
||
| 329 | public static function beep($num = 1) |
||
| 330 | { |
||
| 331 | echo str_repeat("\x07", $num); |
||
| 332 | } |
||
| 333 | |||
| 334 | //-------------------------------------------------------------------- |
||
| 335 | |||
| 336 | /** |
||
| 337 | * Waits a certain number of seconds, optionally showing a wait message and |
||
| 338 | * waiting for a key press. |
||
| 339 | * |
||
| 340 | * @param int $seconds number of seconds |
||
| 341 | * @param bool $countdown show a countdown or not |
||
| 342 | */ |
||
| 343 | public static function wait($seconds = 0, $countdown = false) |
||
| 344 | { |
||
| 345 | if ($countdown === true) |
||
| 346 | { |
||
| 347 | $time = $seconds; |
||
| 348 | |||
| 349 | while ($time > 0) |
||
| 350 | { |
||
| 351 | fwrite(STDOUT, $time.'... '); |
||
| 352 | sleep(1); |
||
| 353 | $time--; |
||
| 354 | } |
||
| 355 | static::write(); |
||
| 356 | } |
||
| 357 | |||
| 358 | else |
||
| 359 | { |
||
| 360 | if ($seconds > 0) |
||
| 361 | { |
||
| 362 | sleep($seconds); |
||
| 363 | } |
||
| 364 | else |
||
| 365 | { |
||
| 366 | static::write(static::$wait_msg); |
||
| 367 | static::input(); |
||
| 368 | } |
||
| 369 | } |
||
| 370 | } |
||
| 371 | |||
| 372 | |||
| 373 | //-------------------------------------------------------------------- |
||
| 374 | |||
| 375 | /** |
||
| 376 | * if operating system === windows |
||
| 377 | */ |
||
| 378 | public static function is_windows() |
||
| 379 | { |
||
| 380 | return 'win' === strtolower(substr(php_uname("s"), 0, 3)); |
||
| 381 | } |
||
| 382 | |||
| 383 | //-------------------------------------------------------------------- |
||
| 384 | |||
| 385 | /** |
||
| 386 | * Enter a number of empty lines |
||
| 387 | * |
||
| 388 | * @param integer Number of lines to output |
||
| 389 | * @return void |
||
| 390 | */ |
||
| 391 | public static function new_line($num = 1) |
||
| 392 | { |
||
| 393 | // Do it once or more, write with empty string gives us a new line |
||
| 394 | for($i = 0; $i < $num; $i++) |
||
| 395 | { |
||
| 396 | static::write(); |
||
| 397 | } |
||
| 398 | } |
||
| 399 | |||
| 400 | //-------------------------------------------------------------------- |
||
| 401 | |||
| 402 | /** |
||
| 403 | * Clears the screen of output |
||
| 404 | * |
||
| 405 | * @return void |
||
| 406 | */ |
||
| 407 | public static function clear_screen() |
||
| 408 | { |
||
| 409 | static::is_windows() |
||
| 410 | |||
| 411 | // Windows is a bit crap at this, but their terminal is tiny so shove this in |
||
| 412 | ? static::new_line(40) |
||
| 413 | |||
| 414 | // Anything with a flair of Unix will handle these magic characters |
||
| 415 | : fwrite(STDOUT, chr(27)."[H".chr(27)."[2J"); |
||
| 416 | } |
||
| 417 | |||
| 418 | //-------------------------------------------------------------------- |
||
| 419 | |||
| 420 | /** |
||
| 421 | * Returns the given text with the correct color codes for a foreground and |
||
| 422 | * optionally a background color. |
||
| 423 | * |
||
| 424 | * @param string $text the text to color |
||
| 425 | * @param string $foreground the foreground color |
||
| 426 | * @param string $background the background color |
||
| 427 | * @param string $format other formatting to apply. Currently only 'underline' is understood |
||
| 428 | * @return string the color coded string |
||
| 429 | */ |
||
| 430 | public static function color($text, $foreground, $background = null, $format=null) |
||
| 431 | { |
||
| 432 | if (static::is_windows() and ! isset($_SERVER['ANSICON'])) |
||
| 433 | { |
||
| 434 | return $text; |
||
| 435 | } |
||
| 436 | |||
| 437 | if ( ! array_key_exists($foreground, static::$foreground_colors)) |
||
| 438 | { |
||
| 439 | throw new \RuntimeException('Invalid CLI foreground color: '.$foreground); |
||
| 440 | } |
||
| 441 | |||
| 442 | if ( $background !== null and ! array_key_exists($background, static::$background_colors)) |
||
| 443 | { |
||
| 444 | throw new \RuntimeException('Invalid CLI background color: '.$background); |
||
| 445 | } |
||
| 446 | |||
| 447 | $string = "\033[".static::$foreground_colors[$foreground]."m"; |
||
| 448 | |||
| 449 | if ($background !== null) |
||
| 450 | { |
||
| 451 | $string .= "\033[".static::$background_colors[$background]."m"; |
||
| 452 | } |
||
| 453 | |||
| 454 | if ($format === 'underline') |
||
| 455 | { |
||
| 456 | $string .= "\033[4m"; |
||
| 457 | } |
||
| 458 | |||
| 459 | $string .= $text."\033[0m"; |
||
| 460 | |||
| 461 | return $string; |
||
| 462 | } |
||
| 463 | |||
| 464 | //-------------------------------------------------------------------- |
||
| 465 | |||
| 466 | public static function getWidth($default=80) |
||
| 467 | { |
||
| 468 | if (static::is_windows()) |
||
| 469 | { |
||
| 470 | return $default; |
||
| 471 | } |
||
| 472 | |||
| 473 | return (int)shell_exec('tput cols'); |
||
| 474 | } |
||
| 475 | |||
| 476 | //-------------------------------------------------------------------- |
||
| 477 | |||
| 478 | public static function getHeight($default=32) |
||
| 479 | { |
||
| 480 | if (static::is_windows()) |
||
| 481 | { |
||
| 482 | return $default; |
||
| 483 | } |
||
| 484 | |||
| 485 | return (int)shell_exec('tput lines'); |
||
| 486 | } |
||
| 487 | |||
| 488 | //-------------------------------------------------------------------- |
||
| 489 | |||
| 490 | /** |
||
| 491 | * Displays a progress bar on the CLI. You must call it repeatedly |
||
| 492 | * to update it. Set $thisStep = false to erase the progress bar. |
||
| 493 | * |
||
| 494 | * @param int $thisStep |
||
| 495 | * @param int $totalSteps |
||
| 496 | */ |
||
| 497 | public static function showProgress($thisStep=1, $totalSteps=10) |
||
| 498 | { |
||
| 499 | // The first time through, save |
||
| 500 | // our position so the script knows where to go |
||
| 501 | // back to when writing the bar, and |
||
| 502 | // at the end of the script. |
||
| 503 | if (! static::$inProgress) { |
||
| 504 | fwrite(STDOUT, "\0337"); |
||
| 505 | static::$inProgress = true; |
||
| 506 | } |
||
| 507 | |||
| 508 | // Restore position |
||
| 509 | fwrite(STDERR, "\0338"); |
||
| 510 | |||
| 511 | if ($thisStep !== false) { |
||
| 512 | // Don't allow div by zero or negative numbers.... |
||
| 513 | $thisStep = abs($thisStep); |
||
| 514 | $totalSteps = $totalSteps < 1 ? 1 : $totalSteps; |
||
| 515 | |||
| 516 | $percent = intval( ($thisStep / $totalSteps) * 100 ); |
||
| 517 | $step = (int)round($percent / 10); |
||
| 518 | |||
| 519 | // Write the progress bar |
||
| 520 | fwrite(STDOUT, "[\033[32m" . str_repeat('#', $step) . str_repeat('.', 10 - $step) . "\033[0m]"); |
||
| 521 | // Textual representation... |
||
| 522 | fwrite(STDOUT, " {$percent}% Complete" . PHP_EOL); |
||
| 523 | // Move up, undo the PHP_EOL |
||
| 524 | fwrite(STDOUT, "\033[1A"); |
||
| 525 | } |
||
| 526 | else |
||
| 527 | { |
||
| 528 | fwrite(STDERR, "\007"); |
||
| 529 | } |
||
| 530 | } |
||
| 531 | |||
| 532 | //-------------------------------------------------------------------- |
||
| 533 | |||
| 534 | /** |
||
| 535 | * Checks to see if an option was passed to us on the CLI and returns |
||
| 536 | * the value if so. Otherwise, returns null. |
||
| 537 | * |
||
| 538 | * @param $name |
||
| 539 | * |
||
| 540 | * @return null |
||
| 541 | */ |
||
| 542 | public static function option($name) |
||
| 543 | { |
||
| 544 | if (array_key_exists($name, self::$options)) |
||
| 545 | { |
||
| 546 | $val = self::$options[$name] === null ? true : self::$options[$name]; |
||
| 547 | return $val; |
||
| 548 | } |
||
| 549 | |||
| 550 | return null; |
||
| 551 | } |
||
| 552 | |||
| 553 | //-------------------------------------------------------------------- |
||
| 554 | |||
| 555 | /** |
||
| 556 | * Gets all of the options set and returns that array. |
||
| 557 | * |
||
| 558 | * @return array |
||
| 559 | */ |
||
| 560 | public static function getOptions() |
||
| 561 | { |
||
| 562 | return self::$options; |
||
| 563 | } |
||
| 564 | |||
| 565 | //-------------------------------------------------------------------- |
||
| 566 | |||
| 567 | /** |
||
| 568 | * Returns the options as a string, suitable for passing along on |
||
| 569 | * the CLI to other commands. |
||
| 570 | */ |
||
| 571 | public static function optionString() |
||
| 572 | { |
||
| 573 | if (! count(static::$options)) |
||
| 574 | { |
||
| 575 | return ''; |
||
| 576 | } |
||
| 577 | |||
| 578 | $out = ''; |
||
| 579 | |||
| 580 | foreach (static::$options as $name => $value) |
||
| 581 | { |
||
| 582 | // If there's a space, we need to group |
||
| 583 | // so it will pass correctly. |
||
| 584 | if (strpos($value, ' ') !== false) |
||
| 585 | { |
||
| 586 | $value = '"'. $value .'"'; |
||
| 587 | } |
||
| 588 | $out .= "-{$name} $value "; |
||
| 589 | } |
||
| 590 | |||
| 591 | return $out; |
||
| 592 | } |
||
| 593 | |||
| 594 | //-------------------------------------------------------------------- |
||
| 595 | |||
| 596 | |||
| 597 | |||
| 598 | /** |
||
| 599 | * Takes a string and writes it to the command line, wrapping to a maximum |
||
| 600 | * width. If no maximum width is specified, will wrap to the window's max |
||
| 601 | * width. |
||
| 602 | * |
||
| 603 | * If an int is passed into $pad_left, then all strings after the first |
||
| 604 | * will padded with that many spaces to the left. Useful when printing |
||
| 605 | * short descriptions that need to start on an existing line. |
||
| 606 | * |
||
| 607 | * @param null $string |
||
| 608 | * @param int $max |
||
| 609 | * @param int $pad_left |
||
| 610 | */ |
||
| 611 | public static function wrap($string=null, $max=0, $pad_left=0) |
||
| 612 | { |
||
| 613 | if (empty($string)) |
||
| 614 | { |
||
| 615 | return ''; |
||
| 616 | } |
||
| 617 | |||
| 618 | if ($max == 0) |
||
| 619 | { |
||
| 620 | $max = CLI::getWidth(); |
||
| 621 | } |
||
| 622 | |||
| 623 | if (CLI::getWidth() < $max) |
||
| 624 | { |
||
| 625 | $max = CLI::getWidth(); |
||
| 626 | } |
||
| 627 | |||
| 628 | $max = $max - $pad_left; |
||
| 629 | |||
| 630 | $lines = wordwrap($string, $max); |
||
| 631 | |||
| 632 | if ($pad_left > 0) { |
||
| 633 | $lines = explode( "\n", $lines ); |
||
| 634 | |||
| 635 | $first = true; |
||
| 636 | |||
| 637 | array_walk( $lines, function ( &$line, $index ) use($max, $pad_left, &$first) { |
||
| 638 | if (! $first) { |
||
| 639 | $line = str_repeat( " ", $pad_left ) . $line; |
||
| 640 | } |
||
| 641 | else |
||
| 642 | { |
||
| 643 | $first = false; |
||
| 644 | } |
||
| 645 | } ); |
||
| 646 | |||
| 647 | $lines = implode("\n", $lines); |
||
| 648 | } |
||
| 649 | |||
| 650 | return $lines; |
||
| 651 | } |
||
| 652 | |||
| 653 | //-------------------------------------------------------------------- |
||
| 654 | |||
| 655 | /** |
||
| 656 | * Parses the command line it was called from and collects all |
||
| 657 | * options and valid segments. |
||
| 658 | * |
||
| 659 | * I tried to use getopt but had it fail occasionally to find any |
||
| 660 | * but argc has always had our back. We don't have all of the "power" |
||
| 661 | * of getopt but this does us just fine. |
||
| 662 | */ |
||
| 663 | protected static function parseCommand() |
||
| 664 | { |
||
| 665 | $options_found = false; |
||
| 666 | |||
| 667 | for ($i = 1; $i < $_SERVER['argc']; $i++) |
||
| 668 | { |
||
| 669 | // If there's no '-' at the beginning of the argument |
||
| 670 | // then add it to our segments. |
||
| 671 | if (! $options_found && strpos($_SERVER['argv'][$i], '-') === false) |
||
| 672 | { |
||
| 673 | self::$segments[] = $_SERVER['argv'][$i]; |
||
| 674 | continue; |
||
| 675 | } |
||
| 676 | |||
| 677 | $options_found = true; |
||
| 678 | |||
| 679 | if (substr($_SERVER['argv'][$i], 0, 1) != '-') |
||
| 680 | { |
||
| 681 | continue; |
||
| 682 | } |
||
| 683 | |||
| 684 | $arg = str_replace('-', '', $_SERVER['argv'][$i]); |
||
| 685 | $value = null; |
||
| 686 | |||
| 687 | // If the next item starts with a dash it's a value |
||
| 688 | if (isset($_SERVER['argv'][$i + 1]) && substr($_SERVER['argv'][$i + 1], 0, 1) != '-' ) |
||
| 689 | { |
||
| 690 | $value = $_SERVER['argv'][$i + 1]; |
||
| 691 | $i++; |
||
| 692 | } |
||
| 693 | |||
| 694 | self::$options[$arg] = $value; |
||
| 695 | } |
||
| 696 | } |
||
| 697 | |||
| 698 | //-------------------------------------------------------------------- |
||
| 699 | |||
| 700 | } |
||
| 701 | |||
| 702 | CLI::_init(); |
||
| 703 |
According to the PSR-2, the body of a case statement must start on the line immediately following the case statement.
}
To learn more about the PSR-2 coding standard, please refer to the PHP-Fig.