- Added tokens 'section.append' and 'section.prepend' which equates longer form '{% section mysection, [ "action" => "prepend" ] %}'

This commit is contained in:
Dave M. 2023-02-01 18:08:47 +00:00
parent af212b07ca
commit 9ea4856f49
3 changed files with 13 additions and 5 deletions

View File

@ -7,7 +7,7 @@ It also insert `Tell` inside the LanguageHandler which handles the `{% _ 'relati
```php ```php
use function DI\autowire, DI\create, DI\get; use function DI\autowire, DI\create, DI\get;
use Zend\Diactoros\Response\HtmlResponse; use Laminas\Diactoros\Response\HtmlResponse;
use Picea\{ Picea, Caching\Cache, Caching\Opcache, Compiler, Compiler\Context, Compiler\BaseContext, FileFetcher, Language\DefaultRegistrations, Method\Request }; use Picea\{ Picea, Caching\Cache, Caching\Opcache, Compiler, Compiler\Context, Compiler\BaseContext, FileFetcher, Language\DefaultRegistrations, Method\Request };
use Picea\Extension\{ LanguageHandler, LanguageExtension, TitleExtension, MoneyExtension, UrlExtension }; use Picea\Extension\{ LanguageHandler, LanguageExtension, TitleExtension, MoneyExtension, UrlExtension };

View File

@ -14,6 +14,8 @@ abstract class Context {
public string $compiledSource = ""; public string $compiledSource = "";
public ? string $sectionAction = null;
public string $viewPath = ""; public string $viewPath = "";
public string $filePath = ""; public string $filePath = "";

View File

@ -4,13 +4,17 @@ namespace Picea\ControlStructure;
class SectionToken implements ControlStructure { class SectionToken implements ControlStructure {
public array $token = [ "section", "endsection" ]; public array $token = [ "section", "section.prepend", "section.append", "endsection" ];
public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token) { public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token) {
switch($token) { switch($token) {
case "section.prepend":
$context->sectionAction = "prepend";
case "section.append":
$context->sectionAction ??= "append";
case "section": case "section":
return $this->printSection($context, $arguments); return $this->printSection($context, $arguments);
case "endsection": case "endsection":
if ( empty($context->sections) ) { if ( empty($context->sections) ) {
throw new \RuntimeException("A section closing tag {% endsection %} was found without an opening {% section %} tag"); throw new \RuntimeException("A section closing tag {% endsection %} was found without an opening {% section %} tag");
@ -28,7 +32,7 @@ class SectionToken implements ControlStructure {
$options = eval("return $options;"); $options = eval("return $options;");
} }
if ( ! ctype_alnum(str_replace([".", "\"", "'", "-", "_"], "", $name)) ) { if ( ! ctype_alnum(str_replace([".", "\"", "'", "-", "_", ":"], "", $name)) ) {
throw new \RuntimeException("Your section named `{$name}` contains invalid character. Allowed are only letters, numbers, dashes, underscores and dots"); throw new \RuntimeException("Your section named `{$name}` contains invalid character. Allowed are only letters, numbers, dashes, underscores and dots");
} }
@ -37,7 +41,9 @@ class SectionToken implements ControlStructure {
'options' => $options, 'options' => $options,
]; ];
$action = $options['action'] ?? "default"; $action = $options['action'] ?? $context->sectionAction ?? "default";
unset($context->sectionAction);
if (! in_array($action, ['prepend', 'append', 'default'])) { if (! in_array($action, ['prepend', 'append', 'default'])) {
throw new \RuntimeException("An unsupported action `$action` was given as an option of a {% section %} tag"); throw new \RuntimeException("An unsupported action `$action` was given as an option of a {% section %} tag");