Как присвоить результат `#valu` переменной? - PullRequest
0 голосов
/ 28 января 2020

Контекст:

На сайте XWiki я интенсивно использую шаблоны скорости, чтобы задать c представление объектов. В конкретном шаблоне мне нужно иметь возможность иметь один уровень косвенности, чтобы разрешить специальную обработку для некоторых полей. Мне удалось поместить формулу в переменную и оценить ее во время рендеринга.

Мой текущий (упрощенный) код:

#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 напрямую выводит свою оценку и ничего не возвращает.

Вопрос

Есть ли способ сохранить результат переменной #evaluate в переменной?

1 Ответ

1 голос
/ 28 января 2020

В скорости, #evaluate только выполняет свое содержимое. Наблюдаются все побочные эффекты, в основном выходы, но ничего не может быть возвращено.

(первая часть) уловка заключается в том, чтобы иметь #evaluate для оценки #set, например (остерегайтесь, что это неверно) :

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

Проблема в том, что эти специальные символы должны быть экранированы в вычисляемых строках, потому что первая часть не должна оцениваться, а вторая - и эта скорость имеет довольно странные правила экранирования: # и $ должны быть экранированы с \, в то время как ' и " должны быть удвоены ...

С этой второй частью, это просто дает:

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