diff --git a/src/Builder/ClassTemplate.php b/src/Builder/ClassTemplate.php index 2092f1d..8a15530 100644 --- a/src/Builder/ClassTemplate.php +++ b/src/Builder/ClassTemplate.php @@ -5,7 +5,6 @@ namespace %NAMESPACE%; %USE% # %PATHNAME% - if (! class_exists("%NAMESPACE%\%CLASSNAME%", false) ) { class %CLASSNAME% %EXTENDS% { @@ -28,6 +27,8 @@ if (! class_exists("%NAMESPACE%\%CLASSNAME%", false) ) { $this->exportFunctions(); static::$context = $picea->context; + + $picea->declareLoadedTemplate(static::class, __FILE__); } public function output(array $variablesList = []) : void @@ -61,14 +62,14 @@ if (! class_exists("%NAMESPACE%\%CLASSNAME%", false) ) { %FUNCTIONS% } - public function getSourceLineFromException(\Throwable $ex) : ? int + public static function getSourceLineFromException(int $sourceLine) : ? int { $sourceFile = file_get_contents("%TEMPLATE%"); if ( $sourceFile ) { foreach(explode(PHP_EOL, $sourceFile) as $line => $content) { if ( strpos($content, str_replace('$', '%', '$CONTENT$')) !== false ) { - return $ex->getLine() - $line; + return $sourceLine - $line; } } } @@ -76,6 +77,16 @@ if (! class_exists("%NAMESPACE%\%CLASSNAME%", false) ) { return null; } + public static function getParam(string $param) : ? string + { + return [ + 'classname' => "%CLASSNAME%", + 'namespace' => "%NAMESPACE%", + 'extends' => "%EXTENDS_TEMPLATE%", + 'view' => "%FULLPATH%", + ][$param] ?? null; + } + public function __invoke(array $variablesList = []) : string { ob_start(); @@ -86,4 +97,5 @@ if (! class_exists("%NAMESPACE%\%CLASSNAME%", false) ) { } -return [ 'classname' => "%CLASSNAME%", 'namespace' => "%NAMESPACE%", 'extends' => "%EXTENDS_TEMPLATE%", 'view' => "%FULLPATH%" ]; + +return [ 'classname' => %CLASSNAME%::getParam('classname'), 'namespace' => %CLASSNAME%::getParam('namespace'), 'extends' => %CLASSNAME%::getParam('extends'), 'view' => %CLASSNAME%::getParam('view') ]; diff --git a/src/Compiler.php b/src/Compiler.php index 977d4e4..ab3d8ba 100644 --- a/src/Compiler.php +++ b/src/Compiler.php @@ -79,6 +79,7 @@ class Compiler public function registerSyntax(Syntax\Syntax $syntaxObject) : self { $this->syntaxObjectList[get_class($syntaxObject)] = $syntaxObject; + return $this; } diff --git a/src/Picea.php b/src/Picea.php index d563a6c..bdff992 100644 --- a/src/Picea.php +++ b/src/Picea.php @@ -28,6 +28,8 @@ class Picea implements LanguageRegistration public bool $debug; + public array $loadedTemplateFile = []; + public function __construct( ? Closure $responseHtml = null, ? Compiler\Context $context = null, @@ -62,18 +64,54 @@ class Picea implements LanguageRegistration } catch(\Throwable $ex) { # Temporary class for an experiment - throw new class($object, "An error occurred trying to render HTML view `$viewPath` : " . $ex->getMessage(), 911, $ex) extends \Exception { - public function __construct(object $compiledObject, string $message, int $code, \Throwable $previous) + throw new class($object, $this, "An error occurred trying to render HTML view `$viewPath` : " . $ex->getMessage(), 911, $ex) extends \Exception { + + protected Picea $picea; + + public function __construct(object $compiledObject, Picea $picea, string $message, int $code, \Throwable $previous) { parent::__construct($message, $code, $previous); - $classContent = include( $previous->getFile() ); + $this->picea = $picea; - if ( is_array($classContent) ) { - $this->file = $classContent['view']; - $this->line = $compiledObject->getSourceLineFromException($previous); - } + # $template = $this->getTemplateFile( $previous->getFile() ); + $this->fromPrevious($previous, $compiledObject); } + + protected function fromPrevious(\Throwable $previous, object $compiledObject) : void + { + $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 = $compiledObject->getSourceLineFromException($trace['line']); + + return; + } + } + + + #if ( $template ) { + # $this->redefineErrorState($classContent); + #} + } + + protected function getTemplateFile(string $filePath) : ? array + { + $content = null; + + if ( is_array($content) && isset($content['classname'], $content['namespace'], $content['view'], $content['extends']) ) { + return $content; + } + + return null; + } + }; } } @@ -223,6 +261,11 @@ class Picea implements LanguageRegistration $this->languageRegistration->registerExtension($compiler); } + public function declareLoadedTemplate(string $className, string $filePath) : void + { + $this->loadedTemplateFile[$className] = $filePath; + } + protected function compileView(string $viewPath) : Compiler\Context { $tmpFolder = sys_get_temp_dir(); @@ -233,7 +276,6 @@ class Picea implements LanguageRegistration $context->filePath = $this->fileFetcher->getFilePath($viewPath); $context = $builder->build($compiled['context'], $compiled['source']) ; $context->classPath = $tmpFolder . DIRECTORY_SEPARATOR . $context->className . ".php"; - if ( $context->extendFrom ) { $this->compileView($context->extendFrom);