diff options
| author | xue <> | 2006-09-23 01:51:57 +0000 | 
|---|---|---|
| committer | xue <> | 2006-09-23 01:51:57 +0000 | 
| commit | a5467e842316daf6a8a4345740f05a9731167ce1 (patch) | |
| tree | 0a982dd52df5c682fd2de8f9b22137471cee2dbe /framework/3rdParty/PhpShell/PHP/Shell/Options.php | |
| parent | 9af56fd93ed071d86f14296cec618073f6c0941a (diff) | |
merge from 3.0 branch till 1435.
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; +    } +} + +  | 
