Skip to content

Commit 49bf66f

Browse files
authored
[CLEANUP] Clean extra whitespace in CSS selector (#1398)
1 parent e7dcce8 commit 49bf66f

File tree

4 files changed

+56
-2
lines changed

4 files changed

+56
-2
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ Please also have a look at our
1414

1515
### Changed
1616

17+
- Cleanup extra whitespace in css selector (#1398)
1718
- The array keys passed to `DeclarationBlock::setSelectors()` are no longer
1819
preserved (#1407)
1920

src/Property/Selector.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use Sabberworm\CSS\Renderable;
1010

1111
use function Safe\preg_match;
12+
use function Safe\preg_replace;
1213

1314
/**
1415
* Class representing a single CSS selector. Selectors have to be split by the comma prior to being passed into this
@@ -74,7 +75,12 @@ public function getSelector(): string
7475

7576
public function setSelector(string $selector): void
7677
{
77-
$this->selector = \trim($selector);
78+
$selector = \trim($selector);
79+
80+
$hasAttribute = \strpos($selector, '[') !== false;
81+
82+
// Whitespace can't be adjusted within an attribute selector, as it would change its meaning
83+
$this->selector = !$hasAttribute ? preg_replace('/\\s++/', ' ', $selector) : $selector;
7884
}
7985

8086
/**

tests/ParserTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -770,7 +770,7 @@ public function selectorIgnoresInFile(): void
770770
$document = self::parsedStructureForFile('selector-ignores', Settings::create()->withMultibyteSupport(true));
771771
$expected = '.some[selectors-may=\'contain-a-{\'] {}'
772772
. "\n"
773-
. '.this-selector .valid {width: 100px;}'
773+
. '.this-selector .valid {width: 100px;}'
774774
. "\n"
775775
. '@media only screen and (min-width: 200px) {.test {prop: val;}}';
776776
self::assertSame($expected, $document->render());

tests/Unit/Property/SelectorTest.php

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,4 +141,51 @@ public function isValidForInvalidSelectorReturnsFalse(string $selector): void
141141
{
142142
self::assertFalse(Selector::isValid($selector));
143143
}
144+
145+
/**
146+
* @test
147+
*/
148+
public function cleansUpSpacesWithinSelector(): void
149+
{
150+
$selector = 'p > small';
151+
152+
$subject = new Selector($selector);
153+
154+
self::assertSame('p > small', $subject->getSelector());
155+
}
156+
157+
/**
158+
* @test
159+
*/
160+
public function cleansUpTabsWithinSelector(): void
161+
{
162+
$selector = "p\t>\tsmall";
163+
164+
$subject = new Selector($selector);
165+
166+
self::assertSame('p > small', $subject->getSelector());
167+
}
168+
169+
/**
170+
* @test
171+
*/
172+
public function cleansUpNewLineWithinSelector(): void
173+
{
174+
$selector = "p\n>\nsmall";
175+
176+
$subject = new Selector($selector);
177+
178+
self::assertSame('p > small', $subject->getSelector());
179+
}
180+
181+
182+
/**
183+
* @test
184+
*/
185+
public function doesNotCleanupSpacesWithinAttributeSelector(): void
186+
{
187+
$subject = new Selector('a[title="extra space"]');
188+
189+
self::assertSame('a[title="extra space"]', $subject->getSelector());
190+
}
144191
}

0 commit comments

Comments
 (0)