Progetto:Bot/Programmi in Python per i bot/parseTemplate.py

Da Wikisource.
#!/usr/bin/python
# -*- coding: utf-8  -*-
"""Analizzatore di template.

Passandogli il testo di un template restituisce un dizionario in cui ["nome"] contiene il nome del template, [parametro] (numerico, esplicito o implicito, o nominale) il contenuto del parametro.

Esempi:
>>> parseTemplate("{{Centrato|'''I tre mascalzoni tornano ad imperversare.'''}}")
{'1': "'''I tre mascalzoni tornano ad imperversare.'''", 'nome': 'Centrato'}

>>> parseTemplate("{{Centrato|'''I tre mascalzoni tornano ad imperversare.'''}}")["1"]
"'''I tre mascalzoni tornano ad imperversare.'''"
"""
import re

# Nuova versione, gestisce i tag annidati; x e' la parte "aspecifica" del
# tag di apertura (es: {{ cercando {{Intestazione| )
def find_stringa(stringa,idi,idf,dc=0,x=None,side="left"):
    if side=="right":
        idip=stringa.rfind(idi)
    else:
        idip=stringa.find(idi)
    idfp=stringa.find(idf,idip+len(idi))+len(idf)
    if idip>-1 and idfp>0:
        if x!=None:
            while stringa[idip:idfp].count(x)>stringa[idip:idfp].count(idf):
                if stringa[idip:idfp].count(x)>stringa[idip:idfp].count(idf):
                    idfp=stringa.find(idf,idfp)+len(idf)
                
        if dc==0:
            vvalore=stringa[idip+len(idi):idfp-len(idf)]
        else:
            vvalore=stringa[idip:idfp]
    else:
        vvalore=""
    return vvalore

def produci_lista(testo,idi,idf,dc=1,inizio=None):
    t=testo[:]
    lista=[]
    while not find_stringa(t,idi,idf,1,inizio)=="":
        el=find_stringa(t,idi,idf,1,inizio)
        t=t.replace(el,"",1)
        if dc==0:
            el=find_stringa(el,idi,idf,0,inizio)
        lista.append(el)
    return lista


def parseTemplate(template):
    elementi={}
    n=1
    template=template.strip()[2:-2]
    #codifica link
    x=produci_lista(template,"[[","]]",1)
    for i in x:
        key="##%d##" % (n)
        elementi[key]=i
        template=template.replace(i,key)
        n+=1
    #codifica template
    x=produci_lista(template,"{{","}}",1,"{{")
    
    for i in x:
        key="##%d##" % (n)
        elementi[key]=i
        template=template.replace(i,key)
        n+=1

    #codifica url
    x=produci_lista(template,"[","]",1)
    
    for i in x:
        key="##%d##" % (n)
        elementi[key]=i
        template=template.replace(i,key)
        n+=1
    template=template.split("|")
    #normalizzazione parametri e decodifica elementi codificati: link, url e template
    n=1
    for i in range(1,len(template)):
        if not "=" in template[i]:
            template[i]=str(n)+" = "+template[i]
            n+=1
    
    
        template[i]=template[i].strip()
        for j in elementi:
            template[i]=template[i].replace(j,elementi[j])
    templateDict={}
    templateDict["nome"]=template[0].strip()
    r=re.compile(" *= *")
    for i in range(1,len(template)):
        tv=r.split(template[i])
        templateDict[tv[0].strip()]=tv[1].strip()

    return templateDict