Skip to content

Commit

Permalink
Refactor class merging logic in CssClass::class. (#152)
Browse files Browse the repository at this point in the history
  • Loading branch information
terabytesoftw committed Dec 18, 2023
1 parent c1a5624 commit 89460ce
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 33 deletions.
28 changes: 18 additions & 10 deletions src/Helper/CssClass.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ final class CssClass
* Adds a CSS class (or several classes) to the specified options.
*
* If the CSS class is already in the options, it will not be added again. If class specification at given options
* is an array, and some class placed there with the named (string) key, overriding of such key will have no
* is an array, and some class placed there with the named (string) key, overriding of such a key will have no
* effect. For example:
*
* ```php
Expand All @@ -38,16 +38,24 @@ final class CssClass
public static function add(array &$attributes, array|string $class): void
{
if (isset($attributes['class'])) {
if (is_array($attributes['class'])) {
/** @psalm-var string[] $attributes['class'] */
$attributes['class'] = self::merge($attributes['class'], (array) $class);
} elseif ('' !== $class) {
/** @psalm-var string $attributes['class'] */
$classes = preg_split('/\s+/', $attributes['class'], -1, PREG_SPLIT_NO_EMPTY);
$attributes['class'] = implode(' ', self::merge($classes, (array) $class));
}
/** @psalm-var string[] $existingClasses */
$existingClasses = is_array($attributes['class'])
? $attributes['class']
: preg_split('/\s+/', (string) $attributes['class'], -1, PREG_SPLIT_NO_EMPTY);

$newClasses = is_array($class)
? $class
: preg_split('/\s+/', $class, -1, PREG_SPLIT_NO_EMPTY);

$mergedClasses = self::merge($existingClasses, $newClasses);

$attributes['class'] = implode(' ', $mergedClasses);
} elseif ($class !== [] && $class !== '') {
$attributes['class'] = $class;
$classArray = is_array($class)
? $class
: preg_split('/\s+/', $class, -1, PREG_SPLIT_NO_EMPTY);

Check warning on line 56 in src/Helper/CssClass.php

View workflow job for this annotation

GitHub Actions / mutation / PHP 8.1-ubuntu-latest

Escaped Mutant for Mutator "DecrementInteger": --- Original +++ New @@ @@ $mergedClasses = self::merge($existingClasses, $newClasses); $attributes['class'] = implode(' ', $mergedClasses); } elseif ($class !== [] && $class !== '') { - $classArray = is_array($class) ? $class : preg_split('/\\s+/', $class, -1, PREG_SPLIT_NO_EMPTY); + $classArray = is_array($class) ? $class : preg_split('/\\s+/', $class, -2, PREG_SPLIT_NO_EMPTY); $attributes['class'] = implode(' ', $classArray); } }

$attributes['class'] = implode(' ', $classArray);
}
}

Expand Down
29 changes: 6 additions & 23 deletions tests/Helper/CssClassTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public function testAdd(): void
CssClass::add($attributes, 'class-1');
$this->assertSame(['class' => 'class class-1'], $attributes);

CssClass::add($attributes, 'class');
CssClass::add($attributes, 'class class-1');
$this->assertSame(['class' => 'class class-1'], $attributes);

CssClass::add($attributes, 'class-1');
Expand All @@ -40,16 +40,16 @@ public function testAdd(): void
CssClass::add($attributes, 'class-1');
$this->assertSame(['class' => 'class class-1 class-2'], $attributes);

$attributes = ['class' => ['class']];
$attributes = ['class' => ['class', 'class-1']];

CssClass::add($attributes, 'class-1');
$this->assertSame(['class' => ['class', 'class-1']], $attributes);
$this->assertSame(['class' => 'class class-1'], $attributes);

CssClass::add($attributes, 'class-1');
$this->assertSame(['class' => ['class', 'class-1']], $attributes);
$this->assertSame(['class' => 'class class-1'], $attributes);

CssClass::add($attributes, 'class-2');
$this->assertSame(['class' => ['class', 'class-1', 'class-2']], $attributes);
$this->assertSame(['class' => 'class class-1 class-2'], $attributes);

$attributes = ['class' => 'class'];

Expand All @@ -65,23 +65,6 @@ public function testDuplicate(): void
CssClass::add($attributes, 'class2');
CssClass::add($attributes, 'test-class');

$this->assertSame(['class' => ['test-class', 'class1', 'class2']], $attributes);
}

/**
* @depends testAdd
*/
public function testMerge(): void
{
$attributes = ['class' => ['persistent' => 'class-1']];

CssClass::add($attributes, ['persistent' => 'class-2']);
$this->assertSame(['persistent' => 'class-1'], $attributes['class']);

CssClass::add($attributes, ['additional' => 'class-2']);
$this->assertSame(['persistent' => 'class-1', 'additional' => 'class-2'], $attributes['class']);

CssClass::add($attributes, ['persistent' => 'class-2']);
$this->assertSame(['persistent' => 'class-1', 'additional' => 'class-2'], $attributes['class']);
$this->assertSame(['class' => 'test-class class1 class2'], $attributes);
}
}

0 comments on commit 89460ce

Please sign in to comment.