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:
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