diff --git a/src/Symfony/Component/Console/Formatter/OutputFormatter.php b/src/Symfony/Component/Console/Formatter/OutputFormatter.php
index 15c14b6d86348..c37a4d452ce86 100644
--- a/src/Symfony/Component/Console/Formatter/OutputFormatter.php
+++ b/src/Symfony/Component/Console/Formatter/OutputFormatter.php
@@ -239,8 +239,18 @@ private function applyCurrentStyle(string $text, string $current, int $width, in
}
if ($currentLineLength) {
- $prefix = Helper::substr($text, 0, $i = $width - $currentLineLength)."\n";
- $text = Helper::substr($text, $i);
+ $lines = explode("\n", $text, 2);
+ $prefix = Helper::substr($lines[0], 0, $i = $width - $currentLineLength)."\n";
+ $text = Helper::substr($lines[0], $i);
+
+ if (isset($lines[1])) {
+ // $prefix may contain the full first line in which the \n is already a part of $prefix.
+ if ('' !== $text) {
+ $text .= "\n";
+ }
+
+ $text .= $lines[1];
+ }
} else {
$prefix = '';
}
@@ -255,8 +265,8 @@ private function applyCurrentStyle(string $text, string $current, int $width, in
$lines = explode("\n", $text);
- foreach ($lines as $line) {
- $currentLineLength += Helper::length($line);
+ foreach ($lines as $i => $line) {
+ $currentLineLength = 0 === $i ? $currentLineLength + Helper::length($line) : Helper::length($line);
if ($width <= $currentLineLength) {
$currentLineLength = 0;
}
diff --git a/src/Symfony/Component/Console/Tests/Formatter/OutputFormatterTest.php b/src/Symfony/Component/Console/Tests/Formatter/OutputFormatterTest.php
index 4dbeb702d0b08..b66b6abe487a2 100644
--- a/src/Symfony/Component/Console/Tests/Formatter/OutputFormatterTest.php
+++ b/src/Symfony/Component/Console/Tests/Formatter/OutputFormatterTest.php
@@ -365,8 +365,14 @@ public function testFormatAndWrap()
$this->assertSame("Lore\nm \e[37;41mip\e[39;49m\n\e[37;41msum\e[39;49m \ndolo\nr \e[32msi\e[39m\n\e[32mt\e[39m am\net", $formatter->formatAndWrap('Lorem ipsum dolor sit amet', 4));
$this->assertSame("Lorem \e[37;41mip\e[39;49m\n\e[37;41msum\e[39;49m dolo\nr \e[32msit\e[39m am\net", $formatter->formatAndWrap('Lorem ipsum dolor sit amet', 8));
$this->assertSame("Lorem \e[37;41mipsum\e[39;49m dolor \e[32m\e[39m\n\e[32msit\e[39m, \e[37;41mamet\e[39;49m et \e[32mlauda\e[39m\n\e[32mntium\e[39m architecto", $formatter->formatAndWrap('Lorem ipsum dolor sit, amet et laudantium architecto', 18));
- $this->assertSame("\e[37;41mnon-empty-array\e[39;49m\e[37;41m\e[39;49m given.\n🪪\n argument.type", $formatter->formatAndWrap("non-empty-array given.\n🪪 argument.type", 38));
+ $this->assertSame("\e[37;41mnon-empty-array\e[39;49m\e[37;41m\e[39;49m given.\n🪪 argument.type", $formatter->formatAndWrap("non-empty-array given.\n🪪 argument.type", 38));
$this->assertSame("Usuário {{user_name}} não é válid\no.", $formatter->formatAndWrap('Usuário {{user_name}} não é válido.', 50));
+ $this->assertSame("foo\e[37;41mb\e[39;49m\n\e[37;41mar\e[39;49mbaz", $formatter->formatAndWrap("foob\narbaz", 7));
+ $this->assertSame("foo\e[37;41mbar\e[39;49mbaz\nnewline", $formatter->formatAndWrap("foobarbaz\nnewline", 11));
+ $this->assertSame("foobarbaz\n\e[37;41mnewline\e[39;49m", $formatter->formatAndWrap("foobarbaz\nnewline", 11));
+ $this->assertSame("foobar\e[37;41mbaz\e[39;49m\n\e[37;41mnewline\e[39;49m", $formatter->formatAndWrap("foobarbaz\nnewline", 11));
+ $this->assertSame("foobar\e[37;41mbazne\e[39;49m\n\e[37;41mwline\e[39;49m", $formatter->formatAndWrap("foobarbazne\nwline", 11));
+ $this->assertSame("foobar\e[37;41mbazne\e[39;49m\n\e[37;41mw\e[39;49m\n\e[37;41mline\e[39;49m", $formatter->formatAndWrap("foobarbaznew\nline", 11));
$formatter = new OutputFormatter();
@@ -378,8 +384,14 @@ public function testFormatAndWrap()
$this->assertSame("Ă‚ rèälly\nlöng tĂ®tlè\nthät cöüld\nnèêd\nmĂşltĂ®plĂŞ\nlĂnès", $formatter->formatAndWrap('Ă‚ rèälly löng tĂ®tlè thät cöüld nèêd mĂşltĂ®plĂŞ lĂnès', 10));
$this->assertSame("Ă‚ rèälly\nlöng tĂ®tlè\nthät cöüld\nnèêd\nmĂşltĂ®plĂŞ\n lĂnès", $formatter->formatAndWrap("Ă‚ rèälly löng tĂ®tlè thät cöüld nèêd mĂşltĂ®plĂŞ\n lĂnès", 10));
$this->assertSame('', $formatter->formatAndWrap(null, 5));
- $this->assertSame("non-empty-array given.\n🪪\n argument.type", $formatter->formatAndWrap("non-empty-array given.\n🪪 argument.type", 38));
+ $this->assertSame("non-empty-array given.\n🪪 argument.type", $formatter->formatAndWrap("non-empty-array given.\n🪪 argument.type", 38));
$this->assertSame("Usuário {{user_name}} não é válid\no.", $formatter->formatAndWrap('Usuário {{user_name}} não é válido.', 50));
+ $this->assertSame("foob\narbaz", $formatter->formatAndWrap("foob\narbaz", 7));
+ $this->assertSame("foobarbaz\nnewline", $formatter->formatAndWrap("foobarbaz\nnewline", 11));
+ $this->assertSame("foobarbaz\nnewline", $formatter->formatAndWrap("foobarbaz\nnewline", 11));
+ $this->assertSame("foobarbaz\nnewline", $formatter->formatAndWrap("foobarbaz\nnewline", 11));
+ $this->assertSame("foobarbazne\nwline", $formatter->formatAndWrap("foobarbazne\nwline", 11));
+ $this->assertSame("foobarbazne\nw\nline", $formatter->formatAndWrap("foobarbaznew\nline", 11));
}
}