From 59d1a31c6f9d74cf24f6672dc620b2aef8ab424a Mon Sep 17 00:00:00 2001 From: KKW557 Date: Tue, 2 Jul 2024 17:42:43 +0800 Subject: [PATCH] feature: MiniMessageTranslator --- .../minimessage/translation/ArgumentTag.java | 39 ++++++++++++++ .../translation/MiniMessageTranslator.java | 53 +++++++++++++++++++ .../minimessage/translation/package-info.java | 1 + 3 files changed, 93 insertions(+) create mode 100644 text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/translation/ArgumentTag.java create mode 100644 text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/translation/MiniMessageTranslator.java create mode 100644 text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/translation/package-info.java diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/translation/ArgumentTag.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/translation/ArgumentTag.java new file mode 100644 index 000000000..a7adce902 --- /dev/null +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/translation/ArgumentTag.java @@ -0,0 +1,39 @@ +package net.kyori.adventure.text.minimessage.translation; + +import java.util.List; +import java.util.Objects; +import net.kyori.adventure.text.ComponentLike; +import net.kyori.adventure.text.minimessage.Context; +import net.kyori.adventure.text.minimessage.ParsingException; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.ArgumentQueue; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class ArgumentTag implements TagResolver { + private static final String NAME = "argument"; + private static final String NAME_1 = "arg"; + + private final List argumentComponents; + + public ArgumentTag(final @NotNull List argumentComponents) { + this.argumentComponents = Objects.requireNonNull(argumentComponents, "argumentComponents"); + } + + @Override + public @Nullable Tag resolve(final @NotNull String name, final @NotNull ArgumentQueue arguments, final @NotNull Context ctx) throws ParsingException { + final int index = arguments.popOr("No argument number provided").asInt().orElseThrow(() -> ctx.newException("Invalid argument number", arguments)); + + if (index < 0 || index >= argumentComponents.size()) { + throw ctx.newException("Invalid argument number", arguments); + } + + return Tag.inserting(argumentComponents.get(index)); + } + + @Override + public boolean has(final @NotNull String name) { + return name.equals(NAME) || name.equals(NAME_1); + } +} diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/translation/MiniMessageTranslator.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/translation/MiniMessageTranslator.java new file mode 100644 index 000000000..80563ceda --- /dev/null +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/translation/MiniMessageTranslator.java @@ -0,0 +1,53 @@ +package net.kyori.adventure.text.minimessage.translation; + +import java.text.MessageFormat; +import java.util.Locale; +import java.util.Objects; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.TranslatableComponent; +import net.kyori.adventure.text.minimessage.MiniMessage; +import net.kyori.adventure.translation.Translator; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public abstract class MiniMessageTranslator implements Translator { + + final MiniMessage miniMessage; + + public MiniMessageTranslator() { + this(MiniMessage.miniMessage()); + } + + public MiniMessageTranslator(final @NotNull MiniMessage miniMessage) { + this.miniMessage = Objects.requireNonNull(miniMessage, "miniMessage"); + } + + protected abstract @Nullable String getMiniMessageString(final @NotNull String key, final @NotNull Locale locale); + + @Override + public final @Nullable MessageFormat translate(final @NotNull String key, final @NotNull Locale locale) { + return null; + } + + @Override + public @Nullable Component translate(final @NotNull TranslatableComponent component, final @NotNull Locale locale) { + final String miniMessageString = getMiniMessageString(component.key(), locale); + + if (miniMessageString == null) { + return null; + } + + final Component resultingComponent; + + if (component.arguments().isEmpty()) { + resultingComponent = this.miniMessage.deserialize(miniMessageString); + } else { + resultingComponent = this.miniMessage.deserialize(miniMessageString, new ArgumentTag(component.args())); + } + if (component.children().isEmpty()) { + return resultingComponent; + } else { + return resultingComponent.children(component.children()); + } + } +} diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/translation/package-info.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/translation/package-info.java new file mode 100644 index 000000000..8418809c0 --- /dev/null +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/translation/package-info.java @@ -0,0 +1 @@ +package net.kyori.adventure.text.minimessage.translation;