[ZPT] TAL omitAllTags proposal

Michael Fair michael@daclubhouse.net
Mon, 25 Mar 2002 10:42:30 -0800


Without meaning any offense, shouldn't this kind of
SQL code generation really be generated in a Python
Script (or even DTML Method) then merely rendered
using ZPT?

The reason this is so stange using ZPT is that it
is doing more than what ZPT's are designed for.

Wouldn't it be easier to pass this logic off to something
outside the page template where you have the kind of
branching and string manipulation tools you want
to make this kind of string development easy?

-- Michael --

----- Original Message -----
From: "Godefroid Chapelle" <gotcha@swing.be>
To: <zpt@zope.org>
Sent: Friday, March 22, 2002 3:08 AM
Subject: [ZPT] TAL omitAllTags proposal


> We are using PageTemplates outside Zope to generate SQL data definitions.
>
> You find hereunder the type of code we wrote first in order to get
> well-formatted (human readable) SQL code.
>
> CREATE TABLE <tal:block tal:replace="table/name"/> (
> <tal:block tal:repeat="field table/field"> <tal:block
> tal:replace="field/name"/> <tal:block tal:replace="field/type"/><tal:block
> tal:condition="python:hasattr(field,'length')">(<tal:block
> tal:replace="field/length"/>)</tal:block><tal:block
> tal:condition="python:hasattr(field,'notnull')"> NOT
> NULL</tal:block><tal:block
> tal:condition="python:hasattr(field,'foreignkey')"> REFERENCES <tal:block
> tal:replace="field/foreignkey/table/name"/>(<tal:block
> tal:replace="field/foreignkey/field/name"/>)</tal:block>,</tal:block>
> PRIMARY KEY (<tal:block tal:repeat="primarykey
> table/primarykeys"><tal:block tal:replace="primarykey/name"/><tal:block
> tal:condition="not:repeat/primarykey/end">, </tal:block></tal:block>)
> );
>
>
> This type of code is quite difficult to debug because of the multiplicity
> of 'tal:block' elements.
> So we rewrote it like this :
>
> CREATE TABLE <tablename tal:omit-tag="" tal:replace="table/name"/> (
> <fields tal:omit-tag="" tal:repeat="field table/field"> <fieldname
> tal:omit-tag="" tal:replace="field/name"/> <fieldtype tal:omit-tag=""
> tal:replace="field/type"/><typelength tal:omit-tag=""
> tal:condition="python:hasattr(field,'length')">(<tal:block
> tal:replace="field/length"/>)</typelength><notnull tal:omit-tag=""
> tal:condition="python:hasattr(field,'notnull')"> NOT
> NULL</notnull><foreignkey tal:omit-tag=""
> tal:condition="python:hasattr(field,'foreignkey')"> REFERENCES <tablename
> tal:omit-tag="" tal:replace="field/foreignkey/table/name"/>(<fieldname
> tal:omit-tag=""
> tal:replace="field/foreignkey/field/name"/>)</foreignkey>,</fields>
> PRIMARY KEY (<primarykeys tal:omit-tag="" tal:repeat="primarykey
> table/primarykeys"><tal:block tal:replace="primarykey/name"/><comma
> tal:omit-tag="" tal:condition="not:repeat/primarykey/end">,
> </comma></primarykeys>)
> );
>
> where we get easier code to debug but with a lot of 'tal:omit-tag'.
>
>
> As I am generating SQL, I know I do not want any xml-like tags. I would
> like to state it and avoid repetitions of 'tal:omit-tag'.
> I would be able to use the following code:
>
> CREATE TABLE <tablename tal:replace="table/name"/> (
> <fields tal:repeat="field table/field"> <fieldname
> tal:replace="field/name"/> <fieldtype
tal:replace="field/type"/><typelength
> tal:condition="python:hasattr(field,'length')">(<tal:block
> tal:replace="field/length"/>)</typelength><notnull
> tal:condition="python:hasattr(field,'notnull')"> NOT
> NULL</notnull><foreignkey
> tal:condition="python:hasattr(field,'foreignkey')"> REFERENCES <tablename
> tal:replace="field/foreignkey/table/name"/>(<fieldname
> tal:replace="field/foreignkey/field/name"/>)</foreignkey>,</fields>
> PRIMARY KEY (<primarykeys tal:repeat="primarykey
> table/primarykeys"><tal:block tal:replace="primarykey/name"/><comma
> tal:condition="not:repeat/primarykey/end">, </comma></primarykeys>)
> );
>
>
> I went through the python source code. It was really easy to add the
feature.
>
>
> I came to the following patches:
>
> TAL/HTMLTALParser.py ( 1.30.4.3.4.1 )
>
> 102c
> <     def __init__(self, gen=None):
> ---
>  >     def __init__(self, gen=None, omitAllTags=0):
> 109a
>  > self.omitAllTags = omitAllTags
> 288a288,289
>  > if self.omitAllTags:
>  >                 taldict['omit-tag'] = ''
>
>
> PageTemplates/PageTemplate.py ( 1.20.10.2 )
>
> 49c49,50
> <     def pt_edit(self, text, content_type):
> ---
>  >     def pt_edit(self, text, content_type, omitAllTags=0):
>  > self.omitAllTags = omitAllTags
> 145c
> <             parser = HTMLTALParser(gen)
> ---
>  >             parser = HTMLTALParser(gen, self.omitAllTags)
>
>
> As both patches are light and nonintrusive, I propose to introduce them in
> the core.
>
>
> --
>
> Godefroid Chapelle
>
> BubbleNet sprl
> rue Victor Horta, 18 / 202
> 1348 Louvain-la-Neuve
> Belgium
>
> Tel + 32 (10) 459901
> Mob + 32 (477) 363942
>
> TVA 467 093 008
> RC Niv 49849
>
>
> _______________________________________________
> ZPT mailing list
> ZPT@zope.org
> http://lists.zope.org/mailman/listinfo/zpt
>