Как я могу получить #evaluate, чтобы поместить его результаты в область страницы? - PullRequest
0 голосов
/ 08 апреля 2019

Я не могу получить #evaluate для установки переменной с помощью любого принятого решения, которое я видел для преобразования строки JSON в карту с использованием Velocity in Confluence.

У меня есть строка JSON, поступившая из другой системы, которую яиспользовать для генерации динамических данных.Во время разработки я мог работать с картой напрямую:

#set($textMapRaw = [{"ace":"clubs"}])

$textMapRaw.get(0).ace

Последняя строка отображается как "клубы".

Я ожидал использовать #evaluate, чтобы превратить живые данные вмассив объектов.Однако, похоже, что #evaluate не помещает объявленную переменную обратно в область действия, когда я что-то с ней делаю.Вот та же карта в виде строки:

#set($textMapHtml = '[{"ace":"clubs"}]')
#set($evalHtml = '#set($myMapHtml = '+ $textMapHtml +')')
evalHtml = $evalHtml<br/>
#evaluate($evalHtml)

$myMapHtml.get(0).ace

Последняя строка отображается как "$ myMapHtml.get (0) .ace".

Я знаю, что $ myMapHtml оцениваетсяпотому что я получаю трассировку стека оценки, когда я не добавляю Html в конец, чтобы избежать автоматически сбегающих махинаций Confluence.

Я пробовал это с экранированием хэша в наборе, используя набор $ {хэш}.Я пробовал одинарные и двойные кавычки.Я попробовал сделать это, просто установив строку с помощью метода execute:

#evaluate('#set($dippity = "doo")')
$dippity

#set($hash = '#')
#evaluate("${hash}set($blue = 'moon')")
$blue

Независимо от того, что я делаю с любым утвержденным кодом #evaluate, он никогда не оценивается как область действия в Confluence.Я всегда получаю результат, идентичный неопределенной переменной.

Примечание. В нашей среде я не могу сделать обходной путь в Java и вставить его в шаблон.Мне нужно найти чистое решение в шаблоне.

Ответы [ 2 ]

1 голос
/ 10 апреля 2019

Скорость 1.6.4 не позволяет изменять контекст оценки из директивы #evaluate.Поэтому при использовании этой версии невозможно создавать записи контекста с динамическим именем.

Однако вы можете сохранить их на карте:

#set( $stringMap = '[{"ace":"clubs"}]' )

#set( $myMap = {} )
#set( $eval = '#set($list = ' + $stringMap + ') #set ($myMap.ace = 
$list.get(0).ace)' )
#evaluate( $eval )

$myMap.ace ## prints 'clubs'
0 голосов
/ 10 апреля 2019

Поскольку кажется, что вы не можете вернуть переменную в текущую область, я нашел обходной путь.Для оценки массива / карты в макрос используйте просто методубордувокруг него.

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

#macro(processMap $theMap)
  #set($count = 0)
  #foreach($item in $theMap)
    #set($count = $velocityCount)
    <p>This thing is $item.tweedle</p>
  #end
  <p><b>I did that $count times</b></p>
#end

#set($workaroundHtml = '[{"tweedle":"dee"},{"tweedle":"dum"}]')

#set($eval = '#processMap(' + $workaroundHtml + ')')

#evaluate($eval)
...