On Fri, Jun 23, 2000 at 08:39:01AM -0700, Joe Pallas wrote:
I'm pretty sure "new syntax" DTML is not actually valid XML, but it doesn't really matter: it's a bad idea either way. The new syntax is a misguided attempt to mix the base and meta levels, which can only result in confusion.
DTML is not markup, it is a macro language for generating markup. As such, it will not always be possible to coerce it into a form that meets the syntax rules of the base language. But meeting those rules, and consequently being able to use XML editors, is the only real justification for the new syntax.
<h1 <!--#if "fervor > 2"-->class="hot"<!--#/if-->> How do I do this in "new" DTML? </h1>
<h1 <dtml-if "fervor > 2">class="hot"</dtml-if>> This isn't valid XML (bad attribute). </h1>
<dtml-if expr="fervor > 2"> <h1 class="hot"> <dtml-else> <h1> </dtml-if> This isn't valid XML, either (bad nesting). </h1>
<dtml-if expr="fervor > 2"> <h1 class="hot"> This is very clumsy and does not scale. </h1> <dtml-else> <h1> ...but I think it is valid XML. </h1> </dtml-if>
Also, XML requires all attributes to be quoted, so forget about using the implicit name/expr distinction with your shiny new XML editor.
The new syntax doesn't satisfy the arguments that were given to support it, and it decreases the readability and maintainability of DTML code that uses it by making it hard to distinguish DTML directives from markup. I avoid it, and I don't recommend it to others.
The reason to introduce the now-not-so-new-anymore syntax was to make it more pallatable to _HTML_ editors, not XML editors. To this end also the DTML entity syntax was introduced, so you could easily embed variables and object calls (whith various formatting options) inside tags. With the enitity reference we can get closer to XML conformance. The above could also be formatted as: <dtml-let fervor_class="_.test(fervor > 2, 'class=\x22hot\x22', '')"> <h1 &dtml_-fervor_class;> This is, as far as I can see, valid XML, if maybe somewhat convoluted. </h1> </dtml-let> The let tag combined with the _.test() method will assign a value of 'class="hot"' or '' to fervor_class, which is then inserted into the generated text without any formatting. But, again, the DTML syntax wasn't designed for this. It doesn't do namespaces. The <dtml-else> tag in a <dtml-if></dtml-if> isn't technically an empty tag, yet XML would dictate it is, and also require a / at the end. Etc. It was purely designed to be tolerated by an HTML editor, that doesn't care about bad nesting or what an empty tag should look like. We just tried to make a WYSIWYG HTML editor a bit more useful for HTML with DTML in it. -- Martijn Pieters | Software Engineer mailto:mj@digicool.com | Digital Creations http://www.digicool.com/ | Creators of Zope http://www.zope.org/ | The Open Source Web Application Server ---------------------------------------------