diff --git a/src/ControlStructure/AbstractLoop.php b/src/ControlStructure/AbstractLoop.php new file mode 100644 index 0000000..285f854 --- /dev/null +++ b/src/ControlStructure/AbstractLoop.php @@ -0,0 +1,47 @@ +iterationStack ?? [], function($item) { + return ! $item['or']; + }); + + $count = count($stack); + + if ( $count > 0 ) { + $name .= "[" . end($stack)['uid'] . "]"; + } + + $context->iterationStack[] = [ + 'or' => false, + 'uid' => $name, + 'token' => "end{$token}", + ]; + + return ""; + + case "endwhile": + case "endforeach": + $last = end($context->iterationStack); + + if ( $last['or'] === false ) { + $output = ""; + } + else { + $output = ""; + } + + array_pop($context->iterationStack); + + return $output; + } + } +} diff --git a/src/ControlStructure/BlockToken.php b/src/ControlStructure/BlockToken.php index e369781..6fe1580 100644 --- a/src/ControlStructure/BlockToken.php +++ b/src/ControlStructure/BlockToken.php @@ -6,7 +6,7 @@ class BlockToken implements ControlStructure { public array $token = [ "arguments", "block", "endblock", "define", "slot", "endslot", "using" ]; - public function parse(/*\Picae\Compiler\Context*/ &$context, ?string $arguments, string $token) { + public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token) { static $slotDefinitions = []; switch($token) { diff --git a/src/ControlStructure/BreakToken.php b/src/ControlStructure/BreakToken.php index 8f815ac..06427ce 100644 --- a/src/ControlStructure/BreakToken.php +++ b/src/ControlStructure/BreakToken.php @@ -6,7 +6,7 @@ class BreakToken implements ControlStructure { public string $token = "break"; - public function parse(/*\Picae\Compiler\Context*/ &$context, ?string $arguments, string $token) { + public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token) { return ""; } diff --git a/src/ControlStructure/CaseToken.php b/src/ControlStructure/CaseToken.php index 127e3fa..d3c1c3a 100644 --- a/src/ControlStructure/CaseToken.php +++ b/src/ControlStructure/CaseToken.php @@ -6,7 +6,7 @@ class CaseToken implements ControlStructure { public string $token = "case"; - public function parse(/*\Picae\Compiler\Context*/ &$context, ?string $arguments, string $token) { + public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token) { $output = ""; if ( $context->switchStack ) { diff --git a/src/ControlStructure/ContinueToken.php b/src/ControlStructure/ContinueToken.php index 97a971c..f8e8034 100644 --- a/src/ControlStructure/ContinueToken.php +++ b/src/ControlStructure/ContinueToken.php @@ -6,7 +6,7 @@ class ContinueToken implements ControlStructure { public string $token = "continue"; - public function parse(/*\Picae\Compiler\Context*/ &$context, ?string $arguments, string $token) { + public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token) { return ""; } diff --git a/src/ControlStructure/ControlStructure.php b/src/ControlStructure/ControlStructure.php index 51c0add..71a7b72 100644 --- a/src/ControlStructure/ControlStructure.php +++ b/src/ControlStructure/ControlStructure.php @@ -3,5 +3,5 @@ namespace Picea\ControlStructure; interface ControlStructure { - public function parse(\Picae\Compiler\Context &$context, string $sourceCode, string $token); + public function parse(\Picea\Compiler\Context &$context, string $sourceCode, string $token); } diff --git a/src/ControlStructure/DefaultToken.php b/src/ControlStructure/DefaultToken.php index cb6b6c9..37ed7d0 100644 --- a/src/ControlStructure/DefaultToken.php +++ b/src/ControlStructure/DefaultToken.php @@ -6,7 +6,7 @@ class DefaultToken implements ControlStructure { public string $token = "default"; - public function parse(/*\Picae\Compiler\Context*/ &$context, ?string $arguments, string $token) { + public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token) { $output = ""; if ( $context->switchStack ) { diff --git a/src/ControlStructure/EndRawToken.php b/src/ControlStructure/EndRawToken.php index a705f02..e3d6907 100644 --- a/src/ControlStructure/EndRawToken.php +++ b/src/ControlStructure/EndRawToken.php @@ -6,7 +6,7 @@ class EndRawToken implements ControlStructure { public string $token = "endraw"; - public function parse(/*\Picae\Compiler\Context*/ &$context, ?string $arguments, string $token) { + public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token) { } } diff --git a/src/ControlStructure/ExtendsToken.php b/src/ControlStructure/ExtendsToken.php index 0d7c52b..357e0a6 100644 --- a/src/ControlStructure/ExtendsToken.php +++ b/src/ControlStructure/ExtendsToken.php @@ -6,7 +6,7 @@ class ExtendsToken implements ControlStructure { public string $token = "extends"; - public function parse(/*\Picae\Compiler\Context*/ &$context, ?string $path, string $token) { + public function parse(\Picea\Compiler\Context &$context, ?string $path, string $token) { # Triming string's quotes $path = trim($path, "\"\' \t"); diff --git a/src/ControlStructure/ForToken.php b/src/ControlStructure/ForToken.php index 34ffead..4a6041e 100644 --- a/src/ControlStructure/ForToken.php +++ b/src/ControlStructure/ForToken.php @@ -6,7 +6,7 @@ class ForToken implements ControlStructure { public array $token = [ "for", "endfor" ]; - public function parse(/*\Picae\Compiler\Context*/ &$context, ?string $arguments, string $token) { + public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token) { switch($token) { case "for": $uid = "$".uniqid("for_"); diff --git a/src/ControlStructure/ForeachToken.php b/src/ControlStructure/ForeachToken.php index 8184e35..21f172a 100644 --- a/src/ControlStructure/ForeachToken.php +++ b/src/ControlStructure/ForeachToken.php @@ -2,46 +2,8 @@ namespace Picea\ControlStructure; -class ForeachToken implements ControlStructure { +use DI\Definition\Source\AnnotationBasedAutowiring; +class ForeachToken extends AbstractLoop { public array $token = [ "foreach", "endforeach" ]; - - public function parse(/*\Picae\Compiler\Context*/ &$context, ?string $arguments, string $token) { - switch($token) { - case "foreach": - $name = "$".uniqid("foreach_"); - - $stack = array_filter($context->iterationStack ?? [], function($item) { - return ! $item['or']; - }); - - $count = count($stack); - - if ( $count > 0 ) { - $name .= "[" . end($stack)['uid'] . "]"; - } - - $context->iterationStack[] = [ - 'or' => false, - 'uid' => $name, - 'token' => 'endforeach', - ]; - - return ""; - - case "endforeach": - $last = end($context->iterationStack); - - if ( $last['or'] === false ) { - $output = ""; - } - else { - $output = ""; - } - - array_pop($context->iterationStack); - - return $output; - } - } } diff --git a/src/ControlStructure/FunctionToken.php b/src/ControlStructure/FunctionToken.php index da82ea7..06d726d 100644 --- a/src/ControlStructure/FunctionToken.php +++ b/src/ControlStructure/FunctionToken.php @@ -6,7 +6,7 @@ class FunctionToken implements ControlStructure { public array $token = [ "function", "endfunction", "return" ]; - public function parse(/*\Picae\Compiler\Context*/ &$context, ?string $arguments, string $token) { + public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token) { switch($token) { case "function": return $this->printFunction($context, $arguments); diff --git a/src/ControlStructure/IfToken.php b/src/ControlStructure/IfToken.php index 9c86446..1a35fcd 100644 --- a/src/ControlStructure/IfToken.php +++ b/src/ControlStructure/IfToken.php @@ -6,7 +6,7 @@ class IfToken implements ControlStructure { public array $token = [ "if", "else", "elseif", "endif" ]; - public function parse(/*\Picae\Compiler\Context*/ &$context, ?string $arguments, string $token) { + public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token) { switch($token) { case "if": return ""; diff --git a/src/ControlStructure/IncludeToken.php b/src/ControlStructure/IncludeToken.php index b75d253..07970f5 100644 --- a/src/ControlStructure/IncludeToken.php +++ b/src/ControlStructure/IncludeToken.php @@ -6,7 +6,7 @@ class IncludeToken implements ControlStructure { public string $token = "include"; - public function parse(/*\Picae\Compiler\Context*/ &$context, ?string $arguments, string $token) { + public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token) { return "picea->inlineContent($arguments); ?>"; } } diff --git a/src/ControlStructure/NamespaceToken.php b/src/ControlStructure/NamespaceToken.php index d0b9cd7..77859e3 100644 --- a/src/ControlStructure/NamespaceToken.php +++ b/src/ControlStructure/NamespaceToken.php @@ -6,7 +6,7 @@ class NamespaceToken implements ControlStructure { public string $token = "namespace"; - public function parse(/*\Picae\Compiler\Context*/ &$context, ?string $arguments, string $token) { + public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token) { $context->namespace = $arguments; return ""; } diff --git a/src/ControlStructure/OrToken.php b/src/ControlStructure/OrToken.php index beecda0..99ad56f 100644 --- a/src/ControlStructure/OrToken.php +++ b/src/ControlStructure/OrToken.php @@ -6,9 +6,9 @@ class OrToken implements ControlStructure { public string $token = "or"; - public function parse(/*\Picae\Compiler\Context*/ &$context, ?string $arguments, string $token) { + public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token) { if ( empty($context->iterationStack) ) { - throw new \LogicException("Token `or` was used outside of iterator. Make sure your `for` or `foreach` declaration are properly made."); + throw new \LogicException("Token `or` was used outside of iterator. Make sure your `for`, `foreach`, `while`, `do/until` declaration are properly made."); } $key = count( $context->iterationStack ) - 1; diff --git a/src/ControlStructure/RawToken.php b/src/ControlStructure/RawToken.php index 8834bca..4d4faba 100644 --- a/src/ControlStructure/RawToken.php +++ b/src/ControlStructure/RawToken.php @@ -6,7 +6,7 @@ class RawToken implements ControlStructure { public string $token = "raw"; - public function parse(/*\Picae\Compiler\Context*/ &$context, ?string $arguments, string $token) { + public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token) { } } diff --git a/src/ControlStructure/SectionToken.php b/src/ControlStructure/SectionToken.php index 127521f..0f0040a 100644 --- a/src/ControlStructure/SectionToken.php +++ b/src/ControlStructure/SectionToken.php @@ -6,7 +6,7 @@ class SectionToken implements ControlStructure { public array $token = [ "section", "endsection" ]; - public function parse(/*\Picae\Compiler\Context*/ &$context, ?string $arguments, string $token) { + public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token) { switch($token) { case "section": return $this->printSection($context, $arguments); diff --git a/src/ControlStructure/SwitchToken.php b/src/ControlStructure/SwitchToken.php index a8643f7..f21d39d 100644 --- a/src/ControlStructure/SwitchToken.php +++ b/src/ControlStructure/SwitchToken.php @@ -6,7 +6,7 @@ class SwitchToken implements ControlStructure { public array $token = [ "switch", "case", "endswitch" ]; - public function parse(/*\Picae\Compiler\Context*/ &$context, ?string $arguments, string $token) { + public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token) { switch($token) { case "switch": $context->switchStack[] = true; diff --git a/src/ControlStructure/UseToken.php b/src/ControlStructure/UseToken.php index 25a3243..a721ff4 100644 --- a/src/ControlStructure/UseToken.php +++ b/src/ControlStructure/UseToken.php @@ -6,7 +6,7 @@ class UseToken implements ControlStructure { public string $token = "use"; - public function parse(/*\Picae\Compiler\Context*/ &$context, ?string $arguments, string $token) { + public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token) { $context->useStack[] = $arguments; return ""; } diff --git a/src/ControlStructure/ViewToken.php b/src/ControlStructure/ViewToken.php index e6c01b0..8094bc9 100644 --- a/src/ControlStructure/ViewToken.php +++ b/src/ControlStructure/ViewToken.php @@ -6,7 +6,7 @@ class ViewToken implements ControlStructure { public string $token = "view"; - public function parse(/*\Picae\Compiler\Context*/ &$context, ?string $arguments, string $token) { + public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token) { # The way this is ordered, if you provide a second arguments, being an array of variables, get_defined_vars() will not be pushed inside the view return "picea->inlineHtml(\$this, $arguments, get_defined_vars()); ?>"; } diff --git a/src/ControlStructure/WhileToken.php b/src/ControlStructure/WhileToken.php new file mode 100644 index 0000000..1549808 --- /dev/null +++ b/src/ControlStructure/WhileToken.php @@ -0,0 +1,32 @@ +iterationStack[] = [ + 'or' => false, + 'token' => "do", + ]; + + return ""; + + case "while": + if ( $context->iterationStack ?? false ) { + if ( end($context->iterationStack)['token'] === 'do' ) { + array_pop($context->iterationStack); + + return ""; + } + } + } + + return parent::parse($context, $arguments, $token); + } +} + + diff --git a/src/Extension/Extension.php b/src/Extension/Extension.php index 2176a56..a5dbb7c 100644 --- a/src/Extension/Extension.php +++ b/src/Extension/Extension.php @@ -3,5 +3,5 @@ namespace Picea\Extension; interface Extension { - public function parse(\Picae\Compiler\Context &$context, string $sourceCode, string $token); + public function parse(\Picea\Compiler\Context &$context, string $sourceCode, string $token); } diff --git a/src/Extension/JsonExtension.php b/src/Extension/JsonExtension.php index 260dc2a..3bbeee1 100644 --- a/src/Extension/JsonExtension.php +++ b/src/Extension/JsonExtension.php @@ -10,7 +10,7 @@ class JsonExtension implements Extension, FunctionExtension { public int $flags = JSON_HEX_TAG | \JSON_HEX_QUOT | \JSON_THROW_ON_ERROR | \JSON_UNESCAPED_UNICODE; - public function parse(/*\Picae\Compiler\Context*/ &$context, ?string $arguments, string $token) + public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token) { $flag = $this->flags; diff --git a/src/Extension/LanguageExtension.php b/src/Extension/LanguageExtension.php index 8bd3f50..3db89f8 100644 --- a/src/Extension/LanguageExtension.php +++ b/src/Extension/LanguageExtension.php @@ -24,7 +24,7 @@ class LanguageExtension implements Extension, FunctionExtension { ]; } - public function parse(/*\Picae\Compiler\Context*/ &$context, ?string $arguments, string $token) : string + public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token) : string { switch($token) { case "language.set": diff --git a/src/Extension/MoneyExtension.php b/src/Extension/MoneyExtension.php index 48c62c0..2c8f044 100644 --- a/src/Extension/MoneyExtension.php +++ b/src/Extension/MoneyExtension.php @@ -25,7 +25,7 @@ class MoneyExtension implements Extension { $context->pushFunction("money", [ $this, 'money' ]); } - public function parse(/*\Picae\Compiler\Context*/ &$context, ?string $arguments, string $token) { + public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token) { return ""; } diff --git a/src/Extension/PhpExtension.php b/src/Extension/PhpExtension.php index 6c363e0..b4eccbe 100644 --- a/src/Extension/PhpExtension.php +++ b/src/Extension/PhpExtension.php @@ -6,7 +6,7 @@ class PhpExtension implements Extension { public array $token = [ "php" ]; - public function parse(/*\Picae\Compiler\Context*/ &$context, ?string $arguments, string $token) { + public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token) { return ""; } } diff --git a/src/Extension/PrintExtension.php b/src/Extension/PrintExtension.php index cd262df..0589ab6 100644 --- a/src/Extension/PrintExtension.php +++ b/src/Extension/PrintExtension.php @@ -18,7 +18,7 @@ class PrintExtension implements Extension { $this->encoding = ini_get("default_charset"); } - public function parse(/*\Picae\Compiler\Context*/ &$context, ?string $arguments, string $token) : string + public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token) : string { switch($token) { case 'print': diff --git a/src/Extension/TitleExtension.php b/src/Extension/TitleExtension.php index 6389159..4896441 100644 --- a/src/Extension/TitleExtension.php +++ b/src/Extension/TitleExtension.php @@ -19,7 +19,7 @@ class TitleExtension implements Extension { $context->pushFunction("title", [ $this, 'handleTitle' ]); } - public function parse(/*\Picae\Compiler\Context*/ &$context, ?string $arguments, string $token) { + public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token) { return ""; } diff --git a/src/Extension/UrlExtension.php b/src/Extension/UrlExtension.php index b9ac50c..1f17928 100644 --- a/src/Extension/UrlExtension.php +++ b/src/Extension/UrlExtension.php @@ -30,7 +30,7 @@ PATTERN; $this->register($context); } - public function parse(/*\Picae\Compiler\Context*/ &$context, ?string $arguments, string $token) : ?string + public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token) : ?string { switch($token) { case "asset": diff --git a/src/Language/DefaultRegistrations.php b/src/Language/DefaultRegistrations.php index f23b938..2742f0e 100644 --- a/src/Language/DefaultRegistrations.php +++ b/src/Language/DefaultRegistrations.php @@ -44,6 +44,7 @@ class DefaultRegistrations implements LanguageRegistration $compiler->registerControlStructure(new \Picea\ControlStructure\IfToken()); $compiler->registerControlStructure(new \Picea\ControlStructure\ForeachToken()); $compiler->registerControlStructure(new \Picea\ControlStructure\ForToken()); + $compiler->registerControlStructure(new \Picea\ControlStructure\WhileToken()); $compiler->registerControlStructure(new \Picea\ControlStructure\OrToken()); $compiler->registerControlStructure(new \Picea\ControlStructure\SwitchToken()); $compiler->registerControlStructure(new \Picea\ControlStructure\DefaultToken()); diff --git a/src/Method/Request.php b/src/Method/Request.php index 1cfff22..250dae0 100644 --- a/src/Method/Request.php +++ b/src/Method/Request.php @@ -24,7 +24,7 @@ class Request implements Extension { $this->register($context); } - public function parse(/*\Picae\Compiler\Context*/ &$context, ?string $arguments, string $token) : string { } + public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token) : string { } public function register(Context $context) : void { diff --git a/src/Syntax/CommentToken.php b/src/Syntax/CommentToken.php index e895023..25f0bef 100644 --- a/src/Syntax/CommentToken.php +++ b/src/Syntax/CommentToken.php @@ -10,7 +10,7 @@ class CommentToken implements Syntax { protected string $tokenClose = "\#\}"; - public function parse(/*\Picae\Compiler\Context*/ &$context, string &$sourceCode) + public function parse(\Picea\Compiler\Context &$context, string &$sourceCode) { $sourceCode = preg_replace("#({$this->tokenOpen})(.*?)({$this->tokenClose})#s", "", $sourceCode); } diff --git a/src/Syntax/EchoRawToken.php b/src/Syntax/EchoRawToken.php index 0a92328..da25c86 100644 --- a/src/Syntax/EchoRawToken.php +++ b/src/Syntax/EchoRawToken.php @@ -8,7 +8,7 @@ class EchoRawToken implements Syntax { public string $tokenClose = "\}\}"; - public function parse(/*\Picae\Compiler\Context*/ &$content, string &$sourceCode) + public function parse(\Picea\Compiler\Context &$content, string &$sourceCode) { $sourceCode = preg_replace_callback("#({$this->tokenOpen})(.*?)({$this->tokenClose})#s", function ($matches) { $line = trim($matches[2], " \t\n\r\0\x0B;"); diff --git a/src/Syntax/EchoSafeToken.php b/src/Syntax/EchoSafeToken.php index 47f15c5..4da643e 100644 --- a/src/Syntax/EchoSafeToken.php +++ b/src/Syntax/EchoSafeToken.php @@ -18,7 +18,7 @@ class EchoSafeToken implements Syntax { $this->encoding = ini_get("default_charset"); } - public function parse(/*\Picae\Compiler\Context*/ &$context, string &$sourceCode) + public function parse(\Picea\Compiler\Context &$context, string &$sourceCode) { $sourceCode = preg_replace_callback("#({$this->tokenOpen})(.*?)({$this->tokenClose})#s", function ($matches) { $line = trim($matches[2], " \t\n\r\0\x0B;"); diff --git a/src/Syntax/Syntax.php b/src/Syntax/Syntax.php index fe1992f..1cf661b 100644 --- a/src/Syntax/Syntax.php +++ b/src/Syntax/Syntax.php @@ -3,5 +3,5 @@ namespace Picea\Syntax; interface Syntax { - public function parse(\Picae\Compiler\Context &$context, string &$sourceCode); + public function parse(\Picea\Compiler\Context &$context, string &$sourceCode); }