我正在使用Freemarker(FMPP)来自定义文本文件。我想要一个定义插值数据的属性文件,如下所示:
VAR1=some-value
VAR2=${VAR1}
这从我的实际文件中高度简化,但保留了我的用例的本质。该模板包含${VAR2}
形式的引用,我希望它会导致some-value
被插值。相反,插值是文字${VAR1}
。
请注意,这与Can a freemarker interpolation contain an interpolation?不同,后者指的是使用变量的值作为变量的名称(间接引用)。此外,can freemarker do second replacement的解决方案涉及修改模板。我希望替换在概念上“在'模板处理之前”发生,因此模板只能引用${VAR2}
而不需要知道双重插值。
有没有办法在FreeMarker中实现这一目标?
如果没有,有人可以告诉我Velocity是否会轻易做到这一点?
答案 0 :(得分:2)
您在.properties
文件中引用的变量是否始终来自同一个.properties
文件?如果是这样,那么您可以编写一个自定义FMPP DataLoader
,它可以在加载文件时执行所需的所有替换。 (或者,tdd
数据加载器也可以使用get(varname)
和某些eval(...)
- s来实现类似的东西,但这可能过于冗长。)
在模板语言级别上解决这个问题时,需要将${...}
的输出重新解释为模板片段,然后我也会假设它出来,直到没有任何内容看起来像模板语言构造的输出。我不知道任何模板语言这样做。但是,它可以在FreeMarker中解决,如果需要它的字符串包含一个自定义TemplateScalarModel
实现,只要有东西读取字符串的值,就会重复进行评估。 (要在FMPP中使用这样的自定义TemplateModel
,您还需要一个自定义FMPP数据加载器,它将以特殊方式包装字符串,然后再将它们返回给FMPP。)