Изменение динамического эталонного значения шаблона скорости из кода Java - PullRequest
1 голос
/ 03 июня 2010

Мне нужно заменить ссылки (свойства и методы) в Velocity шаблоны для некоторых других значений во время рендеринга шаблона. Например, из шаблона ниже:

___
I have $some text $daisy
#foreach ($someElement in $someCollection)
  #$someElement.doSomething()
#end
___

Мне нужно получить такой текст:

___
I have lalala1 text lalala1
lalala2
lalala2
lalala2
___

Кроме того, причина в том, что я не знаю названий ссылок и количество их заранее.

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

Прежде всего, я попытался получить имена ссылок из шаблона, работать с реализацией ReferenceInsertionEventHandler, но проблема была в директивах.

Например, с foreach у меня было исключение "Не удалось определить тип итератор в цикле #foreach " Я посмотрел исходный код скорости, я могу изменить его, как мне нужно, но это убьет ремонтопригодность будущего проекта.

Так что вопрос такой: Есть ли способ получить все ссылки на имена (свойства и методы) из шаблона и изменять их значения при рендеринге?

1 Ответ

2 голосов
/ 26 июня 2010

Я не уверен, полностью ли я понимаю вашу проблему, но если вы хотите заменить одни переменные другими (практически для последовательного переименования переменных), вам все равно нужно знать, с какой переменной какое имя другой переменной будет заменен.

Вы можете запускать шаблоны скорости так часто, как вам нравится. Например. на первом проходе вы можете заменить, например, $ some с '$ other', а во втором проходе заменить $ other на конечные значения, которые вы действительно хотите.

Однако, чтобы получить все переменные в шаблоне последовательно (как и в макросах), я увидел, что инструменты, основанные на Velocity, обычно используют модифицированные версии его синтаксического анализатора. Например. в этом случае вам нужно будет запустить посетителя над созданным AST Velocity из шаблона и собрать ASTVariable s, но я думаю, что это не простая задача.

Примером может быть устаревший пример .

...