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);
+ }
+ }
+ }
+}