Make setPlaceholders behavior consistent with setRelationalPlaceholders

This commit is contained in:
BlitzOffline
2026-02-09 17:05:20 +02:00
parent 7b8550c3f1
commit 64b3d6fa68
3 changed files with 25 additions and 5 deletions

View File

@@ -2,7 +2,7 @@
* This file is part of PlaceholderAPI * This file is part of PlaceholderAPI
* *
* PlaceholderAPI * PlaceholderAPI
* Copyright (c) 2015 - 2026 PlaceholderAPI Team * Copyright (c) 2015 - 2024 PlaceholderAPI Team
* *
* PlaceholderAPI free software: you can redistribute it and/or modify * PlaceholderAPI free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * 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.Locale;
import java.util.function.Function; import java.util.function.Function;
import me.clip.placeholderapi.expansion.PlaceholderExpansion; import me.clip.placeholderapi.expansion.PlaceholderExpansion;
import org.bukkit.ChatColor;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -68,10 +66,14 @@ public final class CharsReplacer implements Replacer {
hadSpace = true; hadSpace = true;
break; break;
} }
if (p == closure.tail) { if (p == closure.tail && identified) {
invalid = false; invalid = false;
break; break;
} }
if (p == closure.tail) {
identifier.append(p);
break;
}
if (p == '_' && !identified) { if (p == '_' && !identified) {
identified = true; identified = true;
@@ -135,4 +137,4 @@ public final class CharsReplacer implements Replacer {
return builder.toString(); return builder.toString();
} }
} }

View File

@@ -30,6 +30,8 @@ import org.jetbrains.annotations.Nullable;
public interface Values { public interface Values {
String NO_ARGUMENTS_PLACEHOLDER = "%player%";
String EMPTY_ARGUMENT_PLACEHOLDER = "%player_%";
String SMALL_TEXT = "My name is %player_name%"; 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%"; 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 { 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_X = "10";
public static final String PLAYER_Y = "20"; public static final String PLAYER_Y = "20";
public static final String PLAYER_Z = "30"; public static final String PLAYER_Z = "30";
@@ -83,6 +86,8 @@ public interface Values {
return PLAYER_Y; return PLAYER_Y;
case "z": case "z":
return PLAYER_Z; return PLAYER_Z;
case "":
return EMPTY_ARGUMENT;
} }
return null; return null;

View File

@@ -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_X;
import static me.clip.placeholderapi.Values.MockPlayerPlaceholderExpansion.PLAYER_Y; 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.PLAYER_Z;
import static me.clip.placeholderapi.Values.MockPlayerPlaceholderExpansion.EMPTY_ARGUMENT;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertEquals;
import me.clip.placeholderapi.Values; import me.clip.placeholderapi.Values;
@@ -37,6 +38,18 @@ public final class ReplacerUnitTester {
Values.CHARS_REPLACER.apply("%player_name%", null, Values.PLACEHOLDERS::get)); 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 @Test
void testCharsReplacerProducesExpectedSentence() { void testCharsReplacerProducesExpectedSentence() {
assertEquals(String.format( assertEquals(String.format(