On Tue, Sep 6, 2011 at 3:04 PM, Thomas Mortagne
<[email protected]> wrote:
> On Tue, Sep 6, 2011 at 2:59 PM, Mark Wallace <[email protected]> 
> wrote:
>> On 9/6/2011 8:40 AM, Vincent Massol wrote:
>>>
>>> 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!
>
> Be just aware that the macro is actually executed after the whole
> velocity is executed. What really happen is that you produce wiki
> syntax with your velocity script which is then interpreted and macros
> are wiki syntax.

That's important to understand when you use include macros ;)

>
>>  -Mark
>>
>>
>>
>> _______________________________________________
>> devs mailing list
>> [email protected]
>> http://lists.xwiki.org/mailman/listinfo/devs
>>
>>
>
>
>
> --
> Thomas Mortagne
>



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

Reply via email to