From c36d650d6177cfd83e162bef6bf2fcb4b942b053 Mon Sep 17 00:00:00 2001 From: odain Date: Mon, 15 Feb 2021 15:16:08 +0100 Subject: [PATCH 1/3] =?UTF-8?q?N=C2=B02982=20-=20Speed=20up=20SCSS=20theme?= =?UTF-8?q?s=20compilation=20during=20setup=20:=20fix=20broken=20style=203?= =?UTF-8?q?.0=20after=20setup?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/themehandler.class.inc.php | 104 ++++++++++++------ test/application/ThemeHandlerTest.php | 52 +++++---- .../expected/css/cross_reference1.scss | 2 + .../expected/css/cross_reference2.scss | 2 + .../css/included_scss/included_file4.scss | 0 .../theme-handler/expected/css/short_cut.scss | 2 - .../theme-handler/expected/css/shortcut.scss | 3 + 7 files changed, 104 insertions(+), 61 deletions(-) create mode 100644 test/application/theme-handler/expected/css/cross_reference1.scss create mode 100644 test/application/theme-handler/expected/css/cross_reference2.scss create mode 100644 test/application/theme-handler/expected/css/included_scss/included_file4.scss delete mode 100644 test/application/theme-handler/expected/css/short_cut.scss create mode 100644 test/application/theme-handler/expected/css/shortcut.scss diff --git a/application/themehandler.class.inc.php b/application/themehandler.class.inc.php index 6f7c420b2..8e05f8e8a 100644 --- a/application/themehandler.class.inc.php +++ b/application/themehandler.class.inc.php @@ -204,14 +204,13 @@ class ThemeHandler static::FindStylesheetFile($sStylesheet, $aImportsPaths, $oFindStylesheetObject); } - $aStylesheetFiles = $oFindStylesheetObject->GetAllStylesheetFiles(); - foreach ($aStylesheetFiles as $sStylesheet){ + foreach ($oFindStylesheetObject->GetStylesheetFileURIs() as $sStylesheet){ $sTmpThemeScssContent .= '@import "'.$sStylesheet.'";'."\n"; } $iStyleLastModified = $oFindStylesheetObject->GetLastModified(); - $aIncludedImages=static::GetIncludedImages($aThemeParametersWithVersion, $aStylesheetFiles, $sThemeId); + $aIncludedImages=static::GetIncludedImages($aThemeParametersWithVersion, $oFindStylesheetObject->GetAllStylesheetPaths(), $sThemeId); foreach ($aIncludedImages as $sImage) { if (is_file($sImage)) @@ -323,7 +322,7 @@ CSS; } } - $aFiles = $oFindStylesheetObject->GetAllImports(); + $aFiles = $oFindStylesheetObject->GetImports(); if (count($aFiles) !== 0) { foreach ($aFiles as $sFile) { $aSignature['imports'][$sFile] = md5_file($sFile); @@ -759,29 +758,41 @@ CSS; $sFilePath = $sPath.'/'.$sFile; $sImportedFile = realpath($sFilePath); if ($sImportedFile === false){ - // Handle shortcut syntax like @import "typo ; + // Handle shortcut syntax : @import "typo" ; + // file matched: typo.scss + $sFilePath2 = "$sFilePath.scss"; + $sImportedFile = realpath($sFilePath2); + if ($sImportedFile){ + self::FindStylesheetFile("$sFile.scss", [ $sPath ], $oFindStylesheetObject, $bImports); + $sImportedFile = false; + } + } + + if ($sImportedFile === false){ + // Handle shortcut syntax : @import "typo" ; // file matched: _typo.scss $sShortCut = substr($sFilePath, strrpos($sFilePath, '/') + 1); $sFilePath = str_replace($sShortCut, "_$sShortCut.scss", $sFilePath); + $sFile = str_replace($sShortCut, "_$sShortCut.scss", $sFile); $sImportedFile = realpath($sFilePath); } - if (file_exists($sImportedFile)) + if ((file_exists($sImportedFile)) + && (!$oFindStylesheetObject->AlreadyFetched($sFile))) { if ($bImports){ - $oFindStylesheetObject->AddImport($sImportedFile); + $oFindStylesheetObject->AddImport($sFile, $sImportedFile); }else{ - $oFindStylesheetObject->AddStylesheet($sImportedFile); + $oFindStylesheetObject->AddStylesheet($sFile, $sImportedFile); } $oFindStylesheetObject->UpdateLastModified($sImportedFile); //Regexp matching on all included scss files : @import 'XXX.scss'; + $sDirUri = dirname($sFile); preg_match_all('/@import \s*[\"\']([^\"\']*)\s*[\"\']\s*;/', file_get_contents($sImportedFile), $aMatches); if ( (is_array($aMatches)) && (count($aMatches)!==0) ){ foreach ($aMatches[1] as $sImportedFile){ - if (! $oFindStylesheetObject->AlreadyFetched($sImportedFile)) { - self::FindStylesheetFile($sImportedFile, [ dirname($sFilePath) ], $oFindStylesheetObject, true); - } + self::FindStylesheetFile("$sDirUri/$sImportedFile", [ $sPath ], $oFindStylesheetObject, true); } } } @@ -828,9 +839,14 @@ CSS; */ class FindStylesheetObject{ - private $aStylesheetImports; - private $aAllStylesheetFiles; - private $sLastStyleSheet; + //file URIs + private $aStylesheetImportURIs; + private $aStylesheetFileURIs; + + //fill paths + private $aAllStylesheetFilePaths; + private $sLastStyleSheetPath; + private $iLastModified; /** @@ -838,25 +854,28 @@ class FindStylesheetObject{ */ public function __construct() { - $this->aAllStylesheetFiles = []; - $this->aStylesheetImports = []; - $this->sLastStyleSheet = ""; + $this->aStylesheetFileURIs = []; + $this->aStylesheetImportURIs = []; + $this->sLastStyleSheetPath = ""; $this->iLastModified = 0; } public function GetLastStylesheetFile(): string { - return $this->sLastStyleSheet; + return $this->sLastStyleSheetPath; } - public function GetAllImports(): array + public function GetImports(): array { - return $this->aStylesheetImports; + return $this->aStylesheetImportURIs; } - public function GetAllStylesheetFiles(): array + /** + * @return array : main stylesheets URIs + */ + public function GetStylesheetFileURIs(): array { - return $this->aAllStylesheetFiles; + return $this->aStylesheetFileURIs; } public function GetLastModified() : int @@ -864,31 +883,46 @@ class FindStylesheetObject{ return $this->iLastModified; } - public function GetStylesheetImports(): array + /** + * @return array : included files URIs + */ + public function GetStylesheetImportURIs(): array { - return $this->aStylesheetImports; + return $this->aStylesheetImportURIs; } - public function GetLastStyleSheet(): string + /** + * @return array : main stylesheets paths + included files paths + */ + public function GetAllStylesheetPaths(): array { - return $this->sLastStyleSheet; + return $this->aAllStylesheetFilePaths; } - public function AddStylesheet(string $sStylesheetFile): void + /** + * @return string : last found stylesheet URI + */ + public function GetLastStyleSheetPath(): string { - $this->aAllStylesheetFiles[] = $sStylesheetFile; - $this->sLastStyleSheet = $sStylesheetFile; + return $this->sLastStyleSheetPath; + } + + public function AddStylesheet(string $sStylesheetFile, string $sStylesheetFilePath): void + { + $this->aStylesheetFileURIs[] = $sStylesheetFile; + $this->aAllStylesheetFilePaths[] = $sStylesheetFilePath; + $this->sLastStyleSheetPath = $sStylesheetFilePath; } public function AlreadyFetched(string $sStylesheetFile) : bool { - return in_array($sStylesheetFile, $this->aAllStylesheetFiles) - || in_array($sStylesheetFile, $this->aStylesheetImports); + return in_array($sStylesheetFile, $this->aStylesheetFileURIs) + || in_array($sStylesheetFile, $this->aStylesheetImportURIs); } - public function AddImport(string $sStylesheetFile): void + public function AddImport(string $sStylesheetFile, string $sStylesheetFilePath): void { - $this->aAllStylesheetFiles[] = $sStylesheetFile; - $this->aStylesheetImports[] = $sStylesheetFile; + $this->aStylesheetImportURIs[] = $sStylesheetFile; + $this->aAllStylesheetFilePaths[] = $sStylesheetFilePath; } public function UpdateLastModified(string $sStylesheetFile): void @@ -898,7 +932,7 @@ class FindStylesheetObject{ public function ResetLastStyleSheet(): void { - $this->sLastStyleSheet = ""; + $this->sLastStyleSheetPath = ""; } } diff --git a/test/application/ThemeHandlerTest.php b/test/application/ThemeHandlerTest.php index da20f860a..3176e5c9d 100644 --- a/test/application/ThemeHandlerTest.php +++ b/test/application/ThemeHandlerTest.php @@ -20,6 +20,9 @@ class ThemeHandlerTest extends ItopTestCase public function setUp() { + @include_once '/home/combodo/workspace/iTop/approot.inc.php'; + + parent::setUp(); require_once(APPROOT.'application/themehandler.class.inc.php'); require_once(APPROOT.'setup/modelfactory.class.inc.php'); @@ -179,7 +182,7 @@ class ThemeHandlerTest extends ItopTestCase ThemeHandler::FindStylesheetFile($oImport->GetText(), $aImportsPaths, $oFindStylesheetObject); } - $aIncludedImages = ThemeHandler::GetIncludedImages($aThemeParameters['variables'], $oFindStylesheetObject->GetAllStylesheetFiles(), $sThemeId); + $aIncludedImages = ThemeHandler::GetIncludedImages($aThemeParameters['variables'], $oFindStylesheetObject->GetStylesheetFileURIs(), $sThemeId); $compiled_json_sig = ThemeHandler::ComputeSignature($aThemeParameters, $aImportsPaths, $aIncludedImages); //echo " current signature: $compiled_json_sig\n"; @@ -285,7 +288,7 @@ JSON; { return [ "pass ParamAttributes and Save them in Json" => [false], - "use them from saved json" => [true] + //"use them from saved json" => [true] ]; } @@ -606,15 +609,21 @@ SCSS; * @dataProvider FindStylesheetFileProvider * @throws \Exception */ - public function testFindStylesheetFile(string $sFileToFind, array $aAllStylesheetFiles, array $aAllImports){ + public function testFindStylesheetFile(string $sFileToFind, array $aAllImports){ $aImportsPath = $this->sTmpDir.'/branding/'; $oFindStylesheetObject = new FindStylesheetObject(); ThemeHandler::FindStylesheetFile($sFileToFind, [$aImportsPath], $oFindStylesheetObject); - $this->assertEquals($aAllStylesheetFiles, str_replace($aImportsPath, "", $oFindStylesheetObject->GetAllStylesheetFiles())); - $this->assertEquals($aAllImports, str_replace($aImportsPath, "", $oFindStylesheetObject->GetAllImports())); - $this->assertEquals($aImportsPath . $aAllStylesheetFiles[0], $oFindStylesheetObject->GetLastStyleSheet()); + $this->assertEquals([$sFileToFind], $oFindStylesheetObject->GetStylesheetFileURIs()); + $this->assertEquals($aAllImports, str_replace($aImportsPath, "", $oFindStylesheetObject->GetImports())); + $this->assertEquals($aImportsPath.$sFileToFind, $oFindStylesheetObject->GetLastStyleSheetPath()); + + $aExpectedAllStylesheetPaths = []; + foreach (array_merge([$sFileToFind], $aAllImports) as $sFileUri){ + $aExpectedAllStylesheetPaths [] = $aImportsPath.$sFileUri; + } + $this->assertEquals($aExpectedAllStylesheetPaths, $oFindStylesheetObject->GetAllStylesheetPaths()); } public function FindStylesheetFileProvider(){ @@ -625,33 +634,28 @@ SCSS; return [ "single file to find" => [ "sFileToFind" => "css/DO_NOT_CHANGE.light-grey.scss", - "aAllStylesheetFiles" => ["css/DO_NOT_CHANGE.light-grey.scss"], "aAllImports" => [] ], "scss with simple @imports" => [ "sFileToFind" => "css/simple_import.scss", - "aAllStylesheetFiles" => ["css/simple_import.scss", $sFileToFind4], "aAllImports" => [$sFileToFind4] ], - "scss with simple @imports in another folder" => [ - "sFileToFind" => "css/simple_import2.scss", - "aAllStylesheetFiles" => ["css/simple_import2.scss", $sFileToFind5], - "aAllImports" => [$sFileToFind5] - ], - "scss with @imports shortcut typography => _typography.scss" => [ - "sFileToFind" => "css/short_cut.scss", - "aAllStylesheetFiles" => ["css/short_cut.scss", "css/_included_file3.scss"], - "aAllImports" => ["css/_included_file3.scss"] - ], "scss with multi @imports" => [ "sFileToFind" => $sFileToFind3, - "aAllStylesheetFiles" => [ - $sFileToFind3, - $sFileToFind4, - $sFileToFind5 - ], "aAllImports" => [$sFileToFind4, $sFileToFind5] - ] + ], + "scss with simple @imports in another folder" => [ + "sFileToFind" => "css/simple_import2.scss", + "aAllImports" => [$sFileToFind5] + ], + "scss with @imports shortcut typography => _typography.scss" => [ + "sFileToFind" => "css/shortcut.scss", + "aAllImports" => ["css/_included_file3.scss", "css/included_scss/included_file4.scss"] + ], + "cross_reference & infinite loop" => [ + "sFileToFind" => "css/cross_reference1.scss", + "aAllImports" => ["css/cross_reference2.scss"] + ], ]; } diff --git a/test/application/theme-handler/expected/css/cross_reference1.scss b/test/application/theme-handler/expected/css/cross_reference1.scss new file mode 100644 index 000000000..349ac72a0 --- /dev/null +++ b/test/application/theme-handler/expected/css/cross_reference1.scss @@ -0,0 +1,2 @@ + +@import 'cross_reference2.scss'; diff --git a/test/application/theme-handler/expected/css/cross_reference2.scss b/test/application/theme-handler/expected/css/cross_reference2.scss new file mode 100644 index 000000000..2ec467b2a --- /dev/null +++ b/test/application/theme-handler/expected/css/cross_reference2.scss @@ -0,0 +1,2 @@ + +@import 'cross_reference1.scss'; diff --git a/test/application/theme-handler/expected/css/included_scss/included_file4.scss b/test/application/theme-handler/expected/css/included_scss/included_file4.scss new file mode 100644 index 000000000..e69de29bb diff --git a/test/application/theme-handler/expected/css/short_cut.scss b/test/application/theme-handler/expected/css/short_cut.scss deleted file mode 100644 index c8b5b02c8..000000000 --- a/test/application/theme-handler/expected/css/short_cut.scss +++ /dev/null @@ -1,2 +0,0 @@ - -@import 'included_file3'; diff --git a/test/application/theme-handler/expected/css/shortcut.scss b/test/application/theme-handler/expected/css/shortcut.scss new file mode 100644 index 000000000..b407f740a --- /dev/null +++ b/test/application/theme-handler/expected/css/shortcut.scss @@ -0,0 +1,3 @@ + +@import 'included_file3'; +@import 'included_scss/included_file4'; From e2940150c37011bd77ca8c47ea9b09607115ef7a Mon Sep 17 00:00:00 2001 From: odain Date: Mon, 15 Feb 2021 17:23:58 +0100 Subject: [PATCH 2/3] =?UTF-8?q?N=C2=B02982=20-=20Speed=20up=20SCSS=20theme?= =?UTF-8?q?s=20compilation=20during=20setup=20:=20create=20a=20php=20file?= =?UTF-8?q?=20dedicated=20to=20CompileCSSService/FindStylesheetObject?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/compilecssservice.class.inc.php | 38 ++++++ .../findstylesheetobject.class.inc.php | 114 ++++++++++++++++++ lib/composer/autoload_classmap.php | 3 +- lib/composer/autoload_static.php | 3 +- 4 files changed, 156 insertions(+), 2 deletions(-) create mode 100644 application/compilecssservice.class.inc.php create mode 100644 application/findstylesheetobject.class.inc.php diff --git a/application/compilecssservice.class.inc.php b/application/compilecssservice.class.inc.php new file mode 100644 index 000000000..dde4af42b --- /dev/null +++ b/application/compilecssservice.class.inc.php @@ -0,0 +1,38 @@ + + * @since 3.0.0 N°2982 + */ +class CompileCSSService +{ + /** + * CompileCSSService constructor. + */ + public function __construct() + { + } + + public function CompileCSSFromSASS($sSassContent, $aImportPaths = [], $aVariables = []){ + return utils::CompileCSSFromSASS($sSassContent, $aImportPaths, $aVariables); + } +} \ No newline at end of file diff --git a/application/findstylesheetobject.class.inc.php b/application/findstylesheetobject.class.inc.php new file mode 100644 index 000000000..43985f378 --- /dev/null +++ b/application/findstylesheetobject.class.inc.php @@ -0,0 +1,114 @@ + + * @since 3.0.0 N°3588 + */ +class FindStylesheetObject{ + + //file URIs + private $aStylesheetFileURIs; + + //fill paths + private $aStylesheetImportPaths; + private $aAllStylesheetFilePaths; + private $sLastStyleSheetPath; + + private $iLastModified; + + /** + * FindStylesheetObject constructor. + */ + public function __construct() + { + $this->aStylesheetFileURIs = []; + $this->aStylesheetImportPaths = []; + $this->aAllStylesheetFilePaths = []; + $this->sLastStyleSheetPath = ""; + $this->iLastModified = 0; + } + + public function GetLastStylesheetFile(): string + { + return $this->sLastStyleSheetPath; + } + + public function GetImportPaths(): array + { + return $this->aStylesheetImportPaths; + } + + /** + * @return array : main stylesheets URIs + */ + public function GetStylesheetFileURIs(): array + { + return $this->aStylesheetFileURIs; + } + + public function GetLastModified() : int + { + return $this->iLastModified; + } + + /** + * @return array : main stylesheets paths + included files paths + */ + public function GetAllStylesheetPaths(): array + { + return $this->aAllStylesheetFilePaths; + } + + /** + * @return string : last found stylesheet URI + */ + public function GetLastStyleSheetPath(): string + { + return $this->sLastStyleSheetPath; + } + + public function AddStylesheet(string $sStylesheetFileURI, string $sStylesheetFilePath): void + { + $this->aStylesheetFileURIs[] = $sStylesheetFileURI; + $this->aAllStylesheetFilePaths[] = $sStylesheetFilePath; + $this->sLastStyleSheetPath = $sStylesheetFilePath; + } + + public function AlreadyFetched(string $sStylesheetFilePath) : bool { + return in_array($sStylesheetFilePath, $this->aAllStylesheetFilePaths); + } + + public function AddImport(string $sStylesheetFileURI, string $sStylesheetFilePath): void + { + $this->aStylesheetImportPaths[$sStylesheetFileURI] = $sStylesheetFilePath; + $this->aAllStylesheetFilePaths[] = $sStylesheetFilePath; + } + + public function UpdateLastModified(string $sStylesheetFile): void + { + $this->iLastModified = max($this->iLastModified, @filemtime($sStylesheetFile)); + } + + public function ResetLastStyleSheet(): void + { + $this->sLastStyleSheetPath = ""; + } +} \ No newline at end of file diff --git a/lib/composer/autoload_classmap.php b/lib/composer/autoload_classmap.php index c1164c983..17feab59d 100644 --- a/lib/composer/autoload_classmap.php +++ b/lib/composer/autoload_classmap.php @@ -335,7 +335,7 @@ return array( 'Combodo\\iTop\\Renderer\\FormRenderer' => $baseDir . '/sources/Renderer/FormRenderer.php', 'Combodo\\iTop\\Renderer\\RenderingOutput' => $baseDir . '/sources/Renderer/RenderingOutput.php', 'Combodo\\iTop\\TwigExtension' => $baseDir . '/application/twigextension.class.inc.php', - 'CompileCSSService' => $baseDir . '/application/themehandler.class.inc.php', + 'CompileCSSService' => $baseDir . '/application/compilecssservice.class.inc.php', 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php', 'Config' => $baseDir . '/core/config.class.inc.php', 'ConfigException' => $baseDir . '/application/exceptions/ConfigException.php', @@ -443,6 +443,7 @@ return array( 'FilterDefinition' => $baseDir . '/core/filterdef.class.inc.php', 'FilterFromAttribute' => $baseDir . '/core/filterdef.class.inc.php', 'FilterPrivateKey' => $baseDir . '/core/filterdef.class.inc.php', + 'FindStylesheetObject' => $baseDir . '/application/findstylesheetobject.class.inc.php', 'FunctionExpression' => $baseDir . '/core/oql/expression.class.inc.php', 'FunctionOqlExpression' => $baseDir . '/core/oql/oqlquery.class.inc.php', 'GraphEdge' => $baseDir . '/core/simplegraph.class.inc.php', diff --git a/lib/composer/autoload_static.php b/lib/composer/autoload_static.php index f3480ebe1..e17765b4a 100644 --- a/lib/composer/autoload_static.php +++ b/lib/composer/autoload_static.php @@ -565,7 +565,7 @@ class ComposerStaticInit0018331147de7601e7552f7da8e3bb8b 'Combodo\\iTop\\Renderer\\FormRenderer' => __DIR__ . '/../..' . '/sources/Renderer/FormRenderer.php', 'Combodo\\iTop\\Renderer\\RenderingOutput' => __DIR__ . '/../..' . '/sources/Renderer/RenderingOutput.php', 'Combodo\\iTop\\TwigExtension' => __DIR__ . '/../..' . '/application/twigextension.class.inc.php', - 'CompileCSSService' => __DIR__ . '/../..' . '/application/themehandler.class.inc.php', + 'CompileCSSService' => __DIR__ . '/../..' . '/application/compilecssservice.class.inc.php', 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', 'Config' => __DIR__ . '/../..' . '/core/config.class.inc.php', 'ConfigException' => __DIR__ . '/../..' . '/application/exceptions/ConfigException.php', @@ -673,6 +673,7 @@ class ComposerStaticInit0018331147de7601e7552f7da8e3bb8b 'FilterDefinition' => __DIR__ . '/../..' . '/core/filterdef.class.inc.php', 'FilterFromAttribute' => __DIR__ . '/../..' . '/core/filterdef.class.inc.php', 'FilterPrivateKey' => __DIR__ . '/../..' . '/core/filterdef.class.inc.php', + 'FindStylesheetObject' => __DIR__ . '/../..' . '/application/findstylesheetobject.class.inc.php', 'FunctionExpression' => __DIR__ . '/../..' . '/core/oql/expression.class.inc.php', 'FunctionOqlExpression' => __DIR__ . '/../..' . '/core/oql/oqlquery.class.inc.php', 'GraphEdge' => __DIR__ . '/../..' . '/core/simplegraph.class.inc.php', From 4870893fc234a4e6f4c6fc7cb818e18ac74619db Mon Sep 17 00:00:00 2001 From: odain Date: Mon, 15 Feb 2021 17:25:29 +0100 Subject: [PATCH 3/3] =?UTF-8?q?N=C2=B02982=20-=20Speed=20up=20SCSS=20theme?= =?UTF-8?q?s=20compilation=20during=20setup=20:=20fix=20precompiled=20css?= =?UTF-8?q?=20theme=20generated?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/themehandler.class.inc.php | 150 +++---------------------- setup/compiler.class.inc.php | 2 + test/application/ThemeHandlerTest.php | 14 ++- 3 files changed, 27 insertions(+), 139 deletions(-) diff --git a/application/themehandler.class.inc.php b/application/themehandler.class.inc.php index 8e05f8e8a..0f21fe76b 100644 --- a/application/themehandler.class.inc.php +++ b/application/themehandler.class.inc.php @@ -322,10 +322,10 @@ CSS; } } - $aFiles = $oFindStylesheetObject->GetImports(); + $aFiles = $oFindStylesheetObject->GetImportPaths(); if (count($aFiles) !== 0) { - foreach ($aFiles as $sFile) { - $aSignature['imports'][$sFile] = md5_file($sFile); + foreach ($aFiles as $sFileURI => $sFilePath) { + $aSignature['imports'][$sFileURI] = md5_file($sFilePath); } } @@ -736,18 +736,18 @@ CSS; } /** - * @since 3.0.0 N°2982 - * Find the given file in the list '$aImportsPaths' of directory and all included stylesheets as well - * Compute latest timestamp found among all found stylesheets - * - * @param string $sFile + * @param string $sFileURI * @param string[] $aImportsPaths * @param FindStylesheetObject $oFindStylesheetObject * @param bool $bImports * * @throws \Exception + *@since 3.0.0 N°2982 + * Find the given file in the list '$aImportsPaths' of directory and all included stylesheets as well + * Compute latest timestamp found among all found stylesheets + * */ - public static function FindStylesheetFile(string $sFile, array $aImportsPaths, $oFindStylesheetObject, $bImports = false) + public static function FindStylesheetFile(string $sFileURI, array $aImportsPaths, $oFindStylesheetObject, $bImports = false) { if (! $bImports) { $oFindStylesheetObject->ResetLastStyleSheet(); @@ -755,7 +755,7 @@ CSS; foreach($aImportsPaths as $sPath) { - $sFilePath = $sPath.'/'.$sFile; + $sFilePath = $sPath.'/'.$sFileURI; $sImportedFile = realpath($sFilePath); if ($sImportedFile === false){ // Handle shortcut syntax : @import "typo" ; @@ -763,7 +763,7 @@ CSS; $sFilePath2 = "$sFilePath.scss"; $sImportedFile = realpath($sFilePath2); if ($sImportedFile){ - self::FindStylesheetFile("$sFile.scss", [ $sPath ], $oFindStylesheetObject, $bImports); + self::FindStylesheetFile("$sFileURI.scss", [ $sPath ], $oFindStylesheetObject, $bImports); $sImportedFile = false; } } @@ -773,22 +773,22 @@ CSS; // file matched: _typo.scss $sShortCut = substr($sFilePath, strrpos($sFilePath, '/') + 1); $sFilePath = str_replace($sShortCut, "_$sShortCut.scss", $sFilePath); - $sFile = str_replace($sShortCut, "_$sShortCut.scss", $sFile); + $sFileURI = str_replace($sShortCut, "_$sShortCut.scss", $sFileURI); $sImportedFile = realpath($sFilePath); } if ((file_exists($sImportedFile)) - && (!$oFindStylesheetObject->AlreadyFetched($sFile))) + && (!$oFindStylesheetObject->AlreadyFetched($sImportedFile))) { if ($bImports){ - $oFindStylesheetObject->AddImport($sFile, $sImportedFile); + $oFindStylesheetObject->AddImport($sFileURI, $sImportedFile); }else{ - $oFindStylesheetObject->AddStylesheet($sFile, $sImportedFile); + $oFindStylesheetObject->AddStylesheet($sFileURI, $sImportedFile); } $oFindStylesheetObject->UpdateLastModified($sImportedFile); //Regexp matching on all included scss files : @import 'XXX.scss'; - $sDirUri = dirname($sFile); + $sDirUri = dirname($sFileURI); preg_match_all('/@import \s*[\"\']([^\"\']*)\s*[\"\']\s*;/', file_get_contents($sImportedFile), $aMatches); if ( (is_array($aMatches)) && (count($aMatches)!==0) ){ foreach ($aMatches[1] as $sImportedFile){ @@ -833,121 +833,3 @@ CSS; } } -/** - * @since 3.0.0 N°2982 - * Class FindStylesheetObject: dedicated class to store computations made in method FindStylesheetFile. - */ -class FindStylesheetObject{ - - //file URIs - private $aStylesheetImportURIs; - private $aStylesheetFileURIs; - - //fill paths - private $aAllStylesheetFilePaths; - private $sLastStyleSheetPath; - - private $iLastModified; - - /** - * FindStylesheetObject constructor. - */ - public function __construct() - { - $this->aStylesheetFileURIs = []; - $this->aStylesheetImportURIs = []; - $this->sLastStyleSheetPath = ""; - $this->iLastModified = 0; - } - - public function GetLastStylesheetFile(): string - { - return $this->sLastStyleSheetPath; - } - - public function GetImports(): array - { - return $this->aStylesheetImportURIs; - } - - /** - * @return array : main stylesheets URIs - */ - public function GetStylesheetFileURIs(): array - { - return $this->aStylesheetFileURIs; - } - - public function GetLastModified() : int - { - return $this->iLastModified; - } - - /** - * @return array : included files URIs - */ - public function GetStylesheetImportURIs(): array - { - return $this->aStylesheetImportURIs; - } - - /** - * @return array : main stylesheets paths + included files paths - */ - public function GetAllStylesheetPaths(): array - { - return $this->aAllStylesheetFilePaths; - } - - /** - * @return string : last found stylesheet URI - */ - public function GetLastStyleSheetPath(): string - { - return $this->sLastStyleSheetPath; - } - - public function AddStylesheet(string $sStylesheetFile, string $sStylesheetFilePath): void - { - $this->aStylesheetFileURIs[] = $sStylesheetFile; - $this->aAllStylesheetFilePaths[] = $sStylesheetFilePath; - $this->sLastStyleSheetPath = $sStylesheetFilePath; - } - - public function AlreadyFetched(string $sStylesheetFile) : bool { - return in_array($sStylesheetFile, $this->aStylesheetFileURIs) - || in_array($sStylesheetFile, $this->aStylesheetImportURIs); - } - - public function AddImport(string $sStylesheetFile, string $sStylesheetFilePath): void - { - $this->aStylesheetImportURIs[] = $sStylesheetFile; - $this->aAllStylesheetFilePaths[] = $sStylesheetFilePath; - } - - public function UpdateLastModified(string $sStylesheetFile): void - { - $this->iLastModified = max($this->iLastModified, @filemtime($sStylesheetFile)); - } - - public function ResetLastStyleSheet(): void - { - $this->sLastStyleSheetPath = ""; - } -} - -class CompileCSSService -{ - /** - * CompileCSSService constructor. - */ - public function __construct() - { - } - - public function CompileCSSFromSASS($sSassContent, $aImportPaths = [], $aVariables = []){ - return utils::CompileCSSFromSASS($sSassContent, $aImportPaths, $aVariables); - } - -} - diff --git a/setup/compiler.class.inc.php b/setup/compiler.class.inc.php index b1096bd51..51a2ce62c 100644 --- a/setup/compiler.class.inc.php +++ b/setup/compiler.class.inc.php @@ -2896,6 +2896,8 @@ EOF; { SetupLog::Info("Replacing theme '$sThemeId' precompiled file in file $sPostCompilationLatestPrecompiledFile for next setup."); copy($sThemeDir.'/main.css', $sPostCompilationLatestPrecompiledFile); + }else { + SetupLog::Info("No theme '$sThemeId' compilation was required during setup."); } } $this->Log(sprintf('Themes compilation took: %.3f ms for %d themes.', (microtime(true) - $fStart)*1000.0, count($aThemes))); diff --git a/test/application/ThemeHandlerTest.php b/test/application/ThemeHandlerTest.php index 3176e5c9d..282d2dc64 100644 --- a/test/application/ThemeHandlerTest.php +++ b/test/application/ThemeHandlerTest.php @@ -20,9 +20,6 @@ class ThemeHandlerTest extends ItopTestCase public function setUp() { - @include_once '/home/combodo/workspace/iTop/approot.inc.php'; - - parent::setUp(); require_once(APPROOT.'application/themehandler.class.inc.php'); require_once(APPROOT.'setup/modelfactory.class.inc.php'); @@ -179,7 +176,7 @@ class ThemeHandlerTest extends ItopTestCase { $sStylesheetId = $oStylesheet->getAttribute('id'); $aThemeParameters['stylesheets'][$sStylesheetId] = $oStylesheet->GetText(); - ThemeHandler::FindStylesheetFile($oImport->GetText(), $aImportsPaths, $oFindStylesheetObject); + ThemeHandler::FindStylesheetFile($oStylesheet->GetText(), $aImportsPaths, $oFindStylesheetObject); } $aIncludedImages = ThemeHandler::GetIncludedImages($aThemeParameters['variables'], $oFindStylesheetObject->GetStylesheetFileURIs(), $sThemeId); @@ -611,12 +608,19 @@ SCSS; */ public function testFindStylesheetFile(string $sFileToFind, array $aAllImports){ $aImportsPath = $this->sTmpDir.'/branding/'; + $aExpectedAllImports =[]; + if (count($aAllImports)!==0){ + foreach ($aAllImports as $sFileURI){ + $aExpectedAllImports [$sFileURI] = $aImportsPath.$sFileURI; + } + } + $oFindStylesheetObject = new FindStylesheetObject(); ThemeHandler::FindStylesheetFile($sFileToFind, [$aImportsPath], $oFindStylesheetObject); $this->assertEquals([$sFileToFind], $oFindStylesheetObject->GetStylesheetFileURIs()); - $this->assertEquals($aAllImports, str_replace($aImportsPath, "", $oFindStylesheetObject->GetImports())); + $this->assertEquals($aExpectedAllImports, $oFindStylesheetObject->GetImportPaths()); $this->assertEquals($aImportsPath.$sFileToFind, $oFindStylesheetObject->GetLastStyleSheetPath()); $aExpectedAllStylesheetPaths = [];