Bot: Aggiornamento {{Bio}} come da richiesta: rimozione |Categorie

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import wikipedia, catlib, re, codecs, myLibs, time


def writeNonCambiati(file, title, txt):
  wikipedia.output(txt)
  file.write('# [['+title+']] - '+txt+'\n')
  file.flush()


catRemove = ['Biografie']

def main(*args):
  summary = u'[[WP:BOT|Bot]]: Aggiornamento {{tl|Bio}} come da [[Wikipedia:Bot/Richieste#Aggiornamento del parametro Categorie nel Template:Bio|richiesta]]: rimozione |Categorie\n'
  site = wikipedia.getSite()
  tempPage = wikipedia.Page(site, "Template:Bio")
  refPages = tempPage.getReferences()
  countEdited = 0
  all = False
  output = codecs.open('template_bio_lista_diff.txt', encoding='utf-8', mode='w+')
  output.write(summary)
  outputNonCambiati = codecs.open('template_bio_lista_non_cambiati.txt', encoding='utf-8', mode='w+')
  outputNonCambiati.write(u"Lista delle voci afferenti al template {{tl|Bio}} con parametro |Categorie ma non modificate\n")
  
  for page in refPages:
    if page.namespace() != 0:
      continue
    wikipedia.output(u'Processing... '+page.title())
    
    # download page
    while 1:
      try:
        content = page.get()
        break
      except:
        print "Waiting 10 seconds and retry"
        time.sleep(10)
    
    edited = 0
    cats = page.categories()
    ptl = re.compile(r'\{\{([Tt]emplate:)?[Bb]io(.*?)\}\}', re.DOTALL)
    tl = ptl.findall(content)
    if len(tl) != 1:
      if len(tl) != 0:
        writeNonCambiati(outputNonCambiati, page.title(), 'ho trovato '+str(len(tl))+' template bio nella pagina')
    else:
      cont = tl[0][1]
      p = re.compile(r'(\||^)\s*[Cc]ategorie\s*=((\s*\[\[.*?\]\])+|.*?)\s*($|\|)', re.DOTALL)
      l = p.findall(cont)
      if len(l) != 1:
        if len(l) != 0:
          writeNonCambiati(outputNonCambiati, page.title(), 'ho trovato '+str(len(l))+' linee |Categorie')
      else:
        contenuto = l[0][1].strip()
        if contenuto != '' and contenuto != 'no':
          cont = p.sub(l[0][0]+"Categorie = no\n"+l[0][3], cont)
          text = ptl.sub('{{Bio'+cont+'}}', content)
          edited = 1
        else:
          if contenuto == '':
            writeNonCambiati(outputNonCambiati, page.title(), 'parametro |Categorie esistente ma senza contenuti')
          
    if edited != 0:
      for catName in catRemove:
        cat = catlib.Category(site, catName)
        if cat in cats:
          cats.remove(cat)
      cats.sort()
      text = wikipedia.replaceCategoryLinks(text, cats, site)
      wikipedia.showDiff(content, text)
      if not all:
        choice = wikipedia.inputChoice(u"Modificare?",  ['Yes', 'No', 'All'], ['y', 'N', 'a'], 'N')
      else:
        choice = 'y'
      if choice in ['A', 'a']:
        all = True
        choice = 'y'
      output.write('* '+str(countEdited)+'. [['+page.title()+']]')
      if choice in ['Y', 'y']:
        countEdited += 1
        #page.put_async(text, summary)
        output.write(' - NON EDITATA su richista manuale')
      output.write('\n<pre>\n'+myLibs.getDiff(content, text)+'</pre>\n\n')
      output.flush()
    
  output.close()
  outputNonCambiati.close()



if __name__ == "__main__":
  try:
    main()
  finally:
    wikipedia.stopme()

la funzione myLibs.getDiff è la showDiff della libreria wikipedia modificata per ottenere il testo del diff invece di stamparlo a video, e senza la colorazione, in modo da usarlo per la scrittura del file di log del lavoro