Utilisateur:Darkoneko/substCategoryOfTemplates.py

Une page de Wikipédia, l'encyclopédie libre.
# -*- coding: utf-8      -*-
#Author : Darkoneko may 2009. Largely inspired of http://fr.wikipedia.org/wiki/Utilisateur:Darkoneko/ImageLinkErasor.py 's code (see file for authors)
# take a category full of templates. 
# subst all of them in all pages (only one edit per page)


import wikipedia, pagegenerators, catlib
import config, replace, re, sys, urllib, codecs


site = wikipedia.getSite()

			
			
			
			
catOfTemplates = raw_input("category of templates to subst (sans catégorie: devant) : ")
	
logUrl = "/w/api.php?format=xml&action=query&list=categorymembers&cmlimit=5000&cmnamespace=10&cmtitle=category:%s" % urllib.quote(catOfTemplates)
wikipedia.output( logUrl )
txt = wikipedia.getSite().getUrl(logUrl)

findDeleted = re.compile(u'title="[^"]+"')
deletedPics = findDeleted.findall(txt)


wikipedia.output(u"%s templates trouvés. " % ( len(deletedPics))  )

listInput = []
for template in deletedPics:
    template = re.sub(u'title="Modèle:([^"]+)"','\g<1>', template ) 
    template = urllib.unquote(template)
    template = template.replace("'","\'").replace("&", "&").replace(""", "\"")
    listInput.append( template ) #on remplie un tableau avec les noms traités 
    #print template
	
#unique regex : cherche tous les modeles dans tous les liens
regexpSubst  = '{{(%s)}}' % ( "|".join(listInput) )
replaceSubst = u'{{subst:\g<1>}}'

nbre = len(listInput)
for compteur in range(0, nbre) :
        nom_ref = listInput[compteur]
        nom_ref = urllib.unquote(nom_ref.strip())
        
        #pages incluant le modele
        url = u"/w/api.php?format=xml&action=query&eilimit=5000&list=embeddedin&einamespace=0|4|6|10|12|14|100&eititle=template:%s" % urllib.quote(nom_ref.encode("utf-8"))
        txt = wikipedia.getSite().getUrl(url)
        regexRelatedPages = re.compile(u' title="(?P<title>[^"]+)"')
        relatedPages = regexRelatedPages.findall(txt)

        
        nb_pages = len(relatedPages)
        if nb_pages == 0: #aucun lien trouvé, au suivant
            wikipedia.output(u"Aucune page liée pour \03{lightblue}%s\03{default}" % nom_ref)
            continue   

        wikipedia.output(u"%s Page(s) liée(s) pour \03{lightyellow}%s\03{default}" % (nb_pages, nom_ref) )	

        #suppression pour chaque page
        for i in range(0, nb_pages) : 
            wikipedia.setAction(u"Robot: subst de templates inutiles")
            replaceList = [
                        (regexpSubst, replaceSubst, True), #sans confirmation
            ]

            bot = ReplaceRobotModified( relatedPages[i], replaceList, [], False, regex=True)
            bot.run()