Development

Changeset 24527

You must first sign up to be able to contribute.

Changeset 24527

Show
Ignore:
Timestamp:
11/29/09 15:21:42 (4 years ago)
Author:
fabien
Message:

[yaml] fixed parsing mapping keys when they are quoted strings (closes #7537)

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • components/yaml/branches/1.0/lib/sfYamlInline.php

    r22986 r24527  
    2121class sfYamlInline 
    2222{ 
     23  const REGEX_QUOTED_STRING = '(?:"([^"\\\\]*(?:\\\\.[^"\\\\]*)*)"|\'([^\']*(?:\'\'[^\']*)*)\')'; 
     24 
    2325  /** 
    2426   * Convert a YAML string to a PHP array. 
     
    157159      // quoted scalar 
    158160      $output = self::parseQuotedScalar($scalar, $i); 
    159  
    160       // skip next delimiter 
    161       ++$i; 
    162161    } 
    163162    else 
     
    201200  static protected function parseQuotedScalar($scalar, &$i) 
    202201  { 
    203     $delimiter = $scalar[$i]; 
    204     ++$i; 
    205     $buffer = ''; 
    206     $len = strlen($scalar); 
    207     $escaped = '"' == $delimiter ? '\\"' : "''"; 
    208  
    209     while ($i < $len) 
    210     { 
    211       if (isset($scalar[$i + 1]) && $escaped == $scalar[$i].$scalar[$i + 1]) 
    212       { 
    213         $buffer .= $delimiter; 
    214         ++$i; 
    215       } 
    216       else if ($delimiter == $scalar[$i]) 
    217       { 
    218         break; 
    219       } 
    220       else 
    221       { 
    222         $buffer .= $scalar[$i]; 
    223       } 
    224  
    225       ++$i; 
    226     } 
    227  
    228     if ('"' == $delimiter) 
     202    preg_match('/'.self::REGEX_QUOTED_STRING.'/A', substr($scalar, $i), $match); 
     203 
     204    $output = stripcslashes(substr($match[0], 1, strlen($match[0]) - 2)); 
     205 
     206    if ('"' == $scalar[$i]) 
    229207    { 
    230208      // evaluate the string 
    231       $buffer = str_replace(array('\\n', '\\r'), array("\n", "\r"), $buffer); 
    232     } 
    233  
    234     return $buffer; 
     209      $output = str_replace(array('\\n', '\\r'), array("\n", "\r"), $output); 
     210    } 
     211    else 
     212    { 
     213      // unescape ' 
     214      $output = str_replace('\'\'', '\'', $output); 
     215    } 
     216 
     217    $i += strlen($match[0]); 
     218 
     219    return $output; 
    235220  } 
    236221 
  • components/yaml/branches/1.0/lib/sfYamlParser.php

    r23504 r24527  
    103103        } 
    104104      } 
    105       else if (preg_match('#^(?P<key>[^ ].*?) *\:(\s+(?P<value>.+?))?\s*$#', $this->currentLine, $values)) 
     105      else if (preg_match('#^(?P<key>'.sfYamlInline::REGEX_QUOTED_STRING.'|[^ ].*?) *\:(\s+(?P<value>.+?))?\s*$#', $this->currentLine, $values)) 
    106106      { 
    107107        $key = sfYamlInline::parseScalar($values['key']); 
  • components/yaml/branches/1.0/test/fixtures/sfQuotes.yml

    r21431 r24527  
    77php: | 
    88    array('foo' => '| bar') 
     9--- 
     10test: A key can be a quoted string 
     11brief: > 
     12  A key can be a quoted string 
     13yaml: | 
     14    "foo1": bar 
     15    'foo2': bar 
     16    "foo \" bar": bar 
     17    'foo '' bar': bar 
     18    'foo3: ': bar 
     19    "foo4: ": bar 
     20    foo5: { "foo \" bar: ": bar, 'foo '' bar: ': bar } 
     21php: | 
     22    array( 
     23      'foo1' => 'bar', 
     24      'foo2' => 'bar', 
     25      'foo " bar' => 'bar', 
     26      'foo \' bar' => 'bar', 
     27      'foo3: ' => 'bar', 
     28      'foo4: ' => 'bar', 
     29      'foo5' => array( 
     30        'foo " bar: ' => 'bar', 
     31        'foo \' bar: ' => 'bar', 
     32      ), 
     33    ) 
  • components/yaml/branches/1.0/test/sfYamlDumperTest.php

    r23743 r24527  
    1616sfYaml::setSpecVersion('1.1'); 
    1717 
    18 $t = new lime_test(143); 
     18$t = new lime_test(144); 
    1919 
    2020$parser = new sfYamlParser(); 
  • components/yaml/branches/1.0/test/sfYamlInlineTest.php

    r21883 r24527  
    1515sfYaml::setSpecVersion('1.1'); 
    1616 
    17 $t = new lime_test(118); 
     17$t = new lime_test(124); 
    1818 
    1919// ::load() 
     
    5656  '{ foo  : bar, bar : foo,  false  :   false,  null  :   null,  integer :  12  }' => array('foo' => 'bar', 'bar' => 'foo', 'false' => false, 'null' => null, 'integer' => 12), 
    5757  '{foo: \'bar\', bar: \'foo: bar\'}' => array('foo' => 'bar', 'bar' => 'foo: bar'), 
     58  '{\'foo\': \'bar\', "bar": \'foo: bar\'}' => array('foo' => 'bar', 'bar' => 'foo: bar'), 
     59  '{\'foo\'\'\': \'bar\', "bar\"": \'foo: bar\'}' => array('foo\'' => 'bar', "bar\"" => 'foo: bar'), 
     60  '{\'foo: \': \'bar\', "bar: ": \'foo: bar\'}' => array('foo: ' => 'bar', "bar: " => 'foo: bar'), 
    5861 
    5962  // nested sequences and mappings 
  • components/yaml/branches/1.0/test/sfYamlParserTest.php

    r23743 r24527  
    1515sfYaml::setSpecVersion('1.1'); 
    1616 
    17 $t = new lime_test(143); 
     17$t = new lime_test(144); 
    1818 
    1919$parser = new sfYamlParser();