Skip to content

Commit 7a0d649

Browse files
committed
Allow parsing of custom placeholder maps
Replace PlaceholderContext#playerExist() with PlaceholderContext#hasPlayer(), deprecate old method
1 parent 862b8c2 commit 7a0d649

9 files changed

Lines changed: 278 additions & 50 deletions

File tree

gradle.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@ org.gradle.jvmargs=-Xmx1G
88
loader_version=0.11.0
99

1010
# Mod Properties
11-
mod_version = 0.2.1
11+
mod_version = 0.3.0
1212
maven_group = eu.pb4
13-
archives_base_name = placeholder-api
13+
archives_base_name = fabric-placeholder-api

src/main/java/eu/pb4/placeholders/Helpers.java

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@
66
import net.minecraft.text.MutableText;
77
import net.minecraft.text.Text;
88
import net.minecraft.text.TranslatableText;
9+
import net.minecraft.util.Identifier;
910

1011
import java.util.ArrayList;
1112
import java.util.List;
13+
import java.util.Map;
1214
import java.util.regex.Matcher;
1315
import java.util.regex.Pattern;
1416

@@ -50,7 +52,7 @@ private static void recursiveParsing(StringBuffer string, List<Text> textList) {
5052
}
5153
}
5254

53-
protected static Text recursivePlaceholderParsing(Text text, Object object, Pattern pattern) {
55+
protected static Text recursivePlaceholderParsing(Text text, Object object, Pattern pattern, Map<Identifier, PlaceholderHandler> placeholders) {
5456
MutableText out;
5557

5658
ServerPlayerEntity player = object instanceof ServerPlayerEntity ? (ServerPlayerEntity) object : null;
@@ -62,7 +64,7 @@ protected static Text recursivePlaceholderParsing(Text text, Object object, Patt
6264

6365
for(Object arg : translatableText.getArgs()) {
6466
if (arg instanceof Text) {
65-
list.add(recursivePlaceholderParsing((Text) arg, object, pattern));
67+
list.add(recursivePlaceholderParsing((Text) arg, object, pattern, placeholders));
6668
} else {
6769
list.add(arg);
6870
}
@@ -80,15 +82,15 @@ protected static Text recursivePlaceholderParsing(Text text, Object object, Patt
8082
out = new LiteralText("").setStyle(text.getStyle());
8183

8284
while (matcher.find()) {
83-
String placeholder = matcher.group(1);
85+
String placeholder = matcher.group("id");
8486
start = matcher.start();
8587
end = matcher.end();
8688

8789
out.append(new LiteralText(string.substring(previousEnd, start)).setStyle(text.getStyle()));
8890

8991
PlaceholderResult result = player != null
90-
? PlaceholderAPI.parsePlaceholder(PlaceholderContext.create(placeholder, player))
91-
: PlaceholderAPI.parsePlaceholder(PlaceholderContext.create(placeholder, server));
92+
? parsePlaceholderFromMap(PlaceholderContext.create(placeholder, player), placeholders)
93+
: parsePlaceholderFromMap(PlaceholderContext.create(placeholder, server), placeholders);
9294

9395
if (result.isValid()) {
9496
out.append(result.getText());
@@ -103,13 +105,13 @@ protected static Text recursivePlaceholderParsing(Text text, Object object, Patt
103105
}
104106

105107
for(Text text1 : text.getSiblings()) {
106-
out.append(recursivePlaceholderParsing(text1, object, pattern));
108+
out.append(recursivePlaceholderParsing(text1, object, pattern, placeholders));
107109
}
108110

109111
return out;
110112
}
111113

112-
public static String parseString(String text, Object object, Pattern pattern) {
114+
protected static String parseString(String text, Object object, Pattern pattern, Map<Identifier, PlaceholderHandler> placeholders) {
113115
Matcher matcher = pattern.matcher(text);
114116
StringBuffer out = new StringBuffer(text.length());
115117

@@ -118,9 +120,9 @@ public static String parseString(String text, Object object, Pattern pattern) {
118120

119121
while (matcher.find()) {
120122
String placeholder = matcher.group(1);
121-
PlaceholderResult result =player != null
122-
? PlaceholderAPI.parsePlaceholder(PlaceholderContext.create(placeholder, player))
123-
: PlaceholderAPI.parsePlaceholder(PlaceholderContext.create(placeholder, server));
123+
PlaceholderResult result = player != null
124+
? parsePlaceholderFromMap(PlaceholderContext.create(placeholder, player), placeholders)
125+
: parsePlaceholderFromMap(PlaceholderContext.create(placeholder, server), placeholders);
124126

125127
if (result.isValid()) {
126128
matcher.appendReplacement(out, Matcher.quoteReplacement(result.getString()));
@@ -131,4 +133,12 @@ public static String parseString(String text, Object object, Pattern pattern) {
131133

132134
return out.toString();
133135
}
136+
137+
private static PlaceholderResult parsePlaceholderFromMap(PlaceholderContext context, Map<Identifier, PlaceholderHandler> placeholders) {
138+
if (placeholders.containsKey(context.getIdentifier())) {
139+
return placeholders.get(context.getIdentifier()).PlaceholderHandler(context);
140+
} else {
141+
return PlaceholderResult.invalid("Placeholder doesn't exist!");
142+
}
143+
}
134144
}
Lines changed: 111 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,28 @@
11
package eu.pb4.placeholders;
22

3-
import eu.pb4.placeholders.builtin.PlayerPlaceholders;
4-
import eu.pb4.placeholders.builtin.ServerPlaceholders;
5-
import net.fabricmc.api.ModInitializer;
63
import net.minecraft.server.MinecraftServer;
74
import net.minecraft.server.network.ServerPlayerEntity;
85
import net.minecraft.text.Text;
96
import net.minecraft.util.Identifier;
107

118
import java.util.HashMap;
9+
import java.util.Map;
1210
import java.util.regex.Pattern;
1311

12+
public class PlaceholderAPI {
13+
public static final Pattern PLACEHOLDER_PATTERN = Pattern.compile("[%](?<id>[^%]+:[^%]+)[%]");
14+
public static final Pattern ALT_PLACEHOLDER_PATTERN = Pattern.compile("[{](?<id>[^{}]+:[^{}]+)[}]");
1415

15-
public class PlaceholderAPI implements ModInitializer {
16-
public static final Pattern PLACEHOLDER_PATTERN = Pattern.compile("[%]([^%]+:[^%]+)[%]");
17-
public static final Pattern ALT_PLACEHOLDER_PATTERN = Pattern.compile("[{]([^{}]+:[^{}]+)[}]");
16+
public static final Pattern PLACEHOLDER_PATTERN_CUSTOM = Pattern.compile("[%](?<id>[^%]+)[%]");
17+
public static final Pattern ALT_PLACEHOLDER_PATTERN_CUSTOM = Pattern.compile("[{](?<id>[^{}]+)[}]");
1818

1919
private static final HashMap<Identifier, PlaceholderHandler> PLACEHOLDERS = new HashMap<>();
2020

21+
/**
22+
* Parses PlaceholderContext, can be used for parsing by hand
23+
*
24+
* @return PlaceholderResult
25+
*/
2126
public static PlaceholderResult parsePlaceholder(PlaceholderContext context) {
2227
if (PLACEHOLDERS.containsKey(context.getIdentifier())) {
2328
return PLACEHOLDERS.get(context.getIdentifier()).PlaceholderHandler(context);
@@ -26,45 +31,131 @@ public static PlaceholderResult parsePlaceholder(PlaceholderContext context) {
2631
}
2732
}
2833

34+
/**
35+
* Parses placeholders (without formatting) within String for player
36+
* Placeholders have format of {@code %namespace:placeholder/argument%}
37+
*
38+
* @return String
39+
*/
2940
public static String parseString(String text, ServerPlayerEntity player) {
30-
return Helpers.parseString(text, player, PLACEHOLDER_PATTERN);
41+
return Helpers.parseString(text, player, PLACEHOLDER_PATTERN, PLACEHOLDERS);
3142
}
3243

44+
/**
45+
* Parses placeholders (without formatting) within String
46+
* Placeholders have format of {@code %namespace:placeholder/argument%}
47+
*
48+
* @return String
49+
*/
3350
public static String parseString(String text, MinecraftServer server) {
34-
return Helpers.parseString(text, server, PLACEHOLDER_PATTERN);
51+
return Helpers.parseString(text, server, PLACEHOLDER_PATTERN, PLACEHOLDERS);
3552
}
3653

54+
/**
55+
* Parses placeholders for player
56+
* Placeholders have format of {@code %namespace:placeholder/argument%}
57+
*
58+
* @return Text
59+
*/
3760
public static Text parseText(Text text, ServerPlayerEntity player) {
38-
return Helpers.recursivePlaceholderParsing(text, player, PLACEHOLDER_PATTERN);
61+
return Helpers.recursivePlaceholderParsing(text, player, PLACEHOLDER_PATTERN, PLACEHOLDERS);
3962
}
4063

64+
/**
65+
* Parses placeholders
66+
* Placeholders have format of {@code %namespace:placeholder/argument%}
67+
*
68+
* @return Text
69+
*/
4170
public static Text parseText(Text text, MinecraftServer server) {
42-
return Helpers.recursivePlaceholderParsing(text, server, PLACEHOLDER_PATTERN);
71+
return Helpers.recursivePlaceholderParsing(text, server, PLACEHOLDER_PATTERN, PLACEHOLDERS);
4372
}
4473

74+
/**
75+
* Parses placeholders (without formatting) within String for player
76+
* Placeholders have format of {@code \{namespace:placeholder/argument\}}
77+
*
78+
* @return String
79+
*/
4580
public static String parseStringAlt(String text, ServerPlayerEntity player) {
46-
return Helpers.parseString(text, player, ALT_PLACEHOLDER_PATTERN);
81+
return Helpers.parseString(text, player, ALT_PLACEHOLDER_PATTERN, PLACEHOLDERS);
4782
}
4883

84+
/**
85+
* Parses placeholders (without formatting) within String
86+
* Placeholders have format of {@code \{namespace:placeholder/argument\}}
87+
*
88+
* @return String
89+
*/
4990
public static String parseStringAlt(String text, MinecraftServer server) {
50-
return Helpers.parseString(text, server, ALT_PLACEHOLDER_PATTERN);
91+
return Helpers.parseString(text, server, ALT_PLACEHOLDER_PATTERN, PLACEHOLDERS);
5192
}
5293

94+
/**
95+
* Parses placeholders for player
96+
* Placeholders have format of {@code \{namespace:placeholder/argument\}}
97+
*
98+
* @return Text
99+
*/
53100
public static Text parseTextAlt(Text text, ServerPlayerEntity player) {
54-
return Helpers.recursivePlaceholderParsing(text, player, ALT_PLACEHOLDER_PATTERN);
101+
return Helpers.recursivePlaceholderParsing(text, player, ALT_PLACEHOLDER_PATTERN, PLACEHOLDERS);
55102
}
56103

104+
/**
105+
* Parses placeholders
106+
* Placeholders have format of {@code \{namespace:placeholder/argument\}}
107+
*
108+
* @return Text
109+
*/
57110
public static Text parseTextAlt(Text text, MinecraftServer server) {
58-
return Helpers.recursivePlaceholderParsing(text, server, ALT_PLACEHOLDER_PATTERN);
111+
return Helpers.recursivePlaceholderParsing(text, server, ALT_PLACEHOLDER_PATTERN, PLACEHOLDERS);
59112
}
60113

61-
public static void register(Identifier identifier, PlaceholderHandler handler) {
62-
PLACEHOLDERS.put(identifier, handler);
114+
/**
115+
* Parses placeholders (without formatting) within String for player
116+
* Placeholders have format of {@code %namespace:placeholder/argument%}
117+
*
118+
* @return String
119+
*/
120+
public static String parseStringCustom(String text, ServerPlayerEntity player, HashMap<Identifier, PlaceholderHandler> placeholders, Pattern pattern) {
121+
return Helpers.parseString(text, player, pattern, placeholders);
122+
}
123+
124+
/**
125+
* Parses custom placeholders (without formatting) within String
126+
* Placeholders can have custom format
127+
*
128+
* @return String
129+
*/
130+
public static String parseStringCustom(String text, MinecraftServer server, HashMap<Identifier, PlaceholderHandler> placeholders, Pattern pattern) {
131+
return Helpers.parseString(text, server, pattern, placeholders);
132+
}
133+
134+
/**
135+
* Parses custom placeholders for player
136+
* Placeholders can have custom format
137+
*
138+
* @return Text
139+
*/
140+
public static Text parseTextCustom(Text text, ServerPlayerEntity player, Map<Identifier, PlaceholderHandler> placeholders, Pattern pattern) {
141+
return Helpers.recursivePlaceholderParsing(text, player, pattern, placeholders);
63142
}
64143

65-
@Override
66-
public void onInitialize() {
67-
ServerPlaceholders.register();
68-
PlayerPlaceholders.register();
144+
/**
145+
* Parses custom placeholders
146+
* Placeholders can have custom format
147+
*
148+
* @return Text
149+
*/
150+
public static Text parseTextCustom(Text text, MinecraftServer server, Map<Identifier, PlaceholderHandler> placeholders, Pattern pattern) {
151+
return Helpers.recursivePlaceholderParsing(text, server, pattern, placeholders);
152+
}
153+
154+
155+
/**
156+
* Registers new placeholder for identifier
157+
*/
158+
public static void register(Identifier identifier, PlaceholderHandler handler) {
159+
PLACEHOLDERS.put(identifier, handler);
69160
}
70161
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package eu.pb4.placeholders;
2+
3+
import eu.pb4.placeholders.builtin.PlayerPlaceholders;
4+
import eu.pb4.placeholders.builtin.ServerPlaceholders;
5+
import net.fabricmc.api.ModInitializer;
6+
7+
public class PlaceholderAPIMod implements ModInitializer {
8+
@Override
9+
public void onInitialize() {
10+
ServerPlaceholders.register();
11+
PlayerPlaceholders.register();
12+
}
13+
}

0 commit comments

Comments
 (0)