You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@velocity.apache.org by Jonathan Revusky <re...@gmail.com> on 2007/06/24 16:05:36 UTC

Re: [jira] Created: (VELOCITY-558) Allow macros that act as blockDirectives

Guido Deinhammer (JIRA) wrote:
> Allow macros that act as blockDirectives
> ----------------------------------------
> 
>                  Key: VELOCITY-558
>                  URL: https://issues.apache.org/jira/browse/VELOCITY-558
>              Project: Velocity
>           Issue Type: Improvement
>           Components: Engine
>     Affects Versions: 1.5
>          Environment: Windows
>             Reporter: Guido Deinhammer
>             Priority: Minor
> 
> 
> Currently migrating a web project from Oracle's proprietary UIX to Velocity, I found the limitation that macros are always line directives and cannot ave content somewhat limiting.
> 
> I would suggest the following improvement or addition to the macro functionality.
> 
> You should be able to define a blockMacro - maybe with a syntax like this:
> 
> #blockmacro(section $title $open)
> <table><th><td>$title</td></th>
> #if($open)
>   #body
> #end
> </table>
> #end
> 
> Where #body would render the body of the macro call. The macro call could look like this:
> 
> #section("My Collapsible Section", true)
> <tr><td>sectionContent</td></tr>
> #end
> 
> This allows the macro to render the content only under a certain condition, or it would allow the macro to render the content multiple times. I think this would a lot of flexibilty to macros - it might be an enhancement worth considering for the Summer of Code Google project.

IMO, at this stage of history, the above-requested feature should 
actually be considered part of the basic feature set of any template 
engine (particularly for use on the web). It is very hard to use macros 
to encapsulate commonly used snippets of HTML coding without this.

FreeMarker has had this for nearly 5 years. I implemented this in code 
in mid or maybe late 2002, IIRC. Rather than the #body directive that 
Guido proposes, FreeMarker uses <#nested>. Same difference.

See:

http://freemarker.org/docs/dgui_misc_userdefdir.html

or

http://freemarker.org/docs/ref_directive_macro.html

I was going to drop an email to Guido Deinhammer but couldn't find his 
email address.

I think it proper to reply here, since many people might need this, it 
being such a basic thing.

And so as to avoid more such informative emails, another extremely basic 
deficiency in Velocity's macro system, that you can't load macros from 
another template using the #parse directive -- you can do this in 
FreeMarker, of course. Though, unlike the above feature of macros with 
nested blocks, which I implemented in code in 2002, the ability to 
dynamically #include templates with other macros in them has been in 
FreeMarker since well before I was active in the project, like 1999 or 
so -- actually, amazingly, before the Velocity project even existed. 
This is also a very basic capability without which it is near-impossible 
to organize one's templates according to the DRY (don't repeat yourself) 
principle.

I think the above could be useful information for people.

Jonathan Revusky
--
lead developer, FreeMarker project, http://freemarker.org/






> 
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@velocity.apache.org
For additional commands, e-mail: dev-help@velocity.apache.org