parse newlines in quoted multiline strings

This commit is contained in:
Christian Flothmann 2017-12-04 14:06:32 +01:00
parent 5b997f1f21
commit b23b957ae9
2 changed files with 30 additions and 1 deletions

View File

@ -700,6 +700,8 @@ class Parser
return Inline::parse($value, $flags, $this->refs);
}
$lines = array();
while ($this->moveToNextLine()) {
// unquoted strings end before the first unindented line
if (null === $quotation && 0 === $this->getCurrentLineIndentation()) {
@ -708,7 +710,7 @@ class Parser
break;
}
$value .= ' '.trim($this->currentLine);
$lines[] = trim($this->currentLine);
// quoted string values end with a line that is terminated with the quotation character
if ('' !== $this->currentLine && substr($this->currentLine, -1) === $quotation) {
@ -716,6 +718,19 @@ class Parser
}
}
for ($i = 0, $linesCount = count($lines), $previousLineBlank = false; $i < $linesCount; ++$i) {
if ('' === $lines[$i]) {
$value .= "\n";
$previousLineBlank = true;
} elseif ($previousLineBlank) {
$value .= $lines[$i];
$previousLineBlank = false;
} else {
$value .= ' '.$lines[$i];
$previousLineBlank = false;
}
}
Inline::$parsedLineNumber = $this->getRealCurrentLineNb();
$parsedValue = Inline::parse($value, $flags, $this->refs);

View File

@ -1572,6 +1572,20 @@ YAML;
$this->assertSame($expected, $this->parser->parse($yaml));
}
public function testBlankLinesInQuotedMultiLineString()
{
$yaml = <<<YAML
foobar: 'foo
bar'
YAML;
$expected = array(
'foobar' => "foo\nbar",
);
$this->assertSame($expected, $this->parser->parse($yaml));
}
public function testParseMultiLineUnquotedString()
{
$yaml = <<<EOT