Skip to content

Commit

Permalink
Move whitespace in front of verbatim block in Blade templates
Browse files Browse the repository at this point in the history
Closes #51146

If a PHP end tag `?>` is followed by a newline, that newline is not shown in
the output. To counteract this, CompilesEchos detects whether an echo is
followed by a newline and then doubles that newline. However, if the newline is
part of a verbatim block, it is already replaced by a placeholder and
CompilesEchos won't detect it correctly.

This change moves the whitespace in front of the verbatim block. The whitespace
remains outside of the placeholder and CompilesEchos can correctly detect it.

This assumes that whitespace is not modified by Blade in a manner that it would
be necessary to put whitespace in a verbatim block to change its meaning.

Only the final assertion in the testNewlinesAreInsertedCorrectlyAfterEcho test
actually tests for what we want. The first two are more of an introduction for
the reader, to show that what we test in the last assertion really makes sense.
It first tests a verbatim block, then an echo statement, and then the
combination of the two, what is what we are really interested in.
  • Loading branch information
Sjord committed Apr 24, 2024
1 parent 6d598f5 commit 94e6877
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 2 deletions.
4 changes: 2 additions & 2 deletions src/Illuminate/View/Compilers/BladeCompiler.php
Original file line number Diff line number Diff line change
Expand Up @@ -390,8 +390,8 @@ protected function storeUncompiledBlocks($value)
*/
protected function storeVerbatimBlocks($value)
{
return preg_replace_callback('/(?<!@)@verbatim(.*?)@endverbatim/s', function ($matches) {
return $this->storeRawBlock($matches[1]);
return preg_replace_callback('/(?<!@)@verbatim(\s*)(.*?)@endverbatim/s', function ($matches) {
return $matches[1] . $this->storeRawBlock($matches[2]);
}, $value);
}

Expand Down
14 changes: 14 additions & 0 deletions tests/View/Blade/BladeVerbatimTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -86,4 +86,18 @@ public function testRawBlocksDontGetMixedUpWhenSomeAreRemovedByBladeComments()

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

public function testNewlinesAreInsertedCorrectlyAfterEcho() {
$string = "test @verbatim\nhello world\n@endverbatim";
$expected = "test \nhello world\n";
$this->assertSame($expected, $this->compiler->compileString($string));

$string = "{{ 1 }}\nhello world\n";
$expected = "<?php echo e(1); ?>\n\nhello world\n";
$this->assertSame($expected, $this->compiler->compileString($string));

$string = "{{ 1 }}@verbatim\nhello world\n@endverbatim";
$expected = "<?php echo e(1); ?>\n\nhello world\n";
$this->assertSame($expected, $this->compiler->compileString($string));
}
}

0 comments on commit 94e6877

Please sign in to comment.