Skip to content

Commit

Permalink
[Yaml] added support for compact inline notation with immediate sub m…
Browse files Browse the repository at this point in the history
…apping
  • Loading branch information
fabpot committed Mar 24, 2010
1 parent a248fc1 commit bc9bbd8
Show file tree
Hide file tree
Showing 3 changed files with 175 additions and 10 deletions.
25 changes: 15 additions & 10 deletions src/Symfony/Components/Yaml/Parser.php
Expand Up @@ -83,11 +83,7 @@ public function parse($value)
}
else
{
if (preg_match('/^([^ ]+)\: +({.*?)$/', $values['value'], $matches))
{
$data[] = array($matches[1] => Inline::load($matches[2]));
}
elseif (isset($values['leadspaces'])
if (isset($values['leadspaces'])
&& ' ' == $values['leadspaces']
&& preg_match('#^(?P<key>'.Inline::REGEX_QUOTED_STRING.'|[^ \'"\{].*?) *\:(\s+(?P<value>.+?))?\s*$#', $values['value'], $matches))
{
Expand All @@ -99,7 +95,7 @@ public function parse($value)
$block = $values['value'];
if (!$this->isNextLineIndented())
{
$block .= "\n".$this->getNextEmbedBlock();
$block .= "\n".$this->getNextEmbedBlock($this->getCurrentLineIndentation() + 2);
}

$data[] = $parser->parse($block);
Expand Down Expand Up @@ -283,17 +279,26 @@ protected function getCurrentLineIndentation()
/**
* Returns the next embed block of YAML.
*
* @param integer $indentation The indent level at which the block is to be read, or null for default
*
* @return string A YAML string
*/
protected function getNextEmbedBlock()
protected function getNextEmbedBlock($indentation = null)
{
$this->moveToNextLine();

$newIndent = $this->getCurrentLineIndentation();
if (null === $indentation)
{
$newIndent = $this->getCurrentLineIndentation();

if (!$this->isCurrentLineEmpty() && 0 == $newIndent)
if (!$this->isCurrentLineEmpty() && 0 == $newIndent)
{
throw new ParserException(sprintf('Indentation problem at line %d (%s)', $this->getRealCurrentLineNb() + 1, $this->currentLine));
}
}
else
{
throw new ParserException(sprintf('Indentation problem at line %d (%s)', $this->getRealCurrentLineNb() + 1, $this->currentLine));
$newIndent = $indentation;
}

$data = array(substr($this->currentLine, $newIndent));
Expand Down
1 change: 1 addition & 0 deletions tests/fixtures/Symfony/Components/Yaml/index.yml
@@ -1,4 +1,5 @@
- sfComments
- sfCompact
- sfTests
- sfObjects
- sfMergeKey
Expand Down
159 changes: 159 additions & 0 deletions tests/fixtures/Symfony/Components/Yaml/sfCompact.yml
@@ -0,0 +1,159 @@
--- %YAML:1.0
test: Compact notation
brief: |
Compact notation for sets of mappings with single element
yaml: |
---
# products purchased
- item : Super Hoop
- item : Basketball
quantity: 1
- item:
name: Big Shoes
nick: Biggies
quantity: 1
php: |
array (
array (
'item' => 'Super Hoop',
),
array (
'item' => 'Basketball',
'quantity' => 1,
),
array (
'item' => array(
'name' => 'Big Shoes',
'nick' => 'Biggies'
),
'quantity' => 1
)
)
---
test: Compact notation combined with inline notation
brief: |
Combinations of compact and inline notation are allowed
yaml: |
---
items:
- { item: Super Hoop, quantity: 1 }
- [ Basketball, Big Shoes ]
php: |
array (
'items' => array (
array (
'item' => 'Super Hoop',
'quantity' => 1,
),
array (
'Basketball',
'Big Shoes'
)
)
)
--- %YAML:1.0
test: Compact notation
brief: |
Compact notation for sets of mappings with single element
yaml: |
---
# products purchased
- item : Super Hoop
- item : Basketball
quantity: 1
- item:
name: Big Shoes
nick: Biggies
quantity: 1
php: |
array (
array (
'item' => 'Super Hoop',
),
array (
'item' => 'Basketball',
'quantity' => 1,
),
array (
'item' => array(
'name' => 'Big Shoes',
'nick' => 'Biggies'
),
'quantity' => 1
)
)
---
test: Compact notation combined with inline notation
brief: |
Combinations of compact and inline notation are allowed
yaml: |
---
items:
- { item: Super Hoop, quantity: 1 }
- [ Basketball, Big Shoes ]
php: |
array (
'items' => array (
array (
'item' => 'Super Hoop',
'quantity' => 1,
),
array (
'Basketball',
'Big Shoes'
)
)
)
--- %YAML:1.0
test: Compact notation
brief: |
Compact notation for sets of mappings with single element
yaml: |
---
# products purchased
- item : Super Hoop
- item : Basketball
quantity: 1
- item:
name: Big Shoes
nick: Biggies
quantity: 1
php: |
array (
array (
'item' => 'Super Hoop',
),
array (
'item' => 'Basketball',
'quantity' => 1,
),
array (
'item' => array(
'name' => 'Big Shoes',
'nick' => 'Biggies'
),
'quantity' => 1
)
)
---
test: Compact notation combined with inline notation
brief: |
Combinations of compact and inline notation are allowed
yaml: |
---
items:
- { item: Super Hoop, quantity: 1 }
- [ Basketball, Big Shoes ]
php: |
array (
'items' => array (
array (
'item' => 'Super Hoop',
'quantity' => 1,
),
array (
'Basketball',
'Big Shoes'
)
)
)

0 comments on commit bc9bbd8

Please sign in to comment.