From 178a0a45a95353b1d18915aea35c65640cee6511 Mon Sep 17 00:00:00 2001 From: Almighty-Satan <43804777+Almighty-Satan@users.noreply.github.com> Date: Tue, 5 Mar 2024 12:03:37 +0100 Subject: [PATCH] Add ContextTagResolver#ofUnsafe --- .../slams/minimessage/ContextTagResolver.java | 37 +++------- .../minimessage/ContextTagResolverImpl.java | 70 +++++++++++++++++++ .../slams/minimessage/AdventureTest.java | 17 ++++- 3 files changed, 97 insertions(+), 27 deletions(-) create mode 100644 minimessage/src/main/java/io/github/almightysatan/slams/minimessage/ContextTagResolverImpl.java diff --git a/minimessage/src/main/java/io/github/almightysatan/slams/minimessage/ContextTagResolver.java b/minimessage/src/main/java/io/github/almightysatan/slams/minimessage/ContextTagResolver.java index 5d42af8..7fee6ba 100644 --- a/minimessage/src/main/java/io/github/almightysatan/slams/minimessage/ContextTagResolver.java +++ b/minimessage/src/main/java/io/github/almightysatan/slams/minimessage/ContextTagResolver.java @@ -21,7 +21,6 @@ package io.github.almightysatan.slams.minimessage; import io.github.almightysatan.slams.Context; -import io.github.almightysatan.slams.Placeholder; import io.github.almightysatan.slams.PlaceholderResolver; import net.kyori.adventure.text.minimessage.ParsingException; import net.kyori.adventure.text.minimessage.tag.Tag; @@ -31,8 +30,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.Objects; @@ -174,30 +171,18 @@ public boolean has(@NotNull String name) { * @return a new {@link ContextTagResolver} */ static @NotNull ContextTagResolver of(@NotNull PlaceholderResolver placeholderResolver) { - Objects.requireNonNull(placeholderResolver); - return new ContextTagResolver() { - - @Override - public @Nullable Tag resolve(@TagPattern @NotNull String name, @NotNull ArgumentQueue arguments, net.kyori.adventure.text.minimessage.@NotNull Context ctx, @Nullable Context context) throws ParsingException { - Placeholder placeholder = placeholderResolver.resolve(name); - return placeholder == null ? null : Tag.selfClosingInserting(ctx.deserialize(placeholder.value(context, this.argumentQueueToList(arguments)))); - } - - @Override - public boolean has(@NotNull String name) { - return placeholderResolver.resolve(name) != null; - } - - private List argumentQueueToList(ArgumentQueue argumentQueue) { - if (!argumentQueue.hasNext()) - return Collections.emptyList(); + return ContextTagResolverImpl.ofPlaceholderResolver(placeholderResolver, false); + } - List argumentList = new ArrayList<>(); - while (argumentQueue.hasNext()) - argumentList.add(argumentQueue.pop().value()); - return Collections.unmodifiableList(argumentList); - } - }; + /** + * Creates a new {@link ContextTagResolver} from the given {@link PlaceholderResolver}. Any string returned by + * placeholders will be deserialized. + * + * @param placeholderResolver the {@link PlaceholderResolver} + * @return a new {@link ContextTagResolver} + */ + static @NotNull ContextTagResolver ofUnsafe(@NotNull PlaceholderResolver placeholderResolver) { + return ContextTagResolverImpl.ofPlaceholderResolver(placeholderResolver, true); } // TODO add builder diff --git a/minimessage/src/main/java/io/github/almightysatan/slams/minimessage/ContextTagResolverImpl.java b/minimessage/src/main/java/io/github/almightysatan/slams/minimessage/ContextTagResolverImpl.java new file mode 100644 index 0000000..3d5595f --- /dev/null +++ b/minimessage/src/main/java/io/github/almightysatan/slams/minimessage/ContextTagResolverImpl.java @@ -0,0 +1,70 @@ +/* + * SLAMS - Simple Language And Message System + * Copyright (C) 2023 Almighty-Satan, LeStegii + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + * USA + */ + +package io.github.almightysatan.slams.minimessage; + +import io.github.almightysatan.slams.Context; +import io.github.almightysatan.slams.Placeholder; +import io.github.almightysatan.slams.PlaceholderResolver; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.ParsingException; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.TagPattern; +import net.kyori.adventure.text.minimessage.tag.resolver.ArgumentQueue; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Objects; + +class ContextTagResolverImpl { + + static @NotNull ContextTagResolver ofPlaceholderResolver(@NotNull PlaceholderResolver placeholderResolver, boolean eval) { + Objects.requireNonNull(placeholderResolver); + return new ContextTagResolver() { + + @Override + public @Nullable Tag resolve(@TagPattern @NotNull String name, @NotNull ArgumentQueue arguments, net.kyori.adventure.text.minimessage.@NotNull Context ctx, @Nullable Context context) throws ParsingException { + Placeholder placeholder = placeholderResolver.resolve(name); + if (placeholder == null) + return null; + String value = placeholder.value(context, this.argumentQueueToList(arguments)); + return Tag.selfClosingInserting(eval ? ctx.deserialize(value) : Component.text(value)); + } + + @Override + public boolean has(@NotNull String name) { + return placeholderResolver.resolve(name) != null; + } + + private List argumentQueueToList(ArgumentQueue argumentQueue) { + if (!argumentQueue.hasNext()) + return Collections.emptyList(); + + List argumentList = new ArrayList<>(); + while (argumentQueue.hasNext()) + argumentList.add(argumentQueue.pop().value()); + return Collections.unmodifiableList(argumentList); + } + }; + } +} diff --git a/minimessage/src/test/java/io/github/almightysatan/slams/minimessage/AdventureTest.java b/minimessage/src/test/java/io/github/almightysatan/slams/minimessage/AdventureTest.java index 2cea785..d851f85 100644 --- a/minimessage/src/test/java/io/github/almightysatan/slams/minimessage/AdventureTest.java +++ b/minimessage/src/test/java/io/github/almightysatan/slams/minimessage/AdventureTest.java @@ -126,7 +126,22 @@ public void testConditionalPlaceholder() throws IOException { langManager.load("0", values -> values.put("test", "Hello '>")); TextComponent component = (TextComponent) entry.value(); - assertEquals("Hello World", component.content()); + assertEquals("Hello ", component.content()); + } + + @Test + public void testConditionalContextTagResolver() throws IOException { + Slams langManager = Slams.create("0"); + AdventureMessage entry = AdventureMessage.of("test", langManager, ContextTagResolver.of( + ContextTagResolver.ofUnsafe(Placeholder.conditional("ifn", () -> false)), + ContextTagResolver.of(Placeholder.constant("abc", "")), + ContextTagResolver.of(Placeholder.constant("def", "World")) + )); + + langManager.load("0", values -> values.put("test", "Hello '>")); + + TextComponent component = (TextComponent) entry.value(); + assertEquals("Hello ", component.content()); } @Test