commit 369d7dcc4210be52a72c6fed10b519cfdb9180eb
parent 4e09759ad09ce3bbb553a5c795e40e6e1f1d3144
Author: Jan Dankert <develop@jandankert.de>
Date: Thu, 14 Nov 2019 00:18:20 +0100
Refactoring: Filter in separate classes; filter setup is read out of the settings.
Diffstat:
7 files changed, 126 insertions(+), 36 deletions(-)
diff --git a/modules/cms-core/model/File.class.php b/modules/cms-core/model/File.class.php
@@ -499,7 +499,7 @@ EOF
*/
function getRealExtension()
{
- if ( !empty($this->extension))
+ if ( $this->extension )
{
return $this->extension;
}
@@ -515,52 +515,44 @@ EOF
private function filterValue()
{
- $filterType = '';
- if ( $this->publisher instanceof PublishEdit ) $filterType = 'edit';
- if ( $this->publisher instanceof PublishPublic ) $filterType = 'public';
- if ( $this->publisher instanceof PublishPreview ) $filterType = 'preview';
- if ( $this->publisher instanceof PublishShow ) $filterType = 'show';
+ $publishType = strtolower(substr(\ClassUtils::getSimpleClassName($this->publisher),7));
- foreach(\ArrayUtils::getSubArray($this->getTotalSettings(), array( 'publish', $filterType, 'filter')) as $filterName )
+ foreach(\ArrayUtils::getSubArray($this->getTotalSettings(), array( 'filter')) as $filterEntry )
{
- switch( $filterName)
- {
- case 'less':
+ $filterName = @$filterEntry['name'];
+ $extension = @$filterEntry['extension'];
- $parser = new Less_Parser(array(
- 'sourceMap' => false,
- 'indentation' => ' ',
- 'outputSourceFiles' => false,
- //'sourceMapBasepath' => $this->filename()
- //'sourceMapBasepath' => './'
- ));
+ if ( $extension && strtolower($extension) != strtolower($this->getRealExtension()) )
+ continue; // File extension does not match
- $parser->parse( $this->value );
- $this->value = $parser->getCss();
+ $onPublish = (array) @$filterEntry['on'];
+ if ( ! $onPublish || in_array('all',$onPublish ) )
+ $onPublish = ['edit','public','preview','show'];
- break;
+ if ( $onPublish && ! in_array($publishType,$onPublish))
+ continue; // Publish type does not match
- case 'less-minifier':
+ $parameter = (array) @$filterEntry['parameter'];
- $parser = new Less_Parser(array(
- 'compress' => true,
- 'sourceMap' => false,
- 'indentation' => ''
- ));
+ $filterClassNameWithNS = 'cms\\publish\\filter\\' . $filterName.'Filter';
- $parser->parse( $this->value );
- $this->value = $parser->getCss();
+ if ( !class_exists( $filterClassNameWithNS ) ) {
+ Logger::warn("Filter '$filterName' does not exist.");
+ continue;
+ }
- break;
+ $filter = new $filterClassNameWithNS();
- case "js-minifier":
- $jz = new JSqueeze();
- $this->value = $jz->squeeze( $this->value);
- break;
+ // Copy filter configuration to filter instance.
+ foreach( $parameter as $name=>$value) {
+ if ( property_exists($filter,$name))
+ $filter->$name = $value;
+ }
- default:
- throw new \LogicException("Filter not found: ".$filterName);
- }
+
+ // Execute the filter.
+ Logger::debug("Filtering '$this->filename' with filter '$filterName'.");
+ $this->value = $filter->filter( $this->value );
}
// Store in cache.
diff --git a/modules/cms-publish/filter/AbstractFilter.class.php b/modules/cms-publish/filter/AbstractFilter.class.php
@@ -0,0 +1,10 @@
+<?php
+
+
+namespace cms\publish\filter;
+
+
+abstract class AbstractFilter
+{
+ public abstract function filter( $value );
+}+
\ No newline at end of file
diff --git a/modules/cms-publish/filter/Base64DecodeFilter.class.php b/modules/cms-publish/filter/Base64DecodeFilter.class.php
@@ -0,0 +1,13 @@
+<?php
+
+
+namespace cms\publish\filter;
+
+
+class Base64DecodeFilter extends AbstractFilter
+{
+ public function filter( $value )
+ {
+ return base64_decode( $value );
+ }
+}+
\ No newline at end of file
diff --git a/modules/cms-publish/filter/Base64EncodeFilter.class.php b/modules/cms-publish/filter/Base64EncodeFilter.class.php
@@ -0,0 +1,13 @@
+<?php
+
+
+namespace cms\publish\filter;
+
+
+class Base64EncodeFilter extends AbstractFilter
+{
+ public function filter( $value )
+ {
+ return base64_encode( $value );
+ }
+}+
\ No newline at end of file
diff --git a/modules/cms-publish/filter/JavascriptMinifierFilter.class.php b/modules/cms-publish/filter/JavascriptMinifierFilter.class.php
@@ -0,0 +1,20 @@
+<?php
+
+
+namespace cms\publish\filter;
+
+
+use JSqueeze;
+
+class JavascriptMinifierFilter extends AbstractFilter
+{
+ public $singleLine = true;
+ public $keepImportantComments = true;
+ public $specialVarRx = false;
+
+ public function filter( $value )
+ {
+ $jz = new JSqueeze();
+ return $jz->squeeze( $value, (bool)$this->singleLine, (bool)$this->keepImportantComments, (bool)$this->specialVarRx );
+ }
+}+
\ No newline at end of file
diff --git a/modules/cms-publish/filter/LessFilter.class.php b/modules/cms-publish/filter/LessFilter.class.php
@@ -0,0 +1,31 @@
+<?php
+
+
+namespace cms\publish\filter;
+
+
+use Less_Parser;
+
+class LessFilter extends AbstractFilter
+{
+ public $sourceMap = false;
+ public $indentation = ' ';
+ public $compress = false;
+ public $variables = array();
+
+ public function filter($value)
+ {
+ $parser = new Less_Parser(array(
+ 'sourceMap' => $this->sourceMap,
+ 'indentation' => $this->indentation,
+ 'outputSourceFiles' => false,
+ 'compress' => (bool) $this->compress,
+ ));
+
+ $parser->parse($value);
+
+ $parser->modifyVars( (array) $this->variables );
+
+ return $parser->getCss();
+ }
+}+
\ No newline at end of file
diff --git a/modules/cms-publish/require.php b/modules/cms-publish/require.php
@@ -6,3 +6,9 @@ require_once(__DIR__ . '/'.'PublishEdit.class.php');
require_once(__DIR__ . '/'.'PublishShow.class.php');
require_once(__DIR__ . '/'.'PublishPublic.class.php');
require_once( __DIR__.'/'.'Ftp.class.php' );
+
+require_once( __DIR__.'/'.'filter/AbstractFilter.class.php' );
+require_once( __DIR__.'/'.'filter/JavascriptMinifierFilter.class.php' );
+require_once( __DIR__.'/'.'filter/LessFilter.class.php' );
+require_once( __DIR__.'/'.'filter/Base64DecodeFilter.class.php' );
+require_once( __DIR__.'/'.'filter/Base64EncodeFilter.class.php' );