【问题标题】:How to get StringTemplate V4 to ignore < as delimiter?如何让 StringTemplate V4 忽略 < 作为分隔符?
【发布时间】:2012-06-21 20:20:58
【问题描述】:

我正在使用 StringTemplate V4 在我的项目中生成一些 HTML 代码。 我需要在我的模板中设置 HTML 格式,因此使用默认分隔符 &lt;&gt; 会很尴尬。

所以,我正在创建一个将分隔符作为参数传递的组(如 this question 所推荐的那样),但它根本不起作用。

这是我的测试代码:

public void testTemplate() {
    char sep = '$';
    STGroup stGroup = new STGroupString("temp",
            "<html>hello, $name$!</html>", sep, sep);
    System.out.println("Group created");
    ST st = stGroup.getInstanceOf("temp");
    if (st == null) {
        System.out.println("Failed to get template!");
    } else {
        st.add("name", "Guest");
        System.out.println("Template initialized correctly");
    }
}

这是我得到的输出:

temp 1:1: invalid character '<'
temp 1:5: invalid character '>'
temp 1:1: garbled template definition starting at 'html'
temp 1:6: garbled template definition starting at 'hello'
temp 1:13: invalid character '$'
temp 1:18: invalid character '$'
temp 1:19: invalid character '!'
temp 1:21: invalid character '<'
temp 1:22: invalid character '/'
temp 1:14: garbled template definition starting at 'name'
temp 1:26: invalid character '>'
temp 1:22: garbled template definition starting at 'html'
Failed to get template!

我在这里错过了什么?

【问题讨论】:

  • 它只适用于模板,但我确实需要使用组,因为在实际代码中我需要注册渲染器。

标签: java stringtemplate stringtemplate-4


【解决方案1】:

问题是提供给STGroupString 构造函数的模板不是有效的“组模板”语法。

要获得不需要特殊语法的组模板,请尝试:

STGroup group = new STGroup('$', '$');
group.registerRenderer(...);
CompiledST compiledTemplate = group.defineTemplate("name", ...);
compiledTemplate.hasFormalArgs = false; // very important!

// later on...
ST template = group.getInstanceOf("name");

(以上是对我的 C# 代码的改编,因此 YMMV。我已尝试确保类型/名称有效且语法正确,但尚未验证。请随时根据需要更新/更正。)

编码愉快。

【讨论】:

  • 这行得通,只是有点奇怪,方法`defineTemplate(String, String)` 有Javadoc 注释for testing。所以这可能不是它的意图。
【解决方案2】:

上面非常有趣的技巧(通过 pst),它也给出了一个提示:“无效的组模板语法”。

因此,作为参考,这里是他的代码的替代方案,使用此类组的有效语法:

 STGroup groupS = new STGroupString("some group", "val(value) ::= \"<span>Value is {value; format=\\\"%1.5f\\\"}</span>\"", '{', '}');
 groupS.registerRenderer(Number.class, new NumberRenderer());
 ST valTpl = groupS.getInstanceOf("val");
 valTpl.add("value", 3.14159265358979353);
 System.out.println(valTpl.render());

Java 字符串中的语法变得笨拙,带有许多转义...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-30
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 2011-12-10
    相关资源
    最近更新 更多