# -*- coding: utf-8 -*-
# Biobot revolution - Alpha
#
# Copyright 2008 Simone Malacarne
# La base del codice del parser è
# Copyright 2008 [[Utente:Wiso]]
#
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 2 of the License, or (at your
# option) any later version.
import re
import wikipedia
from pysqlite2 import dbapi2 as sqlite3
import catlib
import pagegenerators
from time import time, localtime, strftime
def templatesWithParams(thistxt):
# remove commented-out stuff etc.
thistxt = wikipedia.removeDisabledParts(thistxt)
# marker for | in wikilink
marker = '@@'
while marker in thistxt:
marker += '@'
result = []
count = 0
templateRemove = re.compile(u'{{(?!(.)?([Tt]emplate:)?[\n ]*?[Bb]io).*?}}', re.DOTALL)
#thistxt = wikipedia.replaceExcept(thistxt, u'{{(?!([Tt]emplate:)?[\n ]*?[Bb]io).*?}}', u'', ['comment',])
thistxt = re.sub(templateRemove, '', thistxt) # die die die!!!!
Rtemplate = re.compile(u'{{[\n\r ]*?([Tt]emplate:)?([Bb]io).*?(\|(?P<params>[^{]+?))?}}',re.DOTALL) # regex principale
RMarker = re.compile(r'(\[\[.+?)\|(.+?\]\])')
m = Rtemplate.search(thistxt)
testosenzatemplate = Rtemplate.sub(u'', thistxt, 1) # toglie il testo del template bio dal testo (solo la prima occorrenza)
if not m:
#wikipedia.output('\03{lightred}ERROR 70: NON RIESCO A TROVARE IL TEMPLATE\03{default}')
return ([], '')
# Parameters
paramString = m.group('params')
params = []
if paramString:
paramString = RMarker.sub('\\1%s\\2' % marker, paramString)
# Parse string
markedParams = paramString.split('|')
for param in markedParams:
param = param.replace(marker,u'|')
params.append(param)
return params, testosenzatemplate
def ordinaTemplate(templateTxt):
import operator
forzaOrdFlag = 0
marcatore = {} #prepare un dizionario vuoto per inserire i campi presenti nella lista
global tempaErrore
tempaErrore = 0 # flag per indicare che c'è un errore nel template, caso 0 nessun errore
for i in range(len(templateTxt)):
if '=' not in templateTxt[i]:
#wikipedia.output('\03{lightred}ERROR 83: IL CAMPO "%s" NON CONTIENE "=", salto ordinamento\03{default}' %templateTxt[i])
tempaErrore += 1 # usiamo le unità nel caso manchi il parametro =
templateTxt[i] = ('Parametro Fake = 1400') # scrive nel campo errato un valore ininfluente a caso
templateTxt[i] = templateTxt[i].split('=')
templateTxt[i][0] = templateTxt[i][0].strip()
templateTxt[i][1] = templateTxt[i][1].strip()
if templateTxt[i][0].lower() not in marcatore: # nel caso in cui siano inseriti parametri doppi
marcatore[templateTxt[i][0].lower()] = templateTxt[i][1] #inserisce nel dizionario i campi presenti nel template
else:
tempaErrore += 10 # usiamo le decine per segnalare parametri doppi
templateTxt[i][0] = 'Parametro Fake2'
#print templateTxt[i]
if u'nome' in marcatore:
tempOrd = marcatore[u'nome'] #nel caso in cui il campo non sia nel dizionario e quindi non nella lista lo aggiungi
else:
templateTxt.append((u'nome',''))
tempOrd = '' # se 'nome' non esiste creiamo comunque la variabile tempOrd con valore null. Altrimenti con 'cognome' avremmo un errore per l'utilizzo di una variabile che non esiste
if u'cognome' in marcatore:
if marcatore[u'cognome'] != '': tempOrd = marcatore[u'cognome'] + ' ' + tempOrd # l'if serve per evitare che aggiunga uno spazio inutile
else:
templateTxt.append((u'cognome',''))
if u'forzaordinamento' in marcatore: #se esiste la usiamo
if marcatore[u'forzaordinamento'] == '':
forzaOrdFlag = 1 # questo serve se uno ha la grandiosa idea di metter il campo senza valori
else:
templateTxt.append((u'forzaordinamento', tempOrd)) #se non esiste la creiamo con l'accoppiata (cognome, nome)
if u'annonascita' not in marcatore:
templateTxt.append((u'annonascita',''))
if u'giornomesenascita' not in marcatore:
templateTxt.append((u'giornomesenascita',''))
if u'annomorte' not in marcatore:
templateTxt.append((u'annomorte',''))
if u'giornomesemorte' not in marcatore:
templateTxt.append((u'giornomesemorte',''))
if u'nazionalità' not in marcatore:
templateTxt.append((u'nazionalità',''))
if u'attività' not in marcatore:
templateTxt.append((u'attività',''))
if u'attività2' not in marcatore:
templateTxt.append((u'attività2',''))
if u'attività3' not in marcatore:
templateTxt.append((u'attività3',''))
if u'attivitàaltre' not in marcatore:
templateTxt.append((u'attivitàaltre',''))
templateTxt.sort(key=lambda x: funzioneOrdine(x[0])) #riordina la lista, l'ordine è stabilito dalla funzione 'funzioneOrdine'
if forzaOrdFlag == 1:
templateTxt[2][1] = tempOrd
return templateTxt
def funzioneOrdine(x): # confronta i due valori in base ad una lista predefinita, serve come riferimento alla funzione di ordinamento sorted o sort
global tempaErrore
x = x.strip()
#x = x[0].lower() + x[1:] #rende minuscola solo l'iniziale mentre a noi serve tutto minuscolo
x = x.lower()
ordine = [
u'nome',
u'cognome',
u'forzaordinamento',
u'giornomesenascita',
u'annonascita',
u'giornomesemorte',
u'annomorte',
u'nazionalità',
u'attività',
u'attività2',
u'attività3',
u'attivitàaltre',
u'sesso',
u'luogonascita',
u'luogonascitaalt',
u'luogonascitalink',
u'postcognomevirgola',
u'epoca',
u'epoca2',
u'postcognome',
u'luogomorte',
u'luogomortealt',
u'luogomortelink',
u'preattività',
u'postnazionalità',
u'nazionalitànaturalizzato',
u'immagine',
u'dimimmagine',
u'titolo',
u'specialità1',
u'specialità2',
u'specialità3',
u'specialità4',
u'categorie',
u'fineincipit',
u'predata',
u'premio1',
u'annopremio1',
u'premio2',
u'annopremio2',
u'premio3',
u'annopremio3',
u'premio4',
u'annopremio4',
u'didascalia',
u'notenascita',
u'notemorte',
u'parametro fake',
u'parametro fake2'] #viene inserito nel caso di parametri doppi, metto qua per non avere falsi positivi nel controllo dei parametri inventati
try: # nel caso uno dei due elementi non esista basta che vada in fondo alla lista per non rompere
a = ordine.index(x)
except ValueError:
a = 999
tempaErrore = tempaErrore + 100 # usiamo le centinaio per segnalare i parametri inventati
#wikipedia.output(u'ERROR 00 \03{lightred} Non trovo il seguente argomento "%s"\03{default}' %x)
return a
def scorriWiki(): #procedura principale per la creazione e l'aggiormanto del database da internet
con = sqlite3.connect('/home/simo/pywikipedia/bio.sqlite') #si collega al database TODO gestione errore di apertura db
c = con.cursor()
try:
c.execute('DELETE FROM bio WHERE titolo <> ""')
con.commit()
except:
wikipedia.output('Creazione nuovo database')
c.execute('PRAGMA synchronous = OFF') #PROVA
dbinaggiornamento = 0
out_file = open('erroribio.txt', 'w') # prepara un file per loggare gli errori del bio
try:
c.execute('''create table bio(titolo text, interwiki integer, nome text, cognome text, ordinamento text, gmnascita text,
annonascita text, gmmorte text, annomorte text, nazione text, attiv1 text, attiv2 text, attiv3 text, attivaltre text, agg integer)''')
except: #TODO vedere i vari tipi di eccezione
wikipedia.output('Database già esistente. Aggiornamento')
dbinaggiornamento = 1 #il database è già esistente e sarà aggiornato
i = 0 # temporaneo per interrompere l'aggiornamento dopo x voci
tempo = time()
site = wikipedia.getSite()
cat = catlib.Category(site,'Categoria:BioBot')
gen = pagegenerators.PreloadingGenerator(cat.articles(), pageNumber=200)
for page in gen: #scorre la categoria indicata
while page.isRedirectPage():
wikipedia.output(u'La pagina è un REDIRECT, seguo il redirect')
page = page.getRedirectTarget()
i += 1
if i % 200 == 0:
wikipedia.output("numero %i - tempo %f" % (i, time() - tempo))
tempo = time()
#if i == 2: break # dopo xx voci stacca, per test
titoloPagina = page.title() #TODO da inserire la gestione errori nel caso in cui ci sia un errore di rete
try:
#page = wikipedia.Page(site, u"Utente:IlPisano/Biotest")
text = page.get()
while True: # questo while serve per il caso di doppio template
tempa, testosenzatemplate = templatesWithParams(text) #devono essere trasferiti nelle funzioni da creare
if tempa == []: break
tempa = ordinaTemplate(tempa)
t = (titoloPagina, len(page.interwiki()), tempa[0][1], tempa[1][1], tempa[2][1], tempa[3][1], tempa[4][1],
tempa[5][1], tempa[6][1], tempa[7][1], tempa[8][1], tempa[9][1], tempa[10][1], tempa[11][1], 1)
c.execute('insert or replace into bio values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', t)
text = testosenzatemplate
except wikipedia.NoPage:
wikipedia.output(u'\03{lightred}ERROR 120 Page %s not found\03{lightdefault}' % page.aslink())
con.commit()
c.close
#out_file.close()
return
def liveandletdie():
date = [
u'1 gennaio', u'2 gennaio', u'3 gennaio', u'4 gennaio', u'5 gennaio', u'6 gennaio', u'7 gennaio', u'8 gennaio', u'9 gennaio',
u'10 gennaio', u'11 gennaio', u'12 gennaio', u'13 gennaio', u'14 gennaio', u'15 gennaio', u'16 gennaio', u'17 gennaio',
u'18 gennaio', u'19 gennaio', u'20 gennaio', u'21 gennaio', u'22 gennaio', u'23 gennaio', u'24 gennaio', u'25 gennaio',
u'26 gennaio', u'27 gennaio', u'28 gennaio', u'29 gennaio', u'30 gennaio', u'31 gennaio', u'1 febbraio', u'2 febbraio',
u'3 febbraio', u'4 febbraio', u'5 febbraio', u'6 febbraio', u'7 febbraio', u'8 febbraio', u'9 febbraio', u'10 febbraio',
u'11 febbraio', u'12 febbraio', u'13 febbraio', u'14 febbraio', u'15 febbraio', u'16 febbraio', u'17 febbraio', u'18 febbraio',
u'19 febbraio', u'20 febbraio', u'21 febbraio', u'22 febbraio', u'23 febbraio', u'24 febbraio', u'25 febbraio', u'26 febbraio',
u'27 febbraio', u'28 febbraio', u'29 febbraio', u'1 marzo', u'2 marzo', u'3 marzo', u'4 marzo', u'5 marzo', u'6 marzo',
u'7 marzo', u'8 marzo', u'9 marzo', u'10 marzo', u'11 marzo', u'12 marzo', u'13 marzo', u'14 marzo', u'15 marzo', u'16 marzo',
u'17 marzo', u'18 marzo', u'19 marzo', u'20 marzo', u'21 marzo', u'22 marzo', u'23 marzo', u'24 marzo', u'25 marzo', u'26 marzo',
u'27 marzo', u'28 marzo', u'29 marzo', u'30 marzo', u'31 marzo',u'1 aprile', u'2 aprile', u'3 aprile', u'4 aprile', u'5 aprile',
u'6 aprile', u'7 aprile', u'8 aprile', u'9 aprile',
u'10 aprile', u'11 aprile', u'12 aprile', u'13 aprile', u'14 aprile', u'15 aprile', u'16 aprile', u'17 aprile',
u'18 aprile', u'19 aprile', u'20 aprile', u'21 aprile', u'22 aprile', u'23 aprile', u'24 aprile', u'25 aprile',
u'26 aprile', u'27 aprile', u'28 aprile', u'29 aprile', u'30 aprile',u'1 maggio', u'2 maggio', u'3 maggio', u'4 maggio',
u'5 maggio', u'6 maggio', u'7 maggio', u'8 maggio', u'9 maggio',
u'10 maggio', u'11 maggio', u'12 maggio', u'13 maggio', u'14 maggio', u'15 maggio', u'16 maggio', u'17 maggio',
u'18 maggio', u'19 maggio', u'20 maggio', u'21 maggio', u'22 maggio', u'23 maggio', u'24 maggio', u'25 maggio',
u'26 maggio', u'27 maggio', u'28 maggio', u'29 maggio', u'30 maggio', u'31 maggio', u'1 giugno', u'2 giugno',
u'3 giugno', u'4 giugno', u'5 giugno', u'6 giugno', u'7 giugno', u'8 giugno', u'9 giugno',
u'10 giugno', u'11 giugno', u'12 giugno', u'13 giugno', u'14 giugno', u'15 giugno', u'16 giugno', u'17 giugno',
u'18 giugno', u'19 giugno', u'20 giugno', u'21 giugno', u'22 giugno', u'23 giugno', u'24 giugno', u'25 giugno',
u'26 giugno', u'27 giugno', u'28 giugno', u'29 giugno', u'30 giugno', u'1 luglio', u'2 luglio', u'3 luglio',
u'4 luglio', u'5 luglio', u'6 luglio', u'7 luglio', u'8 luglio', u'9 luglio',
u'10 luglio', u'11 luglio', u'12 luglio', u'13 luglio', u'14 luglio', u'15 luglio', u'16 luglio', u'17 luglio',
u'18 luglio', u'19 luglio', u'20 luglio', u'21 luglio', u'22 luglio', u'23 luglio', u'24 luglio', u'25 luglio',
u'26 luglio', u'27 luglio', u'28 luglio', u'29 luglio', u'30 luglio', u'31 luglio', u'1 agosto', u'2 agosto',
u'3 agosto', u'4 agosto', u'5 agosto', u'6 agosto', u'7 agosto', u'8 agosto', u'9 agosto',
u'10 agosto', u'11 agosto', u'12 agosto', u'13 agosto', u'14 agosto', u'15 agosto', u'16 agosto', u'17 agosto',
u'18 agosto', u'19 agosto', u'20 agosto', u'21 agosto', u'22 agosto', u'23 agosto', u'24 agosto', u'25 agosto',
u'26 agosto', u'27 agosto', u'28 agosto', u'29 agosto', u'30 agosto', u'31 agosto', u'1 settembre', u'2 settembre',
u'3 settembre', u'4 settembre', u'5 settembre', u'6 settembre', u'7 settembre', u'8 settembre', u'9 settembre',
u'10 settembre', u'11 settembre', u'12 settembre', u'13 settembre', u'14 settembre', u'15 settembre', u'16 settembre', u'17 settembre',
u'18 settembre', u'19 settembre', u'20 settembre', u'21 settembre', u'22 settembre', u'23 settembre', u'24 settembre', u'25 settembre',
u'26 settembre', u'27 settembre', u'28 settembre', u'29 settembre', u'30 settembre', u'1 ottobre', u'2 ottobre',
u'3 ottobre', u'4 ottobre', u'5 ottobre', u'6 ottobre', u'7 ottobre', u'8 ottobre', u'9 ottobre',
u'10 ottobre', u'11 ottobre', u'12 ottobre', u'13 ottobre', u'14 ottobre', u'15 ottobre', u'16 ottobre', u'17 ottobre',
u'18 ottobre', u'19 ottobre', u'20 ottobre', u'21 ottobre', u'22 ottobre', u'23 ottobre', u'24 ottobre', u'25 ottobre',
u'26 ottobre', u'27 ottobre', u'28 ottobre', u'29 ottobre', u'30 ottobre', u'31 ottobre', u'1 novembre', u'2 novembre',
u'3 novembre', u'4 novembre', u'5 novembre', u'6 novembre', u'7 novembre', u'8 novembre', u'9 novembre',
u'10 novembre', u'11 novembre', u'12 novembre', u'13 novembre', u'14 novembre', u'15 novembre', u'16 novembre', u'17 novembre',
u'18 novembre', u'19 novembre', u'20 novembre', u'21 novembre', u'22 novembre', u'23 novembre', u'24 novembre', u'25 novembre',
u'26 novembre', u'27 novembre', u'28 novembre', u'29 novembre', u'30 novembre', u'1 dicembre', u'2 dicembre', u'3 dicembre',
u'4 dicembre', u'5 dicembre', u'6 dicembre', u'7 dicembre', u'8 dicembre', u'9 dicembre',
u'10 dicembre', u'11 dicembre', u'12 dicembre', u'13 dicembre', u'14 dicembre', u'15 dicembre', u'16 dicembre', u'17 dicembre',
u'18 dicembre', u'19 dicembre', u'20 dicembre', u'21 dicembre', u'22 dicembre', u'23 dicembre', u'24 dicembre', u'25 dicembre',
u'26 dicembre', u'27 dicembre', u'28 dicembre', u'29 dicembre', u'30 dicembre', u'31 dicembre']
datedir = {
u'1 gennaio':u'001',
u'2 gennaio':u'002',
u'3 gennaio':u'003',
u'4 gennaio':u'004',
u'5 gennaio':u'005',
u'6 gennaio':u'006',
u'7 gennaio':u'007',
u'8 gennaio':u'008',
u'9 gennaio':u'009',
u'10 gennaio':u'010',
u'11 gennaio':u'011',
u'12 gennaio':u'012',
u'13 gennaio':u'013',
u'14 gennaio':u'014',
u'15 gennaio':u'015',
u'16 gennaio':u'016',
u'17 gennaio':u'017',
u'18 gennaio':u'018',
u'19 gennaio':u'019',
u'20 gennaio':u'020',
u'21 gennaio':u'021',
u'22 gennaio':u'022',
u'23 gennaio':u'023',
u'24 gennaio':u'024',
u'25 gennaio':u'025',
u'26 gennaio':u'026',
u'27 gennaio':u'027',
u'28 gennaio':u'028',
u'29 gennaio':u'029',
u'30 gennaio':u'030',
u'31 gennaio':u'031',
u'1 febbraio':u'032',
u'2 febbraio':u'033',
u'3 febbraio':u'034',
u'4 febbraio':u'035',
u'5 febbraio':u'036',
u'6 febbraio':u'037',
u'7 febbraio':u'038',
u'8 febbraio':u'039',
u'9 febbraio':u'040',
u'10 febbraio':u'041',
u'11 febbraio':u'042',
u'12 febbraio':u'043',
u'13 febbraio':u'044',
u'14 febbraio':u'045',
u'15 febbraio':u'046',
u'16 febbraio':u'047',
u'17 febbraio':u'048',
u'18 febbraio':u'049',
u'19 febbraio':u'050',
u'20 febbraio':u'051',
u'21 febbraio':u'052',
u'22 febbraio':u'053',
u'23 febbraio':u'054',
u'24 febbraio':u'055',
u'25 febbraio':u'056',
u'26 febbraio':u'057',
u'27 febbraio':u'058',
u'28 febbraio':u'059',
u'29 febbraio':u'060',
u'1 marzo':u'061',
u'2 marzo':u'062',
u'3 marzo':u'063',
u'4 marzo':u'064',
u'5 marzo':u'065',
u'6 marzo':u'066',
u'7 marzo':u'067',
u'8 marzo':u'068',
u'9 marzo':u'069',
u'10 marzo':u'070',
u'11 marzo':u'071',
u'12 marzo':u'072',
u'13 marzo':u'073',
u'14 marzo':u'074',
u'15 marzo':u'075',
u'16 marzo':u'076',
u'17 marzo':u'077',
u'18 marzo':u'078',
u'19 marzo':u'079',
u'20 marzo':u'080',
u'21 marzo':u'081',
u'22 marzo':u'082',
u'23 marzo':u'083',
u'24 marzo':u'084',
u'25 marzo':u'085',
u'26 marzo':u'086',
u'27 marzo':u'087',
u'28 marzo':u'088',
u'29 marzo':u'089',
u'30 marzo':u'090',
u'31 marzo':u'091',
u'1 aprile':u'092',
u'2 aprile':u'093',
u'3 aprile':u'094',
u'4 aprile':u'095',
u'5 aprile':u'096',
u'6 aprile':u'097',
u'7 aprile':u'098',
u'8 aprile':u'099',
u'9 aprile':u'100',
u'10 aprile':u'101',
u'11 aprile':u'102',
u'12 aprile':u'103',
u'13 aprile':u'104',
u'14 aprile':u'105',
u'15 aprile':u'106',
u'16 aprile':u'107',
u'17 aprile':u'108',
u'18 aprile':u'109',
u'19 aprile':u'110',
u'20 aprile':u'111',
u'21 aprile':u'112',
u'22 aprile':u'113',
u'23 aprile':u'114',
u'24 aprile':u'115',
u'25 aprile':u'116',
u'26 aprile':u'117',
u'27 aprile':u'118',
u'28 aprile':u'119',
u'29 aprile':u'120',
u'30 aprile':u'121',
u'1 maggio':u'122',
u'2 maggio':u'123',
u'3 maggio':u'124',
u'4 maggio':u'125',
u'5 maggio':u'126',
u'6 maggio':u'127',
u'7 maggio':u'128',
u'8 maggio':u'129',
u'9 maggio':u'130',
u'10 maggio':u'131',
u'11 maggio':u'132',
u'12 maggio':u'133',
u'13 maggio':u'134',
u'14 maggio':u'135',
u'15 maggio':u'136',
u'16 maggio':u'137',
u'17 maggio':u'138',
u'18 maggio':u'139',
u'19 maggio':u'140',
u'20 maggio':u'141',
u'21 maggio':u'142',
u'22 maggio':u'143',
u'23 maggio':u'144',
u'24 maggio':u'145',
u'25 maggio':u'146',
u'26 maggio':u'147',
u'27 maggio':u'148',
u'28 maggio':u'149',
u'29 maggio':u'150',
u'30 maggio':u'151',
u'31 maggio':u'152',
u'1 giugno':u'153',
u'2 giugno':u'154',
u'3 giugno':u'155',
u'4 giugno':u'156',
u'5 giugno':u'157',
u'6 giugno':u'158',
u'7 giugno':u'159',
u'8 giugno':u'160',
u'9 giugno':u'161',
u'10 giugno':u'162',
u'11 giugno':u'163',
u'12 giugno':u'164',
u'13 giugno':u'165',
u'14 giugno':u'166',
u'15 giugno':u'167',
u'16 giugno':u'168',
u'17 giugno':u'169',
u'18 giugno':u'170',
u'19 giugno':u'171',
u'20 giugno':u'172',
u'21 giugno':u'173',
u'22 giugno':u'174',
u'23 giugno':u'175',
u'24 giugno':u'176',
u'25 giugno':u'177',
u'26 giugno':u'178',
u'27 giugno':u'179',
u'28 giugno':u'180',
u'29 giugno':u'181',
u'30 giugno':u'182',
u'1 luglio':u'183',
u'2 luglio':u'184',
u'3 luglio':u'185',
u'4 luglio':u'186',
u'5 luglio':u'187',
u'6 luglio':u'188',
u'7 luglio':u'189',
u'8 luglio':u'190',
u'9 luglio':u'191',
u'10 luglio':u'192',
u'11 luglio':u'193',
u'12 luglio':u'194',
u'13 luglio':u'195',
u'14 luglio':u'196',
u'15 luglio':u'197',
u'16 luglio':u'198',
u'17 luglio':u'199',
u'18 luglio':u'200',
u'19 luglio':u'201',
u'20 luglio':u'202',
u'21 luglio':u'203',
u'22 luglio':u'204',
u'23 luglio':u'205',
u'24 luglio':u'206',
u'25 luglio':u'207',
u'26 luglio':u'208',
u'27 luglio':u'209',
u'28 luglio':u'210',
u'29 luglio':u'211',
u'30 luglio':u'212',
u'31 luglio':u'213',
u'1 agosto':u'214',
u'2 agosto':u'215',
u'3 agosto':u'216',
u'4 agosto':u'217',
u'5 agosto':u'218',
u'6 agosto':u'219',
u'7 agosto':u'220',
u'8 agosto':u'221',
u'9 agosto':u'222',
u'10 agosto':u'223',
u'11 agosto':u'224',
u'12 agosto':u'225',
u'13 agosto':u'226',
u'14 agosto':u'227',
u'15 agosto':u'228',
u'16 agosto':u'229',
u'17 agosto':u'230',
u'18 agosto':u'231',
u'19 agosto':u'232',
u'20 agosto':u'233',
u'21 agosto':u'234',
u'22 agosto':u'235',
u'23 agosto':u'236',
u'24 agosto':u'237',
u'25 agosto':u'238',
u'26 agosto':u'239',
u'27 agosto':u'240',
u'28 agosto':u'241',
u'29 agosto':u'242',
u'30 agosto':u'243',
u'31 agosto':u'244',
u'1 settembre':u'245',
u'2 settembre':u'246',
u'3 settembre':u'247',
u'4 settembre':u'248',
u'5 settembre':u'249',
u'6 settembre':u'250',
u'7 settembre':u'251',
u'8 settembre':u'252',
u'9 settembre':u'253',
u'10 settembre':u'254',
u'11 settembre':u'255',
u'12 settembre':u'256',
u'13 settembre':u'257',
u'14 settembre':u'258',
u'15 settembre':u'259',
u'16 settembre':u'260',
u'17 settembre':u'261',
u'18 settembre':u'262',
u'19 settembre':u'263',
u'20 settembre':u'264',
u'21 settembre':u'265',
u'22 settembre':u'266',
u'23 settembre':u'267',
u'24 settembre':u'268',
u'25 settembre':u'269',
u'26 settembre':u'270',
u'27 settembre':u'271',
u'28 settembre':u'272',
u'29 settembre':u'273',
u'30 settembre':u'274',
u'1 ottobre':u'275',
u'2 ottobre':u'276',
u'3 ottobre':u'277',
u'4 ottobre':u'278',
u'5 ottobre':u'279',
u'6 ottobre':u'280',
u'7 ottobre':u'281',
u'8 ottobre':u'282',
u'9 ottobre':u'283',
u'10 ottobre':u'284',
u'11 ottobre':u'285',
u'12 ottobre':u'286',
u'13 ottobre':u'287',
u'14 ottobre':u'288',
u'15 ottobre':u'289',
u'16 ottobre':u'290',
u'17 ottobre':u'291',
u'18 ottobre':u'292',
u'19 ottobre':u'293',
u'20 ottobre':u'294',
u'21 ottobre':u'295',
u'22 ottobre':u'296',
u'23 ottobre':u'297',
u'24 ottobre':u'298',
u'25 ottobre':u'299',
u'26 ottobre':u'300',
u'27 ottobre':u'301',
u'28 ottobre':u'302',
u'29 ottobre':u'303',
u'30 ottobre':u'304',
u'31 ottobre':u'305',
u'1 novembre':u'306',
u'2 novembre':u'307',
u'3 novembre':u'308',
u'4 novembre':u'309',
u'5 novembre':u'310',
u'6 novembre':u'311',
u'7 novembre':u'312',
u'8 novembre':u'313',
u'9 novembre':u'314',
u'10 novembre':u'315',
u'11 novembre':u'316',
u'12 novembre':u'317',
u'13 novembre':u'318',
u'14 novembre':u'319',
u'15 novembre':u'320',
u'16 novembre':u'321',
u'17 novembre':u'322',
u'18 novembre':u'323',
u'19 novembre':u'324',
u'20 novembre':u'325',
u'21 novembre':u'326',
u'22 novembre':u'327',
u'23 novembre':u'328',
u'24 novembre':u'329',
u'25 novembre':u'330',
u'26 novembre':u'331',
u'27 novembre':u'332',
u'28 novembre':u'333',
u'29 novembre':u'334',
u'30 novembre':u'335',
u'1 dicembre':u'336',
u'2 dicembre':u'337',
u'3 dicembre':u'338',
u'4 dicembre':u'339',
u'5 dicembre':u'340',
u'6 dicembre':u'341',
u'7 dicembre':u'342',
u'8 dicembre':u'343',
u'9 dicembre':u'344',
u'10 dicembre':u'345',
u'11 dicembre':u'346',
u'12 dicembre':u'347',
u'13 dicembre':u'348',
u'14 dicembre':u'349',
u'15 dicembre':u'350',
u'16 dicembre':u'351',
u'17 dicembre':u'352',
u'18 dicembre':u'353',
u'19 dicembre':u'354',
u'20 dicembre':u'355',
u'21 dicembre':u'356',
u'22 dicembre':u'357',
u'23 dicembre':u'358',
u'24 dicembre':u'359',
u'25 dicembre':u'360',
u'26 dicembre':u'361',
u'27 dicembre':u'362',
u'28 dicembre':u'363',
u'29 dicembre':u'364',
u'30 dicembre':u'365',
u'31 dicembre':u'366'}
def scriviwiki(nuovotesto, titolopagina, dataordinale, acceptall= None):
site = wikipedia.getSite()
if dataordinale in (8, 11, 39, 42, 68, 71, 99, 102, 129, 132, 160, 163, 190, 193, 221, 224, 252, 255, 282, 285, 313, 316, 343, 346):
page = wikipedia.Page(site, (u"Nati l'" + titolopagina))
elif dataordinale in (1, 32, 61, 92, 122, 153, 183, 214, 245, 275, 306, 336):
page = wikipedia.Page(site, (u'Nati il 1º ' + titolopagina[2:]))
else:
page = wikipedia.Page(site, (u'Nati il ' + titolopagina))
#page = wikipedia.Page(site, 'Utente:Fungo/Biotest')
while page.isRedirectPage():
wikipedia.output(u'La pagina è un REDIRECT, seguo il redirect')
page = page.getRedirectTarget()
try:
text = page.get()
if not page.canBeEdited():
wikipedia.output(u"\03{lightred}ERROR 90 You can't edit page %s\03{default}" % page.aslink())
return
except wikipedia.NoPage:
wikipedia.output(u'\03{lightred}ERROR 120 Page %s not found\03{lightdefault}' % page.aslink())
return
except wikipedia.IsRedirectPage:
wikipedia.output(u'\03{lightyellow}FATAL ERROR 100 Page is redirect.\03{default}')
return
if text!=nuovotesto:
wikipedia.output(' ------------------diff-------------------')
wikipedia.showDiff(text, nuovotesto)
wikipedia.output(' -----------------------------------------')
#wikipedia.setAction(message[:-2])
if not acceptall:
choice = wikipedia.inputChoice(u'Do you want to accept these changes?', ['Yes', 'No', 'All'], ['y', 'N', 'a'], 'N')
if choice in ['a', 'A']:
acceptall = True
if choice in ['y', 'Y']:
page.put_async(nuovotesto, u'{{[[Progetto:Biografie|biobot]]}} aggiornamento voci')
if acceptall:
try:
page.put(nuovotesto, u'{{[[Progetto:Biografie|biobot]]}} aggiornamento voci')
except wikipedia.EditConflict:
wikipedia.output(u'Skipping %s because of edit conflict' % (page.title(),))
except wikipedia.SpamfilterError, e:
wikipedia.output(u'Cannot change %s because of blacklist entry %s' % (page.title(), e.url))
except wikipedia.PageNotSaved, error:
wikipedia.output(u'\03{lightred}ERROR 10 putting page: %s\03{default' % (error.args,))
except wikipedia.LockedPage:
wikipedia.output(u'Skipping %s (locked page)' % (page.title(),))
else:
wikipedia.output('\03{lightyellow}WARNING 30 Nessuna modifica da fare\03{default}')
return
return acceptall
def scriviwikiMorti(nuovotesto, titolopagina, dataordinale, acceptall= None):
site = wikipedia.getSite()
if dataordinale in (8, 11, 39, 42, 68, 71, 99, 102, 129, 132, 160, 163, 190, 193, 221, 224, 252, 255, 282, 285, 313, 316, 343, 346):
page = wikipedia.Page(site, (u"Morti l'" + titolopagina))
elif dataordinale in (1, 32, 61, 92, 122, 153, 183, 214, 245, 275, 306, 336):
page = wikipedia.Page(site, (u'Morti il 1º ' + titolopagina[2:]))
else:
page = wikipedia.Page(site, (u'Morti il ' + titolopagina))
#page = wikipedia.Page(site, 'Utente:Fungo/Biotest')
while page.isRedirectPage():
wikipedia.output(u'La pagina è un REDIRECT, seguo il redirect')
page = page.getRedirectTarget()
try:
text = page.get()
if not page.canBeEdited():
wikipedia.output(u"\03{lightred}ERROR 90 You can't edit page %s\03{default}" % page.aslink())
return
except wikipedia.NoPage:
wikipedia.output(u'\03{lightred}ERROR 120 Page %s not found\03{lightdefault}' % page.aslink())
return
except wikipedia.IsRedirectPage:
wikipedia.output(u'\03{lightyellow}FATAL ERROR 100 Page is redirect.\03{default}')
return
if text!=nuovotesto:
wikipedia.output(' ------------------diff-------------------')
wikipedia.showDiff(text, nuovotesto)
wikipedia.output(' -----------------------------------------')
#wikipedia.setAction(message[:-2])
if not acceptall:
choice = wikipedia.inputChoice(u'Do you want to accept these changes?', ['Yes', 'No', 'All'], ['y', 'N', 'a'], 'N')
if choice in ['a', 'A']:
acceptall = True
if choice in ['y', 'Y']:
page.put_async(nuovotesto, u'{{[[Progetto:Biografie|biobot]]}} aggiornamento voci')
if acceptall:
try:
page.put(nuovotesto, u'{{[[Progetto:Biografie|biobot]]}} aggiornamento voci')
except wikipedia.EditConflict:
wikipedia.output(u'Skipping %s because of edit conflict' % (page.title(),))
except wikipedia.SpamfilterError, e:
wikipedia.output(u'Cannot change %s because of blacklist entry %s' % (page.title(), e.url))
except wikipedia.PageNotSaved, error:
wikipedia.output(u'\03{lightred}ERROR 10 putting page: %s\03{default' % (error.args,))
except wikipedia.LockedPage:
wikipedia.output(u'Skipping %s (locked page)' % (page.title(),))
else:
wikipedia.output('\03{lightyellow}WARNING 30 Nessuna modifica da fare\03{default}')
return
return acceptall
def scriviwikiAnni(nuovotesto, titolopagina, acceptall= None):
site = wikipedia.getSite()
if titolopagina[0] == u'8' or titolopagina == u'11' or titolopagina == u'11 a.C.' or titolopagina == u'1' or titolopagina == u'1 a.C.':
page = wikipedia.Page(site, (u"Nati nell'" + titolopagina))
flagvirgola = 1
else:
page = wikipedia.Page(site, (u'Nati nel ' + titolopagina))
flagvirgola = 0
#page = wikipedia.Page(site, 'Utente:Fungo/Biotest')
text = u''
pgflag = 0
while page.isRedirectPage():
wikipedia.output(u'La pagina è un REDIRECT, seguo il redirect')
page = page.getRedirectTarget()
try:
text = page.get()
if not page.canBeEdited():
wikipedia.output(u"\03{lightred}ERROR 90 You can't edit page %s\03{default}" % page.aslink())
return
except wikipedia.NoPage:
wikipedia.output(u'\03{lightred}ERROR 120 Page %s not found\03{lightdefault}' % page.aslink())
# la pagina non esiste, verifichiamo se sulla pagina dell'anno è tutto ok
except wikipedia.IsRedirectPage:
wikipedia.output(u'\03{lightyellow}FATAL ERROR 100 Page is redirect.\03{default}')
#return
pageanno = wikipedia.Page(site, titolopagina)
textanno = pageanno.get()
if flagvirgola == 1:
stringadainserire = u"== [[Nati nell'" + titolopagina + u"|Nati]] ==\n<!-- Per favore NON scrivere QUI i nomi delle persone, ma aggiungi il template:Bio alla loro voce -->\n{{:Nati nell'" + titolopagina + u"}}\n<!-- L'aggiornamento è periodico e automatico. Per chiarimenti vai al progetto Progetto:Biografie -->\n\n=="
textannocorretto = re.sub(u'(?s)==[\[ ]*Nati[ ]*==.*?==', stringadainserire , textanno)
if textanno != textannocorretto:
wikipedia.output(' ------------diff pagina anno-------------')
wikipedia.showDiff(textanno, textannocorretto)
wikipedia.output(' ------------------diff-------------------')
pgflag=1
else:
stringadainserire = u"== [[Nati nel " + titolopagina + u"|Nati]] ==\n<!-- Per favore NON scrivere QUI i nomi delle persone, ma aggiungi il template:Bio alla loro voce -->\n{{:Nati nel " + titolopagina + u"}}\n<!-- L'aggiornamento è periodico e automatico. Per chiarimenti vai al progetto Progetto:Biografie -->\n\n=="
textannocorretto = re.sub(u'(?s)==[\[ ]*Nati[ ]*==.*?==', stringadainserire , textanno)
if textanno != textannocorretto:
wikipedia.output(' ------------diff pagina anno-------------')
wikipedia.showDiff(textanno, textannocorretto)
wikipedia.output(' ------------------diff-------------------')
pgflag=1
if text!=nuovotesto or pgflag == 1:
wikipedia.output(' ------------------diff-------------------')
wikipedia.showDiff(text, nuovotesto)
wikipedia.output(' -----------------------------------------')
#wikipedia.setAction(message[:-2])
if not acceptall:
choice = wikipedia.inputChoice(u'Do you want to accept these changes?', ['Yes', 'No', 'All'], ['y', 'N', 'a'], 'N')
if choice in ['a', 'A']:
acceptall = True
if choice in ['y', 'Y']:
page.put_async(nuovotesto, u'{{[[Progetto:Biografie|biobot]]}} aggiornamento voci')
if pgflag == 1:
print ('tapioca')
pageanno.put_async(textannocorretto, u'{{[[Progetto:Biografie|biobot]]}} aggiornamento voci')
if acceptall:
try:
page.put(nuovotesto, u'{{[[Progetto:Biografie|biobot]]}} aggiornamento voci')
if pgflag == 1:
#print ('tapioca2')
pageanno.put(textannocorretto,u'{{[[Progetto:Biografie|biobot]]}} aggiornamento voci')
except wikipedia.EditConflict:
wikipedia.output(u'Skipping %s because of edit conflict' % (page.title(),))
except wikipedia.SpamfilterError, e:
wikipedia.output(u'Cannot change %s because of blacklist entry %s' % (page.title(), e.url))
except wikipedia.PageNotSaved, error:
wikipedia.output(u'\03{lightred}ERROR 10 putting page: %s\03{default' % (error.args,))
except wikipedia.LockedPage:
wikipedia.output(u'Skipping %s (locked page)' % (page.title(),))
else:
wikipedia.output('\03{lightyellow}WARNING 30 Nessuna modifica da fare\03{default}')
return
return acceptall
def rimuoviAnni(titolopagina, acceptall= None): # togli il link nella pagina dell'anno verso "nati nel ..."
site = wikipedia.getSite()
pageanno = wikipedia.Page(site, titolopagina)
try:
textanno = pageanno.get()
if not pageanno.canBeEdited():
wikipedia.output(u"\03{lightred}ERROR 90 You can't edit page %s\03{default}" % pageanno.aslink())
return acceptall
except wikipedia.NoPage:
wikipedia.output(u'\03{lightred}ERROR 120 Page %s not found\03{lightdefault}' % pageanno.aslink())
return acceptall
# la pagina non esiste, verifichiamo se sulla pagina dell'anno è tutto ok
except wikipedia.IsRedirectPage:
wikipedia.output(u'\03{lightyellow}FATAL ERROR 100 Page is redirect.\03{default}')
return acceptall
#return
stringadainserire = u"== Nati ==\n<!-- Per favore NON scrivere QUI i nomi delle persone, ma aggiungi il template:Bio alla loro voce -->\n<!-- L'aggiornamento è periodico e automatico. Per chiarimenti vai al progetto Progetto:Biografie -->\n=="
textannocorretto = re.sub(u'(?s)==[ ]*\[\[Nati.*?\|.*?\]\][ ]*==.*?==', stringadainserire, textanno)
if textanno != textannocorretto:
wikipedia.output(' ------------diff pagina anno-------------')
wikipedia.showDiff(textanno, textannocorretto)
wikipedia.output(' ------------------diff-------------------')
if not acceptall:
choice = wikipedia.inputChoice(u'Do you want to accept these changes?', ['Yes', 'No', 'All'], ['y', 'N', 'a'], 'N')
if choice in ['a', 'A']:
acceptall = True
if choice in ['y', 'Y']:
pageanno.put_async(textannocorretto, u'{{[[Progetto:Biografie|biobot]]}} aggiornamento voci')
if acceptall:
try:
pageanno.put(textannocorretto,u'{{[[Progetto:Biografie|biobot]]}} aggiornamento voci')
except wikipedia.EditConflict:
wikipedia.output(u'Skipping %s because of edit conflict' % (page.title(),))
except wikipedia.SpamfilterError, e:
wikipedia.output(u'Cannot change %s because of blacklist entry %s' % (page.title(), e.url))
except wikipedia.PageNotSaved, error:
wikipedia.output(u'\03{lightred}ERROR 10 putting page: %s\03{default' % (error.args,))
except wikipedia.LockedPage:
wikipedia.output(u'Skipping %s (locked page)' % (page.title(),))
else:
wikipedia.output('\03{lightyellow}WARNING 30 Nessuna modifica da fare\03{default}')
return
return acceptall
def rimuovinatiAnni(titolopagina, acceptall= None): # cancella la pagina "nati nel ..."
site = wikipedia.getSite()
canctxt = u"{{cancella subito|Pagina vuota, soggetti inseriti a mano (nel caso inserire il <nowiki>{{tmp|bio}}</nowiki> nelle rispettive pagine) o che non devono essere presenti in questa pagina, verificare attentamente e nel caso cancellare anche il link dalla pagina dell'anno. In caso di dubbi avvertire il manovratore del bot}}"
if titolopagina[0] == u'8' or titolopagina == u'11' or titolopagina == u'11 a.C.' or titolopagina == u'1' or titolopagina == u'1 a.C.':
page = wikipedia.Page(site, (u"Nati nell'" + titolopagina))
else:
page = wikipedia.Page(site, (u'Nati nel ' + titolopagina))
try:
text = page.get()
if not page.canBeEdited():
wikipedia.output(u"\03{lightred}ERROR 90 You can't edit page %s\03{default}" % page.aslink())
return(acceptall)
except wikipedia.NoPage:
wikipedia.output(u'\03{lightred}ERROR 120 Page %s not found\03{lightdefault}' % page.aslink())
return(acceptall)
# la pagina non esiste, verifichiamo se sulla pagina dell'anno è tutto ok
except wikipedia.IsRedirectPage:
wikipedia.output(u'\03{lightyellow}FATAL ERROR 100 Page is redirect.\03{default}')
return acceptall
#return
canctxt = text + u'\n\n' + canctxt
if text != canctxt:
wikipedia.output(' ------------diff pagina anno-------------')
wikipedia.showDiff(text, canctxt)
wikipedia.output(' ------------------diff-------------------')
if not acceptall:
choice = wikipedia.inputChoice(u'Do you want to accept these changes?', ['Yes', 'No', 'All'], ['y', 'N', 'a'], 'N')
if choice in ['a', 'A']:
acceptall = True
if choice in ['y', 'Y']:
page.put_async(canctxt, u'{{[[Progetto:Biografie|biobot]]}} aggiornamento voci')
if acceptall:
try:
page.put(canctxt, u'{{[[Progetto:Biografie|biobot]]}} aggiornamento voci')
except wikipedia.EditConflict:
wikipedia.output(u'Skipping %s because of edit conflict' % (page.title(),))
except wikipedia.SpamfilterError, e:
wikipedia.output(u'Cannot change %s because of blacklist entry %s' % (page.title(), e.url))
except wikipedia.PageNotSaved, error:
wikipedia.output(u'\03{lightred}ERROR 10 putting page: %s\03{default' % (error.args,))
except wikipedia.LockedPage:
wikipedia.output(u'Skipping %s (locked page)' % (page.title(),))
else:
wikipedia.output('\03{lightyellow}WARNING 30 Nessuna modifica da fare\03{default}')
return
return acceptall
#---------------------
def scriviwikiAnnimorti(nuovotesto, titolopagina, acceptall= None):
site = wikipedia.getSite()
if titolopagina[0] == u'8' or titolopagina == u'11' or titolopagina == u'11 a.C.' or titolopagina == u'1' or titolopagina == u'1 a.C.':
page = wikipedia.Page(site, (u"Morti nell'" + titolopagina))
flagvirgola = 1
else:
page = wikipedia.Page(site, (u'Morti nel ' + titolopagina))
flagvirgola = 0
#page = wikipedia.Page(site, 'Utente:Fungo/Biotest')
text = u''
pgflag = 0
while page.isRedirectPage():
wikipedia.output(u'La pagina è un REDIRECT, seguo il redirect')
page = page.getRedirectTarget()
try:
text = page.get()
if not page.canBeEdited():
wikipedia.output(u"\03{lightred}ERROR 90 You can't edit page %s\03{default}" % page.aslink())
return
except wikipedia.NoPage:
wikipedia.output(u'\03{lightred}ERROR 120 Page %s not found\03{lightdefault}' % page.aslink())
# la pagina non esiste, verifichiamo se sulla pagina dell'anno è tutto ok
except wikipedia.IsRedirectPage:
wikipedia.output(u'\03{lightyellow}FATAL ERROR 100 Page is redirect.\03{default}')
#return
pageanno = wikipedia.Page(site, titolopagina)
textanno = pageanno.get()
if flagvirgola == 1: # caso pagina con - nell' -
stringadainserire = u"== [[Morti nell'" + titolopagina + u"|Morti]] ==\n<!-- Per favore NON scrivere QUI i nomi delle persone, ma aggiungi il template:Bio alla loro voce -->\n{{:Morti nell'" + titolopagina + u"}}\n<!-- L'aggiornamento è periodico e automatico. Per chiarimenti vai al progetto Progetto:Biografie -->\n\n[[Categoria:Anni del"
textannocorretto = re.sub(u'(?s)==[\[ ]*Morti[ ]*==.*?\[\[Categoria:Anni del', stringadainserire , textanno)
if textanno != textannocorretto:
wikipedia.output(' ------------diff pagina anno-------------')
wikipedia.showDiff(textanno, textannocorretto)
wikipedia.output(' ------------------diff-------------------')
pgflag=1
else:
stringadainserire = u"== [[Morti nel " + titolopagina + u"|Morti]] ==\n<!-- Per favore NON scrivere QUI i nomi delle persone, ma aggiungi il template:Bio alla loro voce -->\n{{:Morti nel " + titolopagina + u"}}\n<!-- L'aggiornamento è periodico e automatico. Per chiarimenti vai al progetto Progetto:Biografie -->\n\n[[Categoria:Anni del"
textannocorretto = re.sub(u'(?s)==[\[ ]*Morti[ ]*==.*?\[\[Categoria:Anni del', stringadainserire , textanno)
if textanno != textannocorretto:
wikipedia.output(' ------------diff pagina anno-------------')
wikipedia.showDiff(textanno, textannocorretto)
wikipedia.output(' ------------------diff-------------------')
pgflag=1
if text!=nuovotesto or pgflag == 1:
wikipedia.output(' ------------------diff-------------------')
wikipedia.showDiff(text, nuovotesto)
wikipedia.output(' -----------------------------------------')
#wikipedia.setAction(message[:-2])
if not acceptall:
choice = wikipedia.inputChoice(u'Do you want to accept these changes?', ['Yes', 'No', 'All'], ['y', 'N', 'a'], 'N')
if choice in ['a', 'A']:
acceptall = True
if choice in ['y', 'Y']:
page.put_async(nuovotesto, u'{{[[Progetto:Biografie|biobot]]}} aggiornamento voci')
if pgflag == 1:
pageanno.put_async(textannocorretto, u'{{[[Progetto:Biografie|biobot]]}} aggiornamento voci')
if acceptall:
try:
page.put(nuovotesto, u'{{[[Progetto:Biografie|biobot]]}} aggiornamento voci')
if pgflag == 1:
pageanno.put(textannocorretto,u'{{[[Progetto:Biografie|biobot]]}} aggiornamento voci')
except wikipedia.EditConflict:
wikipedia.output(u'Skipping %s because of edit conflict' % (page.title(),))
except wikipedia.SpamfilterError, e:
wikipedia.output(u'Cannot change %s because of blacklist entry %s' % (page.title(), e.url))
except wikipedia.PageNotSaved, error:
wikipedia.output(u'\03{lightred}ERROR 10 putting page: %s\03{default' % (error.args,))
except wikipedia.LockedPage:
wikipedia.output(u'Skipping %s (locked page)' % (page.title(),))
else:
wikipedia.output('\03{lightyellow}WARNING 30 Nessuna modifica da fare\03{default}')
return
return acceptall
def rimuoviAnnimorti(titolopagina, acceptall= None): # togli il link nella pagina dell'anno verso "morti nel ..."
site = wikipedia.getSite()
pageanno = wikipedia.Page(site, titolopagina)
try:
textanno = pageanno.get()
if not pageanno.canBeEdited():
wikipedia.output(u"\03{lightred}ERROR 90 You can't edit page %s\03{default}" % pageanno.aslink())
return acceptall
except wikipedia.NoPage:
wikipedia.output(u'\03{lightred}ERROR 120 Page %s not found\03{lightdefault}' % pageanno.aslink())
return acceptall
# la pagina non esiste, verifichiamo se sulla pagina dell'anno è tutto ok
except wikipedia.IsRedirectPage:
wikipedia.output(u'\03{lightyellow}FATAL ERROR 100 Page is redirect.\03{default}')
return acceptall
#return
stringadainserire = u"== Morti ==\n<!-- Per favore NON scrivere QUI i nomi delle persone, ma aggiungi il template:Bio alla loro voce -->\n<!-- L'aggiornamento è periodico e automatico. Per chiarimenti vai al progetto Progetto:Biografie -->\n[[Categoria:Anni del"
textannocorretto = re.sub(u'(?s)==[ ]*\[\[Morti.*?\|.*?\]\][ ]*==.*?\[\[Categoria:Anni del', stringadainserire, textanno)
if textanno != textannocorretto:
wikipedia.output(' ------------diff pagina anno-------------')
wikipedia.showDiff(textanno, textannocorretto)
wikipedia.output(' ------------------diff-------------------')
if not acceptall:
choice = wikipedia.inputChoice(u'Do you want to accept these changes?', ['Yes', 'No', 'All'], ['y', 'N', 'a'], 'N')
if choice in ['a', 'A']:
acceptall = True
if choice in ['y', 'Y']:
pageanno.put_async(textannocorretto, u'{{[[Progetto:Biografie|biobot]]}} aggiornamento voci')
if acceptall:
try:
pageanno.put(textannocorretto,u'{{[[Progetto:Biografie|biobot]]}} aggiornamento voci')
except wikipedia.EditConflict:
wikipedia.output(u'Skipping %s because of edit conflict' % (page.title(),))
except wikipedia.SpamfilterError, e:
wikipedia.output(u'Cannot change %s because of blacklist entry %s' % (page.title(), e.url))
except wikipedia.PageNotSaved, error:
wikipedia.output(u'\03{lightred}ERROR 10 putting page: %s\03{default' % (error.args,))
except wikipedia.LockedPage:
wikipedia.output(u'Skipping %s (locked page)' % (page.title(),))
else:
wikipedia.output('\03{lightyellow}WARNING 30 Nessuna modifica da fare\03{default}')
return
return acceptall
def rimuovimortiAnni(titolopagina, acceptall= None): # cancella la pagina "morti nel ..."
site = wikipedia.getSite()
canctxt = u"{{cancella subito|Pagina vuota, soggetti inseriti a mano (nel caso inserire il <nowiki>{{tmp|bio}}</nowiki> nelle rispettive pagine) o che non devono essere presenti in questa pagina, verificare attentamente e nel caso cancellare anche il link dalla pagina dell'anno. In caso di dubbi avvertire il manovratore del bot}}"
if titolopagina[0] == u'8' or titolopagina == u'11' or titolopagina == u'11 a.C.' or titolopagina == u'1' or titolopagina == u'1 a.C.':
page = wikipedia.Page(site, (u"Morti nell'" + titolopagina))
else:
page = wikipedia.Page(site, (u'Morti nel ' + titolopagina))
try:
text = page.get()
if not page.canBeEdited():
wikipedia.output(u"\03{lightred}ERROR 90 You can't edit page %s\03{default}" % page.aslink())
return(acceptall)
except wikipedia.NoPage:
wikipedia.output(u'\03{lightred}ERROR 120 Page %s not found\03{lightdefault}' % page.aslink())
return(acceptall)
# la pagina non esiste, verifichiamo se sulla pagina dell'anno è tutto ok
except wikipedia.IsRedirectPage:
wikipedia.output(u'\03{lightyellow}FATAL ERROR 100 Page is redirect.\03{default}')
return acceptall
#return
canctxt = text + u'\n\n' + canctxt
if text != canctxt:
wikipedia.output(page.title())
wikipedia.output(' ------------diff pagina anno-------------')
wikipedia.showDiff(text, canctxt)
wikipedia.output(' ------------------diff-------------------')
if not acceptall:
choice = wikipedia.inputChoice(u'Do you want to accept these changes?', ['Yes', 'No', 'All'], ['y', 'N', 'a'], 'N')
if choice in ['a', 'A']:
acceptall = True
if choice in ['y', 'Y']:
page.put_async(canctxt, u'{{[[Progetto:Biografie|biobot]]}} aggiornamento voci')
if acceptall:
try:
page.put(canctxt, u'{{[[Progetto:Biografie|biobot]]}} aggiornamento voci')
except wikipedia.EditConflict:
wikipedia.output(u'Skipping %s because of edit conflict' % (page.title(),))
except wikipedia.SpamfilterError, e:
wikipedia.output(u'Cannot change %s because of blacklist entry %s' % (page.title(), e.url))
except wikipedia.PageNotSaved, error:
wikipedia.output(u'\03{lightred}ERROR 10 putting page: %s\03{default' % (error.args,))
except wikipedia.LockedPage:
wikipedia.output(u'Skipping %s (locked page)' % (page.title(),))
else:
wikipedia.output('\03{lightyellow}WARNING 30 Nessuna modifica da fare\03{default}')
return
return acceptall
#-----------------
def validadata(datatxt): # ritorna 2 valori: la data e un flag per indicare se la data è incerta
#print datatxt
if datatxt == u'': # la stringa è vuota esci
return (u'', 0)
else:
datatxt = re.sub(u'<ref>.*?</ref>', u'', datatxt) # elimina eventuali note
DataTemplate = re.compile(u'(\[){0,2}(?P<data>[0-9]{1,4}[ ]{0,1}(a\.C\.)*)((\]){2})*')
a = re.search(DataTemplate, datatxt)
if a == None: # la data non c'è esci
return (u'',0)
differenza = re.sub(DataTemplate, u'', datatxt).strip()
if differenza == u'':
return (a.group('data').strip(), 0) # caso 1: c'è solo la data pulita
elif differenza == u'?' or differenza == u'c.' or differenza == u'C.' or differenza == u'circa' or differenza == u'Circa' or differenza == u'ca' or differenza == u'ca.':
return (a.group('data').strip(), 1) # caso 2: c'è la data e un elemento che indica incertezza
else:
return (u'', 0) # caso 3: è scritta male o c'è scritto qualcos'altro
def validagm(gmtxt):
if gmtxt == u'':
return u''
else:
gmtxt = re.sub(u'<ref>.*?</ref>', u'', gmtxt) # elimina eventuali note
gmtxt = re.sub(u'[\°º]', u'', gmtxt)
gmtxt = re.sub(u'\[\[', u'', gmtxt)
gm2txt = re.sub(u'\]\]', u'', gmtxt)
return gm2txt.lower()
def toglicommenti(txt):
txt = re.sub(re.compile(u'<[Rr]ef>.*?</[Rr]ef>'), u'', txt)
txt = re.sub(re.compile(u'\[\[|\]\]'), u'', txt)
return txt
def data2ordine(data):
if data == u'':
return -9999 # quelli senza data li mettiamo in cima
else:
numdata = int(re.findall('[0-9]{0,4}', data)[0])
if not re.compile('(a.\C\.)').search(data):
return numdata
else:
return -numdata
def reversedata2ordine(data):
if data >= 0:
return str(data)
else:
return str(-data) + u' a.C.'
def stringamagica(stringa):
blacklist = [u'Fratelli Zeno', u'Omicidio di Pierluigi Torregiani', u'Omicidio di Lino Sabbadin', u'Fratelli Montgolfier', u'Ale e Franz', u'Fratelli Grimm',
u'James e Oliver Phelps', u'Fratelli Dardenne', u'Sorelle Mirabal', u'Jerry Leiber e Mike Stoller', u'Bonnie e Clyde', u'Jules e Gédéon Naudet',
u'Arkadi e Boris Strugatski', u'Angela e Luciana Giussani', u'Sacco e Vanzetti', u'Ignazio e Antonino Salvo', u'Dylan e Cole Sprouse',
u'Eric Harris e Dylan Klebold', u'Manetti Bros.', u'Paolo e Vittorio Taviani', u'Joel ed Ethan Coen', u'Auguste e Louis Lumière',
u'Fratelli Wachowski', u'Esposito Bros.']
titoloVoce = u''
parteMorte = u''
parteAttiv = u''
if stringa[0] in blacklist:
titoloVoce = u'[[' + stringa[0] + u'|' + stringa[2].strip() + u' ' + stringa[3].strip() + u']]'
else:
titoloSenzaWlink = re.sub(u'\(.*?\)', u'', stringa[0]).strip()
if titoloSenzaWlink == stringa[0]:
titoloVoce = u'[[' + stringa[0] + u']]'
else:
titoloVoce = u'[[' + stringa[0] + u'|' + titoloSenzaWlink + u']]'
if stringa[8] == u'':
parteMorte = u''
else:
parteMorte = u'(† [[' + stringa[8] + u']])'
if stringa[10] != u'':
if stringa[11] != u'':
parteAttiv = u', ' + stringa[10] + u' e ' + stringa[11]
else:
parteAttiv = u', ' + stringa[10]
if stringa[9] != u'': # la nazionalità
if stringa[10] == u'':
parteAttiv = u', ' + stringa[9] + u' '
else:
parteAttiv += u' ' + stringa[9] + u' '
else:
parteAttiv += u' '
return titoloVoce + parteAttiv + parteMorte
def stringamagicaMorti(stringa):
blacklist = [u'Fratelli Zeno', u'Omicidio di Pierluigi Torregiani', u'Omicidio di Lino Sabbadin', u'Fratelli Montgolfier', u'Ale e Franz', u'Fratelli Grimm',
u'James e Oliver Phelps', u'Fratelli Dardenne', u'Sorelle Mirabal', u'Jerry Leiber e Mike Stoller', u'Bonnie e Clyde', u'Jules e Gédéon Naudet',
u'Arkadi e Boris Strugatski', u'Angela e Luciana Giussani', u'Sacco e Vanzetti', u'Ignazio e Antonino Salvo', u'Dylan e Cole Sprouse',
u'Eric Harris e Dylan Klebold', u'Manetti Bros.', u'Paolo e Vittorio Taviani', u'Joel ed Ethan Coen', u'Auguste e Louis Lumière',
u'Fratelli Wachowski', u'Esposito Bros.']
titoloVoce = u''
parteNascita = u''
parteAttiv = u''
if stringa[0] in blacklist:
titoloVoce = u'[[' + stringa[0] + u'|' + stringa[2].strip() + u' ' + stringa[3].strip() + u']]'
else:
titoloSenzaWlink = re.sub(u'\(.*?\)', u'', stringa[0]).strip()
if titoloSenzaWlink == stringa[0]:
titoloVoce = u'[[' + stringa[0] + u']]'
else:
titoloVoce = u'[[' + stringa[0] + u'|' + titoloSenzaWlink + u']]'
if stringa[6] == u'':
parteNascita = u''
else:
parteNascita = u'(n. [[' + stringa[6] + u']])'
if stringa[10] != u'':
if stringa[11] != u'':
parteAttiv = u', ' + stringa[10] + u' e ' + stringa[11]
else:
parteAttiv = u', ' + stringa[10]
if stringa[9] != u'': # la nazionalità
if stringa[10] == u'':
parteAttiv = u', ' + stringa[9] + u' '
else:
parteAttiv += u' ' + stringa[9] + u' '
else:
parteAttiv += u' '
return titoloVoce + parteAttiv + parteNascita
# inizio della funzione
con = sqlite3.connect('/home/simo/pywikipedia/bio.sqlite') # si collega al database TODO gestione errore di apertura db
c = con.cursor()
con2 = sqlite3.connect(':memory:') # crea un db di lavoro in memoria
d = con2.cursor()
d.execute('''create table bio(titolo text, revisione integer, nome text, cognome text, ordinamento text, gmnascita text,
annonascita text, gmmorte text, annomorte text, nazione text, attiv1 text, attiv2 text, attiv3 text, attivaltre text, ordine integer,
ordinemorte integer, ordinegiorno integer, ordinegiornomorte integer, nascitaincerta integer, morteincerta integer)''')
c.execute('select * from bio')
for riga in c:
datavalidataNascita = validadata(riga[6]) # validadata ritorna (data, flag) dove flag indica una data incerta
datavalidataMorte = validadata(riga[8])
gmvalidataNascita = validagm(riga[5])
gmvalidataMorte = validagm(riga[7])
if gmvalidataNascita in datedir:
gmnascitaOrdinale = int(datedir[gmvalidataNascita])
else:
gmnascitaOrdinale = 0
if gmvalidataMorte in datedir:
gmmorteOrdinale = int(datedir[gmvalidataMorte])
else:
gmmorteOrdinale = 0
t = (riga[0], riga[1], toglicommenti(riga[2]), toglicommenti(riga[3]), riga[4], gmvalidataNascita, datavalidataNascita[0], gmvalidataMorte,
datavalidataMorte[0], riga[9], riga[10], riga[11], riga[12], riga[13], data2ordine(datavalidataNascita[0]), data2ordine(datavalidataMorte[0]),
gmnascitaOrdinale, gmmorteOrdinale, datavalidataNascita[1], datavalidataMorte[1])
d.execute('insert into bio values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', t)
con2.commit
# aggiorniamo le liste dei vivi per giorno
noconfirm = False
for data in date:
#break
dataordinale = int(datedir[data])
if dataordinale in (1, 32, 61, 92, 122, 153, 183, 214, 245, 275, 306, 336):
testoPagina = (u'<noinclude>{{ListaBio}}{{torna a|1º ' + data[2:] + u'}}</noinclude>\n')
testoCat = (u'[[Categoria:Nati il 1º ' + data[2:] + u'| ]]')
else:
testoPagina = (u'<noinclude>{{ListaBio}}{{torna a|' + data + u'}}</noinclude>\n')
if dataordinale in (8, 11, 39, 42, 68, 71, 99, 102, 129, 132, 160, 163, 190, 193, 221, 224, 252, 255, 282, 285, 313, 316, 343, 346):
testoCat = (u"[[Categoria:Nati l'" + data + u'| ]]')
else:
testoCat = (u"[[Categoria:Nati il " + data + u'| ]]')
t = (data, )
vecchioAnno = 0
contatore = 9999
vecchiaStringa = u''
d.execute('select * from bio where gmnascita=? order by ordine', t)
for riga in d:
nuovoAnno = riga[6]
nuovaStringa = stringamagica(riga)
if contatore == 9999:
vecchiaStringa = nuovaStringa
vecchioAnno = nuovoAnno
contatore = 0
elif vecchioAnno == u'': #xxx
testoPagina += '*' + vecchiaStringa + u'\n' #xxx
elif vecchioAnno == nuovoAnno:
if contatore == 0:
testoPagina += u'*[[' + vecchioAnno + u']]\n**' + vecchiaStringa + u'\n'
contatore += 1
else:
testoPagina += '**' + vecchiaStringa + u'\n'
contatore += 1
elif contatore != 0:
testoPagina += '**' + vecchiaStringa + u'\n'
contatore = 0
else:
if vecchioAnno == u'':
testoPagina += u'*' + vecchiaStringa + u'\n'
else:
testoPagina += u'*[[' + vecchioAnno + u']] - ' + vecchiaStringa + u'\n'
contatore = 0
vecchiaStringa = nuovaStringa
vecchioAnno = nuovoAnno
if contatore == 0:
testoPagina += u'*[[' + vecchioAnno + u']] - ' + vecchiaStringa + u'\n'
else:
testoPagina += '**' + vecchiaStringa + u'\n'
testoPagina += u'<noinclude>\n[[Categoria:Liste di nati per giorno| ' + datedir[data] + u']]\n' + testoCat + '\n</noinclude>'
#print testoPagina
if scriviwiki(testoPagina, data, int(datedir[data]), noconfirm):
noconfirm = True
# aggiorniamo le liste dei morti per giorno
#noconfirm = False
i = 0
for data in date:
#break
dataordinale = int(datedir[data])
if dataordinale in (1, 32, 61, 92, 122, 153, 183, 214, 245, 275, 306, 336):
testoPagina = (u'<noinclude>{{ListaBio}}{{torna a|1º ' + data[2:] + u'}}</noinclude>\n')
testoCat = (u'[[Categoria:Morti il 1º ' + data[2:] + u'| ]]')
else:
testoPagina = (u'<noinclude>{{ListaBio}}{{torna a|' + data + u'}}</noinclude>\n')
if dataordinale in (8, 11, 39, 42, 68, 71, 99, 102, 129, 132, 160, 163, 190, 193, 221, 224, 252, 255, 282, 285, 313, 316, 343, 346):
testoCat = (u"[[Categoria:Morti l'" + data + u'| ]]')
else:
testoCat = (u"[[Categoria:Morti il " + data + u'| ]]')
t = (data, )
vecchioAnno = 0
contatore = 9999
vecchiaStringa = u''
d.execute('select * from bio where gmmorte=? order by ordinemorte', t)
for riga in d:
nuovoAnno = riga[8]
#i += 1
#print (i)
nuovaStringa = stringamagicaMorti(riga)
#print nuovaStringa
if contatore == 9999:
vecchiaStringa = nuovaStringa
vecchioAnno = nuovoAnno
contatore = 0
elif vecchioAnno == u'': #xxx
testoPagina += '*' + vecchiaStringa + u'\n' #xxx
elif vecchioAnno == nuovoAnno:
if contatore == 0:
testoPagina += u'*[[' + vecchioAnno + u']]\n**' + vecchiaStringa + u'\n'
contatore += 1
else:
testoPagina += '**' + vecchiaStringa + u'\n'
contatore += 1
elif contatore != 0:
testoPagina += '**' + vecchiaStringa + u'\n'
contatore = 0
else:
if vecchioAnno == u'':
testoPagina += u'*' + vecchiaStringa + u'\n'
else:
testoPagina += u'*[[' + vecchioAnno + u']] - ' + vecchiaStringa + u'\n'
contatore = 0
vecchiaStringa = nuovaStringa
vecchioAnno = nuovoAnno
if contatore == 0:
testoPagina += u'*[[' + vecchioAnno + u']] - ' + vecchiaStringa + u'\n'
else:
testoPagina += '**' + vecchiaStringa + u'\n'
testoPagina += u'<noinclude>\n[[Categoria:Liste di morti per giorno| ' + datedir[data] + u']]\n' + testoCat + '\n</noinclude>'
#print testoPagina
if scriviwikiMorti(testoPagina, data, int(datedir[data]), noconfirm):
noconfirm = True
#wikipedia.output(testoPagina)
# aggiorniamo le liste dei nati per anno
#noconfirm = False
for anno in range(1000, 2011): # stiamo larghi :)
#break
testoPagina = u'<noinclude>{{ListaBio}}{{torna a|' + reversedata2ordine(anno) + u'}}</noinclude>\n'
t = (anno, )
vecchioGiorno = 0
contatore = 9999
vecchiaStringa = u''
#d.execute('select * from bio where annonascita=? order by ordinegiorno', t)
d.execute('select * from bio where ordine=? order by ordinegiorno', t)
for riga in d:
if riga[5] in datedir:
dataordinale = int(datedir[riga[5]]) #questa parte serve per mettere il simbolo º davanti all'1
if dataordinale in (1, 32, 61, 92, 122, 153, 183, 214, 245, 275, 306, 336):
nuovoGiorno = u'1º ' + riga[5][2:]
else:
nuovoGiorno = riga[5]
else:
nuovoGiorno = u''
nuovaStringa = stringamagica(riga)
if riga[18] == 1:
nuovaStringa += u' <small>(data incerta)</small>'
if contatore == 9999:
contatore = 0
elif vecchioGiorno == u'': #xxx
testoPagina += '*' + vecchiaStringa + u'\n' #xxx
elif vecchioGiorno == nuovoGiorno:
if contatore == 0:
testoPagina += u'*[[' + vecchioGiorno + u']]\n**' + vecchiaStringa + u'\n'
contatore += 1
else:
testoPagina += '**' + vecchiaStringa + u'\n'
contatore += 1
elif contatore != 0:
testoPagina += '**' + vecchiaStringa + u'\n'
contatore = 0
else:
if vecchioGiorno == u'':
testoPagina += u'*' + vecchiaStringa + u'\n'
else:
testoPagina += u'*[[' + vecchioGiorno + u']] - ' + vecchiaStringa + u'\n'
contatore = 0
vecchiaStringa = nuovaStringa
vecchioGiorno = nuovoGiorno
if contatore == 0:
if vecchioGiorno == u'':
testoPagina += '*' + vecchiaStringa + u'\n' #xxx
else:
testoPagina += u'*[[' + vecchioGiorno + u']] - ' + vecchiaStringa + u'\n'
else:
testoPagina += '**' + vecchiaStringa + u'\n'
testoPagina += u"<noinclude>[[Categoria:Liste di nati nell'anno| " + str(anno + 2000) + u']]</noinclude>'
#print testoPagina
if contatore != 9999:
if scriviwikiAnni(testoPagina, reversedata2ordine(anno), noconfirm):
noconfirm = True
else:
#if rimuoviAnni(reversedata2ordine(anno), noconfirm):
# noconfirm = True
if rimuovinatiAnni(reversedata2ordine(anno), noconfirm):
noconfirm = True
# aggiorniamo le liste dei morti per anno
#noconfirm = False
for anno in range(1000, 2011):
#break
testoPagina = (u'<noinclude>{{ListaBio}}{{torna a|' + reversedata2ordine(anno) + u'}}</noinclude>\n')
t = (anno, )
vecchioGiorno = 0
contatore = 9999
vecchiaStringa = u''
d.execute('select * from bio where ordinemorte=? order by ordinegiornomorte', t)
for riga in d:
if riga[7] in datedir:
dataordinale = int(datedir[riga[7]]) #questa parte serve per mettere il simbolo º davanti all'1
if dataordinale in (1, 32, 61, 92, 122, 153, 183, 214, 245, 275, 306, 336):
nuovoGiorno = u'1º ' + riga[7][2:]
else:
nuovoGiorno = riga[7]
else:
nuovoGiorno = u''
nuovaStringa = stringamagicaMorti(riga)
#print riga
if riga[19] == 1:
nuovaStringa += u' <small>''(data incerta)''</small>'
if contatore == 9999:
#vecchiaStringa = nuovaStringa
#vecchioGiorno = nuovoGiorno
contatore = 0
elif vecchioGiorno == u'': #xxx
testoPagina += '*' + vecchiaStringa + u'\n' #xxx
elif vecchioGiorno == nuovoGiorno:
if contatore == 0:
testoPagina += u'*[[' + vecchioGiorno + u']]\n**' + vecchiaStringa + u'\n'
contatore += 1
else:
testoPagina += '**' + vecchiaStringa + u'\n'
contatore += 1
elif contatore != 0:
testoPagina += '**' + vecchiaStringa + u'\n'
contatore = 0
else:
if vecchioGiorno == u'':
testoPagina += u'*' + vecchiaStringa + u'\n'
else:
testoPagina += u'*[[' + vecchioGiorno + u']] - ' + vecchiaStringa + u'\n'
contatore = 0
vecchiaStringa = nuovaStringa
vecchioGiorno = nuovoGiorno
if contatore == 0:
if vecchioGiorno == u'':
testoPagina += '*' + vecchiaStringa + u'\n' #xxx
else:
testoPagina += u'*[[' + vecchioGiorno + u']] - ' + vecchiaStringa + u'\n'
else:
testoPagina += '**' + vecchiaStringa + u'\n'
testoPagina += u"<noinclude>[[Categoria:Liste di morti nell'anno| " + str(anno + 2000) + u']]</noinclude>'
#print testoPagina
if contatore != 9999:
if scriviwikiAnnimorti(testoPagina, reversedata2ordine(anno), noconfirm):
noconfirm = True
else:
#if rimuoviAnnimorti(reversedata2ordine(anno), noconfirm):
# noconfirm = True
if rimuovimortiAnni(reversedata2ordine(anno), noconfirm):
noconfirm = True
c.close
d.close
return()
def main():
for arg in wikipedia.handleArgs():
if arg.startswith('-agg'):
scorriWiki()
elif arg.startswith('-xml'):
if len(arg) == 4:
wikipedia.output('Inserire il nome del file (xml:nomefile)')
return ()
else:
nomefile = arg[5:]
scorriXml(nomefile)
elif arg.startswith('-data'): liveandletdie()
wikipedia.output(u'Procedura terminata')
if __name__ == "__main__":
try:
main()
finally:
wikipedia.stopme()