summaryrefslogtreecommitdiff
path: root/framework/3rdParty/PhpShell/PHP/Shell/Options.php
blob: 649d6727ba600311f9d0a69098237a41bcbb7f92 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
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;
    }
}