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