Определение переменной Freemarker, ссылающееся на другую переменную

Я использую Freemarker (FMPP) для настройки текстового файла. Я хочу иметь файл свойств, определяющий данные интерполяции следующим образом:

VAR1=some-value
VAR2=${VAR1}

Это сильно упрощено по сравнению с моими реальными файлами, но сохраняет суть моего варианта использования. Шаблон содержит ссылку в форме ${VAR2}, которая, как я ожидаю, приведет к интерполяции some-value. Вместо этого интерполированное значение является литералом ${VAR1}.

Обратите внимание, что это не то же самое, что Может ли интерполяция freemarker содержать интерполяцию?, которая относится к использованию значения переменной в качестве имени переменная (косвенная ссылка). Кроме того, решение проблемы может ли freemarker выполнить вторую замену включает изменение шаблона. Я бы хотел, чтобы замена происходила концептуально «до» обработки шаблона, чтобы шаблон мог ссылаться только на ${VAR2} и не должен был знать о двойной интерполяции.

Есть ли способ сделать это в FreeMarker?

Если нет, может ли кто-нибудь сказать мне, легко ли это сделает Velocity?


person Jim Garrison    schedule 09.09.2011    source источник


Ответы (1)


Всегда ли переменные, на которые вы ссылаетесь в файле .properties, происходят из одного и того же файла .properties? Если это так, то вы можете просто написать собственный FMPP DataLoader, который выполняет все необходимые подстановки прямо при загрузке файла. (Или загрузчик данных tdd также может добиться чего-то подобного, используя get(varname) и, возможно, некоторые eval(...), но это, вероятно, слишком многословно для этой цели.)

Что касается решения этого на уровне языка шаблонов, потребуется, чтобы вывод ${...} был переинтерпретирован как фрагмент шаблона, а затем я также предполагаю, что из этого, пока в выводе не будет ничего похожего на шаблон языковая конструкция. Я не знаю ни о каком языке шаблонов, который делает это. Тем не менее, это можно решить в FreeMarker, если строки, где это требуется, обернуты пользовательской реализацией TemplateScalarModel, которая выполняет эту повторную оценку всякий раз, когда что-то читает значение строки. (Чтобы использовать такое пользовательское TemplateModel в FMPP, вам также нужен специальный загрузчик данных FMPP, который будет оборачивать строки особым образом, прежде чем возвращать их в FMPP.)

person ddekany    schedule 10.09.2011
comment
Я так и думал, и пришел к такому же выводу. Я разработал двухэтапное решение, которое сначала обрабатывает переменные свойств как шаблон (для замены внешних параметров), а затем как входные данные для второго преобразования «реального» шаблона. - person Jim Garrison; 10.09.2011