我想知道如何为字符串模板创建自定义格式函数。假设我有以下代码:
render(attributes) :: <<
<html>
$atributes: {
<div> $customformat(atribute.name)$</div>
}
</html>
>>
customformat(name) ::= <<
$name; format="upper"$
>>
目前,函数customformat的行为是:
输入:&#34;你好世界&#34; - &GT;输出:&#34; HELLO WORLD&#34;
我想修改customformat函数,因此输出类似于以下内容:
输入:&#34;你好世界&#34; - &GT;输出:&#34; HELLO_WORLD&#34;
答案 0 :(得分:3)
据我所知,这是不可能的,因为StringTemplate是关于严格的模型 - 视图分离。
相反,我认为你最好在控制器中输入一个返回格式化字符串的getter。
您可能会发现这个问题很有用:embed java code inside a template
实际上,我找到了一种简单的方法,可以避免使用格式化的字符串getter:
您需要创建一个新的StringRenderer,它可以按照您想要的方式格式化字符串。
public class MyStringRenderer extends StringRenderer
{
@Override
public String toString(Object o, String formatString, Locale locale) {
if (!("upperAndUnder".equals(formatString)))
return super.toString(o, formatString, locale);
// we want upper case words with underscores instead of spaces
return ((String) o).replaceAll(" ", "_").toUpperCase(locale);
}
}
然后,您需要让模板组了解新的渲染器:
public static void main(String[] args) {
STGroup templates = new STGroupFile("test.stg");
templates.registerRenderer(String.class, new MyStringRenderer());
ST renderTemplate = templates.getInstanceOf("render");
renderTemplate.add("attributes", new String[]{"blahh blahh I'm a string", "I'm another string"});
System.out.println(renderTemplate.render());
}
然后你可以像以前一样调用格式函数,但是传递&#34; upperAndUnder&#34;作为参数:
group test;
delimiters "$","$"
render(attributes) ::= <<
<html>
$attributes:{ attribute | <div> $customFormat(attribute)$</div>}; separator="\n"$
</html>
>>
customFormat(name) ::= <<
$name; format="upperAndUnder"$
>>
打印:
<html>
<div> BLAHH_BLAHH_I'M_A_STRING</div>
<div> I'M_ANOTHER_STRING</div>
</html>
供参考:
答案 1 :(得分:0)
试试这个
Object rendering using AttributeRenderer
public class BasicFormatRenderer implements AttributeRenderer {
public String toString(Object o) {
return o.toString();
}
public String toString(Object o, String formatName) {
if (formatName.equals("toUpper")) {
return o.toString().toUpperCase();
} else if (formatName.equals("toLower")) {
return o.toString().toLowerCase();
} else {
throw new IllegalArgumentException("Unsupported format name");
}
}}