Skip to content
Closed
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
2 changes: 1 addition & 1 deletion src/Illuminate/View/Compilers/Concerns/CompilesClasses.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,6 @@ protected function compileClass($expression)
{
$expression = is_null($expression) ? '([])' : $expression;

return "class=\"<?php echo \Illuminate\Support\Arr::toCssClasses{$expression}; ?>\"";
return "<?php \$__classes = \Illuminate\Support\Arr::toCssClasses{$expression}; echo \$__classes !== '' ? 'class=\"'.\$__classes.'\"' : ''; ?>";
}
}
2 changes: 1 addition & 1 deletion src/Illuminate/View/Compilers/Concerns/CompilesStyles.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,6 @@ protected function compileStyle($expression)
{
$expression = is_null($expression) ? '([])' : $expression;

return "style=\"<?php echo \Illuminate\Support\Arr::toCssStyles{$expression} ?>\"";
return "<?php \$__styles = \Illuminate\Support\Arr::toCssStyles{$expression}; echo \$__styles !== '' ? 'style=\"'.\$__styles.'\"' : ''; ?>";
}
}
46 changes: 45 additions & 1 deletion tests/View/Blade/BladeClassTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,52 @@ class BladeClassTest extends AbstractBladeTestCase
public function testClassesAreConditionallyCompiledFromArray()
{
$string = "<span @class(['font-bold', 'mt-4', 'ml-2' => true, 'mr-2' => false])></span>";
$expected = "<span class=\"<?php echo \Illuminate\Support\Arr::toCssClasses(['font-bold', 'mt-4', 'ml-2' => true, 'mr-2' => false]); ?>\"></span>";
$expected = "<span <?php \$__classes = \Illuminate\Support\Arr::toCssClasses(['font-bold', 'mt-4', 'ml-2' => true, 'mr-2' => false]); echo \$__classes !== '' ? 'class=\"'.\$__classes.'\"' : ''; ?>></span>";

$this->assertEquals($expected, $this->compiler->compileString($string));
}

public function testClassAttributeIsOmittedWhenArrayIsEmpty()
{
$template = $this->compiler->compileString('<span @class([])></span>');

ob_start();
eval('?>'.$template);
$output = ob_get_clean();

$this->assertSame('<span ></span>', $output);
}

public function testClassAttributeIsOmittedWhenAllConditionsAreFalse()
{
$template = $this->compiler->compileString("<span @class(['foo' => false, 'bar' => false])></span>");

ob_start();
eval('?>'.$template);
$output = ob_get_clean();

$this->assertSame('<span ></span>', $output);
}

public function testClassAttributeIsRenderedWhenSomeConditionsAreTrue()
{
$template = $this->compiler->compileString("<span @class(['base', 'active' => true, 'hidden' => false])></span>");

ob_start();
eval('?>'.$template);
$output = ob_get_clean();

$this->assertSame('<span class="base active"></span>', $output);
}

public function testClassAttributeIsRenderedWithUnconditionalClassWhenAllConditionsAreFalse()
{
$template = $this->compiler->compileString("<span @class(['base', 'active' => false])></span>");

ob_start();
eval('?>'.$template);
$output = ob_get_clean();

$this->assertSame('<span class="base"></span>', $output);
}
}
18 changes: 9 additions & 9 deletions tests/View/Blade/BladePhpStatementsTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -122,12 +122,12 @@ public function testStringWithEscapingDataValue()
public function testUnclosedParenthesisForBladeTags()
{
$string = "<span @class(['(']></span>";
$expected = "<span class=\"<?php echo \Illuminate\Support\Arr::toCssClasses([]); ?>\"(['(']></span>";
$expected = "<span <?php \$__classes = \Illuminate\Support\Arr::toCssClasses([]); echo \$__classes !== '' ? 'class=\"'.\$__classes.'\"' : ''; ?>(['(']></span>";

$this->assertEquals($expected, $this->compiler->compileString($string));

$string = "<span @class(['']></span>";
$expected = "<span class=\"<?php echo \Illuminate\Support\Arr::toCssClasses([]); ?>\"(['']></span>";
$expected = "<span <?php \$__classes = \Illuminate\Support\Arr::toCssClasses([]); echo \$__classes !== '' ? 'class=\"'.\$__classes.'\"' : ''; ?>(['']></span>";

$this->assertEquals($expected, $this->compiler->compileString($string));

Expand All @@ -145,31 +145,31 @@ public function testUnclosedParenthesisForBladeTags()
public function testNestedTagCalls()
{
$string = "<span @class(['k' => @empty(\$v)])></span>";
$expected = '<span class="<?php echo \Illuminate\Support\Arr::toCssClasses([\'k\' => @empty($v)]); ?>"></span>';
$expected = '<span <?php $__classes = \Illuminate\Support\Arr::toCssClasses([\'k\' => @empty($v)]); echo $__classes !== \'\' ? \'class="\'.$__classes.\'"\' : \'\'; ?>></span>';
$this->assertEquals($expected, $this->compiler->compileString($string));

$string = "<span @class(['k))' => @empty(\$v)])></span>";
$expected = '<span class="<?php echo \Illuminate\Support\Arr::toCssClasses([\'k))\' => @empty($v)]); ?>"></span>';
$expected = '<span <?php $__classes = \Illuminate\Support\Arr::toCssClasses([\'k))\' => @empty($v)]); echo $__classes !== \'\' ? \'class="\'.$__classes.\'"\' : \'\'; ?>></span>';
$this->assertEquals($expected, $this->compiler->compileString($string));

$string = "<span @class(['k' => @empty(\$v), 't' => @empty(\$v1)])></span>";
$expected = '<span class="<?php echo \Illuminate\Support\Arr::toCssClasses([\'k\' => @empty($v), \'t\' => @empty($v1)]); ?>"></span>';
$expected = '<span <?php $__classes = \Illuminate\Support\Arr::toCssClasses([\'k\' => @empty($v), \'t\' => @empty($v1)]); echo $__classes !== \'\' ? \'class="\'.$__classes.\'"\' : \'\'; ?>></span>';
$this->assertEquals($expected, $this->compiler->compileString($string));

$string = "<span @class(['k' => @empty(\$v), 't' => @empty(\$v1)])></span>";
$expected = '<span class="<?php echo \Illuminate\Support\Arr::toCssClasses([\'k\' => @empty($v), \'t\' => @empty($v1)]); ?>"></span>';
$expected = '<span <?php $__classes = \Illuminate\Support\Arr::toCssClasses([\'k\' => @empty($v), \'t\' => @empty($v1)]); echo $__classes !== \'\' ? \'class="\'.$__classes.\'"\' : \'\'; ?>></span>';
$this->assertEquals($expected, $this->compiler->compileString($string));

$string = "<span @class(['k' => @empty(\$v), 't' => @empty(\$v1), 'r' => @empty(\$v2)])></span>";
$expected = '<span class="<?php echo \Illuminate\Support\Arr::toCssClasses([\'k\' => @empty($v), \'t\' => @empty($v1), \'r\' => @empty($v2)]); ?>"></span>';
$expected = '<span <?php $__classes = \Illuminate\Support\Arr::toCssClasses([\'k\' => @empty($v), \'t\' => @empty($v1), \'r\' => @empty($v2)]); echo $__classes !== \'\' ? \'class="\'.$__classes.\'"\' : \'\'; ?>></span>';
$this->assertEquals($expected, $this->compiler->compileString($string));

$string = "<span @class(['k' => @empty(\$v), 't))' => @empty(\$v1), 'r' => @empty(\$v2)])></span>";
$expected = '<span class="<?php echo \Illuminate\Support\Arr::toCssClasses([\'k\' => @empty($v), \'t))\' => @empty($v1), \'r\' => @empty($v2)]); ?>"></span>';
$expected = '<span <?php $__classes = \Illuminate\Support\Arr::toCssClasses([\'k\' => @empty($v), \'t))\' => @empty($v1), \'r\' => @empty($v2)]); echo $__classes !== \'\' ? \'class="\'.$__classes.\'"\' : \'\'; ?>></span>';
$this->assertEquals($expected, $this->compiler->compileString($string));

$string = "<span @class(['k' => @empty(\$v), 't' => @empty(\$v1), 'r' => @empty(\$v2), 'l' => 'l'])></span><span @class(['k' => @empty(\$v)])></span>";
$expected = '<span class="<?php echo \Illuminate\Support\Arr::toCssClasses([\'k\' => @empty($v), \'t\' => @empty($v1), \'r\' => @empty($v2), \'l\' => \'l\']); ?>"></span><span class="<?php echo \Illuminate\Support\Arr::toCssClasses([\'k\' => @empty($v)]); ?>"></span>';
$expected = '<span <?php $__classes = \Illuminate\Support\Arr::toCssClasses([\'k\' => @empty($v), \'t\' => @empty($v1), \'r\' => @empty($v2), \'l\' => \'l\']); echo $__classes !== \'\' ? \'class="\'.$__classes.\'"\' : \'\'; ?>></span><span <?php $__classes = \Illuminate\Support\Arr::toCssClasses([\'k\' => @empty($v)]); echo $__classes !== \'\' ? \'class="\'.$__classes.\'"\' : \'\'; ?>></span>';
$this->assertEquals($expected, $this->compiler->compileString($string));
}

Expand Down
46 changes: 45 additions & 1 deletion tests/View/Blade/BladeStyleTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,52 @@ class BladeStyleTest extends AbstractBladeTestCase
public function testStylesAreConditionallyCompiledFromArray()
{
$string = "<span @style(['font-weight: bold', 'text-decoration: underline', 'color: red' => true, 'margin-top: 10px' => false])></span>";
$expected = "<span style=\"<?php echo \Illuminate\Support\Arr::toCssStyles(['font-weight: bold', 'text-decoration: underline', 'color: red' => true, 'margin-top: 10px' => false]) ?>\"></span>";
$expected = "<span <?php \$__styles = \Illuminate\Support\Arr::toCssStyles(['font-weight: bold', 'text-decoration: underline', 'color: red' => true, 'margin-top: 10px' => false]); echo \$__styles !== '' ? 'style=\"'.\$__styles.'\"' : ''; ?>></span>";

$this->assertEquals($expected, $this->compiler->compileString($string));
}

public function testStyleAttributeIsOmittedWhenArrayIsEmpty()
{
$template = $this->compiler->compileString('<span @style([])></span>');

ob_start();
eval('?>'.$template);
$output = ob_get_clean();

$this->assertSame('<span ></span>', $output);
}

public function testStyleAttributeIsOmittedWhenAllConditionsAreFalse()
{
$template = $this->compiler->compileString("<span @style(['color: red' => false, 'margin: 0' => false])></span>");

ob_start();
eval('?>'.$template);
$output = ob_get_clean();

$this->assertSame('<span ></span>', $output);
}

public function testStyleAttributeIsRenderedWhenSomeConditionsAreTrue()
{
$template = $this->compiler->compileString("<span @style(['font-weight: bold', 'color: red' => true, 'margin: 0' => false])></span>");

ob_start();
eval('?>'.$template);
$output = ob_get_clean();

$this->assertSame('<span style="font-weight: bold; color: red;"></span>', $output);
}

public function testStyleAttributeIsRenderedWithUnconditionalStyleWhenAllConditionsAreFalse()
{
$template = $this->compiler->compileString("<span @style(['font-weight: bold', 'color: red' => false])></span>");

ob_start();
eval('?>'.$template);
$output = ob_get_clean();

$this->assertSame('<span style="font-weight: bold;"></span>', $output);
}
}
Loading