From 5c98011073c415db9a8a331276ea20863efab1da Mon Sep 17 00:00:00 2001 From: JOO200 Date: Wed, 23 Feb 2022 20:38:34 +0100 Subject: [PATCH 1/4] text-minimessage: Add additional TagResolvers to Context$parse --- .../adventure/text/minimessage/Context.java | 4 +++- .../text/minimessage/ContextImpl.java | 5 ++-- .../text/minimessage/tag/TagResolverTest.java | 24 +++++++++++++++++++ 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/Context.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/Context.java index 00b85158c..6510251da 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/Context.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/Context.java @@ -25,6 +25,7 @@ import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.tag.resolver.ArgumentQueue; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -42,10 +43,11 @@ public interface Context { * Parses a MiniMessage string using all the settings of this context. * * @param message the message to parse + * @param resolvers additional tag resolvers * @return the parsed message * @since 4.10.0 */ - @NotNull Component parse(final @NotNull String message); + @NotNull Component parse(final @NotNull String message, final @NotNull TagResolver@NotNull... resolvers); /** * Create a new parsing exception. diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/ContextImpl.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/ContextImpl.java index df6a43a9f..1012c994f 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/ContextImpl.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/ContextImpl.java @@ -106,8 +106,9 @@ public UnaryOperator postProcessor() { } @Override - public @NotNull Component parse(final @NotNull String message) { - return this.miniMessage.deserialize(requireNonNull(message, "message"), this.tagResolver); + public @NotNull Component parse(final @NotNull String message, final @NotNull TagResolver@NotNull... resolvers) { + return this.miniMessage.deserialize(requireNonNull(message, "message"), + TagResolver.resolver(this.tagResolver, TagResolver.resolver(resolvers))); } @Override diff --git a/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/tag/TagResolverTest.java b/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/tag/TagResolverTest.java index 7ce2deb17..0d5670823 100644 --- a/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/tag/TagResolverTest.java +++ b/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/tag/TagResolverTest.java @@ -26,6 +26,7 @@ import java.util.Arrays; import java.util.List; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.minimessage.Context; import net.kyori.adventure.text.minimessage.ParsingException; import net.kyori.adventure.text.minimessage.TestBase; @@ -35,6 +36,8 @@ import org.jetbrains.annotations.Nullable; import org.junit.jupiter.api.Test; +import static net.kyori.adventure.text.Component.text; +import static net.kyori.adventure.text.format.TextColor.color; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.fail; @@ -81,6 +84,27 @@ void testSingleAndResolversCombine() { assertEquals("from resolver", ((PreProcess) resolveForTest(built, "overlapping")).value()); } + @Test + void testParseInResolver() { + final List placeholders = Arrays.asList( + Placeholder.parsed("foo", "Hello"), + Placeholder.parsed("bar", "World") + ); + final Context ctx = TestBase.dummyContext("dummy text"); + final Component input = ctx.parse(" ", + Placeholder.parsed("foo", "Hello"), Placeholder.parsed("bar", "World")); + + final Component expected = Component.text() + .append( + text("Hello", color(NamedTextColor.RED)), + text(" "), + text("World", color(NamedTextColor.YELLOW)) + ) + .build(); + + assertEquals(expected, input); + } + private static @NotNull Tag resolveForTest(final TagResolver resolver, final String tag) { try { final Context ctx = TestBase.dummyContext("help i shouldn't be seen"); From 7d820ea97cd61d41f2fc5d8af946801c9a1ca192 Mon Sep 17 00:00:00 2001 From: JOO200 Date: Thu, 24 Feb 2022 00:17:10 +0100 Subject: [PATCH 2/4] minimessage-text: Cleanup test ParseInResolver --- .../kyori/adventure/text/minimessage/tag/TagResolverTest.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/tag/TagResolverTest.java b/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/tag/TagResolverTest.java index 0d5670823..e1078a6d3 100644 --- a/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/tag/TagResolverTest.java +++ b/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/tag/TagResolverTest.java @@ -86,10 +86,6 @@ void testSingleAndResolversCombine() { @Test void testParseInResolver() { - final List placeholders = Arrays.asList( - Placeholder.parsed("foo", "Hello"), - Placeholder.parsed("bar", "World") - ); final Context ctx = TestBase.dummyContext("dummy text"); final Component input = ctx.parse(" ", Placeholder.parsed("foo", "Hello"), Placeholder.parsed("bar", "World")); From 94a2d36d73fc9e4da6ee4e2869e2c7871116a442 Mon Sep 17 00:00:00 2001 From: JOO200 Date: Thu, 24 Feb 2022 19:32:05 +0100 Subject: [PATCH 3/4] Apply suggestions from code review Co-authored-by: zml --- .../main/java/net/kyori/adventure/text/minimessage/Context.java | 2 +- .../java/net/kyori/adventure/text/minimessage/ContextImpl.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/Context.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/Context.java index 6510251da..3d2020482 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/Context.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/Context.java @@ -43,7 +43,7 @@ public interface Context { * Parses a MiniMessage string using all the settings of this context. * * @param message the message to parse - * @param resolvers additional tag resolvers + * @param resolvers additional tag resolvers, added to all other resolvers in this parse, but taking priority in the event of a name overlap * @return the parsed message * @since 4.10.0 */ diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/ContextImpl.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/ContextImpl.java index 1012c994f..7ea87fed8 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/ContextImpl.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/ContextImpl.java @@ -108,7 +108,7 @@ public UnaryOperator postProcessor() { @Override public @NotNull Component parse(final @NotNull String message, final @NotNull TagResolver@NotNull... resolvers) { return this.miniMessage.deserialize(requireNonNull(message, "message"), - TagResolver.resolver(this.tagResolver, TagResolver.resolver(resolvers))); + TagResolver.builder().resolver(this.tagResolver).resolvers(resolvers).build()); } @Override From 41848275332ceeb33b0ed754f25e89e9e4ab4cfc Mon Sep 17 00:00:00 2001 From: JOO200 Date: Thu, 24 Feb 2022 21:34:43 +0100 Subject: [PATCH 4/4] Renamed Context#parse to Context#deserialize, added overloaded methods --- .../adventure/text/minimessage/Context.java | 24 +++++++++++++++++-- .../text/minimessage/ContextImpl.java | 15 ++++++++++-- .../minimessage/tag/standard/HoverTag.java | 4 ++-- .../tag/standard/TranslatableTag.java | 2 +- .../text/minimessage/tag/TagResolverTest.java | 23 +++++++++++++++--- 5 files changed, 58 insertions(+), 10 deletions(-) diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/Context.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/Context.java index 3d2020482..d3d08d3fb 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/Context.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/Context.java @@ -39,15 +39,35 @@ */ @ApiStatus.NonExtendable public interface Context { + + /** + * Deserializes a MiniMessage string using all the settings of this context. + * + * @param message the message to parse + * @return the parsed message + * @since 4.10.0 + */ + @NotNull Component deserialize(final @NotNull String message); + + /** + * Deserializes a MiniMessage string using all the settings of this context. + * + * @param message the message to parse + * @param resolver additional tag resolver, added to all other resolvers in this parse, but taking priority in the event of a name overlap + * @return the parsed message + * @since 4.10.0 + */ + @NotNull Component deserialize(final @NotNull String message, final @NotNull TagResolver resolver); + /** - * Parses a MiniMessage string using all the settings of this context. + * Deserializes a MiniMessage string using all the settings of this context. * * @param message the message to parse * @param resolvers additional tag resolvers, added to all other resolvers in this parse, but taking priority in the event of a name overlap * @return the parsed message * @since 4.10.0 */ - @NotNull Component parse(final @NotNull String message, final @NotNull TagResolver@NotNull... resolvers); + @NotNull Component deserialize(final @NotNull String message, final @NotNull TagResolver@NotNull... resolvers); /** * Create a new parsing exception. diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/ContextImpl.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/ContextImpl.java index 7ea87fed8..2558dec65 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/ContextImpl.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/ContextImpl.java @@ -106,9 +106,20 @@ public UnaryOperator postProcessor() { } @Override - public @NotNull Component parse(final @NotNull String message, final @NotNull TagResolver@NotNull... resolvers) { + public @NotNull Component deserialize(final @NotNull String message) { + return this.miniMessage.deserialize(requireNonNull(message, "message"), this.tagResolver); + } + + @Override + public @NotNull Component deserialize(final @NotNull String message, final @NotNull TagResolver resolver) { + return this.miniMessage.deserialize(requireNonNull(message, "message"), + TagResolver.builder().resolver(this.tagResolver).resolver(requireNonNull(resolver, "resolver")).build()); + } + + @Override + public @NotNull Component deserialize(final @NotNull String message, final @NotNull TagResolver@NotNull... resolvers) { return this.miniMessage.deserialize(requireNonNull(message, "message"), - TagResolver.builder().resolver(this.tagResolver).resolvers(resolvers).build()); + TagResolver.builder().resolver(this.tagResolver).resolvers(requireNonNull(resolvers, "resolvers")).build()); } @Override diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/HoverTag.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/HoverTag.java index 7aaab366e..c837be0e8 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/HoverTag.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/HoverTag.java @@ -54,7 +54,7 @@ static Tag create(final ArgumentQueue args, final Context ctx) throws ParsingExc final HoverEvent.Action action = (HoverEvent.Action) HoverEvent.Action.NAMES.value(actionName); final Object value; if (action == (Object) HoverEvent.Action.SHOW_TEXT) { - value = ctx.parse(args.popOr("show_text action requires a message").value()); + value = ctx.deserialize(args.popOr("show_text action requires a message").value()); } else if (action == (Object) HoverEvent.Action.SHOW_ITEM) { value = parseShowItem(args, ctx); } else if (action == (Object) HoverEvent.Action.SHOW_ENTITY) { @@ -85,7 +85,7 @@ static Tag create(final ArgumentQueue args, final Context ctx) throws ParsingExc final Key key = Key.key(args.popOr("Show entity needs a type argument").value()); final UUID id = UUID.fromString(args.popOr("Show entity needs an entity UUID").value()); if (args.hasNext()) { - final Component name = context.parse(args.pop().value()); + final Component name = context.deserialize(args.pop().value()); return HoverEvent.ShowEntity.of(key, id, name); } return HoverEvent.ShowEntity.of(key, id); diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/TranslatableTag.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/TranslatableTag.java index 4281a8767..59eef76ed 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/TranslatableTag.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/TranslatableTag.java @@ -51,7 +51,7 @@ static Tag create(final ArgumentQueue args, final Context ctx) throws ParsingExc if (args.hasNext()) { with = new ArrayList<>(); while (args.hasNext()) { - with.add(ctx.parse(args.pop().value())); + with.add(ctx.deserialize(args.pop().value())); } } else { with = Collections.emptyList(); diff --git a/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/tag/TagResolverTest.java b/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/tag/TagResolverTest.java index e1078a6d3..4c7667eca 100644 --- a/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/tag/TagResolverTest.java +++ b/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/tag/TagResolverTest.java @@ -85,16 +85,33 @@ void testSingleAndResolversCombine() { } @Test - void testParseInResolver() { + void testContextParseOne() { final Context ctx = TestBase.dummyContext("dummy text"); - final Component input = ctx.parse(" ", + final Component input = ctx.deserialize(" !", Placeholder.parsed("foo", "Hello")); + + final Component expected = Component.text() + .append( + text("Hello", color(NamedTextColor.RED)), + text(" "), + text("!", color(NamedTextColor.GREEN)) + ) + .build(); + + assertEquals(expected, input); + } + + @Test + void testContextParseVarargs() { + final Context ctx = TestBase.dummyContext("dummy text"); + final Component input = ctx.deserialize(" !", Placeholder.parsed("foo", "Hello"), Placeholder.parsed("bar", "World")); final Component expected = Component.text() .append( text("Hello", color(NamedTextColor.RED)), text(" "), - text("World", color(NamedTextColor.YELLOW)) + text("World", color(NamedTextColor.YELLOW)), + text("!", color(NamedTextColor.GREEN)) ) .build();