source: branches/0.4/web/addons/job_monarch/dwoo/plugins/builtin/blocks/if.php @ 755

Last change on this file since 755 was 755, checked in by ramonb, 11 years ago
  • add Dwoo
File size: 5.7 KB
Line 
1<?php
2
3/**
4 * Conditional block, the syntax is very similar to the php one, allowing () || && and
5 * other php operators. Additional operators and their equivalent php syntax are as follow :
6 *
7 * eq -> ==
8 * neq or ne -> !=
9 * gte or ge -> >=
10 * lte or le -> <=
11 * gt -> >
12 * lt -> <
13 * mod -> %
14 * not -> !
15 * X is [not] div by Y -> (X % Y) == 0
16 * X is [not] even [by Y] -> (X % 2) == 0 or ((X/Y) % 2) == 0
17 * X is [not] odd [by Y] -> (X % 2) != 0 or ((X/Y) % 2) != 0
18 *
19 * This software is provided 'as-is', without any express or implied warranty.
20 * In no event will the authors be held liable for any damages arising from the use of this software.
21 *
22 * @author     Jordi Boggiano <j.boggiano@seld.be>
23 * @copyright  Copyright (c) 2008, Jordi Boggiano
24 * @license    http://dwoo.org/LICENSE   Modified BSD License
25 * @link       http://dwoo.org/
26 * @version    1.0.0
27 * @date       2008-10-23
28 * @package    Dwoo
29 */
30class Dwoo_Plugin_if extends Dwoo_Block_Plugin implements Dwoo_ICompilable_Block, Dwoo_IElseable
31{
32        public function init(array $rest)
33        {
34        }
35
36        public static function replaceKeywords(array $params, array $tokens, Dwoo_Compiler $compiler)
37        {
38                $p = array();
39
40                reset($params);
41                while (list($k,$v) = each($params)) {
42                        $v = (string) $v;
43                        if(substr($v, 0, 1) === '"' || substr($v, 0, 1) === '\'') {
44                                $vmod = strtolower(substr($v, 1, -1));
45                        } else {
46                                $vmod = strtolower($v);
47                        }
48                        switch($vmod) {
49
50                        case 'and':
51                                if ($tokens[$k] === Dwoo_Compiler::T_UNQUOTED_STRING) {
52                                        $p[] = '&&';
53                                } else {
54                                        $p[] = $v;
55                                }
56                                break;
57                        case 'or':
58                                if ($tokens[$k] === Dwoo_Compiler::T_UNQUOTED_STRING) {
59                                        $p[] = '||';
60                                } else {
61                                        $p[] = $v;
62                                }
63                                break;
64                        case 'eq':
65                                if ($tokens[$k] === Dwoo_Compiler::T_UNQUOTED_STRING) {
66                                        $p[] = '==';
67                                } else {
68                                        $p[] = $v;
69                                }
70                                break;
71                        case 'ne':
72                        case 'neq':
73                                if ($tokens[$k] === Dwoo_Compiler::T_UNQUOTED_STRING) {
74                                        $p[] = '!=';
75                                } else {
76                                        $p[] = $v;
77                                }
78                                break;
79                        case 'gte':
80                        case 'ge':
81                                if ($tokens[$k] === Dwoo_Compiler::T_UNQUOTED_STRING) {
82                                        $p[] = '>=';
83                                } else {
84                                        $p[] = $v;
85                                }
86                                break;
87                        case 'lte':
88                        case 'le':
89                                if ($tokens[$k] === Dwoo_Compiler::T_UNQUOTED_STRING) {
90                                        $p[] = '<=';
91                                } else {
92                                        $p[] = $v;
93                                }
94                                break;
95                        case 'gt':
96                                if ($tokens[$k] === Dwoo_Compiler::T_UNQUOTED_STRING) {
97                                        $p[] = '>';
98                                } else {
99                                        $p[] = $v;
100                                }
101                                break;
102                        case 'lt':
103                                if ($tokens[$k] === Dwoo_Compiler::T_UNQUOTED_STRING) {
104                                        $p[] = '<';
105                                } else {
106                                        $p[] = $v;
107                                }
108                                break;
109                        case 'mod':
110                                if ($tokens[$k] === Dwoo_Compiler::T_UNQUOTED_STRING) {
111                                        $p[] = '%';
112                                } else {
113                                        $p[] = $v;
114                                }
115                                break;
116                        case 'not':
117                                if ($tokens[$k] === Dwoo_Compiler::T_UNQUOTED_STRING) {
118                                        $p[] = '!';
119                                } else {
120                                        $p[] = $v;
121                                }
122                                break;
123                        case '<>':
124                                $p[] = '!=';
125                                break;
126                        case '==':
127                        case '!=':
128                        case '>=':
129                        case '<=':
130                        case '>':
131                        case '<':
132                        case '===':
133                        case '!==':
134                        case '%':
135                        case '!':
136                                $p[] = $vmod;
137                                break;
138                        case 'is':
139                                if ($tokens[$k] !== Dwoo_Compiler::T_UNQUOTED_STRING) {
140                                        $p[] = $v;
141                                        break;
142                                }
143                                if (isset($params[$k+1]) && strtolower(trim($params[$k+1], '"\'')) === 'not' && $tokens[$k+1] === Dwoo_Compiler::T_UNQUOTED_STRING) {
144                                        $negate = true;
145                                        next($params);
146                                } else {
147                                        $negate = false;
148                                }
149                                $ptr = 1+(int)$negate;
150                                if ($tokens[$k+$ptr] !== Dwoo_Compiler::T_UNQUOTED_STRING) {
151                                        break;
152                                }
153                                if (!isset($params[$k+$ptr])) {
154                                        $params[$k+$ptr] = '';
155                                } else {
156                                        $params[$k+$ptr] = trim($params[$k+$ptr], '"\'');
157                                }
158                                switch($params[$k+$ptr]) {
159
160                                case 'div':
161                                        if (isset($params[$k+$ptr+1]) && strtolower(trim($params[$k+$ptr+1], '"\'')) === 'by') {
162                                                $p[] = ' % '.$params[$k+$ptr+2].' '.($negate?'!':'=').'== 0';
163                                                next($params);
164                                                next($params);
165                                                next($params);
166                                        } else {
167                                                throw new Dwoo_Compilation_Exception($compiler, 'If : Syntax error : syntax should be "if $a is [not] div by $b", found '.$params[$k-1].' is '.($negate?'not ':'').'div '.$params[$k+$ptr+1].' '.$params[$k+$ptr+2]);
168                                        }
169                                        break;
170                                case 'even':
171                                        $a = array_pop($p);
172                                        if (isset($params[$k+$ptr+1]) && strtolower(trim($params[$k+$ptr+1], '"\'')) === 'by') {
173                                                $b = $params[$k+$ptr+2];
174                                                $p[] = '('.$a .' / '.$b.') % 2 '.($negate?'!':'=').'== 0';
175                                                next($params);
176                                                next($params);
177                                        } else {
178                                                $p[] = $a.' % 2 '.($negate?'!':'=').'== 0';
179                                        }
180                                        next($params);
181                                        break;
182                                case 'odd':
183                                        $a = array_pop($p);
184                                        if (isset($params[$k+$ptr+1]) && strtolower(trim($params[$k+$ptr+1], '"\'')) === 'by') {
185                                                $b = $params[$k+$ptr+2];
186                                                $p[] = '('.$a .' / '.$b.') % 2 '.($negate?'=':'!').'== 0';
187                                                next($params);
188                                                next($params);
189                                        } else {
190                                                $p[] = $a.' % 2 '.($negate?'=':'!').'== 0';
191                                        }
192                                        next($params);
193                                        break;
194                                default:
195                                        throw new Dwoo_Compilation_Exception($compiler, 'If : Syntax error : syntax should be "if $a is [not] (div|even|odd) [by $b]", found '.$params[$k-1].' is '.$params[$k+$ptr+1]);
196
197                                }
198                                break;
199                        default:
200                                $p[] = $v;
201
202                        }
203                }
204
205                return $p;
206        }
207
208        public static function preProcessing(Dwoo_Compiler $compiler, array $params, $prepend, $append, $type)
209        {
210                return '';
211        }
212
213        public static function postProcessing(Dwoo_Compiler $compiler, array $params, $prepend, $append, $content)
214        {
215                $tokens = $compiler->getParamTokens($params);
216                $params = $compiler->getCompiledParams($params);
217                $pre = Dwoo_Compiler::PHP_OPEN.'if ('.implode(' ', self::replaceKeywords($params['*'], $tokens['*'], $compiler)).") {\n".Dwoo_Compiler::PHP_CLOSE;
218
219                $post = Dwoo_Compiler::PHP_OPEN."\n}".Dwoo_Compiler::PHP_CLOSE;
220
221                if (isset($params['hasElse'])) {
222                        $post .= $params['hasElse'];
223                }
224
225                return $pre . $content . $post;
226        }
227}
Note: See TracBrowser for help on using the repository browser.