Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ Please also have a look at our

### Added

- Add `OutputFormat::setSpaceAroundSelectorCombinator()` (#1504)
- Add support for escaped quotes in the selectors (#1485, #1489)
- Provide line number in exception message for mismatched parentheses in
selector (#1435)
Expand Down
27 changes: 27 additions & 0 deletions src/OutputFormat.php
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,11 @@ final class OutputFormat
*/
private $spaceAfterSelectorSeparator = ' ';

/**
* @var string
*/
private $spaceAroundSelectorCombinator = ' ';

/**
* This is what’s inserted before the separator in value lists, by default.
*
Expand Down Expand Up @@ -434,6 +439,27 @@ public function setSpaceAfterSelectorSeparator(string $whitespace): self
return $this;
}

/**
* @internal
*/
public function getSpaceAroundSelectorCombinator(): string
{
return $this->spaceAroundSelectorCombinator;
}

/**
* The spacing set is also used for the descendent combinator, which is whitespace only,
* unless an empty string is set, in which case a space will be used.
*
* @return $this fluent interface
*/
public function setSpaceAroundSelectorCombinator(string $whitespace): self
{
$this->spaceAroundSelectorCombinator = $whitespace;

return $this;
}

/**
* @internal
*/
Expand Down Expand Up @@ -724,6 +750,7 @@ public static function createCompact(): self
->setSpaceAfterRuleName('')
->setSpaceBeforeOpeningBrace('')
->setSpaceAfterSelectorSeparator('')
->setSpaceAroundSelectorCombinator('')
->setSemicolonAfterLastRule(false)
->setRenderComments(false);

Expand Down
10 changes: 8 additions & 2 deletions src/Property/Selector/Combinator.php
Original file line number Diff line number Diff line change
Expand Up @@ -94,8 +94,14 @@ public function getSpecificity(): int

public function render(OutputFormat $outputFormat): string
{
// TODO: allow optional spacing controlled via OutputFormat
return $this->value !== ' ' ? (' ' . $this->value . ' ') : ' ';
$spacing = $outputFormat->getSpaceAroundSelectorCombinator();
if ($this->value === ' ') {
$rendering = $spacing !== '' ? $spacing : ' ';
} else {
$rendering = $spacing . $this->value . $spacing;
}

return $rendering;
}

/**
Expand Down
47 changes: 47 additions & 0 deletions tests/Unit/OutputFormatTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -414,6 +414,33 @@ public function setSpaceAfterSelectorSeparatorProvidesFluentInterface(): void
self::assertSame($this->subject, $this->subject->setSpaceAfterSelectorSeparator(' '));
}

/**
* @test
*/
public function getSpaceAroundSelectorCombinatorInitiallyReturnsSpace(): void
{
self::assertSame(' ', $this->subject->getSpaceAroundSelectorCombinator());
}

/**
* @test
*/
public function setSpaceAroundSelectorCombinatorSetsSpaceAroundSelectorCombinator(): void
{
$value = ' ';
$this->subject->setSpaceAroundSelectorCombinator($value);

self::assertSame($value, $this->subject->getSpaceAroundSelectorCombinator());
}

/**
* @test
*/
public function setSpaceAroundSelectorCombinatorProvidesFluentInterface(): void
{
self::assertSame($this->subject, $this->subject->setSpaceAroundSelectorCombinator(' '));
}

/**
* @test
*/
Expand Down Expand Up @@ -1024,6 +1051,16 @@ public function createCompactReturnsInstanceWithSpaceAfterSelectorSeparatorSetTo
self::assertSame('', $newInstance->getSpaceAfterSelectorSeparator());
}

/**
* @test
*/
public function createCompactReturnsInstanceWithSpaceAroundSelectorCombinatorSetToEmptyString(): void
{
$newInstance = OutputFormat::createCompact();

self::assertSame('', $newInstance->getSpaceAroundSelectorCombinator());
}

/**
* @test
*/
Expand Down Expand Up @@ -1163,6 +1200,16 @@ public function createPrettyReturnsInstanceWithSpaceAfterSelectorSeparatorSetToS
self::assertSame(' ', $newInstance->getSpaceAfterSelectorSeparator());
}

/**
* @test
*/
public function createPrettyReturnsInstanceWithSpaceAroundSelectorCombinatorSetToSpace(): void
{
$newInstance = OutputFormat::createPretty();

self::assertSame(' ', $newInstance->getSpaceAroundSelectorCombinator());
}

/**
* @test
*/
Expand Down
46 changes: 46 additions & 0 deletions tests/Unit/Property/Selector/CombinatorTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,52 @@ public function renderReturnsDefaultRenderingForValueProvided(string $value, str
self::assertSame($expectedRendering, $subject->render(OutputFormat::create()));
}

/**
* @return array<non-empty-string, array{0: string}>
*/
public static function provideSpacing(): array
{
return [
'empty string' => [''],
'space' => [' '],
'newline' => ["\n"],
'carriage return' => ["\r"],
'tab' => ["\t"],
];
}

/**
* @test
*
* @dataProvider provideSpacing
*/
public function renderIncludesSpacingSetInOutputFormat(string $spacing): void
{
$subject = new Combinator('>');
$outputFormat = (OutputFormat::create())->setSpaceAroundSelectorCombinator($spacing);

$result = $subject->render($outputFormat);

$expectedRendering = $spacing . '>' . $spacing;
self::assertSame($expectedRendering, $result);
}

/**
* @test
*
* @dataProvider provideSpacing
*/
public function renderReturnsSpacingSetInOutputFormatForDescendentCombinatorOrSpaceIfNeeded(string $spacing): void
{
$subject = new Combinator(' ');
$outputFormat = (OutputFormat::create())->setSpaceAroundSelectorCombinator($spacing);

$result = $subject->render($outputFormat);

$expectedRendering = $spacing !== '' ? $spacing : ' ';
self::assertSame($expectedRendering, $result);
}

/**
* @test
*/
Expand Down