mirror of
https://github.com/Xiao-MoMi/craft-engine.git
synced 2025-12-23 00:49:20 +00:00
Merge branch 'Xiao-MoMi:dev' into dev
This commit is contained in:
@@ -12,7 +12,7 @@ minecraft:jungle_sapling[stage=1]: minecraft:jungle_sapling[stage=0]
|
|||||||
minecraft:dark_oak_sapling[stage=1]: minecraft:dark_oak_sapling[stage=0]
|
minecraft:dark_oak_sapling[stage=1]: minecraft:dark_oak_sapling[stage=0]
|
||||||
minecraft:acacia_sapling[stage=1]: minecraft:acacia_sapling[stage=0]
|
minecraft:acacia_sapling[stage=1]: minecraft:acacia_sapling[stage=0]
|
||||||
minecraft:cherry_sapling[stage=1]: minecraft:cherry_sapling[stage=0]
|
minecraft:cherry_sapling[stage=1]: minecraft:cherry_sapling[stage=0]
|
||||||
#minecraft:pale_oak_leaves[stage=1]: minecraft:pale_oak_leaves[stage=0] # 1.21.4+
|
#minecraft:pale_oak_sapling[stage=1]: minecraft:pale_oak_sapling[stage=0] # 1.21.4+
|
||||||
########################################################################################################################################################################################################################
|
########################################################################################################################################################################################################################
|
||||||
# Ideal block for lower half slabs
|
# Ideal block for lower half slabs
|
||||||
# Sculk Sensor
|
# Sculk Sensor
|
||||||
|
|||||||
@@ -17,6 +17,9 @@ import java.util.regex.Matcher;
|
|||||||
|
|
||||||
@SuppressWarnings("DuplicatedCode")
|
@SuppressWarnings("DuplicatedCode")
|
||||||
public class TemplateManagerImpl implements TemplateManager {
|
public class TemplateManagerImpl implements TemplateManager {
|
||||||
|
/*
|
||||||
|
* 此类仍需要一次重构,对模板预解析,避免每次调用时候重新判断值是否含有参数
|
||||||
|
*/
|
||||||
private final Map<Key, Object> templates = new HashMap<>();
|
private final Map<Key, Object> templates = new HashMap<>();
|
||||||
private final static Set<String> NON_TEMPLATE_KEY = new HashSet<>(Set.of(TEMPLATE, ARGUMENTS, OVERRIDES, MERGES));
|
private final static Set<String> NON_TEMPLATE_KEY = new HashSet<>(Set.of(TEMPLATE, ARGUMENTS, OVERRIDES, MERGES));
|
||||||
private final TemplateParser templateParser;
|
private final TemplateParser templateParser;
|
||||||
@@ -67,8 +70,8 @@ public class TemplateManagerImpl implements TemplateManager {
|
|||||||
Objects.requireNonNull(input, "Input must not be null");
|
Objects.requireNonNull(input, "Input must not be null");
|
||||||
Map<String, Object> result = new LinkedHashMap<>();
|
Map<String, Object> result = new LinkedHashMap<>();
|
||||||
processMap(input,
|
processMap(input,
|
||||||
Map.of("{__ID__}", PlainStringTemplateArgument.plain(id.value()),
|
Map.of("__ID__", PlainStringTemplateArgument.plain(id.value()),
|
||||||
"{__NAMESPACE__}", PlainStringTemplateArgument.plain(id.namespace())),
|
"__NAMESPACE__", PlainStringTemplateArgument.plain(id.namespace())),
|
||||||
(obj) -> {
|
(obj) -> {
|
||||||
// 当前位于根节点下,如果下一级就是模板,则应把模板结果与当前map合并
|
// 当前位于根节点下,如果下一级就是模板,则应把模板结果与当前map合并
|
||||||
// 如果模板结果不是map,则为非法值,因为不可能出现类似于下方的配置
|
// 如果模板结果不是map,则为非法值,因为不可能出现类似于下方的配置
|
||||||
@@ -378,8 +381,10 @@ public class TemplateManagerImpl implements TemplateManager {
|
|||||||
|
|
||||||
// 将某个输入变成最终的结果,可以是string->string,也可以是string->map/list
|
// 将某个输入变成最终的结果,可以是string->string,也可以是string->map/list
|
||||||
private Object applyArgument(String input, Map<String, TemplateArgument> arguments) {
|
private Object applyArgument(String input, Map<String, TemplateArgument> arguments) {
|
||||||
|
// 如果字符串长度连3都没有,那么肯定没有{}啊
|
||||||
|
if (input.length() < 3) return input;
|
||||||
if (input.charAt(0) == '{' && input.charAt(input.length() - 1) == '}') {
|
if (input.charAt(0) == '{' && input.charAt(input.length() - 1) == '}') {
|
||||||
String key = input.substring(1, input.length() - 2);
|
String key = input.substring(1, input.length() - 1);
|
||||||
if (arguments.containsKey(key)) {
|
if (arguments.containsKey(key)) {
|
||||||
return arguments.get(key).get();
|
return arguments.get(key).get();
|
||||||
}
|
}
|
||||||
@@ -417,16 +422,15 @@ public class TemplateManagerImpl implements TemplateManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String replacePlaceholders(String input, Map<String, TemplateArgument> replacements) {
|
public static String replacePlaceholders(String input, Map<String, TemplateArgument> replacements) {
|
||||||
if (input == null || input.isEmpty()) {
|
if (input == null || input.isEmpty()) {
|
||||||
return input;
|
return input;
|
||||||
}
|
}
|
||||||
|
|
||||||
StringBuilder finalResult = new StringBuilder();
|
StringBuilder finalResult = new StringBuilder();
|
||||||
int n = input.length();
|
int n = input.length();
|
||||||
int lastAppendPosition = 0; // 追踪上一次追加操作结束的位置
|
int lastAppendPosition = 0; // 追踪上一次追加操作结束的位置
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
while (i < n) {
|
while (i < n) {
|
||||||
// 检查当前字符是否为未转义的 '{'
|
// 检查当前字符是否为未转义的 '{'
|
||||||
int backslashes = 0;
|
int backslashes = 0;
|
||||||
@@ -435,20 +439,16 @@ public class TemplateManagerImpl implements TemplateManager {
|
|||||||
backslashes++;
|
backslashes++;
|
||||||
temp_i--;
|
temp_i--;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (input.charAt(i) == '{' && backslashes % 2 == 0) {
|
if (input.charAt(i) == '{' && backslashes % 2 == 0) {
|
||||||
// 发现占位符起点
|
// 发现占位符起点
|
||||||
int placeholderStartIndex = i;
|
int placeholderStartIndex = i;
|
||||||
|
|
||||||
// 追加从上一个位置到当前占位符之前的文本
|
// 追加从上一个位置到当前占位符之前的文本
|
||||||
finalResult.append(input, lastAppendPosition, placeholderStartIndex);
|
finalResult.append(input, lastAppendPosition, placeholderStartIndex);
|
||||||
|
|
||||||
// --- 开始解析占位符内部 ---
|
// --- 开始解析占位符内部 ---
|
||||||
StringBuilder keyBuilder = new StringBuilder();
|
StringBuilder keyBuilder = new StringBuilder();
|
||||||
int depth = 1;
|
int depth = 1;
|
||||||
int j = i + 1;
|
int j = i + 1;
|
||||||
boolean foundMatch = false;
|
boolean foundMatch = false;
|
||||||
|
|
||||||
while (j < n) {
|
while (j < n) {
|
||||||
char c = input.charAt(j);
|
char c = input.charAt(j);
|
||||||
if (c == '\\') { // 处理转义
|
if (c == '\\') { // 处理转义
|
||||||
@@ -468,7 +468,6 @@ public class TemplateManagerImpl implements TemplateManager {
|
|||||||
if (depth == 0) { // 找到匹配的结束括号
|
if (depth == 0) { // 找到匹配的结束括号
|
||||||
String key = keyBuilder.toString();
|
String key = keyBuilder.toString();
|
||||||
TemplateArgument value = replacements.get(key);
|
TemplateArgument value = replacements.get(key);
|
||||||
|
|
||||||
if (value != null) {
|
if (value != null) {
|
||||||
// 如果在 Map 中找到值,则进行替换
|
// 如果在 Map 中找到值,则进行替换
|
||||||
finalResult.append(value.get());
|
finalResult.append(value.get());
|
||||||
@@ -476,7 +475,6 @@ public class TemplateManagerImpl implements TemplateManager {
|
|||||||
// 否则,保留原始占位符(包括 '{}')
|
// 否则,保留原始占位符(包括 '{}')
|
||||||
finalResult.append(input, placeholderStartIndex, j + 1);
|
finalResult.append(input, placeholderStartIndex, j + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 更新位置指针
|
// 更新位置指针
|
||||||
i = j + 1;
|
i = j + 1;
|
||||||
lastAppendPosition = i;
|
lastAppendPosition = i;
|
||||||
@@ -491,23 +489,19 @@ public class TemplateManagerImpl implements TemplateManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// --- 占位符解析结束 ---
|
// --- 占位符解析结束 ---
|
||||||
|
|
||||||
if (!foundMatch) {
|
if (!foundMatch) {
|
||||||
// 如果内层循环结束仍未找到匹配的 '}',则不进行任何特殊处理
|
// 如果内层循环结束仍未找到匹配的 '}',则不进行任何特殊处理
|
||||||
// 外层循环的 i 会自然递增
|
// 外层循环的 i 会自然递增
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 追加最后一个占位符之后的所有剩余文本
|
// 追加最后一个占位符之后的所有剩余文本
|
||||||
if (lastAppendPosition < n) {
|
if (lastAppendPosition < n) {
|
||||||
finalResult.append(input, lastAppendPosition, n);
|
finalResult.append(input, lastAppendPosition, n);
|
||||||
}
|
}
|
||||||
|
|
||||||
return finalResult.toString();
|
return finalResult.toString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user