【问题标题】:Custom format functions for StringTemplate4StringTemplate4 的自定义格式函数
【发布时间】:2014-11-12 16:06:12
【问题描述】:

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

render(attributes) :: <<
<html>
    $atributes: {
        <div> $customformat(atribute.name)$</div>
    }


</html>
>>

customformat(name) ::= <<
    $name; format="upper"$
>>

目前函数customformat的行为是:

输入:“hello world” -> 输出:“HELLO WORLD”

我想修改 customformat 函数,使输出如下所示:

输入:“hello world” -> 输出:“HELLO_WORLD”

【问题讨论】:

    标签: stringtemplate stringtemplate-4


    【解决方案1】:

    据我所知这是不可能的,因为 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());
    }
    

    然后你可以像以前一样调用格式化函数,但是传递“upperAndUnder”作为参数:

    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

    【讨论】:

      【解决方案2】:

      试试这个

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-06
        • 2012-12-12
        • 2010-10-18
        • 2020-04-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多