跳到主要内容

组件渲染

QWen Max 中英对照 Component Render

你可以通过两种方式之一来实现组件渲染:完全编程方式或使用 ANTLR Stringtemplate。严格来说,有一个简单的 Function 渲染器接口,它将 Context 作为输入,并输出一个 AttributedString 列表。这让你可以在模板和代码之间进行选择。

如果你不需要做任何复杂的事情,或者只是想稍微修改现有的组件布局,那么模板化是一个不错的选择。通过代码进行渲染则可以让你灵活地做任何你需要的事情。

程序化渲染的方法是创建一个 Function

class StringInputCustomRenderer implements Function<StringInputContext, List<AttributedString>> {
@Override
public List<AttributedString> apply(StringInputContext context) {
AttributedStringBuilder builder = new AttributedStringBuilder();
builder.append(context.getName());
builder.append(" ");
if (context.getResultValue() != null) {
builder.append(context.getResultValue());
}
else {
String input = context.getInput();
if (StringUtils.hasText(input)) {
builder.append(input);
}
else {
builder.append("[Default " + context.getDefaultValue() + "]");
}
}
return Arrays.asList(builder.toAttributedString());
}
}
java

然后你可以将其连接到一个组件:

@ShellMethod(key = "component stringcustom", value = "String input", group = "Components")
public String stringInputCustom(boolean mask) {
StringInput component = new StringInput(getTerminal(), "Enter value", "myvalue",
new StringInputCustomRenderer());
component.setResourceLoader(getResourceLoader());
component.setTemplateExecutor(getTemplateExecutor());
if (mask) {
component.setMaskCharacter('*');
}
StringInputContext context = component.run(StringInputContext.empty());
return "Got value " + context.getResultValue();
}
java

组件有其自己的上下文,但通常会从父组件类型共享一些功能。以下表格显示了这些上下文变量:

表 1. TextComponentContext 模板变量

Key描述
resultValue组件渲染结果后的值。
name组件的名称 — 即其标题。
message组件可能设置的消息。
messageLevel消息的级别 — INFOWARNERROR 之一。
hasMessageLevelInfo如果级别是 INFO,则返回 true。否则,返回 false。
hasMessageLevelWarn如果级别是 WARN,则返回 true。否则,返回 false。
hasMessageLevelError如果级别是 ERROR,则返回 true。否则,返回 false。
input原始用户输入。

表 2. SelectorComponentContext 模板变量

Key描述
name组件的名称 — 即其标题。
input原始用户输入 — 主要用于过滤。
itemStates项目状态的完整列表。
itemStateView可见的项目状态列表。
isResult如果上下文处于结果模式,则返回 true
cursorRow选择器中的当前光标行。

表 3. ComponentContext 模板变量

Key描述
terminalWidth终端的宽度,类型是 Integer,如果未设置,默认为 NULL