mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 12:05:37 +00:00
ENHANCMENT: Improvements to 'sake interactive', thanks Hamish Friedlander
git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/sapphire/trunk@73471 467b73ca-7a2a-4603-9d3b-597d59a354a9
This commit is contained in:
parent
16a012dfa1
commit
d922d2c36a
@ -1,23 +1,79 @@
|
||||
<?php
|
||||
|
||||
/* Don't actually define these, since it'd clutter up the namespace.
|
||||
define('1',E_ERROR);
|
||||
define('2',E_WARNING);
|
||||
define('4',E_PARSE);
|
||||
define('8',E_NOTICE);
|
||||
define('16',E_CORE_ERROR);
|
||||
define('32',E_CORE_WARNING);
|
||||
define('64',E_COMPILE_ERROR);
|
||||
define('128',E_COMPILE_WARNING);
|
||||
define('256',E_USER_ERROR);
|
||||
define('512',E_USER_WARNING);
|
||||
define('1024',E_USER_NOTICE);
|
||||
define('2048',E_STRICT);
|
||||
define('4096',E_RECOVERABLE_ERROR);
|
||||
define('8192',E_DEPRECATED);
|
||||
define('16384',E_USER_DEPRECATED);
|
||||
define('30719',E_ALL);
|
||||
*/
|
||||
|
||||
class SapphireREPL extends Controller {
|
||||
|
||||
private function error_handler( $errno, $errstr, $errfile, $errline, $errctx ) {
|
||||
// Ignore unless important error
|
||||
if ( ($errno & ~( 2048 | 8192 | 16384 )) == 0 ) return ;
|
||||
// Otherwise throw exception to handle in REPL loop
|
||||
throw new Exception(sprintf("%s:%d\r\n%s", $errfile, $errline, $errstr));
|
||||
}
|
||||
|
||||
function index() {
|
||||
if(!Director::is_cli()) return "The Sapphire Interactive Command-line doesn't work in a web browser. Use 'sake interactive' from the command-line to run.";
|
||||
|
||||
echo "Sapphire Interactive Command-line (REPL interface)\n\n";
|
||||
while(true) {
|
||||
echo SSCli::text("?> ", "cyan");
|
||||
echo SSCli::start_colour("yellow");
|
||||
$command = trim(fgets(STDIN, 4096));
|
||||
echo SSCli::end_colour();
|
||||
|
||||
// Simple processing
|
||||
if(substr($command,-1) == ';') $command = substr($command,0,-1);
|
||||
if(!preg_match('/^return/i', $command)) $command = "return ($command)";
|
||||
$command .= ";";
|
||||
$result = eval($command);
|
||||
print_r($result);
|
||||
echo "\n";
|
||||
|
||||
|
||||
/* Try using PHP_Shell if it exists */
|
||||
@include 'php-shell-cmd.php' ;
|
||||
|
||||
/* Fall back to our simpler interface */
|
||||
if( empty( $__shell ) ) {
|
||||
set_error_handler(array($this, 'error_handler'));
|
||||
|
||||
echo "Sapphire Interactive Command-line (REPL interface). Type help for hints.\n\n";
|
||||
while(true) {
|
||||
echo SSCli::text("?> ", "cyan");
|
||||
echo SSCli::start_colour("yellow");
|
||||
$command = trim(fgets(STDIN, 4096));
|
||||
echo SSCli::end_colour();
|
||||
|
||||
if ( $command == 'help' || $command == '?' ) {
|
||||
print "help or ? to exit\n" ;
|
||||
print "quit or \q to exit\n" ;
|
||||
print "install PHP_Shell for a more advanced interface with auto-completion and readline support\n\n" ;
|
||||
continue ;
|
||||
}
|
||||
|
||||
if ( $command == 'quit' || $command == '\q' ) break ;
|
||||
|
||||
// Simple command processing
|
||||
if(substr($command,-1) == ';') $command = substr($command,0,-1);
|
||||
$is_print = preg_match('/^\s*print/i', $command);
|
||||
$is_return = preg_match('/^\s*return/i', $command);
|
||||
if(!$is_print && !$is_return) $command = "return ($command)";
|
||||
$command .= ";";
|
||||
|
||||
try {
|
||||
$result = eval($command);
|
||||
if(!$is_print) print_r($result);
|
||||
echo "\n";
|
||||
}
|
||||
catch( Exception $__repl_exception ) {
|
||||
echo SSCli::start_colour("red");
|
||||
printf( '%s (code: %d) got thrown'.PHP_EOL, get_class($__repl_exception), $__repl_exception->getCode() );
|
||||
print $__repl_exception;
|
||||
echo "\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user