From 48ecd9f7d95b07441e59428caa4347ba199d270e Mon Sep 17 00:00:00 2001 From: Dave Mc Nicoll Date: Fri, 3 Jun 2022 15:30:16 +0000 Subject: [PATCH 1/2] - Made some bugfixes regarding blocks and slots --- src/ControlStructure/BlockToken.php | 12 +++++++----- src/ControlStructure/SectionToken.php | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/ControlStructure/BlockToken.php b/src/ControlStructure/BlockToken.php index 3ee235b..f02787e 100644 --- a/src/ControlStructure/BlockToken.php +++ b/src/ControlStructure/BlockToken.php @@ -24,14 +24,13 @@ class BlockToken implements ControlStructure { return <<using ?? [], \EXTR_OVERWRITE); extract( \\$class::parseArguments(function($arguments) {}, \$inlineVariables), \EXTR_OVERWRITE); - unset(\$inlineVariables); } catch(\TypeError \$ex) { - throw new \Exception( - sprintf('A block awaiting arguments `%s` instead received `%s` with values `%s`', '$arguments', implode(', ', array_map('gettype', \$inlineVariables)), json_encode(\$inlineVariables)) + sprintf('A block awaiting arguments `%s` instead received `%s` with values `%s`', '$arguments', implode(', ', array_map('gettype', \$inlineVariables)), json_encode(\$inlineVariables)) ); } ?> @@ -72,7 +71,7 @@ class BlockToken implements ControlStructure { } return <<slotIsSet($name) || \$___block->setSlot($name, function($definition array \$___using = []) use (\$picea) { extract(\$___using, \EXTR_SKIP); ?> + slotIsSet($name) || \$___block->setSlot($name, function($definition array \$___using = []) use (\$picea) { extract(\$___using, \EXTR_SKIP); ?> PHP; } @@ -131,6 +130,9 @@ class BlockToken implements ControlStructure { elseif ( $value->isVariadic() ) { $parameters[ $value->getName() ] = []; } + else { + $parameters[ $value->getName() ] = null; + } } return $parameters; @@ -217,7 +219,7 @@ class BlockToken implements ControlStructure { public function render(object $classTemplate) : string { $this->rendering = true; - + return $classTemplate->picea->inlineBlock($this, $this->viewPath, ...$this->arguments); } diff --git a/src/ControlStructure/SectionToken.php b/src/ControlStructure/SectionToken.php index 08543ad..127521f 100644 --- a/src/ControlStructure/SectionToken.php +++ b/src/ControlStructure/SectionToken.php @@ -53,7 +53,7 @@ class SectionToken implements ControlStructure { protected function printEndSection($context) : string { $section = array_pop($context->sections); - $build = $context->extendFrom ? "\$___class__template->sectionStack && \$___class__template->renderSection({$section['name']});" : "\$___class__template->renderSection({$section['name']});"; + $build = $context->extendFrom ? "!empty(\$___class__template->sectionStack) && \$___class__template->renderSection({$section['name']});" : "\$___class__template->renderSection({$section['name']});"; return "sectionStack); }]; $build?>"; } } \ No newline at end of file From b08325049b31f58125c4f225ba8bdccd182ab1ed Mon Sep 17 00:00:00 2001 From: Dave Mc Nicoll Date: Fri, 3 Jun 2022 15:31:50 +0000 Subject: [PATCH 2/2] - Addedd a new Money extension and a new Function token --- src/ControlStructure/FunctionToken.php | 47 ++++++++++++++++++++++++++ src/Extension/MoneyExtension.php | 41 ++++++++++++++++++++++ src/Language/DefaultRegistrations.php | 1 + 3 files changed, 89 insertions(+) create mode 100644 src/ControlStructure/FunctionToken.php create mode 100644 src/Extension/MoneyExtension.php diff --git a/src/ControlStructure/FunctionToken.php b/src/ControlStructure/FunctionToken.php new file mode 100644 index 0000000..da82ea7 --- /dev/null +++ b/src/ControlStructure/FunctionToken.php @@ -0,0 +1,47 @@ +printFunction($context, $arguments); + + case "return": + if ( empty($context->functions) ) { + throw new \RuntimeException("A function return tag {% return %} was found without an opening {% function ... %} tag"); + } + + return $this->printReturn($context, $arguments); + + case "endfunction": + if ( empty($context->functions) ) { + throw new \RuntimeException("A function closing tag {% endfunction %} was found without an opening {% function ... %} tag"); + } + + $context->functions--; + + return $this->printEndFunction($context); + } + } + + protected function printFunction($context, ?string $arguments) : string + { + $context->functions++; + return ""; + } + + protected function printReturn($context, ?string $arguments) : string + { + return ""; + } + + protected function printEndFunction($context) : string + { + return ""; + } +} \ No newline at end of file diff --git a/src/Extension/MoneyExtension.php b/src/Extension/MoneyExtension.php new file mode 100644 index 0000000..48c62c0 --- /dev/null +++ b/src/Extension/MoneyExtension.php @@ -0,0 +1,41 @@ +register($context); + $this->locale = explode('.', \Locale::getDefault())[0]; + $this->formatter = new \NumberFormatter($this->locale, \NumberFormatter::CURRENCY); + } + + public function register(Context $context) : void + { + $context->pushFunction("money", [ $this, 'money' ]); + } + + public function parse(/*\Picae\Compiler\Context*/ &$context, ?string $arguments, string $token) { + return ""; + } + + public function money(float $money, ? string $currency = null) /* : string|false */ + { + $this->formatter->setTextAttribute(\NumberFormatter::CURRENCY_CODE, 'CAD'); + + $this->formatter->setPattern( str_replace('¤#','¤ #', $this->formatter->getPattern() ) ); + + return $this->formatter->formatCurrency($money, $currency ?? $this->formatter->getTextAttribute(\NumberFormatter::CURRENCY_CODE)); + } + +} diff --git a/src/Language/DefaultRegistrations.php b/src/Language/DefaultRegistrations.php index 051d071..cd5166a 100644 --- a/src/Language/DefaultRegistrations.php +++ b/src/Language/DefaultRegistrations.php @@ -52,6 +52,7 @@ class DefaultRegistrations implements LanguageRegistration $compiler->registerControlStructure(new \Picea\ControlStructure\ContinueToken()); $compiler->registerControlStructure(new \Picea\ControlStructure\ExtendsToken()); $compiler->registerControlStructure(new \Picea\ControlStructure\SectionToken()); + $compiler->registerControlStructure(new \Picea\ControlStructure\FunctionToken()); $compiler->registerControlStructure(new \Picea\ControlStructure\BlockToken()); $compiler->registerControlStructure(new \Picea\ControlStructure\IncludeToken()); $compiler->registerControlStructure(new \Picea\ControlStructure\ViewToken());