[ZPT] Any news on Template Style Sheet Language?
Ian Bicking
ianb at colorstudy.com
Mon Dec 6 14:23:14 EST 2004
Evan Simpson wrote:
> Ian Bicking wrote:
>
>> Interesting, I hadn't seen that before. I'm not sure if it's playing
>> the role of an XSLT-type transformation, or... what exactly. I feel
>> like it should fit into some already-existing templating style, but
>> I can't determine exactly what.
>
>
> I doubt it fits. TERSE allows you to express the sorts of tag-scoped
> operations that TAL supports, but using CSS-style pattern matching. It
> is slightly similar in function to XSLT, but only slightly.
>
>> Part of what confuses me about it is that it seems to apply both
>> before normal ZPT substitution, and after. There's something
>> DOM-like about it, for these seem similar:
>>
>> img#portal { [src] = "$base/${attrs/src}"; }
>>
>> and:
>>
>> document.getElementById('portal').setAttribute( 'src', '%s/%s' %
>> (base, attrs.src))
>
>
> Here's the semantic model that I use: First, the document is searched
> for matches to TERSE rules. Next, the rules are "attached" to the
> matched nodes, mixing them in a deterministic way with TAL statements
> found on the same node. Finally, the template is rendered in the same
> fashion as a TAL-only ZPT, except that there are additional statements
> to execute along the way.
>
> It takes a bit of getting used to, but the model is *quite* different
> from manipulate-the-DOM approaches.
I'm still not seeing it. Besides being more convenient and whatnot,
which isn't exactly fundamental.
For both TERSE and DOM, ZPT must work on some well-defined
representation of HTML/XML source, not just text, and not just an
internal data structure. In that, I believe both cases require
attaching data that can't necessarily be serialized back into HTML.
Well, one difference might be that TERSE gets evaluated lazily (?);
before normal ZPT constructs, but just barely. At least that's how I'm
interpreting what you call mixing rules deterministically with TAL
statements.
>> This leads to the question -- which is a more accessible way to
>> approach these modifications, from Python or form a stylesheet? I
>> think there are valid reasons for these kinds of transformations.
>> The pluses and minuses are the same as for any domain-specific
>> language, I think; because you are working before ZPT comes into
>> play, these transformations really implement a kind of language, for
>> better or worse.
>
>
> One large practical advantage that the ruleset approach has over DOM
> manipulation is this: you can combine a template and a ruleset into a
> "compiled" representation (TAL-like bytecode) that can then be rendered
> effeciently with different data sets. Typical DOM code, on the other
> hand, must repeatedly search and transform the document's tree each time
> that it is run.
Well, potentially; you could also save the DOM just like you save the
TERSE compiled form. In that case, though, the DOM would have to work
less concretely on the source, creating expressions meant for future
evaluation instead of directly manipulating the structure. So, taking
the last example:
els = document.getElementsByClass('item-list')
for el in els:
el.zptOverride = ItemSubber(el)
class ItemSubber:
def __init__(self, el): self.el = el
def enter(self, namespace):
items = tal_eval(namespace, self.el.getAttribute('items'))
if not items:
new = el.document.createElement('b')
new.appendChild(el.document.createTextNode('No items'))
el.parentNode.replaceChild(new, el)
else:
namespace['items'] = items
def exit(self, namespace):
try:
del namespace['items']
except KeyError: pass
Then ZPT looks for the zptOverride attribute, and calls enter and exit
functions, or something like that. This starts getting annoying to
express with the DOM, but one can imagine helper classes and functions
to make this more pleasant to work with. Or, for that matter, you could
create these transformations from TERSE source. It's got to turn into
Python at some point, after all.
> I also believe that rulesets are more "granular" than DOM code. It is
> straightforward to add or modify rules in a ruleset, or to combine
> independently created rulesets.
I think the CSS-like selectors encourage a more granular way of looking
at the problem. It could be implemented the same way with the DOM,
including composability, but there'd be less implicit guidance towards
that style. Of course, if the DOM included methods that were equivalent
to CSS selectors, that'd help a great deal. (And why doesn't it?)
--
Ian Bicking / ianb at colorstudy.com / http://blog.ianbicking.org
More information about the ZPT
mailing list