From 1249d92065cde96e38902ac471a8a92dc8d0d6a8 Mon Sep 17 00:00:00 2001 From: Ben Thomson Date: Fri, 5 Jul 2024 15:19:29 +0800 Subject: [PATCH] Prevent minification of 8 character hex to 3 characters, instead minify to 4 characters --- src/Assetic/Filter/StylesheetMinifyFilter.php | 7 +++++-- .../Test/Filter/StylesheetMinifyFilterTest.php | 11 +++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/Assetic/Filter/StylesheetMinifyFilter.php b/src/Assetic/Filter/StylesheetMinifyFilter.php index f8ebe65..5830e62 100644 --- a/src/Assetic/Filter/StylesheetMinifyFilter.php +++ b/src/Assetic/Filter/StylesheetMinifyFilter.php @@ -2,7 +2,7 @@ namespace Assetic\Filter; -use Assetic\Asset\AssetInterface; +use Assetic\Contracts\Asset\AssetInterface; /** * Stylesheet Minify Filter @@ -52,8 +52,11 @@ protected function minify($css) // Strips units if value is 0 (converts 0px to 0), ignores values inside () $css = preg_replace('/(:| )(\.?)0(em|ex|px|in|cm|mm|pt|pc)(?![^\(]*\))/i', '${1}0', $css); + // Shorten 8-character hex color codes to 4-character where possible + $css = preg_replace('/#([a-f0-9])\\1([a-f0-9])\\2([a-f0-9])\\3([a-f0-9])\\4/i', '#\1\2\3\4', $css); + // Shortern 6-character hex color codes to 3-character where possible - $css = preg_replace('/#([a-f0-9])\\1([a-f0-9])\\2([a-f0-9])\\3/i', '#\1\2\3', $css); + $css = preg_replace('/#([a-f0-9])\\1([a-f0-9])\\2([a-f0-9])\\3(?![a-f0-9])/i', '#\1\2\3', $css); return trim($css); } diff --git a/tests/Assetic/Test/Filter/StylesheetMinifyFilterTest.php b/tests/Assetic/Test/Filter/StylesheetMinifyFilterTest.php index 004f962..8986e7a 100644 --- a/tests/Assetic/Test/Filter/StylesheetMinifyFilterTest.php +++ b/tests/Assetic/Test/Filter/StylesheetMinifyFilterTest.php @@ -131,4 +131,15 @@ public function testAttributeSelectorsWithLess() $this->assertEquals($output, $mockAsset->getContent()); } + + public function testHexMinification() + { + $asset = new \Assetic\Asset\StringAsset('body { color: #00000088; background: #ffffff; border: #012345; box-shadow: 0 0 0 1px #01234567; }'); + $asset->load(); + + $filter = new StylesheetMinifyFilter(); + $filter->filterDump($asset); + + $this->assertEquals('body{color:#0008;background:#fff;border:#012345;box-shadow:0 0 0 1px #01234567}', $asset->getContent()); + } }