Skip to content

Commit 6c9c7ba

Browse files
committed
Separate quote strategies for names and values
1 parent 980354a commit 6c9c7ba

5 files changed

Lines changed: 57 additions & 24 deletions

File tree

src/main/java/org/glavo/nbt/internal/SNBTCodecImpl.java

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -28,22 +28,25 @@ public record SNBTCodecImpl(
2828
String indentation,
2929
SurroundingSpaces surroundingSpaces,
3030
EscapeStrategy escapeStrategy,
31-
QuoteStrategy quoteStrategy
31+
QuoteStrategy nameQuoteStrategy,
32+
QuoteStrategy valueQuoteStrategy
3233
) implements SNBTCodec {
3334
public static final SNBTCodecImpl COMPACT = new SNBTCodecImpl(
3435
LineBreakStrategy.never(),
3536
"", // No indentation
3637
SurroundingSpaces.COMPACT,
3738
EscapeStrategy.defaultStrategy(),
38-
QuoteStrategy.defaultStrategy()
39+
QuoteStrategy.defaultNameStrategy(),
40+
QuoteStrategy.defaultValueStrategy()
3941
);
4042

4143
public static final SNBTCodecImpl PRETTY = new SNBTCodecImpl(
4244
LineBreakStrategy.defaultStrategy(),
4345
" ", // 4 spaces
4446
SurroundingSpaces.PRETTY,
4547
EscapeStrategy.defaultStrategy(),
46-
QuoteStrategy.defaultStrategy()
48+
QuoteStrategy.defaultNameStrategy(),
49+
QuoteStrategy.defaultValueStrategy()
4750
);
4851

4952

@@ -54,7 +57,7 @@ public LineBreakStrategy getLineBreakStrategy() {
5457

5558
@Override
5659
public SNBTCodec withLineBreakStrategy(LineBreakStrategy strategy) {
57-
return new SNBTCodecImpl(strategy, indentation, surroundingSpaces, escapeStrategy, quoteStrategy);
60+
return new SNBTCodecImpl(strategy, indentation, surroundingSpaces, escapeStrategy, nameQuoteStrategy, valueQuoteStrategy);
5861
}
5962

6063
@Override
@@ -71,12 +74,12 @@ public SNBTCodec withIndentation(String indentation) {
7174
}
7275
}
7376

74-
return new SNBTCodecImpl(lineBreakStrategy, indentation, surroundingSpaces, escapeStrategy, quoteStrategy);
77+
return new SNBTCodecImpl(lineBreakStrategy, indentation, surroundingSpaces, escapeStrategy, nameQuoteStrategy, valueQuoteStrategy);
7578
}
7679

7780
@Override
7881
public SNBTCodec withIndentation(int spaces) {
79-
return new SNBTCodecImpl(lineBreakStrategy, " ".repeat(spaces), surroundingSpaces, escapeStrategy, quoteStrategy);
82+
return new SNBTCodecImpl(lineBreakStrategy, " ".repeat(spaces), surroundingSpaces, escapeStrategy, nameQuoteStrategy, valueQuoteStrategy);
8083
}
8184

8285
@Override
@@ -86,7 +89,7 @@ public SurroundingSpaces getSurroundingSpaces() {
8689

8790
@Override
8891
public SNBTCodec withSurroundingSpaces(SurroundingSpaces surroundingSpaces) {
89-
return new SNBTCodecImpl(lineBreakStrategy, indentation, surroundingSpaces, escapeStrategy, quoteStrategy);
92+
return new SNBTCodecImpl(lineBreakStrategy, indentation, surroundingSpaces, escapeStrategy, nameQuoteStrategy, valueQuoteStrategy);
9093
}
9194

9295
@Override
@@ -96,17 +99,27 @@ public EscapeStrategy getEscapeStrategy() {
9699

97100
@Override
98101
public SNBTCodec withEscapeStrategy(EscapeStrategy escapeStrategy) {
99-
return new SNBTCodecImpl(lineBreakStrategy, indentation, surroundingSpaces, escapeStrategy, quoteStrategy);
102+
return new SNBTCodecImpl(lineBreakStrategy, indentation, surroundingSpaces, escapeStrategy, nameQuoteStrategy, valueQuoteStrategy);
100103
}
101104

102105
@Override
103-
public QuoteStrategy getQuoteStrategy() {
104-
return quoteStrategy;
106+
public QuoteStrategy getNameQuoteStrategy() {
107+
return nameQuoteStrategy;
105108
}
106109

107110
@Override
108-
public SNBTCodec withQuoteStrategy(QuoteStrategy quoteStrategy) {
109-
return new SNBTCodecImpl(lineBreakStrategy, indentation, surroundingSpaces, escapeStrategy, quoteStrategy);
111+
public SNBTCodec withNameQuoteStrategy(QuoteStrategy quoteStrategy) {
112+
return new SNBTCodecImpl(lineBreakStrategy, indentation, surroundingSpaces, escapeStrategy, quoteStrategy, valueQuoteStrategy);
113+
}
114+
115+
@Override
116+
public QuoteStrategy getValueQuoteStrategy() {
117+
return valueQuoteStrategy;
118+
}
119+
120+
@Override
121+
public SNBTCodec withValueQuoteStrategy(QuoteStrategy quoteStrategy) {
122+
return new SNBTCodecImpl(lineBreakStrategy, indentation, surroundingSpaces, escapeStrategy, nameQuoteStrategy, quoteStrategy);
110123
}
111124

112125
@Override

src/main/java/org/glavo/nbt/internal/snbt/SNBTWriter.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package org.glavo.nbt.internal.snbt;
1717

18+
import org.glavo.nbt.io.QuoteStrategy;
1819
import org.glavo.nbt.io.SNBTCodec;
1920
import org.glavo.nbt.tag.*;
2021

@@ -30,8 +31,8 @@ public SNBTWriter(SNBTCodec codec, Appendable appendable) {
3031
this.appendable = appendable;
3132
}
3233

33-
private void writeStringValue(String value) throws IOException {
34-
char quoteChar = codec.getQuoteStrategy().getQuoteChar(value);
34+
private void writeString(QuoteStrategy quoteStrategy, String value) throws IOException {
35+
char quoteChar = quoteStrategy.getQuoteChar(value);
3536

3637
if (quoteChar == '\0') {
3738
appendable.append(value);
@@ -42,6 +43,10 @@ private void writeStringValue(String value) throws IOException {
4243
}
4344
}
4445

46+
private void writeStringValue(String value) throws IOException {
47+
writeString(codec.getValueQuoteStrategy(), value);
48+
}
49+
4550
private void writeNewLine() throws IOException {
4651
appendable.append('\n');
4752
}
@@ -73,7 +78,7 @@ private void writeCompoundTag(CompoundTag tag) throws IOException {
7378
writeIndent();
7479
}
7580

76-
writeStringValue(subTag.getName());
81+
writeString(codec.getNameQuoteStrategy(), subTag.getName());
7782

7883
writeSpaces(codec.getSurroundingSpaces().getSpacesBeforeColon());
7984
appendable.append(':');
@@ -227,7 +232,7 @@ public void writeTag(Tag tag) throws IOException {
227232

228233
public void writeTagWithName(Tag tag) throws IOException {
229234
if (!tag.getName().isEmpty()) {
230-
writeStringValue(tag.getName());
235+
writeString(codec.getNameQuoteStrategy(), tag.getName());
231236
writeSpaces(codec.getSurroundingSpaces().getSpacesBeforeColon());
232237
appendable.append(':');
233238
writeSpaces(codec.getSurroundingSpaces().getSpacesAfterColon());

src/main/java/org/glavo/nbt/io/QuoteStrategy.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,20 @@
1919

2020
public sealed interface QuoteStrategy permits QuoteStrategies.Always, QuoteStrategies.Smart, QuoteStrategies.WhenNeeded {
2121

22-
/// Returns the default quote strategy.
22+
/// Returns the default quote strategy for tag names.
2323
///
2424
/// It is equivalent to [`whenNeeded('"')`][#whenNeeded(char)].
25-
static QuoteStrategy defaultStrategy() {
25+
static QuoteStrategy defaultNameStrategy() {
2626
return QuoteStrategies.WhenNeeded.DOUBLE_QUOTE;
2727
}
2828

29+
/// Returns the default quote strategy for tag values.
30+
///
31+
/// It is equivalent to [`always('"')`][#always(char)].
32+
static QuoteStrategy defaultValueStrategy() {
33+
return QuoteStrategies.Always.DOUBLE_QUOTE;
34+
}
35+
2936
/// Returns a quote strategy that always uses the specified quote character.
3037
///
3138
/// @throws IllegalArgumentException if the quote character is not a valid quote character.

src/main/java/org/glavo/nbt/io/SNBTCodec.java

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,13 +85,21 @@ static SNBTCodec ofCompact() {
8585
@Contract(value = "_ -> new", pure = true)
8686
SNBTCodec withEscapeStrategy(EscapeStrategy escapeStrategy);
8787

88-
/// Returns the quote strategy for SNBT.
88+
/// Returns the quote strategy for SNBT tag names.
8989
@Contract(pure = true)
90-
QuoteStrategy getQuoteStrategy();
90+
QuoteStrategy getNameQuoteStrategy();
9191

92-
/// Returns a new codec with the specified quote strategy.
92+
/// Returns a new codec with the specified quote strategy for tag names.
9393
@Contract(value = "_ -> new", pure = true)
94-
SNBTCodec withQuoteStrategy(QuoteStrategy quoteStrategy);
94+
SNBTCodec withNameQuoteStrategy(QuoteStrategy quoteStrategy);
95+
96+
/// Returns the quote strategy for SNBT tag values.
97+
@Contract(pure = true)
98+
QuoteStrategy getValueQuoteStrategy();
99+
100+
/// Returns a new codec with the specified quote strategy for tag values.
101+
@Contract(value = "_ -> new", pure = true)
102+
SNBTCodec withValueQuoteStrategy(QuoteStrategy quoteStrategy);
95103

96104
/// Reads a NBT tag from the Stringified NBT data.
97105
///

src/test/java/org/glavo/nbt/tag/ValueTagTests.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -480,8 +480,8 @@ void testToString() {
480480
assertToString("Meow: 114.0D", new DoubleTag("Meow", 114.0));
481481

482482
assertToString("\"\"", new StringTag());
483-
assertToString("Hello", new StringTag("", "Hello"));
484-
assertToString("Meow: Hello", new StringTag("Meow", "Hello"));
483+
assertToString("\"Hello\"", new StringTag("", "Hello"));
484+
assertToString("Meow: \"Hello\"", new StringTag("Meow", "Hello"));
485485
assertToString("Meow: \"\\u0000\\b\\t\\n\\f\\r\\n \\\"ABC你好世界\\U0001F604\"", new StringTag("Meow", "\0\b\t\n\f\r\n \"ABC你好世界😄"));
486486
}
487487
}

0 commit comments

Comments
 (0)