Seite 1 von 1

mini templating system

Verfasst: Montag 9. Juli 2007, 01:33
von Costi
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



Verfasst: Montag 9. Juli 2007, 09:25
von EnTeQuAk
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

Verfasst: Montag 9. Juli 2007, 11:14
von Y0Gi
Costi, meinst du zufällig "indent" und nicht "intend"?

Re: mini templating system

Verfasst: Montag 9. Juli 2007, 15:20
von Leonidas
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.

Verfasst: Montag 9. Juli 2007, 19:25
von Costi
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