Utente:Alebot/Scripts

Da Wikivoyage.
script ad hoc per gestione delle chiamate a {{QuickbarCity}}
#!/usr/bin/python
# -*- coding: utf-8 -*-
import wikipedia
from scripts import *

'{{}}'

def quickbarCity(ref=None):
    sito=wikipedia.Site("it","wikivoyage")
    if ref==None:
        ref=references("Template:QuickbarCity",sito)
    for i in ref:
        if i.namespace()==0:
            testo=i.get().replace("[[immagine:","[[Immagine:")\
                .replace("[[Image:","[[Immagine:")\
                .replace("[[image:","[[Immagine:")\
                .replace("[[File:","[[Immagine:")\
                .replace("[[file:","[[Immagine:")
            oldTemplate=find_stringa(testo,"{{QuickbarCity","}}",1,"{{")

            d,l=parseTemplate(testo,"QuickbarCity")
            if not "image" in d:
                print "template irregolare:",i.title()
                continue
            if "[[Immagine:" in d["image"]:
                linkOld=find_stringa(d["image"],"[[Immagine:","]]",1)
                link=linkOld[11:-2].split("|")
                immagine=link.pop(0)
                descrizione=None
                for j in link:
                    if (not j in "left;right;center") and (not j.endswith("px")):
                        descrizione=j
                        break
                if not descrizione==None:
                    immagine+="{{!}}"+descrizione
                d["image"]=immagine+"\n"
                #print i.title(),d["image"].replace(linkOld,immagine)
                newTemplate=rewrite(d,l)
                testo=testo.replace(oldTemplate,newTemplate)
                i.put(testo)
    return
da scripts.py, scripts generali per la gestione di chiamate a template tipo Infobox
# esegue il parsing di un template con tutti parametri nominali.
# Restituisce un dizionario e una lista
def parseTemplate(testo,template):
    template=template[0:1].upper()+template[1:]
    testo=testo.replace("{{"+template,"{{"+template[0:1].upper()+template[1:])\
           .replace("{{"+template[0:1].lower()+template[1:],"{{"+template[0:1].upper()+template[1:])
           
    templateOld=find_stringa(testo,"{{"+template,"}}",1,"{{")
    template=templateOld[2:-2]
    lista=[]
    l1=produci_lista(template,"{{","}}",1,"{{")
    l2=produci_lista(template,"[[","]]",1,"[[")
    l3=produci_lista(template,"\n{|","|}",1,"\n{|")
    n=0
    l=l1+l2+l3
    d={}
    for i in l:
        template=template.replace(i,"###el"+str(n)+"###",1)
        n+=1
    template=template.split("|")
    for i in range(len(template)):
        r=range(len(l))
        r.reverse()
        for j in r:
            template[i]=template[i].replace("###el"+str(j)+"###",l[j])
    l=[]
    for i in range(len(template)):
        x=template[i].split("=",1)
        if len(x)==2:
            d[x[0].strip(" \n\t\r")]=x[1]
            l.append(x[0].strip(" \n\t\r"))
        else:
            d["templateName"]=x[0].strip(" \n\t\r")
        l[0:1]=["templateName"]
        
    return d,l

#riscrive il template  da dizionario e lista parseTemplate. 
def rewrite(d,l):
    testo="{{"+d["templateName"]+"\n"
    for i in l[1:]:
        testo+=" | "+i+" = "+d[i]
    testo+="}}\n"
    return testo

def references(template,sito):
    #def getReferences(self, follow_redirects=True, withTemplateInclusion=True,
    #       onlyTemplateInclusion=False, redirectsOnly=False, internal = False)
    generatore=wikipedia.Page(sito,template).getReferences(onlyTemplateInclusion=True)
    return generatore
find_stringa() e produci_lista()
ricerca di stringhe per stringa iniziale e finale, resistente a elementi annidati (purchè "bilanciati")
# 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