From b3a8e3aca2776f2088ae4816bd335f72b773783a Mon Sep 17 00:00:00 2001 From: Dave Mc Nicoll Date: Thu, 2 Feb 2023 19:38:40 +0000 Subject: [PATCH] - Token name and options are now passed through parse() method --- src/Compiler.php | 7 +++--- src/Compiler/Context.php | 3 +-- src/ControlStructure/AbstractLoop.php | 3 ++- src/ControlStructure/BlockToken.php | 3 ++- src/ControlStructure/BreakToken.php | 3 ++- src/ControlStructure/CaseToken.php | 3 ++- src/ControlStructure/ContinueToken.php | 2 +- src/ControlStructure/DefaultToken.php | 2 +- src/ControlStructure/EchoToken.php | 2 +- src/ControlStructure/ForToken.php | 2 +- src/ControlStructure/FunctionToken.php | 2 +- src/ControlStructure/IfToken.php | 2 +- src/ControlStructure/NamespaceToken.php | 2 +- src/ControlStructure/OrToken.php | 2 +- src/ControlStructure/SectionToken.php | 27 ++++++++++++++--------- src/ControlStructure/SwitchToken.php | 2 +- src/ControlStructure/UseToken.php | 2 +- src/ControlStructure/ViewToken.php | 2 +- src/ControlStructure/WhileToken.php | 2 +- src/Exception/ParseExtensionException.php | 7 ++++++ src/Extension/Extension.php | 2 +- src/Extension/JsonExtension.php | 8 +++---- src/Extension/LanguageExtension.php | 8 +++---- src/Extension/MoneyExtension.php | 3 ++- src/Extension/PhpExtension.php | 3 ++- src/Extension/PrintExtension.php | 10 ++++----- src/Extension/TitleExtension.php | 3 ++- src/Extension/UrlExtension.php | 10 ++++----- src/Method/Request.php | 2 +- 29 files changed, 70 insertions(+), 59 deletions(-) create mode 100644 src/Exception/ParseExtensionException.php diff --git a/src/Compiler.php b/src/Compiler.php index d5e310a..37a4bbf 100644 --- a/src/Compiler.php +++ b/src/Compiler.php @@ -50,14 +50,15 @@ class Compiler list($token, $arguments) = array_pad(array_filter(explode(' ', $matches[2], 2), 'strlen'), 2, null); $token = strtolower(trim($token)); - $tokenName = explode('.', $token, 2)[0]; + $tokenName = $context->tokenName($token); + $tokenOptions = $context->tokenOptions($token); # @TODO Refractor this parts to allows registration to the tag's name if ( $this->tagList[$tokenName] ?? false ) { - return $this->tagList[$tokenName]->parse($context, $arguments, $token); + return $this->tagList[$tokenName]->parse($context, $arguments, $tokenName, $tokenOptions); } elseif ( $this->extensionList[$tokenName] ?? false ) { - return $this->extensionList[$tokenName]->parse($context, $arguments, $token); + return $this->extensionList[$tokenName]->parse($context, $arguments, $tokenName, $tokenOptions); } else { throw new \LogicException("Impossible to find token `$tokenName` declared in `{$matches[2]}`. Perhapse you forgot to add a custom token to Picea's engine ?"); diff --git a/src/Compiler/Context.php b/src/Compiler/Context.php index 97cdecc..02d0c04 100644 --- a/src/Compiler/Context.php +++ b/src/Compiler/Context.php @@ -95,8 +95,7 @@ abstract class Context { public function tokenOptions(string $token, bool $export = false) : array|string { - $options = explode('.', strtolower($token)); - array_shift($options); + $options = array_slice(explode('.', strtolower($token)), 1); return $export ? var_export($options, true) : $options; } diff --git a/src/ControlStructure/AbstractLoop.php b/src/ControlStructure/AbstractLoop.php index 285f854..39305ff 100644 --- a/src/ControlStructure/AbstractLoop.php +++ b/src/ControlStructure/AbstractLoop.php @@ -4,7 +4,8 @@ namespace Picea\ControlStructure; abstract class AbstractLoop implements ControlStructure { - public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token) { + public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token, array $options = []) : string + { switch($token) { case "while": case "foreach": diff --git a/src/ControlStructure/BlockToken.php b/src/ControlStructure/BlockToken.php index 5999a2f..15c3b5c 100644 --- a/src/ControlStructure/BlockToken.php +++ b/src/ControlStructure/BlockToken.php @@ -6,7 +6,8 @@ class BlockToken implements ControlStructure { public array $token = [ "arguments", "block", "endblock", "define", "slot", "endslot", "using" ]; - public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token) { + public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token, array $options = []) : string + { static $slotDefinitions = []; switch($token) { diff --git a/src/ControlStructure/BreakToken.php b/src/ControlStructure/BreakToken.php index 06427ce..dafdee5 100644 --- a/src/ControlStructure/BreakToken.php +++ b/src/ControlStructure/BreakToken.php @@ -6,7 +6,8 @@ class BreakToken implements ControlStructure { public string $token = "break"; - public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token) { + public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token, array $options = []) : string + { return ""; } diff --git a/src/ControlStructure/CaseToken.php b/src/ControlStructure/CaseToken.php index d3c1c3a..28dc5dc 100644 --- a/src/ControlStructure/CaseToken.php +++ b/src/ControlStructure/CaseToken.php @@ -6,7 +6,8 @@ class CaseToken implements ControlStructure { public string $token = "case"; - public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token) { + public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token, array $options = []) : string + { $output = ""; if ( $context->switchStack ) { diff --git a/src/ControlStructure/ContinueToken.php b/src/ControlStructure/ContinueToken.php index f8e8034..28fabeb 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(\Picea\Compiler\Context &$context, ?string $arguments, string $token) { + public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token, array $options = []) : string { return ""; } diff --git a/src/ControlStructure/DefaultToken.php b/src/ControlStructure/DefaultToken.php index 37ed7d0..2143789 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(\Picea\Compiler\Context &$context, ?string $arguments, string $token) { + public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token, array $options = []) : string { $output = ""; if ( $context->switchStack ) { diff --git a/src/ControlStructure/EchoToken.php b/src/ControlStructure/EchoToken.php index f20c841..3afa2e3 100644 --- a/src/ControlStructure/EchoToken.php +++ b/src/ControlStructure/EchoToken.php @@ -6,7 +6,7 @@ class EchoToken implements ControlStructure { public array $token = [ "echo", "echo.raw" ]; - public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token) { + public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token, array $options = []) : string { switch($token) { case "echo": return ""; diff --git a/src/ControlStructure/ForToken.php b/src/ControlStructure/ForToken.php index 4a6041e..67d438f 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(\Picea\Compiler\Context &$context, ?string $arguments, string $token) { + public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token, array $options = []) : string { switch($token) { case "for": $uid = "$".uniqid("for_"); diff --git a/src/ControlStructure/FunctionToken.php b/src/ControlStructure/FunctionToken.php index 06fa788..523ace4 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(\Picea\Compiler\Context &$context, ?string $arguments, string $token) { + public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token, array $options = []) : string { switch($token) { case "function": $context->functions++; diff --git a/src/ControlStructure/IfToken.php b/src/ControlStructure/IfToken.php index 1a35fcd..98f55f2 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(\Picea\Compiler\Context &$context, ?string $arguments, string $token) { + public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token, array $options = []) : string { switch($token) { case "if": return ""; diff --git a/src/ControlStructure/NamespaceToken.php b/src/ControlStructure/NamespaceToken.php index 77859e3..235fa73 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(\Picea\Compiler\Context &$context, ?string $arguments, string $token) { + public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token, array $options = []) : string { $context->namespace = $arguments; return ""; } diff --git a/src/ControlStructure/OrToken.php b/src/ControlStructure/OrToken.php index 99ad56f..a9dfa05 100644 --- a/src/ControlStructure/OrToken.php +++ b/src/ControlStructure/OrToken.php @@ -6,7 +6,7 @@ class OrToken implements ControlStructure { public string $token = "or"; - public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token) { + public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token, array $options = []) : string { if ( empty($context->iterationStack) ) { throw new \LogicException("Token `or` was used outside of iterator. Make sure your `for`, `foreach`, `while`, `do/until` declaration are properly made."); } diff --git a/src/ControlStructure/SectionToken.php b/src/ControlStructure/SectionToken.php index e7c13d5..2b0eac5 100644 --- a/src/ControlStructure/SectionToken.php +++ b/src/ControlStructure/SectionToken.php @@ -2,19 +2,26 @@ namespace Picea\ControlStructure; +enum PrintActionEnum : string { + case prepend = "prepend"; + case default = "default"; + case append = "append"; + # case both = "both"; +} + class SectionToken implements ControlStructure { public array $token = [ "section", "endsection" ]; - public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token) - { - $opt = $context->tokenOptions($token); + protected PrintActionEnum $action = PrintActionEnum::default; - if (in_array('prepend', $opt)) { - $context->sectionAction = "prepend"; + public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token, array $options = []) : string + { + if (in_array('prepend', $options)) { + $this->action = PrintActionEnum::prepend; } - elseif (in_array('append', $opt)) { - $context->sectionAction = "append"; + elseif (in_array('append', $options)) { + $this->action = PrintActionEnum::append; } switch($token) { @@ -30,7 +37,7 @@ class SectionToken implements ControlStructure { } } - protected function printSection($context, ?string $arguments) : string + protected function printSection($context, ? string $arguments) : string { list($name, $options) = array_pad(explode(',', $arguments, 2), 2, null); @@ -47,9 +54,7 @@ class SectionToken implements ControlStructure { 'options' => $options, ]; - $action = $options['action'] ?? $context->sectionAction ?? "default"; - - unset($context->sectionAction); + $action = $options['action'] ?? $this->action->value; if (! in_array($action, ['prepend', 'append', 'default'])) { throw new \RuntimeException("An unsupported action `$action` was given as an option of a {% section %} tag"); diff --git a/src/ControlStructure/SwitchToken.php b/src/ControlStructure/SwitchToken.php index f21d39d..0b0611c 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(\Picea\Compiler\Context &$context, ?string $arguments, string $token) { + public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token, array $options = []) : string { switch($token) { case "switch": $context->switchStack[] = true; diff --git a/src/ControlStructure/UseToken.php b/src/ControlStructure/UseToken.php index a721ff4..4294285 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(\Picea\Compiler\Context &$context, ?string $arguments, string $token) { + public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token, array $options = []) : string { $context->useStack[] = $arguments; return ""; } diff --git a/src/ControlStructure/ViewToken.php b/src/ControlStructure/ViewToken.php index 8094bc9..278694d 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(\Picea\Compiler\Context &$context, ?string $arguments, string $token) { + public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token, array $options = []) : string { # 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 index 1549808..901aa6b 100644 --- a/src/ControlStructure/WhileToken.php +++ b/src/ControlStructure/WhileToken.php @@ -5,7 +5,7 @@ namespace Picea\ControlStructure; class WhileToken extends AbstractLoop { public array $token = [ "do", "while", "endwhile", ]; - public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token) { + public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token, array $options = []) : string { switch($token) { case "do": $context->iterationStack[] = [ diff --git a/src/Exception/ParseExtensionException.php b/src/Exception/ParseExtensionException.php new file mode 100644 index 0000000..89ce7e8 --- /dev/null +++ b/src/Exception/ParseExtensionException.php @@ -0,0 +1,7 @@ +tokenOptions($token); - $flag = $this->flags; - if ( in_array('pretty', $opt) ) { + if ( in_array('pretty', $options) ) { $flag |= \JSON_PRETTY_PRINT; } - if ( in_array('html', $opt) ) { + if ( in_array('html', $options) ) { return ""; } diff --git a/src/Extension/LanguageExtension.php b/src/Extension/LanguageExtension.php index 48100f3..a821e85 100644 --- a/src/Extension/LanguageExtension.php +++ b/src/Extension/LanguageExtension.php @@ -25,10 +25,8 @@ class LanguageExtension implements Extension, FunctionExtension { ]; } - public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token) : string + public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token, array $options = []) : string { - $opt = $context->tokenOptions($token); - switch(explode('.', $token)[0]) { case "language": $cls = $this::class; @@ -49,14 +47,14 @@ class LanguageExtension implements Extension, FunctionExtension { PHP; case "lang": - if ( in_array('raw', $opt) ) { + if ( in_array('raw', $options) ) { return "compiler->getExtensionFromToken('$token')->absoluteLang($arguments) ?>"; } return "compiler->getExtensionFromToken('$token')->absoluteLang($arguments), \ENT_QUOTES, ini_get('default_charset'), true) ?>"; case "_": - if ( in_array('raw', $opt) ) { + if ( in_array('raw', $options) ) { return "compiler->getExtensionFromToken('$token')->relativeLang($arguments) ?>"; } diff --git a/src/Extension/MoneyExtension.php b/src/Extension/MoneyExtension.php index f572271..7c2173d 100644 --- a/src/Extension/MoneyExtension.php +++ b/src/Extension/MoneyExtension.php @@ -26,7 +26,8 @@ class MoneyExtension implements Extension, FunctionExtension { ]; } - public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token) { + public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token, array $options = []) : string + { return ""; } diff --git a/src/Extension/PhpExtension.php b/src/Extension/PhpExtension.php index b4eccbe..d87fb95 100644 --- a/src/Extension/PhpExtension.php +++ b/src/Extension/PhpExtension.php @@ -6,7 +6,8 @@ class PhpExtension implements Extension { public array $token = [ "php" ]; - public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token) { + public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token, array $options = []) : string + { return ""; } } diff --git a/src/Extension/PrintExtension.php b/src/Extension/PrintExtension.php index 08240ca..fd4c9dd 100644 --- a/src/Extension/PrintExtension.php +++ b/src/Extension/PrintExtension.php @@ -18,21 +18,19 @@ class PrintExtension implements Extension { $this->encoding = ini_get("default_charset"); } - public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token) : string + public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token, array $options = []) : string { - $opt = $context->tokenOptions($token); - - switch($context->tokenName($token)) { + switch($token) { case 'echo': case 'print': - if (in_array('raw', $opt)) { + if (in_array('raw', $options)) { return ""; } return "flag}, '{$this->encoding}', " . ($this->doubleEncode ? "true" : "false") . ") ?>"; case 'printf': - if (in_array('raw', $opt)) { + if (in_array('raw', $options)) { return ""; } diff --git a/src/Extension/TitleExtension.php b/src/Extension/TitleExtension.php index 03b4ad3..3dc4ce7 100644 --- a/src/Extension/TitleExtension.php +++ b/src/Extension/TitleExtension.php @@ -15,7 +15,8 @@ class TitleExtension implements Extension, FunctionExtension { ]; } - public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token) { + public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token, array $options = []) : string + { return <<assetToken = $assetToken; } - public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token) : ?string + public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token, array $options = []) : string { - $opt = $context->tokenOptions($token); - switch($token) { case "asset": return "compiler->getExtensionFromToken('$token')->buildAssetUrl($arguments) ?>"; @@ -41,10 +39,10 @@ PATTERN; return "compiler->getExtensionFromToken('$token')->buildRouteUrl($arguments) ?>"; case "url": - if ( in_array('parameters', $opt) ) { + if ( in_array('parameters', $options) ) { return "compiler->getExtensionFromToken('$token')->setUrlParameters($arguments) ?>"; } - elseif ( in_array('current', $opt) ) { + elseif ( in_array('current', $options) ) { return "compiler->getExtensionFromToken('$token')->currentUrl($arguments) ?>"; } @@ -54,7 +52,7 @@ PATTERN; return "compiler->getExtensionFromToken('$token')->slug($arguments) ?>"; } - return null; + throw new \ParseExtensionException("Unknown token given $token in UrlExtension."); } public function exportFunctions(): array diff --git a/src/Method/Request.php b/src/Method/Request.php index ed41b9d..76d93fd 100644 --- a/src/Method/Request.php +++ b/src/Method/Request.php @@ -24,7 +24,7 @@ class Request implements Extension, FunctionExtension { $this->request = $request; } - public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token) : string { } + public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token, array $options = []) : string { } public function exportFunctions(): array {