Hi Mark,
On Sep 6, 2011, at 2:15 PM, Mark Wallace wrote:
On 9/3/2011 3:08 AM, Vincent Massol wrote:
Hi,
On Sep 2, 2011, at 10:48 PM, Mark Wallace wrote:
> I have a macro (implemented in Java) with this interface:
>
> public List<Block> execute(InferenceParameter parameters, String
> content, MacroTransformationContext context) ;
>
> I want to call this macro from within a velocity script. When I do, it
> returns a List<Block>. How do I get the velocity script to render the
> List<Block> properly?
>
You could check the tutorial at
http://rendering.xwiki.org/xwiki/bin/view/Main/ExtendingMacro
(check the deployment at the end).
I'm not having a problem invoking the macro in a wiki page. But
sometimes I'd like to invoke it from within a larger velocity script. I.e.
I can do this:
{{mymacro param="hello"/}}
But I'd also like to do this:
{{velocity}}
#set($words = ["Some", "velocity", "code"])
#foreach($word in $words)
$word ##
$services.mymacro($word)
#end
{{/velocity}}
I didn't see anything in the deployment part of the tutorial about doing
this.
I was going to respond the following:
-----
Your first use case is a macro while your second one isn't. The second use
case is simply a programmatic service or API that you wish to expose. Macros
are not supposed to return anything.
To implement your second use case you'd create a Script Service component
in java, see
http://extensions.xwiki.org/xwiki/bin/view/Extension/Script+Module
Now there's another possibility which is to:
* call your macro using a groovy script. You'll need to look it up and
call its execute method. This will return a List of Blocks
* still in the groovy macro code, lookup a renderer and tell it to render
the list of blocks.
This is slightly more tricky and I don't see why you'd want to do this
TBH. To help you further we'd need to know more about your specific use
case.
-----
But I just understood that you simply want to render the macro from inside
your velocity script. So you'd just need to do this:
{{velocity}}
#set($words = ["Some", "velocity", "code"])
#foreach($word in $words)
$word ##
{{mymacro param="$word"/}}
#end
{{/velocity}}
Hope it helps,
-Vincent
Yes, this is all I needed. Didn't realize I could invoke it inline. Not
sure how I missed that! Thanks!