openrat-cms

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

commit cd753080a36ba39c814db237f1716ccd60b18615
parent 83f732540c7c7dbe84955785b67d0e5caa5dfd57
Author: Jan Dankert <develop@jandankert.de>
Date:   Tue,  7 Jun 2022 23:29:53 +0200

New: The DSL may be used as a JSP-like template language.

Diffstat:
Mmodules/cms/generator/TemplateGenerator.class.php | 30++++++++++++++++++++++++++++++
Amodules/dsl/DslTemplate.class.php | 53+++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 83 insertions(+), 0 deletions(-)

diff --git a/modules/cms/generator/TemplateGenerator.class.php b/modules/cms/generator/TemplateGenerator.class.php @@ -5,6 +5,10 @@ namespace cms\generator; use cms\base\Configuration; +use cms\generator\dsl\DslConsole; +use cms\generator\dsl\DslHttp; +use cms\generator\dsl\DslJson; +use cms\generator\dsl\DslPage; use cms\generator\PageContext; use cms\model\File; use cms\model\Folder; @@ -14,6 +18,9 @@ use cms\model\Project; use cms\model\Template; use cms\model\TemplateModel; use cms\model\Value; +use dsl\DslException; +use dsl\DslTemplate; +use dsl\executor\DslInterpreter; use logger\Logger; use util\exception\GeneratorException; use util\Mustache; @@ -120,6 +127,29 @@ class TemplateGenerator // now we have the fully generated source. + try { + + $templateParser = new DslTemplate(); + $templateParser->parseTemplate($src); + if ($templateParser->tagsFound) { + $executor = new DslInterpreter(); + $executor->addContext([ + 'console' => new DslConsole(), + 'http' => new DslHttp(), + 'json' => new DslJson(), + ]); + $executor->addContext( $data ); + + $executor->runCode($templateParser->script); + + // Ausgabe ermitteln. + $src = $executor->getOutput(); + } + } catch (DslException $e) { + Logger::warn($e); + $src = $e->getMessage()."\nscript source:\n".$templateParser->script; + } + // should we do a UTF-8-escaping here? // Default should be off, because if you are fully using utf-8 (you should do), this is unnecessary. if ( Configuration::subset('publish' )->is('escape_8bit_characters') ) diff --git a/modules/dsl/DslTemplate.class.php b/modules/dsl/DslTemplate.class.php @@ -0,0 +1,52 @@ +<?php + + +namespace dsl; + + +class DslTemplate +{ + public $tagsFound = 0; + public $script = null; + + public function parseTemplate( $source ) { + + $this->script = ''; + $this->tagsFound = 0; + + while( true ) { + + $tagOpen = strpos( $source,'<%' ); + + if ( $tagOpen !== false ) { + $this->tagsFound++; + $this->addWriteCommand(substr($source,0,$tagOpen),true); + $source = substr($source,$tagOpen+2); + $tagClose = strpos( $source,'%>' ); + if ( $tagClose === false ) + throw new DslParserException('Unclosed script tag'); + $code = substr($source,0,$tagClose); + if ( $code[0] == '=' ) + $this->addWriteCommand( substr($code,1) ); + else + $this->script .= $code."\n"; + + $source = substr($source,$tagClose+2); + } + else{ + $this->addWriteCommand($source,true); + break; + } + } + } + + protected function addWriteCommand( $code, $quote = false ) { + + if ( $quote ) + foreach ( explode("\n",$code) as $line) + $this->script .= 'write(\''.str_replace('\'','\\\'',$line).'\');'."\n"; + else + $this->script .= 'write('.$code.');'."\n"; + + } +} +\ No newline at end of file