Re: Thoughts on a block-syntax extension to PTL

Graham Fawcett <[email protected]>
Newsgroups gmane.comp.web.quixote.user
Message-ID <[email protected]>
[email protected] 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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.