From d5de5e665b055f411f548e51ea6b79f6d4f8ed02 Mon Sep 17 00:00:00 2001 From: Dave Mc Nicoll Date: Thu, 12 Oct 2023 19:07:16 +0000 Subject: [PATCH] - WIP on picea-asset AND error handling --- src/Builder/ClassTemplate.php | 42 ++++++++++++++++++++------- src/ControlStructure/SectionToken.php | 6 ++-- src/EventTrait.php | 12 ++++---- src/Exception/RenderHtmlException.php | 25 ++++------------ src/Extension/TitleExtension.php | 11 +++---- src/Extension/UrlExtension.php | 9 ++++++ src/Picea.php | 4 +-- 7 files changed, 61 insertions(+), 48 deletions(-) diff --git a/src/Builder/ClassTemplate.php b/src/Builder/ClassTemplate.php index f42ebf3..02e0d69 100644 --- a/src/Builder/ClassTemplate.php +++ b/src/Builder/ClassTemplate.php @@ -50,20 +50,21 @@ if (! class_exists("%NAMESPACE%\%CLASSNAME%", false) ) { $__event->eventExecute(\Picea\Event\Builder\ClassTemplateOutputing::class, $variablesList); - ( function($___class__template, $___global_variables, $___variables, $__event, $picea) { - extract($___global_variables); - extract($___variables, \EXTR_OVERWRITE); - ?>%CONTENT%call($this->thisProxy ?? new class() {}, $this, $this->variableList, $variablesList, $__event, $this->picea); + try { + ( function($___class__template, $___global_variables, $___variables, $__event, $picea) { + extract($___global_variables); + extract($___variables, \EXTR_OVERWRITE); + ?>%CONTENT%call($this->thisProxy ?? new class() {}, $this, $this->variableList, $variablesList, $__event, $this->picea); + } catch (\Throwable $error) { + throw $this->errorHandler($error); + } $__event->eventExecute(\Picea\Event\Builder\ClassTemplateOutputDone::class, $variablesList); -# try{ - %PARENT_OUTPUT% -# } -# catch(\Exception $e) { -# dump($this->isTemplateError($e)); -# } + try { %PARENT_OUTPUT% } catch (\Throwable $error) { + throw $this->errorHandler($error); + } $this->depth--; @@ -150,6 +151,25 @@ if (! class_exists("%NAMESPACE%\%CLASSNAME%", false) ) { return substr($error->getFile(), -strlen($class)) === $class; } + + protected function errorHandler(\Throwable $error) : \Throwable + { + $class = substr(static::class, strrpos(static::class, '\\') + 1) . ".php"; + + #dump( __NAMESPACE__, basename($error->getFile()), $class ); + $basename = basename($error->getFile()); + + #dump(is_subclass_of(sprintf("\\%s\\%s", __NAMESPACE__, substr($basename,0 , strrpos($basename, '.'))), static::class, true)); + + if (str_ends_with($error->getFile(), $class)) { + $error = new \Picea\Exception\RenderHtmlException($this, $error->getMessage(), $error->getCode(), $error); + } + #elseif (is_subclass_of(sprintf("\\%s\\%s", __NAMESPACE__, substr($basename,0 , strrpos($basename, '.'))), static::class, true)) { + # $error = new \Picea\Exception\RenderHtmlException($this, $error->getMessage(), $error->getCode(), $error); + #} + + return $error; + } } } diff --git a/src/ControlStructure/SectionToken.php b/src/ControlStructure/SectionToken.php index 85c6d54..f185079 100644 --- a/src/ControlStructure/SectionToken.php +++ b/src/ControlStructure/SectionToken.php @@ -63,9 +63,9 @@ class SectionToken implements ControlStructure { $order = $options['order'] ?? "count(\$___class__template->sectionList[$name]['$action'])"; return "sectionList[$name] ??= [ 'prepend' => [], 'append' => [], 'default' => [] ];" . - "\$___class__template->sectionList[$name]['$action'][] = [ - 'order' => $order, - 'callback' => function() use (\$picea, \$___class__template, \$___global_variables, \$___variables, \$__event) {" . + "\$___class__template->sectionList[$name]['$action'][] = [ ". + "'order' => $order, " . + "'callback' => function() use (\$picea, \$___class__template, \$___global_variables, \$___variables, \$__event) {" . "extract(\$___global_variables); extract(\$___variables, \EXTR_OVERWRITE);" . "\$___class__template->sectionStack[] = $name;" . "\$__event->eventExecute(\Picea\Event\Builder\ClassTemplateRenderSection::class, $name);?>"; diff --git a/src/EventTrait.php b/src/EventTrait.php index 16a5e12..889a69d 100644 --- a/src/EventTrait.php +++ b/src/EventTrait.php @@ -4,26 +4,26 @@ namespace Picea; trait EventTrait { - protected $_eventTraitMethod = "execute"; + protected $eventTraitMethod = "execute"; - public array $_eventList = []; + public array $eventTraitList = []; - protected array $_returnList = []; + protected array $eventTraitReturnList = []; public function eventRegister(object $event) : void { - $this->_eventList[] = $event; + $this->eventTraitList[] = $event; } public function eventFromType(string $type) : array { - return array_filter($this->_eventList, fn($ev) => $ev instanceof $type); + return array_filter($this->eventTraitList, fn($ev) => $ev instanceof $type); } public function eventExecute(string $type, ...$arguments) : void { foreach($this->eventFromType($type) as $event) { - $this->_returnList[$event::class][] = call_user_func_array([ $event, $this->_eventTraitMethod ], $arguments); + $this->eventTraitReturnList[$event::class][] = call_user_func_array([ $event, $this->eventTraitMethod ], $arguments); } } } \ No newline at end of file diff --git a/src/Exception/RenderHtmlException.php b/src/Exception/RenderHtmlException.php index 799e4c0..351e146 100644 --- a/src/Exception/RenderHtmlException.php +++ b/src/Exception/RenderHtmlException.php @@ -10,33 +10,20 @@ use Picea\Picea; */ class RenderHtmlException extends \Exception { - protected Picea $picea; - public function __construct(object $compiledObject, Picea $picea, string $message, int $code, \Throwable $previous) + public function __construct(object $template, string $message, int $code, \Throwable $previous) { parent::__construct($message, $code, $previous); - $this->picea = $picea; - - $this->defineError($previous, $compiledObject); + $this->defineError($previous, $template); } - protected function defineError(\Throwable $previous, object $compiledObject) : void + protected function defineError(\Throwable $previous, object $template) : void { - $loadedTemplates = array_flip($this->picea->loadedTemplateFile); + /*$loadedTemplates = array_flip($this->picea->loadedTemplateFile);*/ - foreach($previous->getTrace() as $trace) { - if ( isset($trace['file'], $loadedTemplates[$trace['file']]) ) { - $class = $loadedTemplates[ $trace['file'] ]; - - $content = include($trace['file']); - - $this->file = $content['view']; - $this->line = $class::getSourceLineFromException($trace['line']); - - return; - } - } + $this->file = $template::getParam('view'); + $this->line = $template::getSourceLineFromException($previous->getLine()); } protected function getTemplateFile(string $filePath) : ? array diff --git a/src/Extension/TitleExtension.php b/src/Extension/TitleExtension.php index 3dc4ce7..5f01e68 100644 --- a/src/Extension/TitleExtension.php +++ b/src/Extension/TitleExtension.php @@ -17,13 +17,10 @@ class TitleExtension implements Extension, FunctionExtension { public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token, array $options = []) : string { - return << - PHP; + return ""; } public function handleTitle(? string $set = null, ...$arguments) : ? string diff --git a/src/Extension/UrlExtension.php b/src/Extension/UrlExtension.php index 4f66e53..974a329 100644 --- a/src/Extension/UrlExtension.php +++ b/src/Extension/UrlExtension.php @@ -5,9 +5,11 @@ namespace Picea\Extension; use Notes\Route\Attribute\Object\Route; use Picea\EventTrait; use Picea\Compiler\Context; + use Picea\Event\Extension\{ UrlBuildAssetEvent, UrlBuildUrlEvent, UrlBuildRouteEvent, UrlRegisterRouteEvent }; class UrlExtension implements Extension, FunctionExtension { + use \Picea\EventTrait; use EventTrait; @@ -41,6 +43,13 @@ PATTERN; $this->assetToken = $assetToken; $this->appUrl = $appUrl; $this->forceSSL = $forceSSL; + + $this->eventRegister(new class() implements BuildAssetUrl { + public function execute(string $uri, array $parameters = [], bool $appendVersion = true) : mixed + { + + } + }); } public function parse(\Picea\Compiler\Context &$context, ?string $arguments, string $token, array $options = []) : string diff --git a/src/Picea.php b/src/Picea.php index e7caa98..eb1f600 100644 --- a/src/Picea.php +++ b/src/Picea.php @@ -75,11 +75,11 @@ class Picea implements LanguageRegistration # throw new Exception\RenderHtmlException($object, $this, "An error occurred trying to render HTML view `$viewPath` : " . $ex->getMessage(), 911, $ex); #} #else { - throw $ex; + throw $ex; #} } - exit(); + return null; } /**