9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-23 08:59:27 +00:00

Merge branch 'Xiao-MoMi:dev' into dev

This commit is contained in:
jhqwqmc
2025-06-05 20:43:19 +08:00
committed by GitHub
2 changed files with 10 additions and 16 deletions

View File

@@ -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

View File

@@ -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();
} }
} }