diff options
Diffstat (limited to 'framework/Vendor/PhpShell/PHP/Shell/Extensions/InlineHelp.php')
-rw-r--r-- | framework/Vendor/PhpShell/PHP/Shell/Extensions/InlineHelp.php | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/framework/Vendor/PhpShell/PHP/Shell/Extensions/InlineHelp.php b/framework/Vendor/PhpShell/PHP/Shell/Extensions/InlineHelp.php new file mode 100644 index 00000000..4449d1f4 --- /dev/null +++ b/framework/Vendor/PhpShell/PHP/Shell/Extensions/InlineHelp.php @@ -0,0 +1,140 @@ +<?php + +require_once(dirname(__FILE__)."/../Extensions.php"); +require_once(dirname(__FILE__)."/Prototypes.php"); + +class PHP_Shell_Extensions_InlineHelp implements PHP_Shell_Extension { + public function register() { + $cmd = PHP_Shell_Commands::getInstance(); + + $cmd->registerCommand('#^\? #', $this, 'cmdHelp', '? <var>', + 'show the DocComment a Class, Method or Function'.PHP_EOL. + ' e.g.: ? fopen(), ? PHP_Shell, ? $__shell'); + } + + /** + * handle the '?' commands + * + * With the help of the Reflection Class we extract the DocComments and display them + * For internal Functions we extract the prototype from the php source. + * + * ? Class::method() + * ? $obj->method() + * ? Class::property + * ? $obj::property + * ? Class + * ? $obj + * ? function() + * + * The license of the PHP_Shell class + * ? license + * + * @return string the help text + */ + public function cmdHelp($l) { + if ("? " == substr($l, 0, strlen("? "))) { + $str = substr($l, 2); + + $cmd = ''; + + if (preg_match('#^([A-Za-z0-9_]+)::([a-zA-Z0-9_]+)\(\s*\)\s*#', $str, $a)) { + /* ? Class::method() */ + + $class = $a[1]; + $method = $a[2]; + + if (false !== ($proto = PHP_ShellPrototypes::getInstance()->get($class.'::'.$method))) { + + $cmd = sprintf("/**\n* %s\n\n* @params %s\n* @return %s\n*/\n", + $proto['description'], + $proto['params'], + $proto['return'] + ); + } else if (class_exists($class, false)) { + $c = new ReflectionClass($class); + + if ($c->hasMethod($method)) { + $cmd = $c->getMethod($method)->getDocComment(); + } + } + } else if (preg_match('#^\$([A-Za-z0-9_]+)->([a-zA-Z0-9_]+)\(\s*\)\s*#', $str, $a)) { + /* ? $obj->method() */ + if (isset($GLOBALS[$a[1]]) && is_object($GLOBALS[$a[1]])) { + $class = get_class($GLOBALS[$a[1]]); + $method = $a[2]; + + $c = new ReflectionClass($class); + + if ($c->hasMethod($method)) { + $cmd = $c->getMethod($method)->getDocComment(); + } + } + } else if (preg_match('#^([A-Za-z0-9_]+)::([a-zA-Z0-9_]+)\s*$#', $str, $a)) { + /* ? Class::property */ + $class = $a[1]; + $property = $a[2]; + if (class_exists($class, false)) { + $c = new ReflectionClass($class); + + if ($c->hasProperty($property)) { + $cmd = $c->getProperty($property)->getDocComment(); + } + } + } else if (preg_match('#^\$([A-Za-z0-9_]+)->([a-zA-Z0-9_]+)\s*$#', $str, $a)) { + /* ? $obj->property */ + if (isset($GLOBALS[$a[1]]) && is_object($GLOBALS[$a[1]])) { + $class = get_class($GLOBALS[$a[1]]); + $method = $a[2]; + + $c = new ReflectionClass($class); + + if ($c->hasProperty($property)) { + $cmd = $c->getProperty($property)->getDocComment(); + } + + } + } else if (preg_match('#^([A-Za-z0-9_]+)$#', $str, $a)) { + /* ? Class */ + if (class_exists($a[1], false)) { + $c = new ReflectionClass($a[1]); + $cmd = $c->getDocComment(); + } + } else if (preg_match('#^\$([A-Za-z0-9_]+)$#', $str, $a)) { + /* ? $object */ + $obj = $a[1]; + if (isset($GLOBALS[$obj]) && is_object($GLOBALS[$obj])) { + $class = get_class($GLOBALS[$obj]); + + $c = new ReflectionClass($class); + $cmd = $c->getDocComment(); + } + + } else if (preg_match('#^([A-Za-z0-9_]+)\(\s*\)$#', $str, $a)) { + /* ? function() */ + $func = $a[1]; + + if (false !== ($proto = PHP_ShellPrototypes::getInstance()->get($func))) { + $cmd = sprintf("/**\n* %s\n*\n* @params %s\n* @return %s\n*/\n", + $proto['description'], + $proto['params'], + $proto['return'] + ); + } else if (function_exists($func)) { + $c = new ReflectionFunction($func); + $cmd = $c->getDocComment(); + } + } + + if ($cmd == '') { + $cmd = var_export(sprintf('no help found for \'%s\'', $str), 1); + } else { + $cmd = var_export($cmd, 1); + } + } else if ("?" == $l) { + $cmd = $this->getHelp(); + $cmd = var_export($cmd, 1); + } + + return $cmd; + } +} |