如何将 `#evaluate` 的结果赋给一个变量?

How to assign the result of `#evaluate` to a variable?

上下文:

在 XWiki 站点内,我大量使用速度模板来具有对象的特定表示。在一个特定的模板中,我需要能够有一个间接级别来允许对某些字段进行特殊处理。我设法将公式放入一个变量中并在渲染时对其求值。

我当前的(简化)代码是:

#set($special = { 'field1': 'F1: $pageDoc.display("field1") - F2: $pageDoc.display("field2")',
                  'field2': '' }
...
#foreach($field in $fields):
  #if($special.contains($field))
    #if("$special[$field]" != "")
      <p>#evaluate($special[$field])</p>
    #end
  #else
    <p>$pageDoc.display($field)</p>
  #end
#end

事实上,此示例代码一行显示一个字段列表,而其中一些(特殊 字段)连续显示 2 个($pageDoc.display($field)是一个 XWiki 习语,用于显示从页面中包含的对象获取可显示值)

问题:

对于不同的渲染引擎,我现在需要将这些行传递给引擎:

$engine.addLine($pageDoc.display($field))

但是$engine.addLine(#evaluate($special[$field]))不能工作,因为#evaluate直接输出它的评估而不是return任何东西。

问题

在 velocity 中有没有办法将 #evaluate 的结果存储在变量中?

在velocity中,#evaluate只执行它的内容。观察到所有副作用,主要是输出,但无法返回任何内容。

诀窍的(第一部分)是让 #evaluate 评估 #set,例如(注意这个不正确):

#evaluate(#set($resul = $special[$field]))
$engine.addLine($resul)

如果要在求值字符串中对特殊字符进行转义,则会出现问题,因为第一部分不应求值,而第二部分应求值,而且速度有相当奇怪的转义规则:#$ 应使用 \ 转义,而 '" 应加倍...

对于第二部分,它只给出:

#evaluate("\#set($resul= ""$special[$field]"")")
$engine.addLine($resul)