Added serializer support to placeholder replacement methods.

This commit is contained in:
Justin
2026-02-12 20:30:30 -05:00
parent 354aebe8df
commit b331145c15
2 changed files with 156 additions and 38 deletions

View File

@@ -25,11 +25,14 @@ import me.clip.placeholderapi.replacer.ExactReplacer;
import me.clip.placeholderapi.replacer.RelationalExactReplacer; import me.clip.placeholderapi.replacer.RelationalExactReplacer;
import me.clip.placeholderapi.replacer.Replacer; import me.clip.placeholderapi.replacer.Replacer;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.ComponentLike;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List; import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static me.clip.placeholderapi.PlaceholderAPI.RELATIONAL_PLACEHOLDER_PATTERN; import static me.clip.placeholderapi.PlaceholderAPI.RELATIONAL_PLACEHOLDER_PATTERN;
@@ -49,12 +52,28 @@ public final class PAPIComponents {
*/ */
@NotNull @NotNull
public static Component setPlaceholders(final OfflinePlayer player, @NotNull final Component component) { public static Component setPlaceholders(final OfflinePlayer player, @NotNull final Component component) {
if (PlaceholderAPIPlugin.getInstance().getPlaceholderAPIConfig().useAdventureProvidedReplacer()) { return setPlaceholders(player, component, null);
return component.replaceText(config -> config.match(PlaceholderAPI.PLACEHOLDER_PATTERN).replacement((result, builder) ->
builder.content(PERCENT_EXACT_REPLACER.apply(result.group(), player, PlaceholderAPIPlugin.getInstance().getLocalExpansionManager()::getExpansion))));
} }
return ComponentReplacer.replace(component, str -> PlaceholderAPI.setPlaceholders(player, str)); /**
* Translates all placeholders into their corresponding values.
* <br>The pattern of a valid placeholder is {@literal %<identifier>_<params>%}.
*
* @param player Player to parse the placeholders against
* @param component Component to set the placeholder values in
* @param serializer Optional function to serialize parsed placeholder values into ComponentLike
* @return Component containing all translated placeholders
*/
@NotNull
public static Component setPlaceholders(final OfflinePlayer player, @NotNull final Component component, @Nullable Function<String, ComponentLike> serializer) {
if (PlaceholderAPIPlugin.getInstance().getPlaceholderAPIConfig().useAdventureProvidedReplacer()) {
return component.replaceText(config -> config.match(PlaceholderAPI.PLACEHOLDER_PATTERN).replacement((result, builder) -> {
String parsed = PERCENT_EXACT_REPLACER.apply(result.group(), player, PlaceholderAPIPlugin.getInstance().getLocalExpansionManager()::getExpansion);
return serializer == null ? builder.content(parsed) : serializer.apply(parsed);
}));
}
return ComponentReplacer.replace(component, str -> PlaceholderAPI.setPlaceholders(player, str), serializer == null ? null : s -> serializer.apply(s).asComponent());
} }
/** /**
@@ -67,7 +86,21 @@ public final class PAPIComponents {
*/ */
@NotNull @NotNull
public static List<Component> setPlaceholders(final OfflinePlayer player, @NotNull final List<Component> components) { public static List<Component> setPlaceholders(final OfflinePlayer player, @NotNull final List<Component> components) {
return components.stream().map(component -> setPlaceholders(player, component)).collect(Collectors.toList()); return setPlaceholders(player, components, null);
}
/**
* Translates all placeholders into their corresponding values.
* <br>The pattern of a valid placeholder is {@literal %<identifier>_<params>%}.
*
* @param player Player to parse the placeholders against
* @param components List of Components to set the placeholder values in
* @param serializer Optional function to serialize parsed placeholder values into ComponentLike
* @return List of Components containing all translated placeholders
*/
@NotNull
public static List<Component> setPlaceholders(final OfflinePlayer player, @NotNull final List<Component> components, @Nullable Function<String, ComponentLike> serializer) {
return components.stream().map(component -> setPlaceholders(player, component, serializer == null ? null : s -> serializer.apply(s).asComponent())).collect(Collectors.toList());
} }
/** /**
@@ -80,7 +113,21 @@ public final class PAPIComponents {
*/ */
@NotNull @NotNull
public static Component setPlaceholders(final Player player, @NotNull final Component component) { public static Component setPlaceholders(final Player player, @NotNull final Component component) {
return setPlaceholders((OfflinePlayer) player, component); return setPlaceholders(player, component, null);
}
/**
* Translates all placeholders into their corresponding values.
* <br>The pattern of a valid placeholder is {@literal %<identifier>_<params>%}.
*
* @param player Player to parse the placeholders against
* @param component Component to set the placeholder values in
* @param serializer Optional function to serialize parsed placeholder values into ComponentLike
* @return Component containing all translated placeholders
*/
@NotNull
public static Component setPlaceholders(final Player player, @NotNull final Component component, @Nullable Function<String, ComponentLike> serializer) {
return setPlaceholders((OfflinePlayer) player, component, serializer);
} }
/** /**
@@ -93,7 +140,21 @@ public final class PAPIComponents {
*/ */
@NotNull @NotNull
public static List<Component> setPlaceholders(final Player player, @NotNull final List<Component> components) { public static List<Component> setPlaceholders(final Player player, @NotNull final List<Component> components) {
return setPlaceholders((OfflinePlayer) player, components); return setPlaceholders(player, components, null);
}
/**
* Translates all placeholders into their corresponding values.
* <br>The pattern of a valid placeholder is {@literal %<identifier>_<params>%}.
*
* @param player Player to parse the placeholders against
* @param components List of Components to set the placeholder values in
* @param serializer Optional function to serialize parsed placeholder values into ComponentLike
* @return List of components containing all translated placeholders
*/
@NotNull
public static List<Component> setPlaceholders(final Player player, @NotNull final List<Component> components, @Nullable Function<String, ComponentLike> serializer) {
return setPlaceholders((OfflinePlayer) player, components, serializer);
} }
/** /**
@@ -106,12 +167,26 @@ public final class PAPIComponents {
*/ */
@NotNull @NotNull
public static Component setBracketPlaceholders(final OfflinePlayer player, @NotNull final Component component) { public static Component setBracketPlaceholders(final OfflinePlayer player, @NotNull final Component component) {
return setBracketPlaceholders(player, component, null);
}
/**
* Translates all placeholders into their corresponding values.
* <br>The pattern of a valid placeholder is {@literal {<identifier>_<params>}}.
*
* @param player Player to parse the placeholders against
* @param component Component to set the placeholder values in
* @param serializer Optional function to serialize parsed placeholder values into ComponentLike
* @return Component containing all translated placeholders
*/
@NotNull
public static Component setBracketPlaceholders(final OfflinePlayer player, @NotNull final Component component, @Nullable Function<String, ComponentLike> serializer) {
if (PlaceholderAPIPlugin.getInstance().getPlaceholderAPIConfig().useAdventureReplacer()) { if (PlaceholderAPIPlugin.getInstance().getPlaceholderAPIConfig().useAdventureReplacer()) {
return component.replaceText(config -> config.match(PlaceholderAPI.BRACKET_PLACEHOLDER_PATTERN).replacement((result, builder) -> return component.replaceText(config -> config.match(PlaceholderAPI.BRACKET_PLACEHOLDER_PATTERN).replacement((result, builder) ->
builder.content(BRACKET_EXACT_REPLACER.apply(result.group(), player, PlaceholderAPIPlugin.getInstance().getLocalExpansionManager()::getExpansion)))); builder.content(BRACKET_EXACT_REPLACER.apply(result.group(), player, PlaceholderAPIPlugin.getInstance().getLocalExpansionManager()::getExpansion))));
} }
return ComponentReplacer.replace(component, str -> PlaceholderAPI.setBracketPlaceholders(player, str)); return ComponentReplacer.replace(component, str -> PlaceholderAPI.setBracketPlaceholders(player, str), serializer == null ? null : s -> serializer.apply(s).asComponent());
} }
/** /**
@@ -124,7 +199,21 @@ public final class PAPIComponents {
*/ */
@NotNull @NotNull
public static List<Component> setBracketPlaceholders(final OfflinePlayer player, @NotNull final List<Component> components) { public static List<Component> setBracketPlaceholders(final OfflinePlayer player, @NotNull final List<Component> components) {
return components.stream().map(component -> setBracketPlaceholders(player, component)).collect(Collectors.toList()); return setBracketPlaceholders(player, components, null);
}
/**
* Translates all placeholders into their corresponding values.
* <br>The pattern of a valid placeholder is {@literal {<identifier>_<params>}}.
*
* @param player Player to parse the placeholders against
* @param components List of Components to set the placeholder values in
* @param serializer Optional function to serialize parsed placeholder values into ComponentLike
* @return List of Components containing all translated placeholders
*/
@NotNull
public static List<Component> setBracketPlaceholders(final OfflinePlayer player, @NotNull final List<Component> components, @Nullable Function<String, ComponentLike> serializer) {
return components.stream().map(component -> setBracketPlaceholders(player, component, serializer)).collect(Collectors.toList());
} }
/** /**
@@ -137,7 +226,21 @@ public final class PAPIComponents {
*/ */
@NotNull @NotNull
public static Component setBracketPlaceholders(final Player player, @NotNull final Component component) { public static Component setBracketPlaceholders(final Player player, @NotNull final Component component) {
return setBracketPlaceholders((OfflinePlayer) player, component); return setBracketPlaceholders(player, component, null);
}
/**
* Translates all placeholders into their corresponding values.
* <br>The pattern of a valid placeholder is {@literal {<identifier>_<params>}}.
*
* @param player Player to parse the placeholders against
* @param component Component to set the placeholder values in
* @param serializer Optional function to serialize parsed placeholder values into ComponentLike
* @return Component containing all translated placeholders
*/
@NotNull
public static Component setBracketPlaceholders(final Player player, @NotNull final Component component, @Nullable Function<String, ComponentLike> serializer) {
return setBracketPlaceholders((OfflinePlayer) player, component, serializer);
} }
/** /**
@@ -150,7 +253,21 @@ public final class PAPIComponents {
*/ */
@NotNull @NotNull
public static List<Component> setBracketPlaceholders(final Player player, @NotNull final List<Component> components) { public static List<Component> setBracketPlaceholders(final Player player, @NotNull final List<Component> components) {
return setBracketPlaceholders((OfflinePlayer) player, components); return setBracketPlaceholders(player, components, null);
}
/**
* Translates all placeholders into their corresponding values.
* <br>The pattern of a valid placeholder is {@literal {<identifier>_<params>}}.
*
* @param player Player to parse the placeholders against
* @param components List of Components to set the placeholder values in
* @param serializer Optional function to serialize parsed placeholder values into ComponentLike
* @return List of Components containing all translated placeholders
*/
@NotNull
public static List<Component> setBracketPlaceholders(final Player player, @NotNull final List<Component> components, @Nullable Function<String, ComponentLike> serializer) {
return setBracketPlaceholders((OfflinePlayer) player, components, serializer);
} }
/** /**

View File

@@ -8,6 +8,7 @@ import net.kyori.adventure.text.event.DataComponentValue;
import net.kyori.adventure.text.event.HoverEvent; import net.kyori.adventure.text.event.HoverEvent;
import net.kyori.adventure.text.format.Style; import net.kyori.adventure.text.format.Style;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
@@ -17,25 +18,25 @@ import java.util.function.Function;
public class ComponentReplacer { public class ComponentReplacer {
@NotNull @NotNull
public static Component replace(@NotNull final Component component, @NotNull final Function<String, String> replacer) { public static Component replace(@NotNull final Component component, @NotNull final Function<String, String> replacer, @Nullable final Function<String, Component> serializer) {
return rebuild(component, replacer); return rebuild(component, replacer, serializer);
} }
@NotNull @NotNull
private static Component rebuild(@NotNull final Component component, @NotNull final Function<String, String> replacer) { private static Component rebuild(@NotNull final Component component, @NotNull final Function<String, String> replacer, @Nullable final Function<String, Component> serializer) {
Component rebuilt; Component rebuilt;
if (component instanceof TextComponent) { if (component instanceof TextComponent) {
final TextComponent text = (TextComponent) component; final TextComponent text = (TextComponent) component;
final String replaced = replacer.apply(text.content()); final String replaced = replacer.apply(text.content());
rebuilt = Component.text(replaced); rebuilt = serializer == null ? Component.text(replaced) : serializer.apply(replaced);
} else if (component instanceof TranslatableComponent) { } else if (component instanceof TranslatableComponent) {
final TranslatableComponent translatable = (TranslatableComponent) component; final TranslatableComponent translatable = (TranslatableComponent) component;
final List<Component> arguments = new ArrayList<>(); final List<Component> arguments = new ArrayList<>();
for (final ComponentLike arg : translatable.arguments()) { for (final ComponentLike arg : translatable.arguments()) {
arguments.add(rebuild(arg.asComponent(), replacer)); arguments.add(rebuild(arg.asComponent(), replacer, serializer));
} }
rebuilt = Component.translatable(translatable.key(), arguments); rebuilt = Component.translatable(translatable.key(), arguments);
@@ -52,12 +53,12 @@ public class ComponentReplacer {
rebuilt = Component.empty(); rebuilt = Component.empty();
} }
rebuilt = rebuilt.style(rebuildStyle(component.style(), replacer)); rebuilt = rebuilt.style(rebuildStyle(component.style(), replacer, serializer));
if (!component.children().isEmpty()) { if (!component.children().isEmpty()) {
final List<Component> children = new ArrayList<>(); final List<Component> children = new ArrayList<>();
for (Component child : component.children()) { for (Component child : component.children()) {
children.add(rebuild(child, replacer)); children.add(rebuild(child, replacer, serializer));
} }
rebuilt = rebuilt.children(children); rebuilt = rebuilt.children(children);
} }
@@ -66,7 +67,7 @@ public class ComponentReplacer {
} }
@NotNull @NotNull
private static Style rebuildStyle(@NotNull final Style style, @NotNull final Function<String, String> replacer) { private static Style rebuildStyle(@NotNull final Style style, @NotNull final Function<String, String> replacer, @Nullable final Function<String, Component> serializer) {
final Style.Builder builder = style.toBuilder(); final Style.Builder builder = style.toBuilder();
final ClickEvent click = style.clickEvent(); final ClickEvent click = style.clickEvent();
@@ -77,7 +78,7 @@ public class ComponentReplacer {
final HoverEvent<?> hover = style.hoverEvent(); final HoverEvent<?> hover = style.hoverEvent();
if (hover != null) { if (hover != null) {
builder.hoverEvent(rebuildHoverEvent(hover, replacer)); builder.hoverEvent(rebuildHoverEvent(hover, replacer, serializer));
} }
return builder.build(); return builder.build();
@@ -113,11 +114,11 @@ public class ComponentReplacer {
} }
@NotNull @NotNull
private static HoverEvent<?> rebuildHoverEvent(@NotNull final HoverEvent<?> hover, @NotNull final Function<String, String> replacer) { private static HoverEvent<?> rebuildHoverEvent(@NotNull final HoverEvent<?> hover, @NotNull final Function<String, String> replacer, @Nullable final Function<String, Component> serializer) {
final Object value = hover.value(); final Object value = hover.value();
if (value instanceof Component) { if (value instanceof Component) {
final Component rebuilt = rebuild((Component) value, replacer); final Component rebuilt = rebuild((Component) value, replacer, serializer);
return HoverEvent.showText(rebuilt); return HoverEvent.showText(rebuilt);
} }
@@ -130,7 +131,7 @@ public class ComponentReplacer {
Component rebuiltName = null; Component rebuiltName = null;
if (entity.name() != null) { if (entity.name() != null) {
rebuiltName = rebuild(entity.name(), replacer); rebuiltName = rebuild(entity.name(), replacer, serializer);
} }
return HoverEvent.showEntity(entity.type(), entity.id(), rebuiltName); return HoverEvent.showEntity(entity.type(), entity.id(), rebuiltName);