mini templating system

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
Costi
User
Beiträge: 544
Registriert: Donnerstag 17. August 2006, 14:21

Montag 9. Juli 2007, 01:33

bin im moment etwas muede und das ding wurde nur rudimentaer getestet (-;

wie auch immer:
es handelt sich eine kompakte, flexible templating language:
hier ein beispiel:

Code: Alles auswählen

==def create_form():
<form href=test>
==for i in range(10):
feld nr {i+1} <input name={i}> <br />
<hr />
==end
</form>
==end

==create_form()
wird compiliert in python code:

Code: Alles auswählen

def create_form():
    write('''
    <form href=test>
    ''')
    for i in range(10):
        write('''
        feld nr ''' + str(i+1) + ''' <input name=''' + str(i) + '''> <br />
        <hr />
        ''')
    write('''
    </form>
    ''')
create_form()
und dass sendet (je nachdem was `write` macht) schlieslich folgendes an dem browser:

Code: Alles auswählen

    <form href=test>
    
        feld nr 1 <input name=0> <br />
        <hr />
        
        feld nr 2 <input name=1> <br />
        <hr />
        
        feld nr 3 <input name=2> <br />
        <hr />
        
        feld nr 4 <input name=3> <br />
        <hr />
        
        feld nr 5 <input name=4> <br />
        <hr />
        
        feld nr 6 <input name=5> <br />
        <hr />
        
        feld nr 7 <input name=6> <br />
        <hr />
        
        feld nr 8 <input name=7> <br />
        <hr />
        
        feld nr 9 <input name=8> <br />
        <hr />
        
        feld nr 10 <input name=9> <br />
        <hr />
        
    </form>
und hier schlieslich mein code:

Code: Alles auswählen



stri = """

==def create_form():
<form href=test>
==for i in range(10):
feld nr {i+1} <input name={i}> <br />
<hr />
==end
</form>
==end

==create_form()
"""


class Indent:
    def __init__(self, indent='    '):
        self.indent = indent
        self.data = ''
        self.level = 0
    def up(self):
        self.level += 1
    def down(self):
        self.level -= 1
    def write(self, stri):
        for line in stri.splitlines():
            self.data += self.level*self.indent + line + '\n'
            
    def __str__(self):
        return self.data


def mk_vars(stri):
    """
    ersetzt "helo {user}" mit "helo ''' + user + '''"
    """
    retval = ''
    recording = False
    for char in stri:
        if char == '{':
            retval += "''' + str("
        elif char == '}':
            stack = ''
            retval += ") + '''"
        else:
            retval += char
    return retval

i = Indent()
prev_statement = True
for line in stri.splitlines():
    line = line.strip()
    if not line:
        continue
    if line.startswith('=='):
        if not prev_statement:
            i.write("''')")
        prev_statement = True
        line = line[2:]
        if line == 'end':
            i.down()
        else:
            i.write(line)
            i.up()
    else:
        if prev_statement:
            i.write("write('''")
        i.write(mk_vars(line))
        prev_statement = False
    
print i


Zuletzt geändert von Costi am Montag 9. Juli 2007, 19:18, insgesamt 1-mal geändert.
cp != mv
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Montag 9. Juli 2007, 09:25

Also da finde ich folgendes, http://www.python-forum.de/topic-7267.html einfach mal schicker.

Besonders die Syntax gefällt mir nicht so.

Und wie es ausschaut, kann jeglicher Pythoncode verwendet werden. Das ist weder sicher noch schön.


MFG EnTeQuAk
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Montag 9. Juli 2007, 11:14

Costi, meinst du zufällig "indent" und nicht "intend"?
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 9. Juli 2007, 15:20

Costi hat geschrieben:es handelt sich eine kompakte, flexible templating lenguage
Ich gehe mal davon aus das du "language" meinst und setze hinzu dass sie eine ziemlich obskure Syntax hat. Den Code will ich mir gar nicht erst so genau ansehen, weil du dem Leser durch das Fehlen von Kommentaren nicht entgegenkommst.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Costi
User
Beiträge: 544
Registriert: Donnerstag 17. August 2006, 14:21

Montag 9. Juli 2007, 19:25

heul doch (-;

nein,
ich hab jetzt language mit "a" geschreiben, "intend" mit "indent" replacet

und mich auf einem kommentar konzentriert


der syntax ist in der tat ungwoehnlich,
ich find ihm aber leicht zu lesen und schreiben und hab daher sogar jinja auf diesen syntax umkonfiguriert
cp != mv
Antworten