2014-11-12 7 views
2

Я хотел бы знать, как создать функцию пользовательского формата для строкового шаблона. Пусть говорят, у меня есть следующий код:Функции пользовательского формата для StringTemplate4

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


</html> 
>> 

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

В настоящее время поведение функции CustomFormat является:

Входной сигнал: "привет мир" -> Вывод: "HELLO WORLD"

И я хотел бы изменить функцию CustomFormat поэтому выход что-то вроде следующего:

Входной сигнал: «привет мир» -> Вывод: «hello_world»

ответ

2

Насколько я знаю, это невозможно, поскольку StringTemplate касается строгого разделения модели.

Вместо этого, я думаю, вам будет лучше иметь геттер в контроллере, который возвращает форматированную строку.

Вы могли бы найти этот вопрос полезный: embed java code inside a template


На самом деле, я нашел простой способ сделать это, который позволяет избежать необходимости отформатированной строки добытчиков:

Вам нужно создать новый 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> 

FYI:

Here's the original StringRenderer code

More info on Renderers

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"); 
    } 
}} 
Смежные вопросы