From a77a2ec58947f5fc7cb4023db3b8f8298e2f01f2 Mon Sep 17 00:00:00 2001 From: Kevin Chabowski Date: Mon, 28 Oct 2013 18:09:50 +0100 Subject: ste:foreach now has an else clause for empty arrays. --- docu/language_definition.html | 8 ++++++++ ste.php | 23 ++++++++++++++++++++--- tests/test_foreach/.gitignore | 3 +++ tests/test_foreach/code.php | 9 +++++++++ tests/test_foreach/test.tpl | 8 ++++++++ tests/test_foreach/want | 5 +++++ 6 files changed, 53 insertions(+), 3 deletions(-) create mode 100644 tests/test_foreach/.gitignore create mode 100644 tests/test_foreach/code.php create mode 100644 tests/test_foreach/test.tpl create mode 100644 tests/test_foreach/want diff --git a/docu/language_definition.html b/docu/language_definition.html index a21a869..84232de 100644 --- a/docu/language_definition.html +++ b/docu/language_definition.html @@ -380,6 +380,14 @@
<ste:foreach array="foo" key="k" value="v" counter="i">
Number: $i<br />
Key: $k<br />
Value: $v<br />
<br />
</ste:foreach>
This code will loop through the array foo and return the counter $i, the key $k and the value $v of the current iteration.

+

+ There can also be an optional <ste:else> clause, that will be executed, if the input array was empty. +

+

+ Example:
+

<ste:foreach array="foo" value="v">
<p>$v</p>
<ste:else>
Array \$foo is empty.
</ste:else>
</ste:foreach>
+ This code will list all array elements or will display Array $foo is empty if the array $foo is empty. +

ste:infloop

Creates an infinitive loop. You can get out of the loop using the ste:break tag. Can be used to emulate other loop constructs like while loops.

diff --git a/ste.php b/ste.php index 3715435..018d754 100644 --- a/ste.php +++ b/ste.php @@ -887,14 +887,29 @@ $ste_builtins = array( $loopbody .= "\$${loopname}_counter++;\n\$ste->set_var_by_name(\$${loopname}_countervar, \$${loopname}_counter);\n"; } + $loop = array(); + $else = array(); + foreach($ast->sub as $node) { + if(($node instanceof TagNode) && ($node->name == "else")) { + $else = array_merge($else, $node->sub); + } else { + $loop[] = $node; + } + } + $loopbody .= "\$ste->set_var_by_name(\$${loopname}_valuevar, \$${loopname}_value);\n"; if(!empty($ast->params["key"])) { $loopbody .= "\$ste->set_var_by_name(\$${loopname}_keyvar, \$${loopname}_key);\n"; } $loopbody .= "\n"; - $loopbody .= _transcompile($ast->sub); + $loopbody .= _transcompile($loop); $loopbody = "{\n" . loopbody(indent_code($loopbody)) . "\n}\n"; + if(!empty($else)) { + $code .= "if(empty(\$${loopname}_array))\n{\n"; + $code .= indent_code(_transcompile($else)); + $code .= "\n}\nelse "; + } $code .= "foreach(\$${loopname}_array as \$${loopname}_key => \$${loopname}_value)\n$loopbody\n"; return $code; @@ -1351,13 +1366,15 @@ class STECore { } private function &_get_var_reference(&$from, $name, $create_if_not_exist) { + $nullref = NULL; + $bracket_open = strpos($name, "["); if($bracket_open === false) { if(isset($from[$name]) or $create_if_not_exist) { $ref = &$from[$name]; return $ref; } else { - return NULL; + return $nullref; } } else { $old_varname = $varname; @@ -1371,7 +1388,7 @@ class STECore { if($create_if_not_exist) { $from[$varname] = array(); } else { - return NULL; + return $nullref; } } try { diff --git a/tests/test_foreach/.gitignore b/tests/test_foreach/.gitignore new file mode 100644 index 0000000..de2a41b --- /dev/null +++ b/tests/test_foreach/.gitignore @@ -0,0 +1,3 @@ +have +*.ast +*.transc.php diff --git a/tests/test_foreach/code.php b/tests/test_foreach/code.php new file mode 100644 index 0000000..380ee69 --- /dev/null +++ b/tests/test_foreach/code.php @@ -0,0 +1,9 @@ +vars["foo"] = array( + "a" => array("a" => 100, "b" => 200), + "b" => array("a" => 1, "b" => 2), + "c" => array("a" => 42, "b" => 1337) + ); +} diff --git a/tests/test_foreach/test.tpl b/tests/test_foreach/test.tpl new file mode 100644 index 0000000..1aec8b4 --- /dev/null +++ b/tests/test_foreach/test.tpl @@ -0,0 +1,8 @@ + + $i: $k -> $v[a], $v[b] + +--- + + $v + --empty-- + diff --git a/tests/test_foreach/want b/tests/test_foreach/want new file mode 100644 index 0000000..5710bf7 --- /dev/null +++ b/tests/test_foreach/want @@ -0,0 +1,5 @@ +0: a -> 100, 200 +1: b -> 1, 2 +2: c -> 42, 1337 +--- +--empty-- -- cgit v1.2.3-54-g00ecf