diff --git a/src/Symfony/Component/Yaml/Parser.php b/src/Symfony/Component/Yaml/Parser.php index 611bbac3ae..7d40c0597f 100644 --- a/src/Symfony/Component/Yaml/Parser.php +++ b/src/Symfony/Component/Yaml/Parser.php @@ -384,6 +384,7 @@ class Parser if (0 === $this->currentLineNb) { $parseError = false; $previousLineWasNewline = false; + $previousLineWasTerminatedWithBackslash = false; $value = ''; foreach ($this->lines as $line) { @@ -401,13 +402,25 @@ class Parser if ('' === trim($parsedLine)) { $value .= "\n"; - $previousLineWasNewline = true; - } elseif ($previousLineWasNewline) { + } elseif (!$previousLineWasNewline && !$previousLineWasTerminatedWithBackslash) { + $value .= ' '; + } + + if ('' !== trim($parsedLine) && '\\' === substr($parsedLine, -1)) { + $value .= ltrim(substr($parsedLine, 0, -1)); + } elseif ('' !== trim($parsedLine)) { $value .= trim($parsedLine); + } + + if ('' === trim($parsedLine)) { + $previousLineWasNewline = true; + $previousLineWasTerminatedWithBackslash = false; + } elseif ('\\' === substr($parsedLine, -1)) { $previousLineWasNewline = false; + $previousLineWasTerminatedWithBackslash = true; } else { - $value .= ' '.trim($parsedLine); $previousLineWasNewline = false; + $previousLineWasTerminatedWithBackslash = false; } } catch (ParseException $e) { $parseError = true; @@ -416,7 +429,7 @@ class Parser } if (!$parseError) { - return trim($value); + return Inline::parse(trim($value)); } } diff --git a/src/Symfony/Component/Yaml/Tests/ParserTest.php b/src/Symfony/Component/Yaml/Tests/ParserTest.php index 4c62f9bd17..67ed642084 100644 --- a/src/Symfony/Component/Yaml/Tests/ParserTest.php +++ b/src/Symfony/Component/Yaml/Tests/ParserTest.php @@ -1543,6 +1543,17 @@ EOT; $this->assertSame(array('foo' => 'bar baz foobar foo', 'bar' => 'baz'), $this->parser->parse($yaml)); } + public function testMultiLineQuotedStringWithTrailingBackslash() + { + $yaml = <<assertSame(array('foobar' => 'foobar'), $this->parser->parse($yaml)); + } + public function testParseMultiLineUnquotedString() { $yaml = <<