From 7114f98205d655c06f0a8e1364a24a38a3b5d67c Mon Sep 17 00:00:00 2001 From: Jake Hotson Date: Mon, 21 Jul 2025 15:02:46 +0100 Subject: [PATCH 1/3] [BUGFIX] Remove trailing semicolon with compact format Fixes #1342. --- CHANGELOG.md | 2 ++ src/OutputFormat.php | 1 + tests/Comment/CommentTest.php | 8 ++++---- tests/Functional/RuleSet/RuleSetTest.php | 4 ++-- tests/OutputFormatTest.php | 4 ++-- 5 files changed, 11 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f201262cd..eb3708361 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -74,6 +74,8 @@ Please also have a look at our ### Fixed +- Remove trailing semicolon from declatation blocks with 'compact' + `OutputFormat` (#1345) - Parse selector functions (like `:not`) with comma-separated arguments (#1292) - Parse quoted attribute selector value containing comma (#1323) - Allow comma in selectors (e.g. `:not(html, body)`) (#1293) diff --git a/src/OutputFormat.php b/src/OutputFormat.php index 6ad45aa40..5c493865a 100644 --- a/src/OutputFormat.php +++ b/src/OutputFormat.php @@ -726,6 +726,7 @@ public static function createCompact(): self ->setSpaceAfterRuleName('') ->setSpaceBeforeOpeningBrace('') ->setSpaceAfterSelectorSeparator('') + ->setSemicolonAfterLastRule(false) ->setRenderComments(false); return $format; diff --git a/tests/Comment/CommentTest.php b/tests/Comment/CommentTest.php index 15d5983ee..52c3de550 100644 --- a/tests/Comment/CommentTest.php +++ b/tests/Comment/CommentTest.php @@ -49,8 +49,8 @@ public function keepCommentsInOutput(): void . ' * Comments' . "\n" . ' *//* Hell */@import url("some/url.css") screen;' . '/* Number 4 *//* Number 5 */.foo,#bar{' - . '/* Number 6 */background-color:#000;}@media screen{' - . '/** Number 10 **/#foo.bar{/** Number 10b **/position:absolute;}}', + . '/* Number 6 */background-color:#000}@media screen{' + . '/** Number 10 **/#foo.bar{/** Number 10b **/position:absolute}}', $cssDocument->render(OutputFormat::createCompact()->setRenderComments(true)) ); } @@ -76,8 +76,8 @@ public function stripCommentsFromOutput(): void ', $css->render(OutputFormat::createPretty()->setRenderComments(false))); self::assertSame( '@import url("some/url.css") screen;' - . '.foo,#bar{background-color:#000;}' - . '@media screen{#foo.bar{position:absolute;}}', + . '.foo,#bar{background-color:#000}' + . '@media screen{#foo.bar{position:absolute}}', $css->render(OutputFormat::createCompact()) ); } diff --git a/tests/Functional/RuleSet/RuleSetTest.php b/tests/Functional/RuleSet/RuleSetTest.php index 152f0c6be..b0d976055 100644 --- a/tests/Functional/RuleSet/RuleSetTest.php +++ b/tests/Functional/RuleSet/RuleSetTest.php @@ -71,7 +71,7 @@ public function renderReturnsCssForRulesSet(array $propertyNamesAndValuesToSet, /** * @test */ - public function renderWithCompactOutputFormatReturnsCssWithoutWhitespace(): void + public function renderWithCompactOutputFormatReturnsCssWithoutWhitespaceOrTrailingSemicolon(): void { $this->setRulesFromPropertyNamesAndValues([ ['name' => 'color', 'value' => 'green'], @@ -80,7 +80,7 @@ public function renderWithCompactOutputFormatReturnsCssWithoutWhitespace(): void $result = $this->subject->render(OutputFormat::createCompact()); - self::assertSame('color:green;display:block;', $result); + self::assertSame('color:green;display:block', $result); } /** diff --git a/tests/OutputFormatTest.php b/tests/OutputFormatTest.php index 9852ae58a..3a8deb30e 100644 --- a/tests/OutputFormatTest.php +++ b/tests/OutputFormatTest.php @@ -69,8 +69,8 @@ public function plain(): void public function compact(): void { self::assertSame( - '.main,.test{font:italic normal bold 16px/1.2 "Helvetica",Verdana,sans-serif;background:white;}' - . '@media screen{.main{background-size:100% 100%;font-size:1.3em;background-color:#fff;}}', + '.main,.test{font:italic normal bold 16px/1.2 "Helvetica",Verdana,sans-serif;background:white}' + . '@media screen{.main{background-size:100% 100%;font-size:1.3em;background-color:#fff}}', $this->document->render(OutputFormat::createCompact()) ); } From c5b8b77e808e981270c5932ad247f60adf720d2d Mon Sep 17 00:00:00 2001 From: Jake Hotson Date: Mon, 21 Jul 2025 15:21:42 +0100 Subject: [PATCH 2/3] Add test for `createCompact()` itself. --- tests/Unit/OutputFormatTest.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/Unit/OutputFormatTest.php b/tests/Unit/OutputFormatTest.php index 781ad2f41..1a043e1da 100644 --- a/tests/Unit/OutputFormatTest.php +++ b/tests/Unit/OutputFormatTest.php @@ -1034,6 +1034,16 @@ public function createCompactReturnsInstanceWithSpaceAfterListArgumentSeparators self::assertSame([], $newInstance->getSpaceAfterListArgumentSeparators()); } + /** + * @test + */ + public function createCompactReturnsInstanceWithRenderSemicolonAfterLastRuleDisabled(): void + { + $newInstance = OutputFormat::createCompact(); + + self::assertFalse($newInstance->shouldRenderSemicolonAfterLastRule()); + } + /** * @test */ From 9c131cdea380cd7211535c88cd22d8a3926dbee5 Mon Sep 17 00:00:00 2001 From: JakeQZ Date: Mon, 21 Jul 2025 15:36:05 +0100 Subject: [PATCH 3/3] Fix typo in CHANGELOG.md Co-authored-by: Oliver Klee --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index eb3708361..2064f81f9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -74,7 +74,7 @@ Please also have a look at our ### Fixed -- Remove trailing semicolon from declatation blocks with 'compact' +- Remove trailing semicolon from declaration blocks with 'compact' `OutputFormat` (#1345) - Parse selector functions (like `:not`) with comma-separated arguments (#1292) - Parse quoted attribute selector value containing comma (#1323)