[simpleTAL] Tabellen mit unterschiedlichen Farben erzeugen..

Django, Flask, Bottle, WSGI, CGI…
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 14. Oktober 2005, 11:26

Hab ein wenig mit TAL experimentiert und nach einer einfachen Variante gesucht, damit die Tabellen-Zeilen abwechselnd in einer anderen Farbe dargestellt wird:

Code: Alles auswählen

         from simpletal import simpleTAL, simpleTALES

         template = """
         <table>
         <tr tal:repeat="data example"
         tal:attributes="class string:color${'repeat/data/odd'}">
             <td tal:content="repeat/data/number"></td>
             <td tal:content="data/char"></td>
         </tr>
         </table>
         <style type="text/css">
             .color0 {background-color:#EEEEEE;}
             .color1 {background-color:#DDDDDD;}
         </style>
         """
         data = [{"char":chr(i)} for i in range(65, 91)]

         context = simpleTALES.Context()
         context.addGlobal("example", data)

         template = simpleTAL.compileHTMLTemplate(template)
         template.expand(context, sys.stdout)
Es funktioniert bei mir genau richtig:
<table>
<tr class="color0">
<td>1</td>
<td>A</td>
</tr><tr class="color1">
<td>2</td>
<td>B</td>
</tr><tr class="color0">
<td>3</td>
<td>C</td>
</tr><tr class="color1">
<td>4</td>
<td>D</td>
</tr><tr class="color0">

...

</table>
<style type="text/css">
.color0 {background-color:#EEEEEE;}
.color1 {background-color:#DDDDDD;}
</style>
aber macht man es wirklich so?

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Freitag 14. Oktober 2005, 14:17

jens hat geschrieben:...aber macht man es wirklich so?
Hi Jens!

Die Styles noch in den HEAD-Bereich der HTML-Seite, dann sieht das Ganze nicht mehr schlecht aus. :)

Unter Zope kann man die Funktion "test" einsetzen um nicht unbedingt auf die Zahlenwerte zugreifen zu müssen. Ob es diese Funktion auch für simpleTAL gibt, weiß ich leider nicht. Evt. kann man selbst so eine Funktion schreiben und an die Vorlage weiterreichen.

Code: Alles auswählen

<table>
  <tal:block tal:repeat="row python:['a','b','c']">
    <tr tal:define="odd repeat/row/odd"
        tal:attributes="class python:str(test(odd, 'odd', 'even'))"
    >
      <td tal:content="repeat/row/item">
        [Hier steht etwas]
      </td>
    </tr>
  </tal:block>
</table>    
lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Freitag 14. Oktober 2005, 14:29

Hi Jens!
gerold hat geschrieben:

Code: Alles auswählen

  <tal:block tal:repeat="row python:['a','b','c']">
    <tr tal:define="odd repeat/row/odd"
        tal:attributes="class python:str(test(odd, 'odd', 'even'))"
    >
Noch eine Erklärung zu dieser Struktur:
tal:define wird immer vor tal:repeat ausgeführt.

Wenn ich tal:define im selben Tag verwenden würde, könnte es noch nicht auf die Variable row zugrifen.

tal:block ist ein für TAL *nicht* existierendes Tag. Deshalb wird es im Zope vom Parser nicht angezeigt. Damit spart man sich das Ausblenden der Begin- und End-Tags mit tal:omit-tag="".

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 14. Oktober 2005, 14:38

test kennt simpleTAL wohl schon, aber anscheinend kein tal:block... Zumindest geht das hier nicht:

Code: Alles auswählen

import sys
from simpletal import simpleTAL, simpleTALES

template = """
<table>
<tal:block tal:repeat="data example"
<tr tal:define="odd repeat/row/odd"
        tal:attributes="class python:str(test(odd, 'odd', 'even'))"
    >
    <td tal:content="repeat/data/number"></td>
    <td tal:content="data/char">
        [Hier steht etwas]
    </td>
</tr>
</tal:block>
</table>
<style type="text/css">
    .color0 {background-color:#EEEEEE;}
    .color1 {background-color:#DDDDDD;}
</style>
"""
data = [{"char":chr(i)} for i in range(65, 70)]

context = simpleTALES.Context()
context.addGlobal("example", data)

template = simpleTAL.compileHTMLTemplate(template)
template.expand(context, sys.stdout)
traceback:
simpletal.simpleTAL.TemplateParseException: [</tal:block>] Close tag encountered with no corresponding open tag.

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Freitag 14. Oktober 2005, 14:54

jens hat geschrieben:test kennt simpleTAL wohl schon, aber anscheinend kein tal:block... Zumindest geht das hier nicht:
[...]

Code: Alles auswählen

<tal:block tal:repeat="data example"
simpletal.simpleTAL.TemplateParseException: [</tal:block>] Close tag encountered with no corresponding open tag.
Hi Jens!

Tag nicht geschlossen?

lg
Gerold
:-)
Zuletzt geändert von gerold am Freitag 14. Oktober 2005, 14:58, insgesamt 1-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 14. Oktober 2005, 14:57

gerold hat geschrieben:Tag nicht geschlossen?
OK, oben war noch ein Fehler drin, aber so geht's auch nicht:

Code: Alles auswählen

<table>
<tal:block tal:repeat="data example">
<tr tal:define="odd repeat/row/odd"
        tal:attributes="class python:str(test(odd, 'odd', 'even'))"
    >
    <td tal:content="repeat/data/number"></td>
    <td tal:content="data/char">
        [Hier steht etwas]
    </td>
</tr>
</tal:block>
</table>
simpletal.simpleTAL.TemplateParseException: [</tal:block>] Close tag encountered with no corresponding open tag.

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Freitag 14. Oktober 2005, 15:03

jens hat geschrieben:OK, oben war noch ein Fehler drin, aber so geht's auch nicht:
Hi Jens!

Dann werde ich mir mal simpleTAL herunterladen :)

Bis dahin sollte als Ersatz tal:omit-tag="" funktionieren.

Code: Alles auswählen

<table>
  <span tal:repeat="row python:['a','b','c']"
        tal:omit-tag=""
  >
    <tr tal:define="odd repeat/row/odd"
        tal:attributes="class python:str(test(odd, 'odd', 'even'))"
    >
      <td tal:content="repeat/row/item">
        [Hier steht etwas]
      </td>
    </tr>
  </span>
</table>    
lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 14. Oktober 2005, 15:11

gerold hat geschrieben:Bis dahin sollte als Ersatz tal:omit-tag="" funktionieren.
Das tut's auch nicht so richtig:
No handlers could be found for logger "simpleTALES.Context"
Naja, vielleicht bleib ich auch einfach bei meiner Variante? Geht ja damit schon... Oder meinst du das es nicht wirklich glücklich gelöst ist? Doof ist schon das man dann CSS Angaben mit "0" oder "1" am Ende, aber es geht...

Zum testen mußt du simpleTAL auch nicht "richtig" installieren, es reicht, wenn du es irgendwo auspackst. Es gibt ein Verz. \lib\ darin gibt es das Verz. simpletal... Du packst ein Test-Skript in \lib\ und kannst dann, wie ich, mit from simpletal import simpleTAL, simpleTALES arbeiten.

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Freitag 14. Oktober 2005, 15:16

jens hat geschrieben:Das tut's auch nicht so richtig:
Hi Jens!
Das könnte mit einigen Einschränkungen zu tun haben, die unter dieser Url aufgezählt sind: http://www.owlfish.com/software/simpleTAL/notes.html

Probiere mal "compileXMLTemplate" aus. Ich komme jetzt leider nicht mehr zum Testen.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Freitag 14. Oktober 2005, 16:24

jens hat geschrieben:
No handlers could be found for logger "simpleTALES.Context"
Hi Jens!

Das mit dem <tal:block> funktioniert anscheinend wirklich nicht.
tal:omit-tag="" funktioniert aber bestens. Damit kannst du, ohne den Inhalt zu löschen, jeden Tag ausblenden und damit zweckentfremden.
So kannst du z.B. einen Span-Tag für die Schleife verwenden, ohne diesen in der HTML-Datei angezeigt zu bekommen :-)

Da ist irgend ein Fehler beim Logging im Modul "simpleTALES.py". Damit möchte ich mich aber nicht weiter beschäftigen.

Wenn man den Import von "logging" unterbindet, dann funktioniert es bei mir.

Code: Alles auswählen

#try:
#	import logging
#except:
#	import DummyLogger as logging
import DummyLogger as logging
lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Samstag 15. Oktober 2005, 07:39

Du hast recht, die Fehlermeldung ist damit weg. Allerdings klappt dein Beispiel bei mir dennoch nicht :(
Ich hab es 1zu1 von dir übernommen und dann entsteht überhaupt keine Schleite ich erhalte nur <table></table>.
Ich hab das ganze mal angepasst:

Code: Alles auswählen

def test_simpletal():
    data = [{"char":chr(i)} for i in range(65, 91)]

    from simpletal import simpleTAL, simpleTALES

    template = """<table>
    <span tal:repeat="data example"
        tal:omit-tag=""
    >
    <tr tal:define="odd repeat/data/odd"
        tal:attributes="class python:str(test(odd, 'odd', 'even'))"
    >
      <td tal:content="data/char">
        [Hier steht etwas]
      </td>
    </tr>
    </span>
    </table>"""

    context = simpleTALES.Context()
    context.addGlobal("example", data)

    template = simpleTAL.compileHTMLTemplate(template)
    template.expand(context, sys.stdout)

if __name__=="__main__":
    test_simpletal()
Die Daten sehe ich, aber es ist immer class="0" :(

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Samstag 15. Oktober 2005, 08:36

jens hat geschrieben:Die Daten sehe ich, aber es ist immer class="0" :(
Hi Jens!

:D Ich habe die Lösung gefunden -->

Code: Alles auswählen

context = simpleTALES.Context(allowPythonPath=True)
Ohne dieses allowPythonPath arbeitet simpleTAL sehr eingeschränkt.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Samstag 15. Oktober 2005, 08:51

Hey, super :lol: Aber sag mal, warum komm ich da nicht drauf :oops:

Ich frag mich nur, warum das per default ausgeschaltet ist? Könnte das eine "Sicherheitslücke" sein? Von wegen blos keinen Python-Code im Template oder so?

EDIT: Hier ist die Antwort:
By default Python TAL paths (e.g. 'python: 1 + 2') are not allowed. If you require them, and you completely trust the authors of the templates, they can be enabled by passing in allowPythonPath=1.
Nun frag ich mich, ob ich mir vertrauen kann :roll:

Ich sollte mal schauen, ob ich nicht irgendwie die Log Funktion nutzten kann, dann hätte ich einen Hinweis bekommen.

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 17. Oktober 2005, 15:34

gerold hat geschrieben:Da ist irgend ein Fehler beim Logging im Modul "simpleTALES.py". Damit möchte ich mich aber nicht weiter beschäftigen.

Wenn man den Import von "logging" unterbindet, dann funktioniert es bei mir.
Ich glaube es lag nicht am Dummy-Logging Modul, sondern nur am fehlenden allowPythonPath=True ;)

Naja, wie dem auch sei, ich glaube die einfachere String-Variante ist besser/kürzer... Hier mal ein vergleich:

Code: Alles auswählen

import sys
from simpletal import simpleTAL, simpleTALES

template = """
<table>
<div tal:repeat="data example" tal:omit-tag="">
<tr tal:define="odd repeat/data/odd"
        tal:attributes="class python:str(test(odd, 'css_odd', 'css_even'))"
    >
    <td tal:content="repeat/data/number">Aufzählung</td>
    <td tal:content="data/char">Buchstaben</td>
</tr>
</div>
</table>
<style type="text/css">
    .css_odd {background-color:#EEEEEE;}
    .css_even {background-color:#DDDDDD;}
</style>
"""
data = [{"char":chr(i)} for i in range(65, 91)]

context = simpleTALES.Context(allowPythonPath=True)
context.addGlobal("example", data)

template = simpleTAL.compileHTMLTemplate(template)
template.expand(context, sys.stdout)
Einfachere String-Variante:

Code: Alles auswählen

import sys
from simpletal import simpleTAL, simpleTALES

template = """
<table>
<tr tal:repeat="data example"
    tal:attributes="class string:color${'repeat/data/odd'}"
>
    <td tal:content="repeat/data/number">Aufzählung</td>
    <td tal:content="data/char">Buchstaben</td>
</tr>
</table>
<style type="text/css">
    .color0 {background-color:#EEEEEE;}
    .color1 {background-color:#DDDDDD;}
</style>
"""
data = [{"char":chr(i)} for i in range(65, 70)]

context = simpleTALES.Context()
context.addGlobal("example", data)

template = simpleTAL.compileHTMLTemplate(template)
template.expand(context, sys.stdout)
Natürlich hat, deine Variante Vorteile, weil man den CSS-Klassennamen vollkommen frei wählen kann...
Die String-Variante ist dafür allerdings einen Tick schneller ;)

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Montag 17. Oktober 2005, 19:20

Hi Jens!
jens hat geschrieben:Ich glaube es lag nicht am Dummy-Logging Modul, sondern nur am fehlenden allowPythonPath=True ;)
Das es an allowPythonPath=True gescheitert ist, das glaube ich sofort, aber kommt jetzt statt der richtigen, aussagekräftigeren Fehlermeldung immer No handlers could be found for logger "simpleTALES.Context"? Ich weiß nicht, was man tun muss, damit der Logger richtig funktioniert.
jens hat geschrieben: Naja, wie dem auch sei, ich glaube die einfachere String-Variante ist besser/kürzer...
[...]
Natürlich hat, deine Variante Vorteile, weil man den CSS-Klassennamen vollkommen frei wählen kann... Die String-Variante ist dafür allerdings einen Tick schneller ;)
Es tut mir leid, dass ich dich damit unnötig aufgehalten habe. Ich würde auch eher deine ursprüngliche Variante :!: verwenden -- mir ging es nur darum, aufzuzeigen, dass TAL nicht so extrem eingeschränkt ist wie es aus deinem Beispiel hervor zu gehen schien.

Wenn du auch noch METAL einsetzt, dann hast du ein ziemlich mächtiges Vorlagensystem in der Hand. Da ich dein pyLucid noch nicht kenne, weiß ich aber nicht ob der Einsatz von METAL überhaupt zur Struktur von pyLucid passt.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten