@@ -48,123 +48,123 @@ |
||
48 | 48 | */ |
49 | 49 | class PluginLoop extends BlockPlugin implements ICompilableBlock, IElseable |
50 | 50 | { |
51 | - public static $cnt = 0; |
|
51 | + public static $cnt = 0; |
|
52 | 52 | |
53 | - /** |
|
54 | - * @param $from |
|
55 | - * @param string $name |
|
56 | - */ |
|
57 | - public function init($from, $name = 'default') |
|
58 | - { |
|
59 | - } |
|
53 | + /** |
|
54 | + * @param $from |
|
55 | + * @param string $name |
|
56 | + */ |
|
57 | + public function init($from, $name = 'default') |
|
58 | + { |
|
59 | + } |
|
60 | 60 | |
61 | - /** |
|
62 | - * @param Compiler $compiler |
|
63 | - * @param array $params |
|
64 | - * @param string $prepend |
|
65 | - * @param string $append |
|
66 | - * @param string $type |
|
67 | - * |
|
68 | - * @return string |
|
69 | - */ |
|
70 | - public static function preProcessing(Compiler $compiler, array $params, $prepend, $append, $type) |
|
71 | - { |
|
72 | - // get block params and save the current template pointer to use it in the postProcessing method |
|
73 | - $currentBlock = &$compiler->getCurrentBlock(); |
|
74 | - $currentBlock['params']['tplPointer'] = $compiler->getPointer(); |
|
61 | + /** |
|
62 | + * @param Compiler $compiler |
|
63 | + * @param array $params |
|
64 | + * @param string $prepend |
|
65 | + * @param string $append |
|
66 | + * @param string $type |
|
67 | + * |
|
68 | + * @return string |
|
69 | + */ |
|
70 | + public static function preProcessing(Compiler $compiler, array $params, $prepend, $append, $type) |
|
71 | + { |
|
72 | + // get block params and save the current template pointer to use it in the postProcessing method |
|
73 | + $currentBlock = &$compiler->getCurrentBlock(); |
|
74 | + $currentBlock['params']['tplPointer'] = $compiler->getPointer(); |
|
75 | 75 | |
76 | - return ''; |
|
77 | - } |
|
76 | + return ''; |
|
77 | + } |
|
78 | 78 | |
79 | - /** |
|
80 | - * @param Compiler $compiler |
|
81 | - * @param array $params |
|
82 | - * @param string $prepend |
|
83 | - * @param string $append |
|
84 | - * @param string $content |
|
85 | - * |
|
86 | - * @return string |
|
87 | - */ |
|
88 | - public static function postProcessing(Compiler $compiler, array $params, $prepend, $append, $content) |
|
89 | - { |
|
90 | - $params = $compiler->getCompiledParams($params); |
|
91 | - $tpl = $compiler->getTemplateSource($params['tplPointer']); |
|
79 | + /** |
|
80 | + * @param Compiler $compiler |
|
81 | + * @param array $params |
|
82 | + * @param string $prepend |
|
83 | + * @param string $append |
|
84 | + * @param string $content |
|
85 | + * |
|
86 | + * @return string |
|
87 | + */ |
|
88 | + public static function postProcessing(Compiler $compiler, array $params, $prepend, $append, $content) |
|
89 | + { |
|
90 | + $params = $compiler->getCompiledParams($params); |
|
91 | + $tpl = $compiler->getTemplateSource($params['tplPointer']); |
|
92 | 92 | |
93 | - // assigns params |
|
94 | - $src = $params['from']; |
|
95 | - $name = $params['name']; |
|
93 | + // assigns params |
|
94 | + $src = $params['from']; |
|
95 | + $name = $params['name']; |
|
96 | 96 | |
97 | - // evaluates which global variables have to be computed |
|
98 | - $varName = '$dwoo.loop.' . trim($name, '"\'') . '.'; |
|
99 | - $shortVarName = '$.loop.' . trim($name, '"\'') . '.'; |
|
100 | - $usesAny = strpos($tpl, $varName) !== false || strpos($tpl, $shortVarName) !== false; |
|
101 | - $usesFirst = strpos($tpl, $varName . 'first') !== false || strpos($tpl, $shortVarName . 'first') !== false; |
|
102 | - $usesLast = strpos($tpl, $varName . 'last') !== false || strpos($tpl, $shortVarName . 'last') !== false; |
|
103 | - $usesIndex = $usesFirst || strpos($tpl, $varName . 'index') !== false || strpos($tpl, $shortVarName . 'index') !== false; |
|
104 | - $usesIteration = $usesLast || strpos($tpl, $varName . 'iteration') !== false || strpos($tpl, $shortVarName . 'iteration') !== false; |
|
105 | - $usesShow = strpos($tpl, $varName . 'show') !== false || strpos($tpl, $shortVarName . 'show') !== false; |
|
106 | - $usesTotal = $usesLast || strpos($tpl, $varName . 'total') !== false || strpos($tpl, $shortVarName . 'total') !== false; |
|
97 | + // evaluates which global variables have to be computed |
|
98 | + $varName = '$dwoo.loop.' . trim($name, '"\'') . '.'; |
|
99 | + $shortVarName = '$.loop.' . trim($name, '"\'') . '.'; |
|
100 | + $usesAny = strpos($tpl, $varName) !== false || strpos($tpl, $shortVarName) !== false; |
|
101 | + $usesFirst = strpos($tpl, $varName . 'first') !== false || strpos($tpl, $shortVarName . 'first') !== false; |
|
102 | + $usesLast = strpos($tpl, $varName . 'last') !== false || strpos($tpl, $shortVarName . 'last') !== false; |
|
103 | + $usesIndex = $usesFirst || strpos($tpl, $varName . 'index') !== false || strpos($tpl, $shortVarName . 'index') !== false; |
|
104 | + $usesIteration = $usesLast || strpos($tpl, $varName . 'iteration') !== false || strpos($tpl, $shortVarName . 'iteration') !== false; |
|
105 | + $usesShow = strpos($tpl, $varName . 'show') !== false || strpos($tpl, $shortVarName . 'show') !== false; |
|
106 | + $usesTotal = $usesLast || strpos($tpl, $varName . 'total') !== false || strpos($tpl, $shortVarName . 'total') !== false; |
|
107 | 107 | |
108 | - if (strpos($name, '$this->scope[') !== false) { |
|
109 | - $usesAny = $usesFirst = $usesLast = $usesIndex = $usesIteration = $usesShow = $usesTotal = true; |
|
110 | - } |
|
108 | + if (strpos($name, '$this->scope[') !== false) { |
|
109 | + $usesAny = $usesFirst = $usesLast = $usesIndex = $usesIteration = $usesShow = $usesTotal = true; |
|
110 | + } |
|
111 | 111 | |
112 | - // gets foreach id |
|
113 | - $cnt = self::$cnt ++; |
|
112 | + // gets foreach id |
|
113 | + $cnt = self::$cnt ++; |
|
114 | 114 | |
115 | - // builds pre processing output |
|
116 | - $pre = Compiler::PHP_OPEN . "\n" . '$_loop' . $cnt . '_data = ' . $src . ';'; |
|
117 | - // adds foreach properties |
|
118 | - if ($usesAny) { |
|
119 | - $pre .= "\n" . '$this->globals["loop"][' . $name . '] = array' . "\n("; |
|
120 | - if ($usesIndex) { |
|
121 | - $pre .= "\n\t" . '"index" => 0,'; |
|
122 | - } |
|
123 | - if ($usesIteration) { |
|
124 | - $pre .= "\n\t" . '"iteration" => 1,'; |
|
125 | - } |
|
126 | - if ($usesFirst) { |
|
127 | - $pre .= "\n\t" . '"first" => null,'; |
|
128 | - } |
|
129 | - if ($usesLast) { |
|
130 | - $pre .= "\n\t" . '"last" => null,'; |
|
131 | - } |
|
132 | - if ($usesShow) { |
|
133 | - $pre .= "\n\t" . '"show" => $this->isTraversable($_loop' . $cnt . '_data, true),'; |
|
134 | - } |
|
135 | - if ($usesTotal) { |
|
136 | - $pre .= "\n\t" . '"total" => $this->count($_loop' . $cnt . '_data),'; |
|
137 | - } |
|
138 | - $pre .= "\n);\n" . '$_loop' . $cnt . '_glob =& $this->globals["loop"][' . $name . '];'; |
|
139 | - } |
|
140 | - // checks if the loop must be looped |
|
141 | - $pre .= "\n" . 'if ($this->isTraversable($_loop' . $cnt . '_data' . (isset($params['hasElse']) ? ', true' : '') . ') == true)' . "\n{"; |
|
142 | - // iterates over keys |
|
143 | - $pre .= "\n\t" . 'foreach ($_loop' . $cnt . '_data as $tmp_key => $this->scope["-loop-"])' . "\n\t{"; |
|
144 | - // updates properties |
|
145 | - if ($usesFirst) { |
|
146 | - $pre .= "\n\t\t" . '$_loop' . $cnt . '_glob["first"] = (string) ($_loop' . $cnt . '_glob["index"] === 0);'; |
|
147 | - } |
|
148 | - if ($usesLast) { |
|
149 | - $pre .= "\n\t\t" . '$_loop' . $cnt . '_glob["last"] = (string) ($_loop' . $cnt . '_glob["iteration"] === $_loop' . $cnt . '_glob["total"]);'; |
|
150 | - } |
|
151 | - $pre .= "\n\t\t" . '$_loop' . $cnt . '_scope = $this->setScope(array("-loop-"));' . "\n/* -- loop start output */\n" . Compiler::PHP_CLOSE; |
|
115 | + // builds pre processing output |
|
116 | + $pre = Compiler::PHP_OPEN . "\n" . '$_loop' . $cnt . '_data = ' . $src . ';'; |
|
117 | + // adds foreach properties |
|
118 | + if ($usesAny) { |
|
119 | + $pre .= "\n" . '$this->globals["loop"][' . $name . '] = array' . "\n("; |
|
120 | + if ($usesIndex) { |
|
121 | + $pre .= "\n\t" . '"index" => 0,'; |
|
122 | + } |
|
123 | + if ($usesIteration) { |
|
124 | + $pre .= "\n\t" . '"iteration" => 1,'; |
|
125 | + } |
|
126 | + if ($usesFirst) { |
|
127 | + $pre .= "\n\t" . '"first" => null,'; |
|
128 | + } |
|
129 | + if ($usesLast) { |
|
130 | + $pre .= "\n\t" . '"last" => null,'; |
|
131 | + } |
|
132 | + if ($usesShow) { |
|
133 | + $pre .= "\n\t" . '"show" => $this->isTraversable($_loop' . $cnt . '_data, true),'; |
|
134 | + } |
|
135 | + if ($usesTotal) { |
|
136 | + $pre .= "\n\t" . '"total" => $this->count($_loop' . $cnt . '_data),'; |
|
137 | + } |
|
138 | + $pre .= "\n);\n" . '$_loop' . $cnt . '_glob =& $this->globals["loop"][' . $name . '];'; |
|
139 | + } |
|
140 | + // checks if the loop must be looped |
|
141 | + $pre .= "\n" . 'if ($this->isTraversable($_loop' . $cnt . '_data' . (isset($params['hasElse']) ? ', true' : '') . ') == true)' . "\n{"; |
|
142 | + // iterates over keys |
|
143 | + $pre .= "\n\t" . 'foreach ($_loop' . $cnt . '_data as $tmp_key => $this->scope["-loop-"])' . "\n\t{"; |
|
144 | + // updates properties |
|
145 | + if ($usesFirst) { |
|
146 | + $pre .= "\n\t\t" . '$_loop' . $cnt . '_glob["first"] = (string) ($_loop' . $cnt . '_glob["index"] === 0);'; |
|
147 | + } |
|
148 | + if ($usesLast) { |
|
149 | + $pre .= "\n\t\t" . '$_loop' . $cnt . '_glob["last"] = (string) ($_loop' . $cnt . '_glob["iteration"] === $_loop' . $cnt . '_glob["total"]);'; |
|
150 | + } |
|
151 | + $pre .= "\n\t\t" . '$_loop' . $cnt . '_scope = $this->setScope(array("-loop-"));' . "\n/* -- loop start output */\n" . Compiler::PHP_CLOSE; |
|
152 | 152 | |
153 | - // build post processing output and cache it |
|
154 | - $post = Compiler::PHP_OPEN . "\n" . '/* -- loop end output */' . "\n\t\t" . '$this->setScope($_loop' . $cnt . '_scope, true);'; |
|
155 | - // update properties |
|
156 | - if ($usesIndex) { |
|
157 | - $post .= "\n\t\t" . '$_loop' . $cnt . '_glob["index"]+=1;'; |
|
158 | - } |
|
159 | - if ($usesIteration) { |
|
160 | - $post .= "\n\t\t" . '$_loop' . $cnt . '_glob["iteration"]+=1;'; |
|
161 | - } |
|
162 | - // end loop |
|
163 | - $post .= "\n\t}\n}\n" . Compiler::PHP_CLOSE; |
|
164 | - if (isset($params['hasElse'])) { |
|
165 | - $post .= $params['hasElse']; |
|
166 | - } |
|
153 | + // build post processing output and cache it |
|
154 | + $post = Compiler::PHP_OPEN . "\n" . '/* -- loop end output */' . "\n\t\t" . '$this->setScope($_loop' . $cnt . '_scope, true);'; |
|
155 | + // update properties |
|
156 | + if ($usesIndex) { |
|
157 | + $post .= "\n\t\t" . '$_loop' . $cnt . '_glob["index"]+=1;'; |
|
158 | + } |
|
159 | + if ($usesIteration) { |
|
160 | + $post .= "\n\t\t" . '$_loop' . $cnt . '_glob["iteration"]+=1;'; |
|
161 | + } |
|
162 | + // end loop |
|
163 | + $post .= "\n\t}\n}\n" . Compiler::PHP_CLOSE; |
|
164 | + if (isset($params['hasElse'])) { |
|
165 | + $post .= $params['hasElse']; |
|
166 | + } |
|
167 | 167 | |
168 | - return $pre . $content . $post; |
|
169 | - } |
|
168 | + return $pre . $content . $post; |
|
169 | + } |
|
170 | 170 | } |
@@ -31,59 +31,59 @@ |
||
31 | 31 | */ |
32 | 32 | class PluginStrip extends BlockPlugin implements ICompilableBlock |
33 | 33 | { |
34 | - /** |
|
35 | - * @param string $mode |
|
36 | - */ |
|
37 | - public function init($mode = 'default') |
|
38 | - { |
|
39 | - } |
|
34 | + /** |
|
35 | + * @param string $mode |
|
36 | + */ |
|
37 | + public function init($mode = 'default') |
|
38 | + { |
|
39 | + } |
|
40 | 40 | |
41 | - /** |
|
42 | - * @param Compiler $compiler |
|
43 | - * @param array $params |
|
44 | - * @param string $prepend |
|
45 | - * @param string $append |
|
46 | - * @param string $type |
|
47 | - * |
|
48 | - * @return string |
|
49 | - */ |
|
50 | - public static function preProcessing(Compiler $compiler, array $params, $prepend, $append, $type) |
|
51 | - { |
|
52 | - return ''; |
|
53 | - } |
|
41 | + /** |
|
42 | + * @param Compiler $compiler |
|
43 | + * @param array $params |
|
44 | + * @param string $prepend |
|
45 | + * @param string $append |
|
46 | + * @param string $type |
|
47 | + * |
|
48 | + * @return string |
|
49 | + */ |
|
50 | + public static function preProcessing(Compiler $compiler, array $params, $prepend, $append, $type) |
|
51 | + { |
|
52 | + return ''; |
|
53 | + } |
|
54 | 54 | |
55 | - /** |
|
56 | - * @param Compiler $compiler |
|
57 | - * @param array $params |
|
58 | - * @param string $prepend |
|
59 | - * @param string $append |
|
60 | - * @param string $content |
|
61 | - * |
|
62 | - * @return mixed|string |
|
63 | - */ |
|
64 | - public static function postProcessing(Compiler $compiler, array $params, $prepend, $append, $content) |
|
65 | - { |
|
66 | - $params = $compiler->getCompiledParams($params); |
|
55 | + /** |
|
56 | + * @param Compiler $compiler |
|
57 | + * @param array $params |
|
58 | + * @param string $prepend |
|
59 | + * @param string $append |
|
60 | + * @param string $content |
|
61 | + * |
|
62 | + * @return mixed|string |
|
63 | + */ |
|
64 | + public static function postProcessing(Compiler $compiler, array $params, $prepend, $append, $content) |
|
65 | + { |
|
66 | + $params = $compiler->getCompiledParams($params); |
|
67 | 67 | |
68 | - $mode = trim($params['mode'], '"\''); |
|
69 | - switch ($mode) { |
|
70 | - case 'js': |
|
71 | - case 'javascript': |
|
72 | - $content = preg_replace('#(?<!:)//\s[^\r\n]*|/\*.*?\*/#s', '', $content); |
|
68 | + $mode = trim($params['mode'], '"\''); |
|
69 | + switch ($mode) { |
|
70 | + case 'js': |
|
71 | + case 'javascript': |
|
72 | + $content = preg_replace('#(?<!:)//\s[^\r\n]*|/\*.*?\*/#s', '', $content); |
|
73 | 73 | |
74 | - case 'default': |
|
75 | - default: |
|
76 | - } |
|
77 | - $content = preg_replace(array( |
|
78 | - "/\n/", |
|
79 | - "/\r/", |
|
80 | - '/(<\?(?:php)?|<%)\s*/' |
|
81 | - ), array( |
|
82 | - '', |
|
83 | - '', |
|
84 | - '$1 ' |
|
85 | - ), preg_replace('#^\s*(.+?)\s*$#m', '$1', $content)); |
|
74 | + case 'default': |
|
75 | + default: |
|
76 | + } |
|
77 | + $content = preg_replace(array( |
|
78 | + "/\n/", |
|
79 | + "/\r/", |
|
80 | + '/(<\?(?:php)?|<%)\s*/' |
|
81 | + ), array( |
|
82 | + '', |
|
83 | + '', |
|
84 | + '$1 ' |
|
85 | + ), preg_replace('#^\s*(.+?)\s*$#m', '$1', $content)); |
|
86 | 86 | |
87 | - return $content; |
|
88 | - } |
|
87 | + return $content; |
|
88 | + } |
|
89 | 89 | } |
@@ -32,67 +32,67 @@ |
||
32 | 32 | */ |
33 | 33 | class PluginAutoEscape extends BlockPlugin implements ICompilableBlock |
34 | 34 | { |
35 | - protected static $stack = array(); |
|
35 | + protected static $stack = array(); |
|
36 | 36 | |
37 | - /** |
|
38 | - * @param $enabled |
|
39 | - */ |
|
40 | - public function init($enabled) |
|
41 | - { |
|
42 | - } |
|
37 | + /** |
|
38 | + * @param $enabled |
|
39 | + */ |
|
40 | + public function init($enabled) |
|
41 | + { |
|
42 | + } |
|
43 | 43 | |
44 | - /** |
|
45 | - * @param Compiler $compiler |
|
46 | - * @param array $params |
|
47 | - * @param string $prepend |
|
48 | - * @param string $append |
|
49 | - * @param string $type |
|
50 | - * |
|
51 | - * @return string |
|
52 | - * @throws CompilationException |
|
53 | - */ |
|
54 | - public static function preProcessing(Compiler $compiler, array $params, $prepend, $append, $type) |
|
55 | - { |
|
56 | - $params = $compiler->getCompiledParams($params); |
|
57 | - switch (strtolower(trim((string)$params['enabled'], '"\''))) { |
|
44 | + /** |
|
45 | + * @param Compiler $compiler |
|
46 | + * @param array $params |
|
47 | + * @param string $prepend |
|
48 | + * @param string $append |
|
49 | + * @param string $type |
|
50 | + * |
|
51 | + * @return string |
|
52 | + * @throws CompilationException |
|
53 | + */ |
|
54 | + public static function preProcessing(Compiler $compiler, array $params, $prepend, $append, $type) |
|
55 | + { |
|
56 | + $params = $compiler->getCompiledParams($params); |
|
57 | + switch (strtolower(trim((string)$params['enabled'], '"\''))) { |
|
58 | 58 | |
59 | - case 'on': |
|
60 | - case 'true': |
|
61 | - case 'enabled': |
|
62 | - case 'enable': |
|
63 | - case '1': |
|
64 | - $enable = true; |
|
65 | - break; |
|
66 | - case 'off': |
|
67 | - case 'false': |
|
68 | - case 'disabled': |
|
69 | - case 'disable': |
|
70 | - case '0': |
|
71 | - $enable = false; |
|
72 | - break; |
|
73 | - default: |
|
74 | - throw new CompilationException($compiler, 'Auto_Escape : Invalid parameter (' . $params['enabled'] . '), valid parameters are "enable"/true or "disable"/false'); |
|
75 | - } |
|
59 | + case 'on': |
|
60 | + case 'true': |
|
61 | + case 'enabled': |
|
62 | + case 'enable': |
|
63 | + case '1': |
|
64 | + $enable = true; |
|
65 | + break; |
|
66 | + case 'off': |
|
67 | + case 'false': |
|
68 | + case 'disabled': |
|
69 | + case 'disable': |
|
70 | + case '0': |
|
71 | + $enable = false; |
|
72 | + break; |
|
73 | + default: |
|
74 | + throw new CompilationException($compiler, 'Auto_Escape : Invalid parameter (' . $params['enabled'] . '), valid parameters are "enable"/true or "disable"/false'); |
|
75 | + } |
|
76 | 76 | |
77 | - self::$stack[] = $compiler->getAutoEscape(); |
|
78 | - $compiler->setAutoEscape($enable); |
|
77 | + self::$stack[] = $compiler->getAutoEscape(); |
|
78 | + $compiler->setAutoEscape($enable); |
|
79 | 79 | |
80 | - return ''; |
|
81 | - } |
|
80 | + return ''; |
|
81 | + } |
|
82 | 82 | |
83 | - /** |
|
84 | - * @param Compiler $compiler |
|
85 | - * @param array $params |
|
86 | - * @param string $prepend |
|
87 | - * @param string $append |
|
88 | - * @param string $content |
|
89 | - * |
|
90 | - * @return string |
|
91 | - */ |
|
92 | - public static function postProcessing(Compiler $compiler, array $params, $prepend, $append, $content) |
|
93 | - { |
|
94 | - $compiler->setAutoEscape(array_pop(self::$stack)); |
|
83 | + /** |
|
84 | + * @param Compiler $compiler |
|
85 | + * @param array $params |
|
86 | + * @param string $prepend |
|
87 | + * @param string $append |
|
88 | + * @param string $content |
|
89 | + * |
|
90 | + * @return string |
|
91 | + */ |
|
92 | + public static function postProcessing(Compiler $compiler, array $params, $prepend, $append, $content) |
|
93 | + { |
|
94 | + $compiler->setAutoEscape(array_pop(self::$stack)); |
|
95 | 95 | |
96 | - return $content; |
|
97 | - } |
|
96 | + return $content; |
|
97 | + } |
|
98 | 98 | } |
@@ -38,59 +38,59 @@ |
||
38 | 38 | */ |
39 | 39 | class PluginElse extends BlockPlugin implements ICompilableBlock |
40 | 40 | { |
41 | - public function init() |
|
42 | - { |
|
43 | - } |
|
41 | + public function init() |
|
42 | + { |
|
43 | + } |
|
44 | 44 | |
45 | - /** |
|
46 | - * @param Compiler $compiler |
|
47 | - * @param array $params |
|
48 | - * @param string $prepend |
|
49 | - * @param string $append |
|
50 | - * @param string $type |
|
51 | - * |
|
52 | - * @return string |
|
53 | - * @throws CompilationException |
|
54 | - */ |
|
55 | - public static function preProcessing(Compiler $compiler, array $params, $prepend, $append, $type) |
|
56 | - { |
|
57 | - $preContent = ''; |
|
58 | - while (true) { |
|
59 | - $preContent .= $compiler->removeTopBlock(); |
|
60 | - $block = &$compiler->getCurrentBlock(); |
|
61 | - if (!$block) { |
|
62 | - throw new CompilationException($compiler, 'An else block was found but it was not preceded by an if or other else-able construct'); |
|
63 | - } |
|
64 | - $interfaces = class_implements($block['class']); |
|
65 | - if (in_array('Dwoo\IElseable', $interfaces) !== false) { |
|
66 | - break; |
|
67 | - } |
|
68 | - } |
|
45 | + /** |
|
46 | + * @param Compiler $compiler |
|
47 | + * @param array $params |
|
48 | + * @param string $prepend |
|
49 | + * @param string $append |
|
50 | + * @param string $type |
|
51 | + * |
|
52 | + * @return string |
|
53 | + * @throws CompilationException |
|
54 | + */ |
|
55 | + public static function preProcessing(Compiler $compiler, array $params, $prepend, $append, $type) |
|
56 | + { |
|
57 | + $preContent = ''; |
|
58 | + while (true) { |
|
59 | + $preContent .= $compiler->removeTopBlock(); |
|
60 | + $block = &$compiler->getCurrentBlock(); |
|
61 | + if (!$block) { |
|
62 | + throw new CompilationException($compiler, 'An else block was found but it was not preceded by an if or other else-able construct'); |
|
63 | + } |
|
64 | + $interfaces = class_implements($block['class']); |
|
65 | + if (in_array('Dwoo\IElseable', $interfaces) !== false) { |
|
66 | + break; |
|
67 | + } |
|
68 | + } |
|
69 | 69 | |
70 | - $params['initialized'] = true; |
|
71 | - $compiler->injectBlock($type, $params); |
|
70 | + $params['initialized'] = true; |
|
71 | + $compiler->injectBlock($type, $params); |
|
72 | 72 | |
73 | - return $preContent; |
|
74 | - } |
|
73 | + return $preContent; |
|
74 | + } |
|
75 | 75 | |
76 | - /** |
|
77 | - * @param Compiler $compiler |
|
78 | - * @param array $params |
|
79 | - * @param string $prepend |
|
80 | - * @param string $append |
|
81 | - * @param string $content |
|
82 | - * |
|
83 | - * @return string |
|
84 | - */ |
|
85 | - public static function postProcessing(Compiler $compiler, array $params, $prepend, $append, $content) |
|
86 | - { |
|
87 | - if (!isset($params['initialized'])) { |
|
88 | - return ''; |
|
89 | - } |
|
76 | + /** |
|
77 | + * @param Compiler $compiler |
|
78 | + * @param array $params |
|
79 | + * @param string $prepend |
|
80 | + * @param string $append |
|
81 | + * @param string $content |
|
82 | + * |
|
83 | + * @return string |
|
84 | + */ |
|
85 | + public static function postProcessing(Compiler $compiler, array $params, $prepend, $append, $content) |
|
86 | + { |
|
87 | + if (!isset($params['initialized'])) { |
|
88 | + return ''; |
|
89 | + } |
|
90 | 90 | |
91 | - $block = &$compiler->getCurrentBlock(); |
|
92 | - $block['params']['hasElse'] = Compiler::PHP_OPEN . "else {\n" . Compiler::PHP_CLOSE . $content . Compiler::PHP_OPEN . "\n}" . Compiler::PHP_CLOSE; |
|
91 | + $block = &$compiler->getCurrentBlock(); |
|
92 | + $block['params']['hasElse'] = Compiler::PHP_OPEN . "else {\n" . Compiler::PHP_CLOSE . $content . Compiler::PHP_OPEN . "\n}" . Compiler::PHP_CLOSE; |
|
93 | 93 | |
94 | - return ''; |
|
95 | - } |
|
94 | + return ''; |
|
95 | + } |
|
96 | 96 | } |
@@ -28,98 +28,98 @@ discard block |
||
28 | 28 | */ |
29 | 29 | class PluginSection extends BlockPlugin implements ICompilableBlock, IElseable |
30 | 30 | { |
31 | - public static $cnt = 0; |
|
32 | - |
|
33 | - /** |
|
34 | - * @param $name |
|
35 | - * @param $loop |
|
36 | - * @param null $start |
|
37 | - * @param null $step |
|
38 | - * @param null $max |
|
39 | - * @param bool $show |
|
40 | - */ |
|
41 | - public function init($name, $loop, $start = null, $step = null, $max = null, $show = true) |
|
42 | - { |
|
43 | - } |
|
44 | - |
|
45 | - /** |
|
46 | - * @param Compiler $compiler |
|
47 | - * @param array $params |
|
48 | - * @param string $prepend |
|
49 | - * @param string $append |
|
50 | - * @param string $type |
|
51 | - * |
|
52 | - * @return string |
|
53 | - */ |
|
54 | - public static function preProcessing(Compiler $compiler, array $params, $prepend, $append, $type) |
|
55 | - { |
|
56 | - return ''; |
|
57 | - } |
|
58 | - |
|
59 | - /** |
|
60 | - * @param Compiler $compiler |
|
61 | - * @param array $params |
|
62 | - * @param string $prepend |
|
63 | - * @param string $append |
|
64 | - * @param string $content |
|
65 | - * |
|
66 | - * @return string |
|
67 | - */ |
|
68 | - public static function postProcessing(Compiler $compiler, array $params, $prepend, $append, $content) |
|
69 | - { |
|
70 | - $output = Compiler::PHP_OPEN; |
|
71 | - $params = $compiler->getCompiledParams($params); |
|
72 | - |
|
73 | - // assigns params |
|
74 | - $loop = $params['loop']; |
|
75 | - $start = $params['start']; |
|
76 | - $max = $params['max']; |
|
77 | - $name = $params['name']; |
|
78 | - $step = $params['step']; |
|
79 | - $show = $params['show']; |
|
80 | - |
|
81 | - // gets unique id |
|
82 | - $cnt = self::$cnt ++; |
|
83 | - |
|
84 | - $output .= '$this->globals[\'section\'][' . $name . '] = array();' . "\n" . '$_section' . $cnt . ' =& $this->globals[\'section\'][' . $name . '];' . "\n"; |
|
85 | - |
|
86 | - if ($loop !== 'null') { |
|
87 | - $output .= '$_section' . $cnt . '[\'loop\'] = is_array($tmp = ' . $loop . ') ? count($tmp) : max(0, (int) $tmp);' . "\n"; |
|
88 | - } else { |
|
89 | - $output .= '$_section' . $cnt . '[\'loop\'] = 1;' . "\n"; |
|
90 | - } |
|
91 | - |
|
92 | - if ($show !== 'null') { |
|
93 | - $output .= '$_section' . $cnt . '[\'show\'] = ' . $show . ";\n"; |
|
94 | - } else { |
|
95 | - $output .= '$_section' . $cnt . '[\'show\'] = true;' . "\n"; |
|
96 | - } |
|
97 | - |
|
98 | - if ($name !== 'null') { |
|
99 | - $output .= '$_section' . $cnt . '[\'name\'] = ' . $name . ";\n"; |
|
100 | - } else { |
|
101 | - $output .= '$_section' . $cnt . '[\'name\'] = true;' . "\n"; |
|
102 | - } |
|
103 | - |
|
104 | - if ($max !== 'null') { |
|
105 | - $output .= '$_section' . $cnt . '[\'max\'] = (int)' . $max . ";\n" . 'if($_section' . $cnt . '[\'max\'] < 0) { $_section' . $cnt . '[\'max\'] = $_section' . $cnt . '[\'loop\']; }' . "\n"; |
|
106 | - } else { |
|
107 | - $output .= '$_section' . $cnt . '[\'max\'] = $_section' . $cnt . '[\'loop\'];' . "\n"; |
|
108 | - } |
|
109 | - |
|
110 | - if ($step !== 'null') { |
|
111 | - $output .= '$_section' . $cnt . '[\'step\'] = (int)' . $step . ' == 0 ? 1 : (int) ' . $step . ";\n"; |
|
112 | - } else { |
|
113 | - $output .= '$_section' . $cnt . '[\'step\'] = 1;' . "\n"; |
|
114 | - } |
|
115 | - |
|
116 | - if ($start !== 'null') { |
|
117 | - $output .= '$_section' . $cnt . '[\'start\'] = (int)' . $start . ";\n"; |
|
118 | - } else { |
|
119 | - $output .= '$_section' . $cnt . '[\'start\'] = $_section' . $cnt . '[\'step\'] > 0 ? 0 : $_section' . $cnt . '[\'loop\'] - 1;' . "\n" . 'if ($_section' . $cnt . '[\'start\'] < 0) { $_section' . $cnt . '[\'start\'] = max($_section' . $cnt . '[\'step\'] > 0 ? 0 : -1, $_section' . $cnt . '[\'loop\'] + $_section' . $cnt . '[\'start\']); } ' . "\n" . 'else { $_section' . $cnt . '[\'start\'] = min($_section' . $cnt . '[\'start\'], $_section' . $cnt . '[\'step\'] > 0 ? $_section' . $cnt . '[\'loop\'] : $_section' . $cnt . '[\'loop\'] -1); }' . "\n"; |
|
120 | - } |
|
121 | - |
|
122 | - /* if ($usesAny) { |
|
31 | + public static $cnt = 0; |
|
32 | + |
|
33 | + /** |
|
34 | + * @param $name |
|
35 | + * @param $loop |
|
36 | + * @param null $start |
|
37 | + * @param null $step |
|
38 | + * @param null $max |
|
39 | + * @param bool $show |
|
40 | + */ |
|
41 | + public function init($name, $loop, $start = null, $step = null, $max = null, $show = true) |
|
42 | + { |
|
43 | + } |
|
44 | + |
|
45 | + /** |
|
46 | + * @param Compiler $compiler |
|
47 | + * @param array $params |
|
48 | + * @param string $prepend |
|
49 | + * @param string $append |
|
50 | + * @param string $type |
|
51 | + * |
|
52 | + * @return string |
|
53 | + */ |
|
54 | + public static function preProcessing(Compiler $compiler, array $params, $prepend, $append, $type) |
|
55 | + { |
|
56 | + return ''; |
|
57 | + } |
|
58 | + |
|
59 | + /** |
|
60 | + * @param Compiler $compiler |
|
61 | + * @param array $params |
|
62 | + * @param string $prepend |
|
63 | + * @param string $append |
|
64 | + * @param string $content |
|
65 | + * |
|
66 | + * @return string |
|
67 | + */ |
|
68 | + public static function postProcessing(Compiler $compiler, array $params, $prepend, $append, $content) |
|
69 | + { |
|
70 | + $output = Compiler::PHP_OPEN; |
|
71 | + $params = $compiler->getCompiledParams($params); |
|
72 | + |
|
73 | + // assigns params |
|
74 | + $loop = $params['loop']; |
|
75 | + $start = $params['start']; |
|
76 | + $max = $params['max']; |
|
77 | + $name = $params['name']; |
|
78 | + $step = $params['step']; |
|
79 | + $show = $params['show']; |
|
80 | + |
|
81 | + // gets unique id |
|
82 | + $cnt = self::$cnt ++; |
|
83 | + |
|
84 | + $output .= '$this->globals[\'section\'][' . $name . '] = array();' . "\n" . '$_section' . $cnt . ' =& $this->globals[\'section\'][' . $name . '];' . "\n"; |
|
85 | + |
|
86 | + if ($loop !== 'null') { |
|
87 | + $output .= '$_section' . $cnt . '[\'loop\'] = is_array($tmp = ' . $loop . ') ? count($tmp) : max(0, (int) $tmp);' . "\n"; |
|
88 | + } else { |
|
89 | + $output .= '$_section' . $cnt . '[\'loop\'] = 1;' . "\n"; |
|
90 | + } |
|
91 | + |
|
92 | + if ($show !== 'null') { |
|
93 | + $output .= '$_section' . $cnt . '[\'show\'] = ' . $show . ";\n"; |
|
94 | + } else { |
|
95 | + $output .= '$_section' . $cnt . '[\'show\'] = true;' . "\n"; |
|
96 | + } |
|
97 | + |
|
98 | + if ($name !== 'null') { |
|
99 | + $output .= '$_section' . $cnt . '[\'name\'] = ' . $name . ";\n"; |
|
100 | + } else { |
|
101 | + $output .= '$_section' . $cnt . '[\'name\'] = true;' . "\n"; |
|
102 | + } |
|
103 | + |
|
104 | + if ($max !== 'null') { |
|
105 | + $output .= '$_section' . $cnt . '[\'max\'] = (int)' . $max . ";\n" . 'if($_section' . $cnt . '[\'max\'] < 0) { $_section' . $cnt . '[\'max\'] = $_section' . $cnt . '[\'loop\']; }' . "\n"; |
|
106 | + } else { |
|
107 | + $output .= '$_section' . $cnt . '[\'max\'] = $_section' . $cnt . '[\'loop\'];' . "\n"; |
|
108 | + } |
|
109 | + |
|
110 | + if ($step !== 'null') { |
|
111 | + $output .= '$_section' . $cnt . '[\'step\'] = (int)' . $step . ' == 0 ? 1 : (int) ' . $step . ";\n"; |
|
112 | + } else { |
|
113 | + $output .= '$_section' . $cnt . '[\'step\'] = 1;' . "\n"; |
|
114 | + } |
|
115 | + |
|
116 | + if ($start !== 'null') { |
|
117 | + $output .= '$_section' . $cnt . '[\'start\'] = (int)' . $start . ";\n"; |
|
118 | + } else { |
|
119 | + $output .= '$_section' . $cnt . '[\'start\'] = $_section' . $cnt . '[\'step\'] > 0 ? 0 : $_section' . $cnt . '[\'loop\'] - 1;' . "\n" . 'if ($_section' . $cnt . '[\'start\'] < 0) { $_section' . $cnt . '[\'start\'] = max($_section' . $cnt . '[\'step\'] > 0 ? 0 : -1, $_section' . $cnt . '[\'loop\'] + $_section' . $cnt . '[\'start\']); } ' . "\n" . 'else { $_section' . $cnt . '[\'start\'] = min($_section' . $cnt . '[\'start\'], $_section' . $cnt . '[\'step\'] > 0 ? $_section' . $cnt . '[\'loop\'] : $_section' . $cnt . '[\'loop\'] -1); }' . "\n"; |
|
120 | + } |
|
121 | + |
|
122 | + /* if ($usesAny) { |
|
123 | 123 | $output .= "\n".'$this->globals["section"]['.$name.'] = array'."\n("; |
124 | 124 | if ($usesIndex) $output .="\n\t".'"index" => 0,'; |
125 | 125 | if ($usesIteration) $output .="\n\t".'"iteration" => 1,'; |
@@ -131,29 +131,29 @@ discard block |
||
131 | 131 | } |
132 | 132 | */ |
133 | 133 | |
134 | - $output .= 'if ($_section' . $cnt . '[\'show\']) {' . "\n"; |
|
135 | - if ($start === 'null' && $step === 'null' && $max === 'null') { |
|
136 | - $output .= ' $_section' . $cnt . '[\'total\'] = $_section' . $cnt . '[\'loop\'];' . "\n"; |
|
137 | - } else { |
|
138 | - $output .= ' $_section' . $cnt . '[\'total\'] = min(ceil(($_section' . $cnt . '[\'step\'] > 0 ? $_section' . $cnt . '[\'loop\'] - $_section' . $cnt . '[\'start\'] : $_section' . $cnt . '[\'start\'] + 1) / abs($_section' . $cnt . '[\'step\'])), $_section' . $cnt . '[\'max\']);' . "\n"; |
|
139 | - } |
|
140 | - $output .= ' if ($_section' . $cnt . '[\'total\'] == 0) {' . "\n" . ' $_section' . $cnt . '[\'show\'] = false;' . "\n" . ' }' . "\n" . '} else {' . "\n" . ' $_section' . $cnt . '[\'total\'] = 0;' . "\n}\n"; |
|
141 | - $output .= 'if ($_section' . $cnt . '[\'show\']) {' . "\n"; |
|
142 | - $output .= "\t" . 'for ($this->scope[' . $name . '] = $_section' . $cnt . '[\'start\'], $_section' . $cnt . '[\'iteration\'] = 1; ' . '$_section' . $cnt . '[\'iteration\'] <= $_section' . $cnt . '[\'total\']; ' . '$this->scope[' . $name . '] += $_section' . $cnt . '[\'step\'], $_section' . $cnt . '[\'iteration\']++) {' . "\n"; |
|
143 | - $output .= "\t\t" . '$_section' . $cnt . '[\'rownum\'] = $_section' . $cnt . '[\'iteration\'];' . "\n"; |
|
144 | - $output .= "\t\t" . '$_section' . $cnt . '[\'index_prev\'] = $this->scope[' . $name . '] - $_section' . $cnt . '[\'step\'];' . "\n"; |
|
145 | - $output .= "\t\t" . '$_section' . $cnt . '[\'index_next\'] = $this->scope[' . $name . '] + $_section' . $cnt . '[\'step\'];' . "\n"; |
|
146 | - $output .= "\t\t" . '$_section' . $cnt . '[\'first\'] = ($_section' . $cnt . '[\'iteration\'] == 1);' . "\n"; |
|
147 | - $output .= "\t\t" . '$_section' . $cnt . '[\'last\'] = ($_section' . $cnt . '[\'iteration\'] == $_section' . $cnt . '[\'total\']);' . "\n"; |
|
148 | - |
|
149 | - $output .= Compiler::PHP_CLOSE . $content . Compiler::PHP_OPEN; |
|
150 | - |
|
151 | - $output .= "\n\t}\n} " . Compiler::PHP_CLOSE; |
|
152 | - |
|
153 | - if (isset($params['hasElse'])) { |
|
154 | - $output .= $params['hasElse']; |
|
155 | - } |
|
156 | - |
|
157 | - return $output; |
|
158 | - } |
|
134 | + $output .= 'if ($_section' . $cnt . '[\'show\']) {' . "\n"; |
|
135 | + if ($start === 'null' && $step === 'null' && $max === 'null') { |
|
136 | + $output .= ' $_section' . $cnt . '[\'total\'] = $_section' . $cnt . '[\'loop\'];' . "\n"; |
|
137 | + } else { |
|
138 | + $output .= ' $_section' . $cnt . '[\'total\'] = min(ceil(($_section' . $cnt . '[\'step\'] > 0 ? $_section' . $cnt . '[\'loop\'] - $_section' . $cnt . '[\'start\'] : $_section' . $cnt . '[\'start\'] + 1) / abs($_section' . $cnt . '[\'step\'])), $_section' . $cnt . '[\'max\']);' . "\n"; |
|
139 | + } |
|
140 | + $output .= ' if ($_section' . $cnt . '[\'total\'] == 0) {' . "\n" . ' $_section' . $cnt . '[\'show\'] = false;' . "\n" . ' }' . "\n" . '} else {' . "\n" . ' $_section' . $cnt . '[\'total\'] = 0;' . "\n}\n"; |
|
141 | + $output .= 'if ($_section' . $cnt . '[\'show\']) {' . "\n"; |
|
142 | + $output .= "\t" . 'for ($this->scope[' . $name . '] = $_section' . $cnt . '[\'start\'], $_section' . $cnt . '[\'iteration\'] = 1; ' . '$_section' . $cnt . '[\'iteration\'] <= $_section' . $cnt . '[\'total\']; ' . '$this->scope[' . $name . '] += $_section' . $cnt . '[\'step\'], $_section' . $cnt . '[\'iteration\']++) {' . "\n"; |
|
143 | + $output .= "\t\t" . '$_section' . $cnt . '[\'rownum\'] = $_section' . $cnt . '[\'iteration\'];' . "\n"; |
|
144 | + $output .= "\t\t" . '$_section' . $cnt . '[\'index_prev\'] = $this->scope[' . $name . '] - $_section' . $cnt . '[\'step\'];' . "\n"; |
|
145 | + $output .= "\t\t" . '$_section' . $cnt . '[\'index_next\'] = $this->scope[' . $name . '] + $_section' . $cnt . '[\'step\'];' . "\n"; |
|
146 | + $output .= "\t\t" . '$_section' . $cnt . '[\'first\'] = ($_section' . $cnt . '[\'iteration\'] == 1);' . "\n"; |
|
147 | + $output .= "\t\t" . '$_section' . $cnt . '[\'last\'] = ($_section' . $cnt . '[\'iteration\'] == $_section' . $cnt . '[\'total\']);' . "\n"; |
|
148 | + |
|
149 | + $output .= Compiler::PHP_CLOSE . $content . Compiler::PHP_OPEN; |
|
150 | + |
|
151 | + $output .= "\n\t}\n} " . Compiler::PHP_CLOSE; |
|
152 | + |
|
153 | + if (isset($params['hasElse'])) { |
|
154 | + $output .= $params['hasElse']; |
|
155 | + } |
|
156 | + |
|
157 | + return $output; |
|
158 | + } |
|
159 | 159 | } |
@@ -35,158 +35,158 @@ |
||
35 | 35 | */ |
36 | 36 | class PluginFor extends BlockPlugin implements ICompilableBlock, IElseable |
37 | 37 | { |
38 | - public static $cnt = 0; |
|
39 | - |
|
40 | - /** |
|
41 | - * @param $name |
|
42 | - * @param $from |
|
43 | - * @param null $to |
|
44 | - * @param int $step |
|
45 | - * @param int $skip |
|
46 | - */ |
|
47 | - public function init($name, $from, $to = null, $step = 1, $skip = 0) |
|
48 | - { |
|
49 | - } |
|
50 | - |
|
51 | - /** |
|
52 | - * @param Compiler $compiler |
|
53 | - * @param array $params |
|
54 | - * @param string $prepend |
|
55 | - * @param string $append |
|
56 | - * @param string $type |
|
57 | - * |
|
58 | - * @return string |
|
59 | - */ |
|
60 | - public static function preProcessing(Compiler $compiler, array $params, $prepend, $append, $type) |
|
61 | - { |
|
62 | - // get block params and save the current template pointer to use it in the postProcessing method |
|
63 | - $currentBlock = &$compiler->getCurrentBlock(); |
|
64 | - $currentBlock['params']['tplPointer'] = $compiler->getPointer(); |
|
65 | - |
|
66 | - return ''; |
|
67 | - } |
|
68 | - |
|
69 | - /** |
|
70 | - * @param Compiler $compiler |
|
71 | - * @param array $params |
|
72 | - * @param string $prepend |
|
73 | - * @param string $append |
|
74 | - * @param string $content |
|
75 | - * |
|
76 | - * @return string |
|
77 | - */ |
|
78 | - public static function postProcessing(Compiler $compiler, array $params, $prepend, $append, $content) |
|
79 | - { |
|
80 | - $params = $compiler->getCompiledParams($params); |
|
81 | - $tpl = $compiler->getTemplateSource($params['tplPointer']); |
|
82 | - |
|
83 | - // assigns params |
|
84 | - $from = $params['from']; |
|
85 | - $name = $params['name']; |
|
86 | - $step = $params['step']; |
|
87 | - $to = $params['to']; |
|
88 | - |
|
89 | - // evaluates which global variables have to be computed |
|
90 | - $varName = '$dwoo.for.' . trim($name, '"\'') . '.'; |
|
91 | - $shortVarName = '$.for.' . trim($name, '"\'') . '.'; |
|
92 | - $usesAny = strpos($tpl, $varName) !== false || strpos($tpl, $shortVarName) !== false; |
|
93 | - $usesFirst = strpos($tpl, $varName . 'first') !== false || strpos($tpl, $shortVarName . 'first') !== false; |
|
94 | - $usesLast = strpos($tpl, $varName . 'last') !== false || strpos($tpl, $shortVarName . 'last') !== false; |
|
95 | - $usesIndex = strpos($tpl, $varName . 'index') !== false || strpos($tpl, $shortVarName . 'index') !== false; |
|
96 | - $usesIteration = $usesFirst || $usesLast || strpos($tpl, $varName . 'iteration') !== false || strpos($tpl, $shortVarName . 'iteration') !== false; |
|
97 | - $usesShow = strpos($tpl, $varName . 'show') !== false || strpos($tpl, $shortVarName . 'show') !== false; |
|
98 | - $usesTotal = $usesLast || strpos($tpl, $varName . 'total') !== false || strpos($tpl, $shortVarName . 'total') !== false; |
|
99 | - |
|
100 | - if (strpos($name, '$this->scope[') !== false) { |
|
101 | - $usesAny = $usesFirst = $usesLast = $usesIndex = $usesIteration = $usesShow = $usesTotal = true; |
|
102 | - } |
|
103 | - |
|
104 | - // gets foreach id |
|
105 | - $cnt = self::$cnt ++; |
|
106 | - |
|
107 | - // builds pre processing output for |
|
108 | - $out = Compiler::PHP_OPEN . "\n" . '$_for' . $cnt . '_from = ' . $from . ';' . "\n" . '$_for' . $cnt . '_to = ' . $to . ';' . "\n" . '$_for' . $cnt . '_step = abs(' . $step . ');' . "\n" . 'if (is_numeric($_for' . $cnt . '_from) && !is_numeric($_for' . $cnt . '_to)) { $this->triggerError(\'For requires the <em>to</em> parameter when using a numerical <em>from</em>\'); }' . "\n" . '$tmp_shows = $this->isArray($_for' . $cnt . '_from, true) || (is_numeric($_for' . $cnt . '_from) && (abs(($_for' . $cnt . '_from - $_for' . $cnt . '_to)/$_for' . $cnt . '_step) !== 0 || $_for' . $cnt . '_from == $_for' . $cnt . '_to));'; |
|
109 | - // adds for properties |
|
110 | - if ($usesAny) { |
|
111 | - $out .= "\n" . '$this->globals["for"][' . $name . '] = array' . "\n("; |
|
112 | - if ($usesIndex) { |
|
113 | - $out .= "\n\t" . '"index" => 0,'; |
|
114 | - } |
|
115 | - if ($usesIteration) { |
|
116 | - $out .= "\n\t" . '"iteration" => 1,'; |
|
117 | - } |
|
118 | - if ($usesFirst) { |
|
119 | - $out .= "\n\t" . '"first" => null,'; |
|
120 | - } |
|
121 | - if ($usesLast) { |
|
122 | - $out .= "\n\t" . '"last" => null,'; |
|
123 | - } |
|
124 | - if ($usesShow) { |
|
125 | - $out .= "\n\t" . '"show" => $tmp_shows,'; |
|
126 | - } |
|
127 | - if ($usesTotal) { |
|
128 | - $out .= "\n\t" . '"total" => $this->isArray($_for' . $cnt . '_from) ? floor($this->count($_for' . $cnt . '_from) / $_for' . $cnt . '_step) : (is_numeric($_for' . $cnt . '_from) ? abs(($_for' . $cnt . '_to + 1 - $_for' . $cnt . '_from)/$_for' . $cnt . '_step) : 0),'; |
|
129 | - } |
|
130 | - $out .= "\n);\n" . '$_for' . $cnt . '_glob =& $this->globals["for"][' . $name . '];'; |
|
131 | - } |
|
132 | - // checks if for must be looped |
|
133 | - $out .= "\n" . 'if ($tmp_shows)' . "\n{"; |
|
134 | - // set from/to to correct values if an array was given |
|
135 | - $out .= "\n\t" . 'if ($this->isArray($_for' . $cnt . '_from' . (isset($params['hasElse']) ? ', true' : '') . ') == true) { |
|
38 | + public static $cnt = 0; |
|
39 | + |
|
40 | + /** |
|
41 | + * @param $name |
|
42 | + * @param $from |
|
43 | + * @param null $to |
|
44 | + * @param int $step |
|
45 | + * @param int $skip |
|
46 | + */ |
|
47 | + public function init($name, $from, $to = null, $step = 1, $skip = 0) |
|
48 | + { |
|
49 | + } |
|
50 | + |
|
51 | + /** |
|
52 | + * @param Compiler $compiler |
|
53 | + * @param array $params |
|
54 | + * @param string $prepend |
|
55 | + * @param string $append |
|
56 | + * @param string $type |
|
57 | + * |
|
58 | + * @return string |
|
59 | + */ |
|
60 | + public static function preProcessing(Compiler $compiler, array $params, $prepend, $append, $type) |
|
61 | + { |
|
62 | + // get block params and save the current template pointer to use it in the postProcessing method |
|
63 | + $currentBlock = &$compiler->getCurrentBlock(); |
|
64 | + $currentBlock['params']['tplPointer'] = $compiler->getPointer(); |
|
65 | + |
|
66 | + return ''; |
|
67 | + } |
|
68 | + |
|
69 | + /** |
|
70 | + * @param Compiler $compiler |
|
71 | + * @param array $params |
|
72 | + * @param string $prepend |
|
73 | + * @param string $append |
|
74 | + * @param string $content |
|
75 | + * |
|
76 | + * @return string |
|
77 | + */ |
|
78 | + public static function postProcessing(Compiler $compiler, array $params, $prepend, $append, $content) |
|
79 | + { |
|
80 | + $params = $compiler->getCompiledParams($params); |
|
81 | + $tpl = $compiler->getTemplateSource($params['tplPointer']); |
|
82 | + |
|
83 | + // assigns params |
|
84 | + $from = $params['from']; |
|
85 | + $name = $params['name']; |
|
86 | + $step = $params['step']; |
|
87 | + $to = $params['to']; |
|
88 | + |
|
89 | + // evaluates which global variables have to be computed |
|
90 | + $varName = '$dwoo.for.' . trim($name, '"\'') . '.'; |
|
91 | + $shortVarName = '$.for.' . trim($name, '"\'') . '.'; |
|
92 | + $usesAny = strpos($tpl, $varName) !== false || strpos($tpl, $shortVarName) !== false; |
|
93 | + $usesFirst = strpos($tpl, $varName . 'first') !== false || strpos($tpl, $shortVarName . 'first') !== false; |
|
94 | + $usesLast = strpos($tpl, $varName . 'last') !== false || strpos($tpl, $shortVarName . 'last') !== false; |
|
95 | + $usesIndex = strpos($tpl, $varName . 'index') !== false || strpos($tpl, $shortVarName . 'index') !== false; |
|
96 | + $usesIteration = $usesFirst || $usesLast || strpos($tpl, $varName . 'iteration') !== false || strpos($tpl, $shortVarName . 'iteration') !== false; |
|
97 | + $usesShow = strpos($tpl, $varName . 'show') !== false || strpos($tpl, $shortVarName . 'show') !== false; |
|
98 | + $usesTotal = $usesLast || strpos($tpl, $varName . 'total') !== false || strpos($tpl, $shortVarName . 'total') !== false; |
|
99 | + |
|
100 | + if (strpos($name, '$this->scope[') !== false) { |
|
101 | + $usesAny = $usesFirst = $usesLast = $usesIndex = $usesIteration = $usesShow = $usesTotal = true; |
|
102 | + } |
|
103 | + |
|
104 | + // gets foreach id |
|
105 | + $cnt = self::$cnt ++; |
|
106 | + |
|
107 | + // builds pre processing output for |
|
108 | + $out = Compiler::PHP_OPEN . "\n" . '$_for' . $cnt . '_from = ' . $from . ';' . "\n" . '$_for' . $cnt . '_to = ' . $to . ';' . "\n" . '$_for' . $cnt . '_step = abs(' . $step . ');' . "\n" . 'if (is_numeric($_for' . $cnt . '_from) && !is_numeric($_for' . $cnt . '_to)) { $this->triggerError(\'For requires the <em>to</em> parameter when using a numerical <em>from</em>\'); }' . "\n" . '$tmp_shows = $this->isArray($_for' . $cnt . '_from, true) || (is_numeric($_for' . $cnt . '_from) && (abs(($_for' . $cnt . '_from - $_for' . $cnt . '_to)/$_for' . $cnt . '_step) !== 0 || $_for' . $cnt . '_from == $_for' . $cnt . '_to));'; |
|
109 | + // adds for properties |
|
110 | + if ($usesAny) { |
|
111 | + $out .= "\n" . '$this->globals["for"][' . $name . '] = array' . "\n("; |
|
112 | + if ($usesIndex) { |
|
113 | + $out .= "\n\t" . '"index" => 0,'; |
|
114 | + } |
|
115 | + if ($usesIteration) { |
|
116 | + $out .= "\n\t" . '"iteration" => 1,'; |
|
117 | + } |
|
118 | + if ($usesFirst) { |
|
119 | + $out .= "\n\t" . '"first" => null,'; |
|
120 | + } |
|
121 | + if ($usesLast) { |
|
122 | + $out .= "\n\t" . '"last" => null,'; |
|
123 | + } |
|
124 | + if ($usesShow) { |
|
125 | + $out .= "\n\t" . '"show" => $tmp_shows,'; |
|
126 | + } |
|
127 | + if ($usesTotal) { |
|
128 | + $out .= "\n\t" . '"total" => $this->isArray($_for' . $cnt . '_from) ? floor($this->count($_for' . $cnt . '_from) / $_for' . $cnt . '_step) : (is_numeric($_for' . $cnt . '_from) ? abs(($_for' . $cnt . '_to + 1 - $_for' . $cnt . '_from)/$_for' . $cnt . '_step) : 0),'; |
|
129 | + } |
|
130 | + $out .= "\n);\n" . '$_for' . $cnt . '_glob =& $this->globals["for"][' . $name . '];'; |
|
131 | + } |
|
132 | + // checks if for must be looped |
|
133 | + $out .= "\n" . 'if ($tmp_shows)' . "\n{"; |
|
134 | + // set from/to to correct values if an array was given |
|
135 | + $out .= "\n\t" . 'if ($this->isArray($_for' . $cnt . '_from' . (isset($params['hasElse']) ? ', true' : '') . ') == true) { |
|
136 | 136 | $_for' . $cnt . '_to = is_numeric($_for' . $cnt . '_to) ? $_for' . $cnt . '_to - $_for' . $cnt . '_step : $this->count($_for' . $cnt . '_from) - 1; |
137 | 137 | $_for' . $cnt . '_from = 0; |
138 | 138 | }'; |
139 | 139 | |
140 | - // if input are pure numbers it shouldn't reorder them, if it's variables it gets too messy though so in that case a counter should be used |
|
141 | - $reverse = false; |
|
142 | - $condition = '<='; |
|
143 | - $incrementer = '+'; |
|
144 | - |
|
145 | - if (preg_match('{^(["\']?)([0-9]+)\1$}', $from, $mN1) && preg_match('{^(["\']?)([0-9]+)\1$}', $to, $mN2)) { |
|
146 | - $from = (int)$mN1[2]; |
|
147 | - $to = (int)$mN2[2]; |
|
148 | - if ($from > $to) { |
|
149 | - $reverse = true; |
|
150 | - $condition = '>='; |
|
151 | - $incrementer = '-'; |
|
152 | - } |
|
153 | - } |
|
154 | - |
|
155 | - // reverse from and to if needed |
|
156 | - if (!$reverse) { |
|
157 | - $out .= "\n\t" . 'if ($_for' . $cnt . '_from > $_for' . $cnt . '_to) { |
|
140 | + // if input are pure numbers it shouldn't reorder them, if it's variables it gets too messy though so in that case a counter should be used |
|
141 | + $reverse = false; |
|
142 | + $condition = '<='; |
|
143 | + $incrementer = '+'; |
|
144 | + |
|
145 | + if (preg_match('{^(["\']?)([0-9]+)\1$}', $from, $mN1) && preg_match('{^(["\']?)([0-9]+)\1$}', $to, $mN2)) { |
|
146 | + $from = (int)$mN1[2]; |
|
147 | + $to = (int)$mN2[2]; |
|
148 | + if ($from > $to) { |
|
149 | + $reverse = true; |
|
150 | + $condition = '>='; |
|
151 | + $incrementer = '-'; |
|
152 | + } |
|
153 | + } |
|
154 | + |
|
155 | + // reverse from and to if needed |
|
156 | + if (!$reverse) { |
|
157 | + $out .= "\n\t" . 'if ($_for' . $cnt . '_from > $_for' . $cnt . '_to) { |
|
158 | 158 | $tmp = $_for' . $cnt . '_from; |
159 | 159 | $_for' . $cnt . '_from = $_for' . $cnt . '_to; |
160 | 160 | $_for' . $cnt . '_to = $tmp; |
161 | 161 | }'; |
162 | - } |
|
163 | - |
|
164 | - $out .= "\n\t" . 'for ($this->scope[' . $name . '] = $_for' . $cnt . '_from; $this->scope[' . $name . '] ' . $condition . ' $_for' . $cnt . '_to; $this->scope[' . $name . '] ' . $incrementer . '= $_for' . $cnt . '_step)' . "\n\t{"; |
|
165 | - // updates properties |
|
166 | - if ($usesIndex) { |
|
167 | - $out .= "\n\t\t" . '$_for' . $cnt . '_glob["index"] = $this->scope[' . $name . '];'; |
|
168 | - } |
|
169 | - if ($usesFirst) { |
|
170 | - $out .= "\n\t\t" . '$_for' . $cnt . '_glob["first"] = (string) ($_for' . $cnt . '_glob["iteration"] === 1);'; |
|
171 | - } |
|
172 | - if ($usesLast) { |
|
173 | - $out .= "\n\t\t" . '$_for' . $cnt . '_glob["last"] = (string) ($_for' . $cnt . '_glob["iteration"] === $_for' . $cnt . '_glob["total"]);'; |
|
174 | - } |
|
175 | - $out .= "\n/* -- for start output */\n" . Compiler::PHP_CLOSE; |
|
176 | - |
|
177 | - // build post processing output and cache it |
|
178 | - $postOut = Compiler::PHP_OPEN . '/* -- for end output */'; |
|
179 | - // update properties |
|
180 | - if ($usesIteration) { |
|
181 | - $postOut .= "\n\t\t" . '$_for' . $cnt . '_glob["iteration"]+=1;'; |
|
182 | - } |
|
183 | - // end loop |
|
184 | - $postOut .= "\n\t}\n}\n" . Compiler::PHP_CLOSE; |
|
185 | - |
|
186 | - if (isset($params['hasElse'])) { |
|
187 | - $postOut .= $params['hasElse']; |
|
188 | - } |
|
189 | - |
|
190 | - return $out . $content . $postOut; |
|
191 | - } |
|
162 | + } |
|
163 | + |
|
164 | + $out .= "\n\t" . 'for ($this->scope[' . $name . '] = $_for' . $cnt . '_from; $this->scope[' . $name . '] ' . $condition . ' $_for' . $cnt . '_to; $this->scope[' . $name . '] ' . $incrementer . '= $_for' . $cnt . '_step)' . "\n\t{"; |
|
165 | + // updates properties |
|
166 | + if ($usesIndex) { |
|
167 | + $out .= "\n\t\t" . '$_for' . $cnt . '_glob["index"] = $this->scope[' . $name . '];'; |
|
168 | + } |
|
169 | + if ($usesFirst) { |
|
170 | + $out .= "\n\t\t" . '$_for' . $cnt . '_glob["first"] = (string) ($_for' . $cnt . '_glob["iteration"] === 1);'; |
|
171 | + } |
|
172 | + if ($usesLast) { |
|
173 | + $out .= "\n\t\t" . '$_for' . $cnt . '_glob["last"] = (string) ($_for' . $cnt . '_glob["iteration"] === $_for' . $cnt . '_glob["total"]);'; |
|
174 | + } |
|
175 | + $out .= "\n/* -- for start output */\n" . Compiler::PHP_CLOSE; |
|
176 | + |
|
177 | + // build post processing output and cache it |
|
178 | + $postOut = Compiler::PHP_OPEN . '/* -- for end output */'; |
|
179 | + // update properties |
|
180 | + if ($usesIteration) { |
|
181 | + $postOut .= "\n\t\t" . '$_for' . $cnt . '_glob["iteration"]+=1;'; |
|
182 | + } |
|
183 | + // end loop |
|
184 | + $postOut .= "\n\t}\n}\n" . Compiler::PHP_CLOSE; |
|
185 | + |
|
186 | + if (isset($params['hasElse'])) { |
|
187 | + $postOut .= $params['hasElse']; |
|
188 | + } |
|
189 | + |
|
190 | + return $out . $content . $postOut; |
|
191 | + } |
|
192 | 192 | } |
@@ -26,35 +26,35 @@ |
||
26 | 26 | */ |
27 | 27 | final class PluginTopLevelBlock extends BlockPlugin implements ICompilableBlock |
28 | 28 | { |
29 | - public function init() |
|
30 | - { |
|
31 | - } |
|
29 | + public function init() |
|
30 | + { |
|
31 | + } |
|
32 | 32 | |
33 | - /** |
|
34 | - * @param Compiler $compiler |
|
35 | - * @param array $params |
|
36 | - * @param string $prepend |
|
37 | - * @param string $append |
|
38 | - * @param string $type |
|
39 | - * |
|
40 | - * @return string |
|
41 | - */ |
|
42 | - public static function preProcessing(Compiler $compiler, array $params, $prepend, $append, $type) |
|
43 | - { |
|
44 | - return '/* end template head */ ob_start(); /* template body */ ' . Compiler::PHP_CLOSE; |
|
45 | - } |
|
33 | + /** |
|
34 | + * @param Compiler $compiler |
|
35 | + * @param array $params |
|
36 | + * @param string $prepend |
|
37 | + * @param string $append |
|
38 | + * @param string $type |
|
39 | + * |
|
40 | + * @return string |
|
41 | + */ |
|
42 | + public static function preProcessing(Compiler $compiler, array $params, $prepend, $append, $type) |
|
43 | + { |
|
44 | + return '/* end template head */ ob_start(); /* template body */ ' . Compiler::PHP_CLOSE; |
|
45 | + } |
|
46 | 46 | |
47 | - /** |
|
48 | - * @param Compiler $compiler |
|
49 | - * @param array $params |
|
50 | - * @param string $prepend |
|
51 | - * @param string $append |
|
52 | - * @param string $content |
|
53 | - * |
|
54 | - * @return string |
|
55 | - */ |
|
56 | - public static function postProcessing(Compiler $compiler, array $params, $prepend, $append, $content) |
|
57 | - { |
|
58 | - return $content . Compiler::PHP_OPEN . ' /* end template body */' . "\n" . 'return $this->buffer . ob_get_clean();'; |
|
59 | - } |
|
47 | + /** |
|
48 | + * @param Compiler $compiler |
|
49 | + * @param array $params |
|
50 | + * @param string $prepend |
|
51 | + * @param string $append |
|
52 | + * @param string $content |
|
53 | + * |
|
54 | + * @return string |
|
55 | + */ |
|
56 | + public static function postProcessing(Compiler $compiler, array $params, $prepend, $append, $content) |
|
57 | + { |
|
58 | + return $content . Compiler::PHP_OPEN . ' /* end template body */' . "\n" . 'return $this->buffer . ob_get_clean();'; |
|
59 | + } |
|
60 | 60 | } |
@@ -30,161 +30,161 @@ |
||
30 | 30 | */ |
31 | 31 | class PluginHtmlFormat extends Filter |
32 | 32 | { |
33 | - /** |
|
34 | - * tab count to auto-indent the source. |
|
35 | - * |
|
36 | - * @var int |
|
37 | - */ |
|
38 | - protected static $tabCount = - 1; |
|
39 | - |
|
40 | - /** |
|
41 | - * stores the additional data (following a tag) of the last call to open/close/singleTag. |
|
42 | - * |
|
43 | - * @var string |
|
44 | - */ |
|
45 | - protected static $lastCallAdd = ''; |
|
46 | - |
|
47 | - /** |
|
48 | - * formats the input using the singleTag/closeTag/openTag functions. |
|
49 | - * It is auto indenting the whole code, excluding <textarea>, <code> and <pre> tags that must be kept intact. |
|
50 | - * Those tags must however contain only htmlentities-escaped text for everything to work properly. |
|
51 | - * Inline tags are presented on a single line with their content |
|
52 | - * |
|
53 | - * @param string $input the xhtml to format |
|
54 | - * |
|
55 | - * @return string formatted xhtml |
|
56 | - */ |
|
57 | - public function process($input) |
|
58 | - { |
|
59 | - self::$tabCount = - 1; |
|
60 | - |
|
61 | - // auto indent all but textareas & pre (or we have weird tabs inside) |
|
62 | - $input = preg_replace_callback("#(<[^>]+>)(\s*)([^<]*)#", array( |
|
63 | - 'self', |
|
64 | - 'tagDispatcher' |
|
65 | - ), $input); |
|
66 | - |
|
67 | - return $input; |
|
68 | - } |
|
69 | - |
|
70 | - /** |
|
71 | - * helper function for format()'s preg_replace call. |
|
72 | - * |
|
73 | - * @param array $input array of matches (1=>tag, 2=>whitespace(optional), 3=>additional non-html content) |
|
74 | - * |
|
75 | - * @return string the indented tag |
|
76 | - */ |
|
77 | - protected static function tagDispatcher($input) |
|
78 | - { |
|
79 | - // textarea, pre, code tags and comments are to be left alone to avoid any non-wanted whitespace inside them so it just outputs them as they were |
|
80 | - if (substr($input[1], 0, 9) == '<textarea' || substr($input[1], 0, 4) == '<pre' || substr($input[1], 0, 5) == '<code' || substr($input[1], 0, 4) == '<!--' || substr($input[1], 0, 9) == '<![CDATA[') { |
|
81 | - return $input[1] . $input[3]; |
|
82 | - } |
|
83 | - // closing textarea, code and pre tags and self-closed tags (i.e. <br />) are printed as singleTags because we didn't use openTag for the formers and the latter is a single tag |
|
84 | - if (substr($input[1], 0, 10) == '</textarea' || substr($input[1], 0, 5) == '</pre' || substr($input[1], 0, 6) == '</code' || substr($input[1], - 2) == '/>') { |
|
85 | - return self::singleTag($input[1], $input[3], $input[2]); |
|
86 | - } |
|
87 | - // it's the closing tag |
|
88 | - if ($input[0][1] == '/') { |
|
89 | - return self::closeTag($input[1], $input[3], $input[2]); |
|
90 | - } |
|
91 | - |
|
92 | - // opening tag |
|
93 | - return self::openTag($input[1], $input[3], $input[2]); |
|
94 | - } |
|
95 | - |
|
96 | - /** |
|
97 | - * returns an open tag and adds a tab into the auto indenting. |
|
98 | - * |
|
99 | - * @param string $tag content of the tag |
|
100 | - * @param string $add additional data (anything before the following tag) |
|
101 | - * @param string $whitespace white space between the tag and the additional data |
|
102 | - * |
|
103 | - * @return string |
|
104 | - */ |
|
105 | - protected static function openTag($tag, $add, $whitespace) |
|
106 | - { |
|
107 | - $tabs = str_pad('', self::$tabCount ++, "\t"); |
|
108 | - |
|
109 | - if (preg_match('#^<(a|label|option|textarea|h1|h2|h3|h4|h5|h6|strong|b|em|i|abbr|acronym|cite|span|sub|sup|u|s|title)(?: [^>]*|)>#', $tag)) { |
|
110 | - // if it's one of those tag it's inline so it does not require a leading line break |
|
111 | - $result = $tag . $whitespace . str_replace("\n", "\n" . $tabs, $add); |
|
112 | - } elseif (substr($tag, 0, 9) == '<!DOCTYPE') { |
|
113 | - // it's the doctype declaration so no line break here either |
|
114 | - $result = $tabs . $tag; |
|
115 | - } else { |
|
116 | - // normal block tag |
|
117 | - $result = "\n" . $tabs . $tag; |
|
118 | - |
|
119 | - if (!empty($add)) { |
|
120 | - $result .= "\n" . $tabs . "\t" . str_replace("\n", "\n\t" . $tabs, $add); |
|
121 | - } |
|
122 | - } |
|
123 | - |
|
124 | - self::$lastCallAdd = $add; |
|
125 | - |
|
126 | - return $result; |
|
127 | - } |
|
128 | - |
|
129 | - /** |
|
130 | - * returns a closing tag and removes a tab from the auto indenting. |
|
131 | - * |
|
132 | - * @param string $tag content of the tag |
|
133 | - * @param string $add additional data (anything before the following tag) |
|
134 | - * @param string $whitespace white space between the tag and the additional data |
|
135 | - * |
|
136 | - * @return string |
|
137 | - */ |
|
138 | - protected static function closeTag($tag, $add, $whitespace) |
|
139 | - { |
|
140 | - $tabs = str_pad('', -- self::$tabCount, "\t"); |
|
141 | - |
|
142 | - // if it's one of those tag it's inline so it does not require a leading line break |
|
143 | - if (preg_match('#^</(a|label|option|textarea|h1|h2|h3|h4|h5|h6|strong|b|em|i|abbr|acronym|cite|span|sub|sup|u|s|title)>#', $tag)) { |
|
144 | - $result = $tag . $whitespace . str_replace("\n", "\n" . $tabs, $add); |
|
145 | - } else { |
|
146 | - $result = "\n" . $tabs . $tag; |
|
147 | - |
|
148 | - if (!empty($add)) { |
|
149 | - $result .= "\n" . $tabs . "\t" . str_replace("\n", "\n\t" . $tabs, $add); |
|
150 | - } |
|
151 | - } |
|
152 | - |
|
153 | - self::$lastCallAdd = $add; |
|
154 | - |
|
155 | - return $result; |
|
156 | - } |
|
157 | - |
|
158 | - /** |
|
159 | - * returns a single tag with auto indenting. |
|
160 | - * |
|
161 | - * @param string $tag content of the tag |
|
162 | - * @param string $add additional data (anything before the following tag) |
|
163 | - * |
|
164 | - * @return string |
|
165 | - */ |
|
166 | - protected static function singleTag($tag, $add, $whitespace) |
|
167 | - { |
|
168 | - $tabs = str_pad('', self::$tabCount, "\t"); |
|
169 | - |
|
170 | - // if it's img, br it's inline so it does not require a leading line break |
|
171 | - // if it's a closing textarea, code or pre tag, it does not require a leading line break either or it creates whitespace at the end of those blocks |
|
172 | - if (preg_match('#^<(img|br|/textarea|/pre|/code)(?: [^>]*|)>#', $tag)) { |
|
173 | - $result = $tag . $whitespace; |
|
174 | - |
|
175 | - if (!empty($add)) { |
|
176 | - $result .= str_replace("\n", "\n" . $tabs, $add); |
|
177 | - } |
|
178 | - } else { |
|
179 | - $result = "\n" . $tabs . $tag; |
|
180 | - |
|
181 | - if (!empty($add)) { |
|
182 | - $result .= "\n" . $tabs . str_replace("\n", "\n" . $tabs, $add); |
|
183 | - } |
|
184 | - } |
|
185 | - |
|
186 | - self::$lastCallAdd = $add; |
|
187 | - |
|
188 | - return $result; |
|
189 | - } |
|
33 | + /** |
|
34 | + * tab count to auto-indent the source. |
|
35 | + * |
|
36 | + * @var int |
|
37 | + */ |
|
38 | + protected static $tabCount = - 1; |
|
39 | + |
|
40 | + /** |
|
41 | + * stores the additional data (following a tag) of the last call to open/close/singleTag. |
|
42 | + * |
|
43 | + * @var string |
|
44 | + */ |
|
45 | + protected static $lastCallAdd = ''; |
|
46 | + |
|
47 | + /** |
|
48 | + * formats the input using the singleTag/closeTag/openTag functions. |
|
49 | + * It is auto indenting the whole code, excluding <textarea>, <code> and <pre> tags that must be kept intact. |
|
50 | + * Those tags must however contain only htmlentities-escaped text for everything to work properly. |
|
51 | + * Inline tags are presented on a single line with their content |
|
52 | + * |
|
53 | + * @param string $input the xhtml to format |
|
54 | + * |
|
55 | + * @return string formatted xhtml |
|
56 | + */ |
|
57 | + public function process($input) |
|
58 | + { |
|
59 | + self::$tabCount = - 1; |
|
60 | + |
|
61 | + // auto indent all but textareas & pre (or we have weird tabs inside) |
|
62 | + $input = preg_replace_callback("#(<[^>]+>)(\s*)([^<]*)#", array( |
|
63 | + 'self', |
|
64 | + 'tagDispatcher' |
|
65 | + ), $input); |
|
66 | + |
|
67 | + return $input; |
|
68 | + } |
|
69 | + |
|
70 | + /** |
|
71 | + * helper function for format()'s preg_replace call. |
|
72 | + * |
|
73 | + * @param array $input array of matches (1=>tag, 2=>whitespace(optional), 3=>additional non-html content) |
|
74 | + * |
|
75 | + * @return string the indented tag |
|
76 | + */ |
|
77 | + protected static function tagDispatcher($input) |
|
78 | + { |
|
79 | + // textarea, pre, code tags and comments are to be left alone to avoid any non-wanted whitespace inside them so it just outputs them as they were |
|
80 | + if (substr($input[1], 0, 9) == '<textarea' || substr($input[1], 0, 4) == '<pre' || substr($input[1], 0, 5) == '<code' || substr($input[1], 0, 4) == '<!--' || substr($input[1], 0, 9) == '<![CDATA[') { |
|
81 | + return $input[1] . $input[3]; |
|
82 | + } |
|
83 | + // closing textarea, code and pre tags and self-closed tags (i.e. <br />) are printed as singleTags because we didn't use openTag for the formers and the latter is a single tag |
|
84 | + if (substr($input[1], 0, 10) == '</textarea' || substr($input[1], 0, 5) == '</pre' || substr($input[1], 0, 6) == '</code' || substr($input[1], - 2) == '/>') { |
|
85 | + return self::singleTag($input[1], $input[3], $input[2]); |
|
86 | + } |
|
87 | + // it's the closing tag |
|
88 | + if ($input[0][1] == '/') { |
|
89 | + return self::closeTag($input[1], $input[3], $input[2]); |
|
90 | + } |
|
91 | + |
|
92 | + // opening tag |
|
93 | + return self::openTag($input[1], $input[3], $input[2]); |
|
94 | + } |
|
95 | + |
|
96 | + /** |
|
97 | + * returns an open tag and adds a tab into the auto indenting. |
|
98 | + * |
|
99 | + * @param string $tag content of the tag |
|
100 | + * @param string $add additional data (anything before the following tag) |
|
101 | + * @param string $whitespace white space between the tag and the additional data |
|
102 | + * |
|
103 | + * @return string |
|
104 | + */ |
|
105 | + protected static function openTag($tag, $add, $whitespace) |
|
106 | + { |
|
107 | + $tabs = str_pad('', self::$tabCount ++, "\t"); |
|
108 | + |
|
109 | + if (preg_match('#^<(a|label|option|textarea|h1|h2|h3|h4|h5|h6|strong|b|em|i|abbr|acronym|cite|span|sub|sup|u|s|title)(?: [^>]*|)>#', $tag)) { |
|
110 | + // if it's one of those tag it's inline so it does not require a leading line break |
|
111 | + $result = $tag . $whitespace . str_replace("\n", "\n" . $tabs, $add); |
|
112 | + } elseif (substr($tag, 0, 9) == '<!DOCTYPE') { |
|
113 | + // it's the doctype declaration so no line break here either |
|
114 | + $result = $tabs . $tag; |
|
115 | + } else { |
|
116 | + // normal block tag |
|
117 | + $result = "\n" . $tabs . $tag; |
|
118 | + |
|
119 | + if (!empty($add)) { |
|
120 | + $result .= "\n" . $tabs . "\t" . str_replace("\n", "\n\t" . $tabs, $add); |
|
121 | + } |
|
122 | + } |
|
123 | + |
|
124 | + self::$lastCallAdd = $add; |
|
125 | + |
|
126 | + return $result; |
|
127 | + } |
|
128 | + |
|
129 | + /** |
|
130 | + * returns a closing tag and removes a tab from the auto indenting. |
|
131 | + * |
|
132 | + * @param string $tag content of the tag |
|
133 | + * @param string $add additional data (anything before the following tag) |
|
134 | + * @param string $whitespace white space between the tag and the additional data |
|
135 | + * |
|
136 | + * @return string |
|
137 | + */ |
|
138 | + protected static function closeTag($tag, $add, $whitespace) |
|
139 | + { |
|
140 | + $tabs = str_pad('', -- self::$tabCount, "\t"); |
|
141 | + |
|
142 | + // if it's one of those tag it's inline so it does not require a leading line break |
|
143 | + if (preg_match('#^</(a|label|option|textarea|h1|h2|h3|h4|h5|h6|strong|b|em|i|abbr|acronym|cite|span|sub|sup|u|s|title)>#', $tag)) { |
|
144 | + $result = $tag . $whitespace . str_replace("\n", "\n" . $tabs, $add); |
|
145 | + } else { |
|
146 | + $result = "\n" . $tabs . $tag; |
|
147 | + |
|
148 | + if (!empty($add)) { |
|
149 | + $result .= "\n" . $tabs . "\t" . str_replace("\n", "\n\t" . $tabs, $add); |
|
150 | + } |
|
151 | + } |
|
152 | + |
|
153 | + self::$lastCallAdd = $add; |
|
154 | + |
|
155 | + return $result; |
|
156 | + } |
|
157 | + |
|
158 | + /** |
|
159 | + * returns a single tag with auto indenting. |
|
160 | + * |
|
161 | + * @param string $tag content of the tag |
|
162 | + * @param string $add additional data (anything before the following tag) |
|
163 | + * |
|
164 | + * @return string |
|
165 | + */ |
|
166 | + protected static function singleTag($tag, $add, $whitespace) |
|
167 | + { |
|
168 | + $tabs = str_pad('', self::$tabCount, "\t"); |
|
169 | + |
|
170 | + // if it's img, br it's inline so it does not require a leading line break |
|
171 | + // if it's a closing textarea, code or pre tag, it does not require a leading line break either or it creates whitespace at the end of those blocks |
|
172 | + if (preg_match('#^<(img|br|/textarea|/pre|/code)(?: [^>]*|)>#', $tag)) { |
|
173 | + $result = $tag . $whitespace; |
|
174 | + |
|
175 | + if (!empty($add)) { |
|
176 | + $result .= str_replace("\n", "\n" . $tabs, $add); |
|
177 | + } |
|
178 | + } else { |
|
179 | + $result = "\n" . $tabs . $tag; |
|
180 | + |
|
181 | + if (!empty($add)) { |
|
182 | + $result .= "\n" . $tabs . str_replace("\n", "\n" . $tabs, $add); |
|
183 | + } |
|
184 | + } |
|
185 | + |
|
186 | + self::$lastCallAdd = $add; |
|
187 | + |
|
188 | + return $result; |
|
189 | + } |
|
190 | 190 | } |
@@ -23,176 +23,176 @@ |
||
23 | 23 | */ |
24 | 24 | class Loader implements ILoader |
25 | 25 | { |
26 | - /** |
|
27 | - * Stores the plugin directories. |
|
28 | - * |
|
29 | - * @see addDirectory |
|
30 | - * @var array |
|
31 | - */ |
|
32 | - protected $paths = array(); |
|
26 | + /** |
|
27 | + * Stores the plugin directories. |
|
28 | + * |
|
29 | + * @see addDirectory |
|
30 | + * @var array |
|
31 | + */ |
|
32 | + protected $paths = array(); |
|
33 | 33 | |
34 | - /** |
|
35 | - * Stores the plugins names/paths relationships |
|
36 | - * don't edit this on your own, use addDirectory. |
|
37 | - * |
|
38 | - * @see addDirectory |
|
39 | - * @var array |
|
40 | - */ |
|
41 | - protected $classPath = array(); |
|
34 | + /** |
|
35 | + * Stores the plugins names/paths relationships |
|
36 | + * don't edit this on your own, use addDirectory. |
|
37 | + * |
|
38 | + * @see addDirectory |
|
39 | + * @var array |
|
40 | + */ |
|
41 | + protected $classPath = array(); |
|
42 | 42 | |
43 | - /** |
|
44 | - * Path where class paths cache files are written. |
|
45 | - * |
|
46 | - * @var string |
|
47 | - */ |
|
48 | - protected $cacheDir; |
|
43 | + /** |
|
44 | + * Path where class paths cache files are written. |
|
45 | + * |
|
46 | + * @var string |
|
47 | + */ |
|
48 | + protected $cacheDir; |
|
49 | 49 | |
50 | - /** |
|
51 | - * Path where builtin plugins are stored. |
|
52 | - * |
|
53 | - * @var string |
|
54 | - */ |
|
55 | - protected $corePluginDir; |
|
50 | + /** |
|
51 | + * Path where builtin plugins are stored. |
|
52 | + * |
|
53 | + * @var string |
|
54 | + */ |
|
55 | + protected $corePluginDir; |
|
56 | 56 | |
57 | - /** |
|
58 | - * Loader constructor. |
|
59 | - * |
|
60 | - * @param $cacheDir |
|
61 | - */ |
|
62 | - public function __construct($cacheDir) |
|
63 | - { |
|
64 | - $this->corePluginDir = __DIR__ . DIRECTORY_SEPARATOR . 'Plugins'; |
|
65 | - $this->cacheDir = rtrim($cacheDir, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR; |
|
57 | + /** |
|
58 | + * Loader constructor. |
|
59 | + * |
|
60 | + * @param $cacheDir |
|
61 | + */ |
|
62 | + public function __construct($cacheDir) |
|
63 | + { |
|
64 | + $this->corePluginDir = __DIR__ . DIRECTORY_SEPARATOR . 'Plugins'; |
|
65 | + $this->cacheDir = rtrim($cacheDir, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR; |
|
66 | 66 | |
67 | - // include class paths or rebuild paths if the cache file isn't there |
|
68 | - $cacheFile = $this->cacheDir . 'classpath.cache.d' . Core::RELEASE_TAG . '.php'; |
|
69 | - if (file_exists($cacheFile)) { |
|
70 | - $classpath = file_get_contents($cacheFile); |
|
71 | - $this->classPath = unserialize($classpath) + $this->classPath; |
|
72 | - } else { |
|
73 | - $this->rebuildClassPathCache($this->corePluginDir, $cacheFile); |
|
74 | - } |
|
75 | - } |
|
67 | + // include class paths or rebuild paths if the cache file isn't there |
|
68 | + $cacheFile = $this->cacheDir . 'classpath.cache.d' . Core::RELEASE_TAG . '.php'; |
|
69 | + if (file_exists($cacheFile)) { |
|
70 | + $classpath = file_get_contents($cacheFile); |
|
71 | + $this->classPath = unserialize($classpath) + $this->classPath; |
|
72 | + } else { |
|
73 | + $this->rebuildClassPathCache($this->corePluginDir, $cacheFile); |
|
74 | + } |
|
75 | + } |
|
76 | 76 | |
77 | - /** |
|
78 | - * Rebuilds class paths, scans the given directory recursively and saves all paths in the given file. |
|
79 | - * |
|
80 | - * @param string $path the plugin path to scan |
|
81 | - * @param string $cacheFile the file where to store the plugin paths cache, it will be overwritten |
|
82 | - * |
|
83 | - * @throws Exception |
|
84 | - */ |
|
85 | - protected function rebuildClassPathCache($path, $cacheFile) |
|
86 | - { |
|
87 | - if ($cacheFile !== false) { |
|
88 | - $tmp = $this->classPath; |
|
89 | - $this->classPath = array(); |
|
90 | - } |
|
77 | + /** |
|
78 | + * Rebuilds class paths, scans the given directory recursively and saves all paths in the given file. |
|
79 | + * |
|
80 | + * @param string $path the plugin path to scan |
|
81 | + * @param string $cacheFile the file where to store the plugin paths cache, it will be overwritten |
|
82 | + * |
|
83 | + * @throws Exception |
|
84 | + */ |
|
85 | + protected function rebuildClassPathCache($path, $cacheFile) |
|
86 | + { |
|
87 | + if ($cacheFile !== false) { |
|
88 | + $tmp = $this->classPath; |
|
89 | + $this->classPath = array(); |
|
90 | + } |
|
91 | 91 | |
92 | - // iterates over all files/folders |
|
93 | - $list = glob(rtrim($path, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . '*'); |
|
94 | - if (is_array($list)) { |
|
95 | - foreach ($list as $f) { |
|
96 | - if (is_dir($f)) { |
|
97 | - $this->rebuildClassPathCache($f, false); |
|
98 | - } else { |
|
99 | - // TODO: is it still valid now? |
|
100 | - $this->classPath[str_replace(array( |
|
101 | - 'function.', |
|
102 | - 'block.', |
|
103 | - 'modifier.', |
|
104 | - 'outputfilter.', |
|
105 | - 'filter.', |
|
106 | - 'prefilter.', |
|
107 | - 'postfilter.', |
|
108 | - 'pre.', |
|
109 | - 'post.', |
|
110 | - 'output.', |
|
111 | - 'shared.', |
|
112 | - 'helper.' |
|
113 | - ), '', basename($f, '.php'))] = $f; |
|
114 | - } |
|
115 | - } |
|
116 | - } |
|
92 | + // iterates over all files/folders |
|
93 | + $list = glob(rtrim($path, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . '*'); |
|
94 | + if (is_array($list)) { |
|
95 | + foreach ($list as $f) { |
|
96 | + if (is_dir($f)) { |
|
97 | + $this->rebuildClassPathCache($f, false); |
|
98 | + } else { |
|
99 | + // TODO: is it still valid now? |
|
100 | + $this->classPath[str_replace(array( |
|
101 | + 'function.', |
|
102 | + 'block.', |
|
103 | + 'modifier.', |
|
104 | + 'outputfilter.', |
|
105 | + 'filter.', |
|
106 | + 'prefilter.', |
|
107 | + 'postfilter.', |
|
108 | + 'pre.', |
|
109 | + 'post.', |
|
110 | + 'output.', |
|
111 | + 'shared.', |
|
112 | + 'helper.' |
|
113 | + ), '', basename($f, '.php'))] = $f; |
|
114 | + } |
|
115 | + } |
|
116 | + } |
|
117 | 117 | |
118 | - // save in file if it's the first call (not recursed) |
|
119 | - if ($cacheFile !== false) { |
|
120 | - if (!file_put_contents($cacheFile, serialize($this->classPath))) { |
|
121 | - throw new Exception('Could not write into ' . $cacheFile . |
|
122 | - ', either because the folder is not there (create it) or because of the chmod configuration (please ensure this directory is writable by php), alternatively you can change the directory used with $dwoo->setCompileDir() or provide a custom loader object with $dwoo->setLoader()'); |
|
123 | - } |
|
124 | - $this->classPath += $tmp; |
|
125 | - } |
|
126 | - } |
|
118 | + // save in file if it's the first call (not recursed) |
|
119 | + if ($cacheFile !== false) { |
|
120 | + if (!file_put_contents($cacheFile, serialize($this->classPath))) { |
|
121 | + throw new Exception('Could not write into ' . $cacheFile . |
|
122 | + ', either because the folder is not there (create it) or because of the chmod configuration (please ensure this directory is writable by php), alternatively you can change the directory used with $dwoo->setCompileDir() or provide a custom loader object with $dwoo->setLoader()'); |
|
123 | + } |
|
124 | + $this->classPath += $tmp; |
|
125 | + } |
|
126 | + } |
|
127 | 127 | |
128 | - /** |
|
129 | - * Loads a plugin file. |
|
130 | - * |
|
131 | - * @param string $class the plugin name, without the `Plugin` prefix |
|
132 | - * @param bool $forceRehash if true, the class path caches will be rebuilt if the plugin is not found, in case it |
|
133 | - * has just been added, defaults to true |
|
134 | - * |
|
135 | - * @throws Exception |
|
136 | - */ |
|
137 | - public function loadPlugin($class, $forceRehash = true) |
|
138 | - { |
|
139 | - /** |
|
140 | - * An unknown class was requested (maybe newly added) or the |
|
141 | - * include failed so we rebuild the cache. include() will fail |
|
142 | - * with an uncatchable error if the file doesn't exist, which |
|
143 | - * usually means that the cache is stale and must be rebuilt, |
|
144 | - * so we check for that before trying to include() the plugin. |
|
145 | - */ |
|
146 | - if ((!isset($this->classPath[$class]) || !is_readable($this->classPath[$class])) || (!isset |
|
147 | - ($this->classPath[$class . 'Compile']) || !is_readable($this->classPath[$class . 'Compile']))) { |
|
148 | - if ($forceRehash) { |
|
149 | - $this->rebuildClassPathCache($this->corePluginDir, $this->cacheDir . 'classpath.cache.d' . |
|
150 | - Core::RELEASE_TAG . '.php'); |
|
151 | - foreach ($this->paths as $path => $file) { |
|
152 | - $this->rebuildClassPathCache($path, $file); |
|
153 | - } |
|
154 | - if (isset($this->classPath[$class])) { |
|
155 | - include_once $this->classPath[$class]; |
|
156 | - } elseif (isset($this->classPath[$class . 'Compile'])) { |
|
157 | - include_once $this->classPath[$class . 'Compile']; |
|
158 | - } else { |
|
159 | - throw new Exception('Plugin "' . $class . |
|
160 | - '" can not be found, maybe you forgot to bind it if it\'s a custom plugin ?', E_USER_NOTICE); |
|
161 | - } |
|
162 | - } else { |
|
163 | - throw new Exception('Plugin "' . $class . |
|
164 | - '" can not be found, maybe you forgot to bind it if it\'s a custom plugin ?', E_USER_NOTICE); |
|
165 | - } |
|
166 | - } |
|
167 | - } |
|
128 | + /** |
|
129 | + * Loads a plugin file. |
|
130 | + * |
|
131 | + * @param string $class the plugin name, without the `Plugin` prefix |
|
132 | + * @param bool $forceRehash if true, the class path caches will be rebuilt if the plugin is not found, in case it |
|
133 | + * has just been added, defaults to true |
|
134 | + * |
|
135 | + * @throws Exception |
|
136 | + */ |
|
137 | + public function loadPlugin($class, $forceRehash = true) |
|
138 | + { |
|
139 | + /** |
|
140 | + * An unknown class was requested (maybe newly added) or the |
|
141 | + * include failed so we rebuild the cache. include() will fail |
|
142 | + * with an uncatchable error if the file doesn't exist, which |
|
143 | + * usually means that the cache is stale and must be rebuilt, |
|
144 | + * so we check for that before trying to include() the plugin. |
|
145 | + */ |
|
146 | + if ((!isset($this->classPath[$class]) || !is_readable($this->classPath[$class])) || (!isset |
|
147 | + ($this->classPath[$class . 'Compile']) || !is_readable($this->classPath[$class . 'Compile']))) { |
|
148 | + if ($forceRehash) { |
|
149 | + $this->rebuildClassPathCache($this->corePluginDir, $this->cacheDir . 'classpath.cache.d' . |
|
150 | + Core::RELEASE_TAG . '.php'); |
|
151 | + foreach ($this->paths as $path => $file) { |
|
152 | + $this->rebuildClassPathCache($path, $file); |
|
153 | + } |
|
154 | + if (isset($this->classPath[$class])) { |
|
155 | + include_once $this->classPath[$class]; |
|
156 | + } elseif (isset($this->classPath[$class . 'Compile'])) { |
|
157 | + include_once $this->classPath[$class . 'Compile']; |
|
158 | + } else { |
|
159 | + throw new Exception('Plugin "' . $class . |
|
160 | + '" can not be found, maybe you forgot to bind it if it\'s a custom plugin ?', E_USER_NOTICE); |
|
161 | + } |
|
162 | + } else { |
|
163 | + throw new Exception('Plugin "' . $class . |
|
164 | + '" can not be found, maybe you forgot to bind it if it\'s a custom plugin ?', E_USER_NOTICE); |
|
165 | + } |
|
166 | + } |
|
167 | + } |
|
168 | 168 | |
169 | - /** |
|
170 | - * Adds a plugin directory, the plugins found in the new plugin directory |
|
171 | - * will take precedence over the other directories (including the default |
|
172 | - * dwoo plugin directory), you can use this for example to override plugins |
|
173 | - * in a specific directory for a specific application while keeping all your |
|
174 | - * usual plugins in the same place for all applications. |
|
175 | - * TOCOM don't forget that php functions overrides are not rehashed so you |
|
176 | - * need to clear the classpath caches by hand when adding those. |
|
177 | - * |
|
178 | - * @param string $pluginDirectory the plugin path to scan |
|
179 | - * |
|
180 | - * @throws Exception |
|
181 | - */ |
|
182 | - public function addDirectory($pluginDirectory) |
|
183 | - { |
|
184 | - $pluginDir = realpath($pluginDirectory); |
|
185 | - if (!$pluginDir) { |
|
186 | - throw new Exception('Plugin directory does not exist or can not be read : ' . $pluginDirectory); |
|
187 | - } |
|
188 | - $cacheFile = $this->cacheDir . 'classpath-' . substr(strtr($pluginDir, '/\\:' . PATH_SEPARATOR, '----'), |
|
189 | - strlen($pluginDir) > 80 ? - 80 : 0) . '.d' . Core::RELEASE_TAG . '.php'; |
|
190 | - $this->paths[$pluginDir] = $cacheFile; |
|
191 | - if (file_exists($cacheFile)) { |
|
192 | - $classpath = file_get_contents($cacheFile); |
|
193 | - $this->classPath = unserialize($classpath) + $this->classPath; |
|
194 | - } else { |
|
195 | - $this->rebuildClassPathCache($pluginDir, $cacheFile); |
|
196 | - } |
|
197 | - } |
|
169 | + /** |
|
170 | + * Adds a plugin directory, the plugins found in the new plugin directory |
|
171 | + * will take precedence over the other directories (including the default |
|
172 | + * dwoo plugin directory), you can use this for example to override plugins |
|
173 | + * in a specific directory for a specific application while keeping all your |
|
174 | + * usual plugins in the same place for all applications. |
|
175 | + * TOCOM don't forget that php functions overrides are not rehashed so you |
|
176 | + * need to clear the classpath caches by hand when adding those. |
|
177 | + * |
|
178 | + * @param string $pluginDirectory the plugin path to scan |
|
179 | + * |
|
180 | + * @throws Exception |
|
181 | + */ |
|
182 | + public function addDirectory($pluginDirectory) |
|
183 | + { |
|
184 | + $pluginDir = realpath($pluginDirectory); |
|
185 | + if (!$pluginDir) { |
|
186 | + throw new Exception('Plugin directory does not exist or can not be read : ' . $pluginDirectory); |
|
187 | + } |
|
188 | + $cacheFile = $this->cacheDir . 'classpath-' . substr(strtr($pluginDir, '/\\:' . PATH_SEPARATOR, '----'), |
|
189 | + strlen($pluginDir) > 80 ? - 80 : 0) . '.d' . Core::RELEASE_TAG . '.php'; |
|
190 | + $this->paths[$pluginDir] = $cacheFile; |
|
191 | + if (file_exists($cacheFile)) { |
|
192 | + $classpath = file_get_contents($cacheFile); |
|
193 | + $this->classPath = unserialize($classpath) + $this->classPath; |
|
194 | + } else { |
|
195 | + $this->rebuildClassPathCache($pluginDir, $cacheFile); |
|
196 | + } |
|
197 | + } |
|
198 | 198 | } |