diff --git a/framework/Yaml/lib/Horde/Yaml/Dumper.php b/framework/Yaml/lib/Horde/Yaml/Dumper.php
index 40ff021..994c7be 100644
--- a/framework/Yaml/lib/Horde/Yaml/Dumper.php
+++ b/framework/Yaml/lib/Horde/Yaml/Dumper.php
@@ -130,11 +130,13 @@ class Horde_Yaml_Dumper
*/
protected function _dumpNode($key, $value, $indent)
{
+ $literal = false;
// Do some folding here, for blocks.
if (strpos($value, "\n") !== false
|| strpos($value, ': ') !== false
|| strpos($value, '- ') !== false) {
$value = $this->_doLiteralBlock($value, $indent);
+ $literal = true;
} else {
$value = $this->_fold($value, $indent);
}
@@ -153,6 +155,11 @@ class Horde_Yaml_Dumper
$spaces = str_repeat(' ', $indent);
+ // quote strings if necessary, and not folder
+ if (!$literal && strpos($value, "\n") === false && strchr($value, '#')) {
+ $value = "'{$value}'";
+ }
+
if (is_int($key)) {
// It's a sequence.
$string = $spaces . '- ' . $value . "\n";
diff --git a/framework/Yaml/test/Horde/Yaml/DumperTest.php b/framework/Yaml/test/Horde/Yaml/DumperTest.php
index e7ed0eb..65240f2 100644
--- a/framework/Yaml/test/Horde/Yaml/DumperTest.php
+++ b/framework/Yaml/test/Horde/Yaml/DumperTest.php
@@ -188,4 +188,30 @@ class Horde_Yaml_DumperTest extends PHPUnit_Framework_TestCase
$this->assertEquals($expected, $actual);
}
+ public function testShouldWrapStringsWithCommentDelimiterInQuotes()
+ {
+ $value = array('foo' => 'string # this is not a comment');
+ $expected = "---\n"
+ . "foo: '{$value['foo']}'\n";
+ $actual = $this->dumper->dump($value);
+ $this->assertEquals($expected, $actual);
+ // round-trip assert
+ $this->assertEquals($value, Horde_Yaml::load($actual), "Error with: >{$actual}<");
+ }
+
+ public function testShouldNotWrapStringsWithCommentDelimiterForFoldedStrings()
+ {
+ // stringWithHash: 'string # this is part of the string, not a comment'
+ $value = array('foo' => 'string # this is not a comment but it is a long string that gets folded', 'bar' => 2);
+ $expected = "---\n"
+ . "foo: >\n"
+ . " string # this is not a comment but it is\n"
+ . " a long string that gets folded\n"
+ . "bar: 2\n";
+
+ $actual = $this->dumper->dump($value);
+ $this->assertEquals($expected, $actual);
+ // round-trip assert
+ $this->assertEquals($value, Horde_Yaml::load($actual), "Error: expected: " . print_r($value, true) . ", actual: " . print_r(Horde_Yaml::load($actual), true) . ", from: >" . $actual . "<"); // fails presently due to bug in loader which causes an extra "\n" at end of string
+ }
}
diff --git a/framework/Yaml/test/Horde/Yaml/LoaderTest.php b/framework/Yaml/test/Horde/Yaml/LoaderTest.php
index 1146ec1..9cdd9a3 100644
--- a/framework/Yaml/test/Horde/Yaml/LoaderTest.php
+++ b/framework/Yaml/test/Horde/Yaml/LoaderTest.php
@@ -787,6 +787,19 @@ class Horde_Yaml_LoaderTest extends PHPUnit_Framework_TestCase
return dirname(__FILE__) . "/fixtures/{$name}.yml";
}
+ public function testUnfolding()
+ {
+ $parsed = Horde_Yaml::loadFile($this->fixture('basic'));
+ $expected = "Line 1 Line 2";
+ $this->assertEquals($expected, $parsed['foldedStringTest']);
+ }
+
+ public function testUnliteraling()
+ {
+ $parsed = Horde_Yaml::loadFile($this->fixture('basic'));
+ $expected = "Line #1\nLine #2";
+ $this->assertEquals($expected, $parsed['literalStringTest']);
+ }
}
diff --git a/framework/Yaml/test/Horde/Yaml/fixtures/basic.yml b/framework/Yaml/test/Horde/Yaml/fixtures/basic.yml
index da6a584..b706bd9 100644
--- a/framework/Yaml/test/Horde/Yaml/fixtures/basic.yml
+++ b/framework/Yaml/test/Horde/Yaml/fixtures/basic.yml
@@ -1,5 +1,4 @@
foo: bar
-
# A folded block as a mapped value
no time: >
There isn't any time
@@ -11,4 +10,9 @@ no time: >
some time: |
There is nothing but time
for your tricks.
-
+literalStringTest: |
+ Line #1
+ Line #2
+foldedStringTest: >
+ Line 1
+ Line 2