8000 Fixes · symfony/symfony@038a94e · GitHub
[go: up one dir, main page]

Skip to content

Commit 038a94e

Browse files
committed
Fixes
1 parent 8947a4e commit 038a94e

File tree

2 files changed

+40
-66
lines changed

2 files changed

+40
-66
lines changed

src/Symfony/Component/Yaml/Inline.php

Lines changed: 35 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,8 @@ public static function parse($value, $flags = 0, $references = array())
9696
$reader = new StringReader($value);
9797
$i = 0;
9898
if ($reader->eat('[')) {
99-
$result = self::parseSequence($value, $flags, $i, $references);
100-
++$i;
99+
$result = self::parseSequence($reader, $flags, $references);
100+
$i = $reader->getOffset();
101101
} elseif ($reader->eat('{')) {
102102
$result = self::parseMapping($value, $flags, $i, $references);
103103
++$i;
@@ -341,31 +341,6 @@ public static function parseScalar($scalar, $flags = 0, $delimiters = null, &$i
341341
return $output;
342342
}
343343

344-
/**
345-
* Parses a quoted scalar to YAML.
346-
*
347-
* @param string $scalar
348-
* @param int &$i
349-
*
350-
* @return string A YAML string
351-
*
352-
* @throws ParseException When malformed inline YAML string is parsed
353-
*/
354-
private static function parseQuotedScalar($scalar, &$i)
355-
{
356-
$reader = new StringReader($scalar, $i);
357-
$unescaper = new Unescaper();
358-
if ($reader->eat('"')) {
359-
$output = $unescaper->unescapeDoubleQuotedString($reader);
360-
} elseif ($reader->eat('\'')) {
361-
$output = $unescaper->unescapeSingleQuotedString($reader);
362-
}
363-
364-
$i = $reader->getOffset();
365-
366-
return $output;
367-
}
368-
369344
/**
370345
* Parses a sequence to a YAML string.
371346
*
@@ -378,52 +353,44 @@ private static function parseQuotedScalar($scalar, &$i)
378353
*
379354
* @throws ParseException When malformed inline YAML string is parsed
380355
*/
381-
private static function parseSequence($sequence, $flags, &$i = 0, $references = array())
356+
private static function parseSequence(StringReader $reader, $flags, $references = array())
382357
{
383358
$output = array();
384-
$len = strlen($sequence);
385-
++$i;
386359

387360
// [foo, bar, ...]
388-
while ($i < $len) {
389-
switch ($sequence[$i]) {
390-
case '[':
391-
// nested sequence
392-
$output[] = self::parseSequence($sequence, $flags, $i, $references);
393-
break;
394-
case '{':
395-
// nested mapping
396-
$output[] = self::parseMapping($sequence, $flags, $i, $references);
397-
break;
398-
case ']':
399-
return $output;
400-
case ',':
401-
case ' ':
402-
break;
403-
default:
404-
$isQuoted = in_array($sequence[$i], array('"', "'"));
405-
$value = self::parseScalar($sequence, $flags, array(',', ']'), $i, true, $references);
406-
407-
// the value can be an array if a reference has been resolved to an array var
408-
if (is_string($value) && !$isQuoted && false !== strpos($value, ': ')) {
409-
// embedded mapping?
410-
try {
411-
$pos = 0;
412-
$value = self::parseMapping('{'.$value.'}', $flags, $pos, $references);
413-
} catch (\InvalidArgumentException $e) {
414-
// no, it's not
415-
}
361+
while (true) {
362+
if ($reader->eat('[')) {
363+
$output[] = self::parseSequence($reader, $flags, $references);
364+
} elseif ($reader->eat('{')) {
365+
$rest = substr((string) $reader, $reader->getOffset() - 1);
366+
$i = 0;
367+
$output[] = self::parseMapping($rest, $flags, $i, $references);
368+
$reader->read($i);
369+
} elseif ($reader->eat(']')) {
370+
return $output;
371+
} elseif ($reader->eatAny(array(',', ' '))) {
372+
} else {
373+
$rest = substr((string) $reader, $reader->getOffset());
374+
$i = 0;
375+
376+
$isQuoted = in_array($rest[0], array('"', "'"));
377+
$value = self::parseScalar($rest, $flags, array(',', ']'), $i, true, $references);
378+
$reader->read($i);
379+
380+
// the value can be an array if a reference has been resolved to an array var
381+
if (is_string($value) && !$isQuoted && false !== strpos($value, ': ')) {
382+
// embedded mapping?
383+
try {
384+
$pos = 0;
385+
$value = self::parseMapping('{'.$value.'}', $flags, $pos, $references);
386+
} catch (\InvalidArgumentException $e) {
387+
// no, it's not
416388
}
389+
}
417390

418-
$output[] = $value;
419-
420-
--$i;
391+
$output[] = $value;
421392
}
422-
423-
++$i;
424393
}
425-
426-
throw new ParseException(sprintf('Malformed inline YAML string %s', $sequence));
427394
}
428395

429396
/**
@@ -473,8 +440,10 @@ private static function parseMapping($mapping, $flags, &$i = 0, $references = ar
473440
while ($i < $len) {
474441
switch ($mapping[$i]) {
475442
case '[':
443+
$reader = new StringReader($mapping, $i + 1);
476444
// nested sequence
477-
$value = self::parseSequence($mapping, $flags, $i, $references);
445+
$value = self::parseSequence($reader, $flags, $references);
446+
$i = $reader->getOffset() - 1;
478447
// Spec: Keys MUST be unique; first one wins.
479448
// Parser cannot abort this mapping earlier, since lines
480449
// are processed sequentially.

src/Symfony/Component/Yaml/Util/StringReader.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,11 @@ public function captureState()
194194
return new StringSourceState($this->offset);
195195
}
196196

197+
public function __toString()
198+
{
199+
return $this->data;
200+
}
201+
197202
private function checkByteCount(&$byteCount, $allowIncomplete)
198203
{
199204
$maxByteCount = $this->getRemainingByteCount();

0 commit comments

Comments
 (0)
0