#!/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