From 64b3d6fa680cb08c6540d4e10681d7bbc02c8593 Mon Sep 17 00:00:00 2001 From: BlitzOffline <52609756+BlitzOffline@users.noreply.github.com> Date: Mon, 9 Feb 2026 17:05:20 +0200 Subject: [PATCH] Make setPlaceholders behavior consistent with setRelationalPlaceholders --- .../clip/placeholderapi/replacer/CharsReplacer.java | 12 +++++++----- src/test/java/me/clip/placeholderapi/Values.java | 5 +++++ .../placeholderapi/replacer/ReplacerUnitTester.java | 13 +++++++++++++ 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/main/java/me/clip/placeholderapi/replacer/CharsReplacer.java b/src/main/java/me/clip/placeholderapi/replacer/CharsReplacer.java index 8f0af63..fc6fa4a 100644 --- a/src/main/java/me/clip/placeholderapi/replacer/CharsReplacer.java +++ b/src/main/java/me/clip/placeholderapi/replacer/CharsReplacer.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2026 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -22,9 +22,7 @@ package me.clip.placeholderapi.replacer; import java.util.Locale; import java.util.function.Function; - import me.clip.placeholderapi.expansion.PlaceholderExpansion; -import org.bukkit.ChatColor; import org.bukkit.OfflinePlayer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -68,10 +66,14 @@ public final class CharsReplacer implements Replacer { hadSpace = true; break; } - if (p == closure.tail) { + if (p == closure.tail && identified) { invalid = false; break; } + if (p == closure.tail) { + identifier.append(p); + break; + } if (p == '_' && !identified) { identified = true; @@ -135,4 +137,4 @@ public final class CharsReplacer implements Replacer { return builder.toString(); } -} +} \ No newline at end of file diff --git a/src/test/java/me/clip/placeholderapi/Values.java b/src/test/java/me/clip/placeholderapi/Values.java index 11e0459..55c01a9 100644 --- a/src/test/java/me/clip/placeholderapi/Values.java +++ b/src/test/java/me/clip/placeholderapi/Values.java @@ -30,6 +30,8 @@ import org.jetbrains.annotations.Nullable; public interface Values { + String NO_ARGUMENTS_PLACEHOLDER = "%player%"; + String EMPTY_ARGUMENT_PLACEHOLDER = "%player_%"; String SMALL_TEXT = "My name is %player_name%"; String LARGE_TEXT = "My name is %player_name% and my location is (%player_x%, %player_y%, %player_z%), this placeholder is invalid %server_name%"; @@ -43,6 +45,7 @@ public interface Values { final class MockPlayerPlaceholderExpansion extends PlaceholderExpansion { + public static final String EMPTY_ARGUMENT = "Empty Argument"; public static final String PLAYER_X = "10"; public static final String PLAYER_Y = "20"; public static final String PLAYER_Z = "30"; @@ -83,6 +86,8 @@ public interface Values { return PLAYER_Y; case "z": return PLAYER_Z; + case "": + return EMPTY_ARGUMENT; } return null; diff --git a/src/test/java/me/clip/placeholderapi/replacer/ReplacerUnitTester.java b/src/test/java/me/clip/placeholderapi/replacer/ReplacerUnitTester.java index fcc886d..5529a47 100644 --- a/src/test/java/me/clip/placeholderapi/replacer/ReplacerUnitTester.java +++ b/src/test/java/me/clip/placeholderapi/replacer/ReplacerUnitTester.java @@ -24,6 +24,7 @@ import static me.clip.placeholderapi.Values.MockPlayerPlaceholderExpansion.PLAYE import static me.clip.placeholderapi.Values.MockPlayerPlaceholderExpansion.PLAYER_X; import static me.clip.placeholderapi.Values.MockPlayerPlaceholderExpansion.PLAYER_Y; import static me.clip.placeholderapi.Values.MockPlayerPlaceholderExpansion.PLAYER_Z; +import static me.clip.placeholderapi.Values.MockPlayerPlaceholderExpansion.EMPTY_ARGUMENT; import static org.junit.jupiter.api.Assertions.assertEquals; import me.clip.placeholderapi.Values; @@ -37,6 +38,18 @@ public final class ReplacerUnitTester { Values.CHARS_REPLACER.apply("%player_name%", null, Values.PLACEHOLDERS::get)); } + @Test + void charsReplacersDoesNotParsePlaceholdersWithNoArguments() { + assertEquals(Values.NO_ARGUMENTS_PLACEHOLDER, + Values.CHARS_REPLACER.apply(Values.NO_ARGUMENTS_PLACEHOLDER, null, Values.PLACEHOLDERS::get)); + } + + @Test + void charsReplacersParsesPlaceholdersWithOneArgumentThatIsEmpty() { + assertEquals(EMPTY_ARGUMENT, + Values.CHARS_REPLACER.apply(Values.EMPTY_ARGUMENT_PLACEHOLDER, null, Values.PLACEHOLDERS::get)); + } + @Test void testCharsReplacerProducesExpectedSentence() { assertEquals(String.format(