proposal for issue 29: Allow separate option in DumperOptions for long strings
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index b0e9bf2..9ea46f3 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -7,6 +7,9 @@
 	</properties>

 	<body>

 	    <release version="1.6-SNAPSHOT" date="in Mercurial" description="development">

+            <action dev="py4fun" type="fix" issue="29" due-to="grignaak">

+                Allow separate option in DumperOptions for long strings (2009-11-16)

+            </action>

             <action dev="py4fun" type="add">

                 JavaBeanDumper: add possibility to define a custom Representer (2009-11-25)

             </action>

diff --git a/src/main/java/org/yaml/snakeyaml/DumperOptions.java b/src/main/java/org/yaml/snakeyaml/DumperOptions.java
index f2692b2..5321484 100644
--- a/src/main/java/org/yaml/snakeyaml/DumperOptions.java
+++ b/src/main/java/org/yaml/snakeyaml/DumperOptions.java
@@ -18,6 +18,7 @@
 import java.util.Map;
 
 import org.yaml.snakeyaml.emitter.Emitter;
+import org.yaml.snakeyaml.emitter.ScalarAnalysis;
 import org.yaml.snakeyaml.error.YAMLException;
 
 /**
@@ -50,6 +51,25 @@
         public String toString() {
             return "Scalar style: '" + styleChar + "'";
         }
+
+        public static ScalarStyle createStyle(Character style) {
+            if (style == null) {
+                return PLAIN;
+            } else {
+                switch (style) {
+                case '"':
+                    return DOUBLE_QUOTED;
+                case '\'':
+                    return SINGLE_QUOTED;
+                case '|':
+                    return LITERAL;
+                case '>':
+                    return FOLDED;
+                default:
+                    throw new YAMLException("Unknown scalar style character: " + style);
+                }
+            }
+        }
     }
 
     /**
@@ -299,4 +319,16 @@
         this.tags = tags;
     }
 
+    /**
+     * Define the ScalarStyle to be used for emitting scalars
+     * 
+     * @param analysis
+     *            - Scalar meta data
+     * @param style
+     *            - automatically detected style
+     * @return ScalarStyle to be used for scalar
+     */
+    public ScalarStyle chooseScalarStyle(ScalarAnalysis analysis, ScalarStyle style) {
+        return style;
+    }
 }
diff --git a/src/main/java/org/yaml/snakeyaml/emitter/Emitter.java b/src/main/java/org/yaml/snakeyaml/emitter/Emitter.java
index b30c981..7804e78 100644
--- a/src/main/java/org/yaml/snakeyaml/emitter/Emitter.java
+++ b/src/main/java/org/yaml/snakeyaml/emitter/Emitter.java
@@ -28,6 +28,7 @@
 import java.util.regex.Pattern;
 
 import org.yaml.snakeyaml.DumperOptions;
+import org.yaml.snakeyaml.DumperOptions.ScalarStyle;
 import org.yaml.snakeyaml.events.AliasEvent;
 import org.yaml.snakeyaml.events.CollectionEndEvent;
 import org.yaml.snakeyaml.events.CollectionStartEvent;
@@ -141,6 +142,7 @@
     // Scalar analysis and style.
     private ScalarAnalysis analysis;
     private Character style;
+    private DumperOptions options;
 
     public Emitter(Writer stream, DumperOptions opts) {
         // The stream should have the methods `write` and possibly `flush`.
@@ -197,6 +199,7 @@
         // Scalar analysis and style.
         this.analysis = null;
         this.style = null;
+        this.options = opts;
     }
 
     public void emit(Event event) throws IOException {
@@ -772,6 +775,7 @@
         if (style == null) {
             style = chooseScalarStyle();
         }
+        style = options.chooseScalarStyle(analysis, ScalarStyle.createStyle(style)).getChar();
         boolean split = !simpleKeyContext;
         if (style == null) {
             writePlain(analysis.scalar, split);
diff --git a/src/main/java/org/yaml/snakeyaml/emitter/ScalarAnalysis.java b/src/main/java/org/yaml/snakeyaml/emitter/ScalarAnalysis.java
index 244353a..030f62a 100644
--- a/src/main/java/org/yaml/snakeyaml/emitter/ScalarAnalysis.java
+++ b/src/main/java/org/yaml/snakeyaml/emitter/ScalarAnalysis.java
@@ -18,7 +18,7 @@
 /**

  * @see <a href="http://pyyaml.org/wiki/PyYAML">PyYAML</a> for more information

  */

-final class ScalarAnalysis {

+public final class ScalarAnalysis {

     public String scalar;

     public boolean empty;

     public boolean multiline;

diff --git a/src/test/java/org/yaml/snakeyaml/issues/issue29/FlexibleScalarStyleTest.java b/src/test/java/org/yaml/snakeyaml/issues/issue29/FlexibleScalarStyleTest.java
new file mode 100644
index 0000000..e265e01
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/issues/issue29/FlexibleScalarStyleTest.java
@@ -0,0 +1,58 @@
+/**

+ * Copyright (c) 2008-2009 Andrey Somov

+ *

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ *

+ *     http://www.apache.org/licenses/LICENSE-2.0

+ *

+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ */

+package org.yaml.snakeyaml.issues.issue29;

+

+import java.io.IOException;

+

+import junit.framework.TestCase;

+

+import org.yaml.snakeyaml.DumperOptions;

+import org.yaml.snakeyaml.Yaml;

+import org.yaml.snakeyaml.emitter.ScalarAnalysis;

+

+/**

+ * to test http://code.google.com/p/snakeyaml/issues/detail?id=29

+ */

+public class FlexibleScalarStyleTest extends TestCase {

+    public void testLong() throws IOException {

+        Yaml yaml = new Yaml(new MyOptions());

+        String result = yaml

+                .dump("qqqqqqqqqqqqqqqqqq qqqqqqqqqqqqqqqqqqqqqqqqq qqqqqqqqqqqqqqqqqqqqqqqq "

+                        + "qqqqqqqqqqqqqqqqqqqqqqqq qqqqqqqqqqqqqqqqqqqqqqqq "

+                        + "qqqqqqqqqqqqqqqqqqqqqqqqq qqqqqqqqqqqqqqqqqqqqqqqqqqq\n "

+                        + "qqqqqqqqqqqqqqqqqqqqqqqqqqqqq qqqqqqqqqqqqqqqqqqqqqqqqqqq\n");

+        // System.out.println(result);

+        assertTrue(result.startsWith(">\n"));

+    }

+

+    public void testShort() throws IOException {

+        Yaml yaml = new Yaml(new MyOptions());

+        String result = yaml.dump("qqqqqqqqqqqqqqqqqq");

+        // System.out.println(result);

+        assertEquals("qqqqqqqqqqqqqqqqqq\n", result);

+    }

+

+    private class MyOptions extends DumperOptions {

+        @Override

+        public ScalarStyle chooseScalarStyle(ScalarAnalysis analysis, ScalarStyle style) {

+            if (analysis.allowBlock && analysis.scalar.length() > 80) {

+                return ScalarStyle.FOLDED;

+            } else {

+                return super.chooseScalarStyle(analysis, style);

+            }

+        }

+    }

+}