Freemarker - предварительная обработка шаблона - PullRequest
0 голосов
/ 07 марта 2012

Мне было интересно, есть ли способ предварительной обработки шаблона freemarker с некоторыми правилами - я хотел бы добавить синтаксический сахар, который на самом деле не является ни директивой, ни методом.

Например, у меня есть переменные, которые я печатаю так:

${item.getLocale(currentLocale).name}
${item.getLocale(currentLocale).text}
${item.parent.getLocale(currentLocale).name}
${item.parent.getLocale(currentLocale).text}

Очевидно, конструкция getLocale делает все выражение довольно уродливым. Чего я хотел бы достичь, так это уметь писать:

${item.l.name}
${item.l.text}
${item.parent.l.name}
${item.parent.l.text}

Так что все .l. будут во время компиляции переписаны в .getLocale(currentLocale).

Есть ли какой-нибудь хороший способ сделать это? Спасибо!

1 Ответ

1 голос
/ 07 марта 2012

Именно поэтому в FreeMarker существует перенос объектов;Вы можете представить данные в шаблоны в произвольном порядке.Я полагаю, item принадлежит определенному классу Java.Таким образом, вы можете расширить DefaultObjectWrapper или BeansWrapper, чтобы обернуть эти элементы специально, а затем использовать Configuration.setObjectWrapper(new YourObjectWrapper()) один раз, когда вы инициализируете FreeMarker.(См. Исходный код DefaultObjectWrapper в качестве примера настройки; он расширяет BeansWrapper, чтобы обернуть узлы XML, Jython-объекты и т. Д., Особенно.) Таким образом, когда в шаблоне ${item.name}, это вызов YourHashModel.get("name") на стороне Java (где YourHashModel расширяется freemarker.template.TemplateHashModel), и в этом методе get вы можете иметь return new SimpleScalar(item.getLocale(currentLocale).get("name")) или подобное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...