[PageD'Accueil] [IndexDesTitres] [IndexDesTermes

Suite et évolution du script sur http://flibuste.net/pythreries/templython

Code Template

Incorporation de code python dans une page HTML, style PHP,ASP ou JSP.

L'idée est de transformer une page HTML en un script Python qui pourra être facilement importable (et donc bytecompilé)

Format du template :

pour insérer du code python
<py>code_python</py>

pour afficher à partir du code python :
 _out += "chaine à afficher"

pour utiliser une variable globale :
 glob.nom_de_la_variable

pour afficher directement une variable
 <py>=nom_de_la_variable</py>

Le compilateur :

LICENCE GPL pour tout les codes de cette page

#!/usr/bin/python

def compiler(file,cible="."):
    """ compile le fichier file, retourne le résultat (près à être exécuté), et l'enregistre éventuellement dans le répertoire cible"""
    f=open(file)
    res=f.read()
    id_py_fin=0
    _out="# Fichier auto-généré\n"
    _out+="def run(glob=None):\n _out=''"
    while 1:
        id_py=res.find("<py>",id_py_fin)
        if id_py==-1:
            break

        _out+='\n _out+="""%s"""\n'%(res[id_py_fin:id_py])
        id_py+=4
        id_py_fin=res.find("</py>",id_py)
        if id_py_fin==-1:
            break
        if res[id_py]=="=":
            _out+="\n _out+=str("+res[id_py+1:id_py_fin]+")"
        else:
            _out+=" "+res[id_py:id_py_fin].replace("\n","\n ")
        id_py_fin+=5
    if id_py_fin>0:
        _out+= '\n _out+="""%s"""\n'%(res[id_py_fin:])
    else:
        _out=res
    _out+="\n return _out"
    if cible!=None:
        import os
        import os.path
        file=os.path.basename(file)
        file=os.path.splitext(file)[0]
        f=open(cible+os.sep+file+".py","w")
        f.write(_out)
        f.close()
    return _out

def compilerDir(dir):
    """ compile un répertoire entier"""
    _out=""
    import os
    for file in os.listdir(dir):
        if file[-5:]==".html":
            _out+=file+"\n"
            file=os.path.join(dir,file)
            if os.path.isfile(file):
                compiler(file,dir)
    return _out

un exemple de template :

<html>
<body>
Coucou !
<py>
for i in range(10):
 _out+=str(i)
</py>
i=<py>=i</py>

Variable globale g=<py>=glob.g</py>
fonction globale f=<py>=glob.foo()</py>
</body></html>

le script qui va importer ce template :

class glob:
 g="Je suis une variable globale"
 def foo(self):
  return "je suis une fonction globale"
 import test
 print test.run(glob())

et finalement, le résultat :

<html>
<body>
Coucou !
0123456789
i=9

Variable globale g=Je suis une variable globale
fonction globale f=je suis une fonction globale
</body></html>

2016-06-05 21:43