StringTemplate4的自定义格式函数

时间:2014-11-12 16:06:13

标签: stringtemplate stringtemplate-4

我想知道如何为字符串模板创建自定义格式函数。假设我有以下代码:

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;

2 个答案:

答案 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>

供参考:

Here's the original StringRenderer code

More info on Renderers

答案 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");
    }
}}