macro(<name>,<param-name>,...,<param-name>) -------------------------------------------
example:
<table do="macro(mytable,list,td-class)"> <tr do="forEach($list)"> <td class="${$class}">${item}</td> </tr> </table>
We also need an evalBody as in JXTG. And maybe we should have a possibilty to give a name space to the macro name.
We also need: - some script compiler directives i.e. for cache control (as in JXTG) - template inclusion so the templates may be defined in a separate file
Named macros rock! This way we can completely eliminate the need for this hack:
http://cocoon.apache.org/2.1/userdocs/flow/jxtemplate.html#eval
Imagine that user wants to render a fancy table providing only a header rendering macro and a row template:
<tr do="macro(tableHeader,context)"> <th>Elem1</th> <th>Elem2</th> </tr>
<tr do="macro(singleRow,context)"> <td>{context.elem1}</td> <td>{context.elem2}</td> </tr>
<table do="macro(mytable,list,headerMacro,rowMacro)"> <!-- some fancy longish code here --> <tr> <th>No.</th> <th do="eval($headerMacro)"/> </tr> <tr do="forEach($list)"> <td>${index}</td> <td do="eval($rowMacro,context=.)"/><!-- problem here --> </tr> </table>
Lovely!
Still I see one problem: as every directive is bound to some tag one should be able to eval the macro and strip the root element. In my case the output would look like this:
<tr> <th>No.</th> <tr> <th>Elem1</th> <th>Elem2</th> </tr> </tr>
This would fix it: <th do="eval($headerMacro,stripRoot=true)"/>
If we used tags we would be able to introduce <jx:template> as in jxtg that would not show up in the output. Here we have no such possibility.
IMO this one is not that clear as the same syntax using tags. This will be also a lot harder to implement as we will have to create much more sophisticated parser. With tags, the xml syntax does 95% of parsing itself with only a little amount of additional coding.Several directives ------------------
So, how do we handle multiple directives for one element? We could handle the TAL example above like:
<p do="let(x=/a/long/path/from/the/root;if(x);content(x/txt);attributes(class=x/class)">
What hits me is how the attribute based syntax can be compact comparing to this monster :)<jx:let name="x" value="/a/long/path/from/the/root"> <jx:if test="x"> <jx:content select="x/txt"> <jx:attribute name="class" value="x/class"> <p>Ex Text</p> </jx:attribute> </jx:content> </jx:if> <jx:let>
I understand this is completely orthogonal functionality to the one you described.Formating? ----------
IMO most of the basic formating can be done in a special conversion layer as we have discussed in the convertor thread.
I have not given any detailed thought to all of the constructions above, just wanted to concretize what attribute driven templating could look like in Cocoon.I am only afraid how I will explain the directive ordering to my developers. Moreover: how many mistakes they will make, which IMO will be much harder to trace comparing to old verbose syntax.
WDYT?
-- Leszek Gawron [EMAIL PROTECTED] Project Manager MobileBox sp. z o.o. +48 (61) 855 06 67 http://www.mobilebox.pl mobile: +48 (501) 720 812 fax: +48 (61) 853 29 65