diff options
Diffstat (limited to 'framework/3rdParty/PhpShell/PHP/Shell/Options.php')
-rw-r--r-- | framework/3rdParty/PhpShell/PHP/Shell/Options.php | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/framework/3rdParty/PhpShell/PHP/Shell/Options.php b/framework/3rdParty/PhpShell/PHP/Shell/Options.php new file mode 100644 index 00000000..649d6727 --- /dev/null +++ b/framework/3rdParty/PhpShell/PHP/Shell/Options.php @@ -0,0 +1,132 @@ +<?php + +require_once(dirname(__FILE__)."/Extensions.php"); /* for the PHP_Shell_Interface */ + +/** +* +*/ +class PHP_Shell_Options implements PHP_Shell_Extension { + /* + * instance of the current class + * + * @var PHP_Shell_Options + */ + static protected $instance; + + /** + * known options and their setors + * + * @var array + * @see registerOption + */ + protected $options = array(); + + /** + * known options and their setors + * + * @var array + * @see registerOptionAlias + */ + protected $option_aliases = array(); + + public function register() { + $cmd = PHP_Shell_Commands::getInstance(); + $cmd->registerCommand('#^:set #', $this, 'cmdSet', ':set <var>', 'set a shell variable'); + } + + /** + * register a option + * + * @param string name of the option + * @param object a object handle + * @param string method-name of the setor in the object + * @param string (unused) + */ + public function registerOption($option, $obj, $setor, $getor = null) { + if (!method_exists($obj, $setor)) { + throw new Exception(sprintf("setor %s doesn't exist on class %s", $setor, get_class($obj))); + } + + $this->options[trim($option)] = array("obj" => $obj, "setor" => $setor); + } + + /** + * set a shell-var + * + * :set al to enable autoload + * :set bg=dark to enable highlighting with a dark backgroud + */ + public function cmdSet($l) { + if (!preg_match('#:set\s+([a-z]+)\s*(?:=\s*([a-z0-9]+)\s*)?$#i', $l, $a)) { + print(':set failed: either :set <option> or :set <option> = <value>'); + return; + } + + $this->execute($a[1], isset($a[2]) ? $a[2] : null); + } + + /** + * get all the option names + * + * @return array names of all options + */ + public function getOptions() { + return array_keys($this->options); + } + + /** + * map a option to another option + * + * e.g.: bg maps to background + * + * @param string alias + * @param string option + */ + public function registerOptionAlias($alias, $option) { + if (!isset($this->options[$option])) { + throw new Exception(sprintf("Option %s is not known", $option)); + } + + $this->option_aliases[trim($alias)] = trim($option); + + } + + /** + * execute a :set command + * + * calls the setor for the :set <option> + * + * + */ + private function execute($key, $value) { + /* did we hit a alias (bg for backgroud) ? */ + if (isset($this->option_aliases[$key])) { + $opt_key = $this->option_aliases[$key]; + } else { + $opt_key = $key; + } + + if (!isset($this->options[$opt_key])) { + print (':set '.$key.' failed: unknown key'); + return; + } + + if (!isset($this->options[$opt_key]["setor"])) { + return; + } + + $setor = $this->options[$opt_key]["setor"]; + $obj = $this->options[$opt_key]["obj"]; + $obj->$setor($key, $value); + } + + static function getInstance() { + if (is_null(self::$instance)) { + $class = __CLASS__; + self::$instance = new $class(); + } + return self::$instance; + } +} + + |