#-------------------------------------------------------------------------------
# Name: Central de Fusões
# Purpose:
#
# Author: Chico Venancio
#
# Created: 01/03/2012
# Copyright: (c) Chico Venancio 2012
# Licence: GNU General Public License
# See http://www.gnu.org/licenses/gpl.txt for full text of the license
#-------------------------------------------------------------------------------
#!/usr/bin/env python
import wikipedia
import catlib
import pagegenerators
import string
import re
import json
import codecs
import datetime
site = wikipedia.getSite()
def main():
"""inserir automaticamente {{fusões a avaliar|nome do artigo}} na Central
de fusões e na PD dos artigos"""
#abrir o arquivo do dicionário
try:
with codecs.open (u'fusões.txt', encoding='utf-8') as dicionario:
lista = json.load(dicionario, encoding='utf-8')
except ValueError: #se o arquivo de dicionário der erro
print (u'dicionário mal formatado, criando novo')
#Gerar lista mesmo que tiver erro no arquivo
lista = {}
except IOError: #se o arquivo de dicionário der erro
print (u'dicionário não presente, criando novo')
#Gerar lista mesmo que tiver erro no arquivo
lista = {}
lista ={} #para testes, rodar sem o dicionário
central = wikipedia.Page(site, u'Wikipédia:Fusão/Central de fusões')
## central = wikipedia.Page(site, u'Usuário:Chicocvenancio/teste2') #para testes
casos_novos = u'' #inicializar os casos
#iniciando o log em wiki texto
log = u'\n==Log da Central das fusões dia ' + str(datetime.datetime.utcnow(
).day) +u' de {{LCMONTHNAME|' + str(datetime.datetime.utcnow().month
) + u'}} de '+ str(datetime.datetime.utcnow().year) + u' ==\n'+ str(
datetime.datetime.utcnow().hour) +u':'+ str(datetime.datetime.utcnow(
).minute) + u':' + str(datetime.datetime.utcnow().second) + u' (utc)\n\n'
## log += u'Rodada de testes, nenhuma modificação feita\n' #Para testes em que não se altera nada
Plog = wikipedia.Page(site, u'Usuário(a):ChicoBot/log') #Página do Log
se_tiver = re.compile(u'\{\{fusões a avaliar\|(?P<links>.*?)\}\}', re.I) #Regex, grupo links contém casos
ordem_regex = re.compile(u'\{\{fusão\|1=(?P<primeiro>.*?)(\|.*)\|2=(?P<segundo>.*?)(\|.*)\}\}', re.I) #regex da {{fusão}} (para encontrar a ordem)
ordem_regex2 = re.compile(u'\{\{fusão\|(.*?)(|\|.*)\}\}', re.I)
artigos_sem_predef = u''
#nunca mexer nessas subpáginas
lista [wikipedia.Page(site, u'Wikipédia:Fusão/Central de fusões/instruções',
site)._title] = 1
for caso in pagegenerators.PrefixingPageGenerator(
u'Wikipédia:Fusão/Central de fusões/'): #loop nas subpáginas da central
if not lista.has_key(caso._title): lista[caso._title] = 0 #criar caso na lista com 0 se ele não existir
if lista[caso._title] == 0: #só fazer qualquer coisa se o caso não já tiver sido tratado
#verificar ainda se o caso não é um redirecionamento
if not caso.isRedirectPage():
#Gerar e limpar a lista de links
links = [item for sublist in [string.split(a ,u'|') for a in
re.findall(se_tiver, central.get())] for item in sublist]
if not all(artigo in links for artigo in string.split(
caso._title[34:], u'; ')): #Se não tiver todos
if any(artigo in links for artigo in string.split(
caso._title[34:], u'; ')): #Se tiver só um
#Não colocar a predefinição na página e avisar no log que não tinham todos os casos
log += u'\nPara o caso ([[' +caso._title + u']]) não foram encontrado todos os artigos nas {{lp|fusões a avaliar}} da central mas foi encontrado um dos casos\n'
#Se não tem nenhum caso na página, adicionar o caso à lista
else: casos_novos += u'\n{{fusões a avaliar|' + u'|'.join (
string.split(caso._title[34:], u'; ')) + u'}}'
try:
for artigo in string.split(caso._title[34:], u'; '): #separar os artigos no título
#Primeiro verificar se o artigo existe e não é redirecionamento
if wikipedia.Page(site, artigo).exists(
) and not wikipedia.Page(site, artigo).isRedirectPage():
pd = wikipedia.Page(site, artigo).toggleTalkPage()
l = len(string.split(caso._title[34:], u'; ')) - 1
#Gerar lista de links e limpar ela
links = [item for sublist in [string.split(a ,u'|')
for a in re.findall(se_tiver, pd.get())
] for item in sublist]
if not all(artigo in links for artigo in string.split(
caso._title[34:], u'; ')): #Se não tiver todos
if any(artigo in links for artigo in string.split(
caso._title[34:], u'; ')): #Se tiver algum
#Não adicionar predef e avisar no log
log += u'\nPara o caso ([[' +caso._title + u']]) não foram encontrado todos os artigos na {{lp|fusões a avaliar}} da PD mas foi encontrado [[' + artigo + u']]\n'
else: #Se não tiver o caso
#adicionar predef na PD
pd.put(pd.get() + u'\n{{fusões a avaliar|' +
u'|'.join (string.split(caso._title[34:],
u'; ')) + u'}}', u'Robô: Adicionando {{fusões a avaliar|' + u'|'.join (
string.split(caso._title[34:], u'; ')) + u'}}', botflag=False)
#avisar no output
print (u'adicionaria {{fusões a avaliar|' + u'|'.join(
string.split(caso._title[34:], u'; ')) + u'}} à PD ' + pd._title )
#e no log...
log += u'\nAdicionaria <nowiki>{{fusões a avaliar|' + u'|'.join(
string.split(caso._title[34:], u'; ')) + u'}}</nowiki> à PD [[' + pd._title + u']]\n'
if string.split(caso._title[34:], u'; ')[1] == artigo:
try:
if re.findall(ordem_regex, wikipedia.Page(site, artigo).get())[0][0] == string.split(
caso._title[34:], u'; ')[1]:
wikipedia.Page(site, artigo).put(re.sub(ordem_regex, u'{{fusão|1={{subst:FULLPAGENAME}}\g<2>|2=\g<primeiro>\g<3>}}',
wikipedia.Page(site, artigo).get()))
wikipedia.showDiff(wikipedia.Page(site, artigo).get(), re.sub(ordem_regex, u'{{fusão|1={{subst:FULLPAGENAME}}\g<2>|2=\g<primeiro>\g<3>}}',
wikipedia.Page(site, artigo).get()))
log += u'\nTrocaria a ordem da predef de fusão no artigo [[' + artigo + u']]\n'
except IndexError:
try:
if re.findall(ordem_regex2, wikipedia.Page(site, artigo).get())[0][0
] == string.split(caso._title[34:], u'; ')[1] :
wikipedia.Page(site, artigo).put(re.sub(ordem_regex2,
u'{{fusão|1=\g<1>|2=' + artigo + u'\g<2>}}', wikipedia.Page(site,
artigo).get()))
wikipedia.showDiff(wikipedia.Page(site, artigo).get(), re.sub(ordem_regex2,
u'{{fusão|1=\g<1>|2=' + artigo + u'\g<2>}}', wikipedia.Page(site,
artigo).get()))
log += u'\nTrocaria a ordem da predef de fusão no artigo [[' + artigo + u']]\n'
except IndexError:
if u'{{fusão com|' not in wikipedia.Page(site, artigo).get().lower(
) and u'{{fusão de|' not in wikipedia.Page(site, artigo).get().lower():
artigos_sem_predef += u'\n[[' + artigo + u']]\n'
except wikipedia.NoPage: # se a PD em questão não existir
if pd.toggleTalkPage().exists(): #Se o artigo da PD existir
#adicioanar predefinição
pd.put(u'{{fusões a avaliar|' + u'|'.join (string.split(
caso._title[34:], u'; ')) + u'}}', u'Robô: Adicionando {{fusões a avaliar|'
+ u'|'.join (string.split(caso._title[34:], u'; ')) + u'}}', botflag=False)
#avisar no output e no log
print (u'Criaria a PD ' + pd._title + u' com {{fusões a avaliar|' + u'|'.join (
string.split(caso._title[34:], u'; ')) + u'}}' )
log += u'\nCriaria a PD [[' + pd._title + u']] com <nowiki>{{fusões a avaliar|' + u'|'.join (
string.split(caso._title[34:], u'; ')) + u'}}</nowiki>\n'
## finally: # no final ;P
## for versao in versoes_do_titulo: # para cada título
## lista[versao] = 1 #adcionar ao dicionário como sem precisar rodar novamente
lista[caso._title] = 1
if casos_novos: # se houverem casos novos a adicionar a central
#adicionar os casos, avisar no log e no output
central.put(central.get() + casos_novos, u'Robô: Adicionando novos casos', botflag=False)
print (u'Adicionaria os seguintes casos à central: ' + casos_novos)
log += u'\nAdicionaria os seguintes casos à [[' + central._title + u'|central]]: <pre>' + casos_novos + u'</pre>\n'
else: #ou avisar que não fez nada na central
print (u'Nenhum caso novo a ser adicionado à central')
log += u'\nNenhum caso novo a ser adicionado à central\n'
log += u'\nArtigos sem a predefinição: <pre>' + artigos_sem_predef + u'</pre>\n'
#gravar mudanças no arquivo do dicionário
with codecs.open(u'fusões.txt', 'w', encoding='utf-8') as dicionario:
json.dump(lista, dicionario, ensure_ascii=False)
#marcar a hora final do script no log
log += u'\nTerminado as ' + str(datetime.datetime.utcnow().hour) +u':'+ str(datetime.datetime.utcnow().minute) + u':' + str(datetime.datetime.utcnow().second) + u' (utc)\n'
#gravar o log na subpágina
Plog.put(Plog.get() + log)
#gravar o log em um arquivo
with codecs.open(u'logs da central de fusões.txt', 'w', encoding='utf-8') as Flog:
Flog.write(log)
if __name__ == '__main__':
try:main()
finally:wikipedia.stopme()