diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/internal/parser/node/TagPart.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/internal/parser/node/TagPart.java index 3e21a4b02..09457e75a 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/internal/parser/node/TagPart.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/internal/parser/node/TagPart.java @@ -106,6 +106,11 @@ public TagPart( endIndex--; } + if (startIndex > endIndex) { + // We were given only a single quote that doesn't terminate, we can't unescape it + return text.substring(start, end); + } + return TokenParser.unescape(text, startIndex, endIndex, i -> i == firstChar || i == TokenParser.ESCAPE); } diff --git a/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/MiniMessageParserTest.java b/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/MiniMessageParserTest.java index f6606bb56..84b1fa027 100644 --- a/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/MiniMessageParserTest.java +++ b/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/MiniMessageParserTest.java @@ -544,4 +544,13 @@ public boolean has(final @NotNull String name) { this.assertParsedEquals(expected, input, alwaysMatchingResolver); } + + // https://github.com/KyoriPowered/adventure/issues/1011 + @Test + void testNonTerminatingQuoteArgument() { + final String input = ""; + final Component expected = Component.text(input); + + this.assertParsedEquals(expected, input); + } }