Как заставить StringTemplate V4 игнорировать ‹ в качестве разделителя?

Я использую StringTemplate V4 для создания HTML-кода в своем проекте. Мне нужно иметь форматирование HTML в моих шаблонах, поэтому использование разделителей по умолчанию < и > было бы очень неудобно.

Итак, я создаю группу, передающую разделитель в качестве аргумента (как рекомендовано в этом вопросе) , но это просто не работает.

Вот мой тестовый код:

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!

Что мне здесь не хватает?


person Elias Dorneles    schedule 21.06.2012    source источник
comment
Он работает только с шаблоном, но мне действительно нужно использовать группу, потому что в реальном коде мне нужно зарегистрировать рендереры.   -  person Elias Dorneles    schedule 22.06.2012


Ответы (2)


Проблема заключается в том, что шаблон, предоставленный конструктору 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. Я пытался убедиться, что типы/имена действительны, а синтаксис правильный, но не проверял его. Не стесняйтесь обновлять/исправлять по мере необходимости.)

Удачного кодирования.

person Community    schedule 21.06.2012
comment
Это работает, просто немного странно, что метод `defineTemplate(String, String)` имеет комментарий Javadoc for testing. Так что это, вероятно, не так, как это было задумано. - person wvdz; 27.05.2014

Очень интересный трюк выше (от 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 со многими экранами...

person PhiLho    schedule 04.09.2012