@@ -96,8 +96,8 @@ public static function parse($value, $flags = 0, $references = array())
96
96
$ reader = new StringReader ($ value );
97
97
$ i = 0 ;
98
98
if ($ reader ->eat ('[ ' )) {
99
- $ result = self ::parseSequence ($ value , $ flags, $ i , $ references );
100
- ++ $ i ;
99
+ $ result = self ::parseSequence ($ reader , $ flags , $ references );
100
+ $ i = $ reader -> getOffset () ;
101
101
} elseif ($ reader ->eat ('{ ' )) {
102
102
$ result = self ::parseMapping ($ value , $ flags , $ i , $ references );
103
103
++$ i ;
@@ -341,31 +341,6 @@ public static function parseScalar($scalar, $flags = 0, $delimiters = null, &$i
341
341
return $ output ;
342
342
}
343
343
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
-
369
344
/**
370
345
* Parses a sequence to a YAML string.
371
346
*
@@ -378,52 +353,44 @@ private static function parseQuotedScalar($scalar, &$i)
378
353
*
379
354
* @throws ParseException When malformed inline YAML string is parsed
380
355
*/
381
- private static function parseSequence ($ sequence , $ flags , & $ i = 0 , $ references = array ())
356
+ private static function parseSequence (StringReader $ reader , $ flags , $ references = array ())
382
357
{
383
358
$ output = array ();
384
- $ len = strlen ($ sequence );
385
- ++$ i ;
386
359
387
360
// [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
416
388
}
389
+ }
417
390
418
- $ output [] = $ value ;
419
-
420
- --$ i ;
391
+ $ output [] = $ value ;
421
392
}
422
-
423
- ++$ i ;
424
393
}
425
-
426
- throw new ParseException (sprintf ('Malformed inline YAML string %s ' , $ sequence ));
427
394
}
428
395
429
396
/**
@@ -473,8 +440,10 @@ private static function parseMapping($mapping, $flags, &$i = 0, $references = ar
473
440
while ($ i < $ len ) {
474
441
switch ($ mapping [$ i ]) {
475
442
case '[ ' :
443
+ $ reader = new StringReader ($ mapping , $ i + 1 );
476
444
// nested sequence
477
- $ value = self ::parseSequence ($ mapping , $ flags , $ i , $ references );
445
+ $ value = self ::parseSequence ($ reader , $ flags , $ references );
446
+ $ i = $ reader ->getOffset () - 1 ;
478
447
// Spec: Keys MUST be unique; first one wins.
479
448
// Parser cannot abort this mapping earlier, since lines
480
449
// are processed sequentially.
0 commit comments