mso@oz.net wrote: >Graham Fawcett wrote: > >>This is a request-for-speculation. I've been thinking about an extension >>to PTL that I'd like to make, and wondered if you might scan my example >>below & provide feedback. > > >Interesting idea. My concerns would be not getting in the way of existing >usage, not being fragile, and not being a huge code bloat. I'm not sure I >would use it; when the template starts to use several levels of tags >(indented levels), I start reaching for a traditional template language >like Cheetah that makes the tags explicit in the source. Thanks for the feedback, Mike. Fragility would be a concern; yet another layer of code-transformation would take place during a PTL import, and that could lead to a lot of confusion when something goes wrong. I don't think bloat is as significant, unless you mean "concept bloat"; the translation code itself could be quite compact. It is another concept to soak in, and in that sense it may be a deterrent to new PTL users. Having said that, I think these same problems occur (sometimes) with other templating languages: yet another language to learn, yet another way to do it. >If we do this, we should probably define a third output style rather than >overloading '[html]'. But this would be orthogonical to the [text/html] >switch. Maybe '[html, block]'. Interesting idea. Perhaps it could also be an extension to the enable_ptl call, like 'enable_ptl(extended_syntax=True)'. >> TABLE(_class='nice_table'): # or some other class-hack > >css_class= is the Quixote standard. Ah, true. I never really used the forms modules, and should have checked this. Of course, that's the tags, not the block-syntax, but it ought to be consistent with Quixote. >># a custom block definition, using a str() expression >>alert = 'div style="color: red;"' >> alert: > >This syntax and use is a bit surprising. What about requiring tags to be >your special tag object? And encouraging .open_block() and .close_block() >to call quixote.html.htmltag(), so there will be consistency between the >parts of a Quixote application. Somehow you'd want to support default >attributes but let the user override them. Maybe something like this: Yes, the string-syntax was a bit of a throw-in. I will yank it out of the proposal, unless anyone chimes in and absolutely loves it. ;-) >We should use htmltext() consistent with our recommendations to users. >It's already confusing enough to know when to htmltext() things and when >to str() them. So anything that comes in with markup chars should be >htmltext'd or generated by htmltag(). > Good point. >> A(href='%d/edit' % person.id): >> 'Edit' >> A('Delete', # *args-style tag syntax >> href='%d/delete' % person.id) > > >In Python, keywords introducing a block cannot also be function names. >I'm not sure we should break that tradition. It would also prevent us >from leveraging the Python parser, I think. Well, it might. But even if it didn't, a consistent syntax is a good idea, and certainly the example above is inconsistent. I would be happy with the block-only form; it may be verbose at times, but it's clean. >Putting the body (positional arg) before the attributes (keywords) is >confusing. How urgent is it to support the args-style syntax? Could we >have a special keyword arg for the body (body=)? Are multiple positional >args allowed? Yet another point in favour of dropping the tag-as-function alternative. I'm leaning toward tags as blocks, and only tags allowed in block definitions (where a "tag" is any object that supports "open_block" and "close_block" methods). >> * I've considered a tag-inlining syntax, so that you could write >> one-liners like "UL: LI: A('Main', href='/')". I'm torn, though; >> while more efficient, it would be harder to parse, and contravenes >> the Python-style recommendation against inlining block-level >> expressions. > > >Sounds too confusing for human maintainers. What would the indentation >be? What would a dedent do? A one-LI UL is so rare we don't need a >one-line syntax for it. One-line ULs might be a bad example, I do have a lot of code like "P: A(href='foo'): ...". But in the sake of consistency, I'll drop this idea. >>I think it takes the regularity of 'stan' syntax, and adds great >>readability through the block syntax, without requiring map() or >>listcomps to get iteration, or other declarative hacks to handle >>conditionals in the midst of a complex page. > >Yes, it reminded me of stan, but with an even cleaner syntax. It has some >good potential in that regard. I'm just not sure of putting it into the >default PTL, which is already magical enough with its import hook and >straight-to-pyc compiling. Could it be done as a third-party alternative >to PTL? It could be separated from PTL. But, in my mind, the proposed syntax depends heavily on PTL's "collect the bare expressions" strategy. I suppose it's conceivable to use the block-syntax without this. Before responding to your message, Mike, I rigged up a horrible little implementation (don't read the code, just execute it! :-) You can hook it into PTL with a quick, easily-reversed patch, and give it a try. http://fawcett.medialab.uwindsor.ca/quixote/eptl-1.0.tar Of course, it's pre-feedback, so some of my earlier ideas are present in the implementation. (If anyone actually tries the implementation, but has problems with it, email me directly with bug reports; I don't want to clutter the list.) Thanks, Graham