Support customizing a whitespace before list indicators
diff --git a/src/main/java/org/yaml/snakeyaml/DumperOptions.java b/src/main/java/org/yaml/snakeyaml/DumperOptions.java
index 1753943..2c7477b 100644
--- a/src/main/java/org/yaml/snakeyaml/DumperOptions.java
+++ b/src/main/java/org/yaml/snakeyaml/DumperOptions.java
@@ -163,6 +163,7 @@
private boolean allowUnicode = true;
private boolean allowReadOnlyProperties = false;
private int indent = 2;
+ private int indicatorIndent = 0;
private int bestWidth = 80;
private boolean splitLines = true;
private LineBreak lineBreak = LineBreak.UNIX;
@@ -225,6 +226,20 @@
return this.indent;
}
+ public void setIndicatorIndent(int indicatorIndent) {
+ if (indicatorIndent < 0) {
+ throw new YAMLException("Indicator indent must be non-negative");
+ }
+ if (indicatorIndent > Emitter.MAX_INDENT - 1) {
+ throw new YAMLException("Indicator indent must be at most " + (Emitter.MAX_INDENT-1));
+ }
+ this.indicatorIndent = indicatorIndent;
+ }
+
+ public int getIndicatorIndent() {
+ return this.indicatorIndent;
+ }
+
public void setVersion(Version version) {
this.version = version;
}
diff --git a/src/main/java/org/yaml/snakeyaml/emitter/Emitter.java b/src/main/java/org/yaml/snakeyaml/emitter/Emitter.java
index 9c72438..2136e21 100644
--- a/src/main/java/org/yaml/snakeyaml/emitter/Emitter.java
+++ b/src/main/java/org/yaml/snakeyaml/emitter/Emitter.java
@@ -135,6 +135,7 @@
private boolean allowUnicode;
private int bestIndent;
+ private int indicatorIndent;
private int bestWidth;
private char[] bestLineBreak;
private boolean splitLines;
@@ -190,6 +191,7 @@
if ((opts.getIndent() > MIN_INDENT) && (opts.getIndent() < MAX_INDENT)) {
this.bestIndent = opts.getIndent();
}
+ this.indicatorIndent = opts.getIndicatorIndent();
this.bestWidth = 80;
if (opts.getWidth() > this.bestIndent * 2) {
this.bestWidth = opts.getWidth();
@@ -590,6 +592,7 @@
state = states.pop();
} else {
writeIndent();
+ writeWhitespace(indicatorIndent);
writeIndicator("-", true, false, true);
states.push(new ExpectBlockSequenceItem(false));
expectNode(false, false, false);
@@ -1100,15 +1103,20 @@
writeLineBreak(null);
}
- if (this.column < indent) {
- this.whitespace = true;
- char[] data = new char[indent - this.column];
- for (int i = 0; i < data.length; i++) {
- data[i] = ' ';
- }
- this.column = indent;
- stream.write(data);
+ writeWhitespace(indent - this.column);
+ }
+
+ private void writeWhitespace(int length) throws IOException {
+ if (length <= 0) {
+ return;
}
+ this.whitespace = true;
+ char[] data = new char[length];
+ for (int i = 0; i < data.length; i++) {
+ data[i] = ' ';
+ }
+ this.column += length;
+ stream.write(data);
}
private void writeLineBreak(String data) throws IOException {
diff --git a/src/test/java/org/yaml/snakeyaml/emitter/EmitterTest.java b/src/test/java/org/yaml/snakeyaml/emitter/EmitterTest.java
index 717363e..b50310e 100644
--- a/src/test/java/org/yaml/snakeyaml/emitter/EmitterTest.java
+++ b/src/test/java/org/yaml/snakeyaml/emitter/EmitterTest.java
@@ -18,7 +18,9 @@
import java.io.IOException;
import java.io.StringWriter;
import java.util.Arrays;
+import java.util.Collections;
import java.util.LinkedHashMap;
+import java.util.List;
import java.util.Map;
import java.util.TreeMap;
@@ -26,6 +28,7 @@
import org.yaml.snakeyaml.DumperOptions;
import org.yaml.snakeyaml.Yaml;
+import org.yaml.snakeyaml.DumperOptions.FlowStyle;
import org.yaml.snakeyaml.DumperOptions.ScalarStyle;
import org.yaml.snakeyaml.events.DocumentStartEvent;
import org.yaml.snakeyaml.events.ImplicitTuple;
@@ -155,6 +158,19 @@
assertEquals("{\"12345\": [\"1111111111\"]}\n", output);
}
+ public void testWriteIndicatorIndent() {
+ DumperOptions options = new DumperOptions();
+ options.setIndent(5);
+ options.setIndicatorIndent(2);
+ options.setDefaultFlowStyle(FlowStyle.BLOCK);
+ List<?> topLevel = Arrays.asList(Collections.singletonMap("k1", "v1"), Collections.singletonMap("k2", "v2"));
+ Map<String, ?> map = Collections.singletonMap("aaa", topLevel);
+ Yaml yaml = new Yaml(options);
+ String output = yaml.dump(map);
+ String etalon = "aaa:\n - k1: v1\n - k2: v2\n";
+ assertEquals(etalon, output);
+ }
+
public void testSplitLineExpectFlowSequenceItem() {
DumperOptions options = new DumperOptions();