-
Notifications
You must be signed in to change notification settings - Fork 11.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Unexpected newline behavior in blade template with echo followed by verbatim #51146
Comments
With One way to solve this is to leave newlines alone in the input and always add a newline after a PHP closing tag, regardless of whether it is followed by a newline in the input. E.g.
A workaround to get one newline is to put
However, this is also unexpected, because there is no separator between |
Thank you for reporting this issue! As Laravel is an open source project, we rely on the community to help us diagnose and fix issues as it is not possible to research and fix every issue reported to us via GitHub. If possible, please make a pull request fixing the issue you have described, along with corresponding tests. All pull requests are promptly reviewed by the Laravel team. Thank you! |
Thanks @Sjord. Would love a PR that could improve this one. |
I looked further into this, and there are two problems with this solution:
Another possible solution is to move whitespace in front of the verbatim block:
|
Closes laravel#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.
Closes laravel#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.
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.
Laravel Version
v11.4.0
PHP Version
8.3.6
Database Driver & Version
No response
Description
In a Blade template, when a echo expression is followed by a verbatim directive, zero or two newlines are echoed. It does not seem possible to echo one newline.
Steps To Reproduce
Input 1, with no newlines between
{{ 1 }}
andsecond line
:Output 1:
Input 2; one additional newline in the input results in two newlines between
{{ 1 }}
andsecond line
in the output:Output 2:
The text was updated successfully, but these errors were encountered: