StringTemplate.java

net.minecraft.commands.functions.StringTemplate

信息

  • 全限定名:net.minecraft.commands.functions.StringTemplate
  • 类型:public record
  • 包:net.minecraft.commands.functions
  • 源码路径:src/main/java/net/minecraft/commands/functions/StringTemplate.java
  • 起始行号:L7
  • 职责:

    TODO

字段/常量

内部类/嵌套类型

构造器

方法

下面的方法块按源码顺序生成。

public static StringTemplate fromString(String input) @ L8

  • 方法名:fromString
  • 源码定位:L8
  • 返回类型:StringTemplate
  • 修饰符:public static

参数:

  • input: String

说明:

TODO

public static boolean isValidVariableName(String variable) @ L47

  • 方法名:isValidVariableName
  • 源码定位:L47
  • 返回类型:boolean
  • 修饰符:public static

参数:

  • variable: String

说明:

TODO

public String substitute(List<String> arguments) @ L58

  • 方法名:substitute
  • 源码定位:L58
  • 返回类型:String
  • 修饰符:public

参数:

  • arguments: List

说明:

TODO

代码

public record StringTemplate(List<String> segments, List<String> variables) {
    public static StringTemplate fromString(String input) {
        Builder<String> segments = ImmutableList.builder();
        Builder<String> variables = ImmutableList.builder();
        int length = input.length();
        int start = 0;
        int index = input.indexOf(36);
 
        while (index != -1) {
            if (index != length - 1 && input.charAt(index + 1) == '(') {
                segments.add(input.substring(start, index));
                int variableEnd = input.indexOf(41, index + 1);
                if (variableEnd == -1) {
                    throw new IllegalArgumentException("Unterminated macro variable");
                }
 
                String variable = input.substring(index + 2, variableEnd);
                if (!isValidVariableName(variable)) {
                    throw new IllegalArgumentException("Invalid macro variable name '" + variable + "'");
                }
 
                variables.add(variable);
                start = variableEnd + 1;
                index = input.indexOf(36, start);
            } else {
                index = input.indexOf(36, index + 1);
            }
        }
 
        if (start == 0) {
            throw new IllegalArgumentException("No variables in macro");
        } else {
            if (start != length) {
                segments.add(input.substring(start));
            }
 
            return new StringTemplate(segments.build(), variables.build());
        }
    }
 
    public static boolean isValidVariableName(String variable) {
        for (int i = 0; i < variable.length(); i++) {
            char character = variable.charAt(i);
            if (!Character.isLetterOrDigit(character) && character != '_') {
                return false;
            }
        }
 
        return true;
    }
 
    public String substitute(List<String> arguments) {
        StringBuilder builder = new StringBuilder();
 
        for (int i = 0; i < this.variables.size(); i++) {
            builder.append(this.segments.get(i)).append(arguments.get(i));
            CommandFunction.checkCommandLineLength(builder);
        }
 
        if (this.segments.size() > this.variables.size()) {
            builder.append(this.segments.getLast());
        }
 
        CommandFunction.checkCommandLineLength(builder);
        return builder.toString();
    }
}

引用的其他类

  • CommandFunction
    • 引用位置: 方法调用
    • 关联成员: CommandFunction.checkCommandLineLength()