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

>  -Mark
> 
> 

_______________________________________________
devs mailing list
[email protected]
http://lists.xwiki.org/mailman/listinfo/devs

Reply via email to