- WIP on the exception handler
This commit is contained in:
		
							parent
							
								
									69db3efdce
								
							
						
					
					
						commit
						082bdd4ad3
					
				| @ -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') ]; | ||||
|  | ||||
| @ -79,6 +79,7 @@ class Compiler | ||||
|     public function registerSyntax(Syntax\Syntax $syntaxObject) : self | ||||
|     { | ||||
|         $this->syntaxObjectList[get_class($syntaxObject)] = $syntaxObject; | ||||
| 
 | ||||
|         return $this; | ||||
|     } | ||||
| 
 | ||||
|  | ||||
| @ -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); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user