73 lines
2.5 KiB
Java
73 lines
2.5 KiB
Java
package net.minecraft.commands.functions;
|
|
|
|
import com.google.common.collect.ImmutableList;
|
|
import com.google.common.collect.ImmutableList.Builder;
|
|
import java.util.List;
|
|
|
|
public record StringTemplate(List<String> segments, List<String> variables) {
|
|
public static StringTemplate fromString(String p_311822_, int p_311237_) {
|
|
Builder<String> builder = ImmutableList.builder();
|
|
Builder<String> builder1 = ImmutableList.builder();
|
|
int i = p_311822_.length();
|
|
int j = 0;
|
|
int k = p_311822_.indexOf(36);
|
|
|
|
while (k != -1) {
|
|
if (k != i - 1 && p_311822_.charAt(k + 1) == '(') {
|
|
builder.add(p_311822_.substring(j, k));
|
|
int l = p_311822_.indexOf(41, k + 1);
|
|
if (l == -1) {
|
|
throw new IllegalArgumentException("Unterminated macro variable in macro '" + p_311822_ + "' on line " + p_311237_);
|
|
}
|
|
|
|
String s = p_311822_.substring(k + 2, l);
|
|
if (!isValidVariableName(s)) {
|
|
throw new IllegalArgumentException("Invalid macro variable name '" + s + "' on line " + p_311237_);
|
|
}
|
|
|
|
builder1.add(s);
|
|
j = l + 1;
|
|
k = p_311822_.indexOf(36, j);
|
|
} else {
|
|
k = p_311822_.indexOf(36, k + 1);
|
|
}
|
|
}
|
|
|
|
if (j == 0) {
|
|
throw new IllegalArgumentException("Macro without variables on line " + p_311237_);
|
|
} else {
|
|
if (j != i) {
|
|
builder.add(p_311822_.substring(j));
|
|
}
|
|
|
|
return new StringTemplate(builder.build(), builder1.build());
|
|
}
|
|
}
|
|
|
|
private static boolean isValidVariableName(String p_312174_) {
|
|
for (int i = 0; i < p_312174_.length(); i++) {
|
|
char c0 = p_312174_.charAt(i);
|
|
if (!Character.isLetterOrDigit(c0) && c0 != '_') {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public String substitute(List<String> p_310551_) {
|
|
StringBuilder stringbuilder = new StringBuilder();
|
|
|
|
for (int i = 0; i < this.variables.size(); i++) {
|
|
stringbuilder.append(this.segments.get(i)).append(p_310551_.get(i));
|
|
CommandFunction.checkCommandLineLength(stringbuilder);
|
|
}
|
|
|
|
if (this.segments.size() > this.variables.size()) {
|
|
stringbuilder.append(this.segments.get(this.segments.size() - 1));
|
|
}
|
|
|
|
CommandFunction.checkCommandLineLength(stringbuilder);
|
|
return stringbuilder.toString();
|
|
}
|
|
} |