Usuário:Danilo.bot/marcas.py: diferenças entre revisões

Conteúdo apagado Conteúdo adicionado
reformatando o código, adicionando comentários na função atualizar e não mais adicionando |rev= quando não houver avaliação humana (antes adicionava sempre)
→‎Código: refazendo a função atualizar, agora o comando -rmbot remove o parâmetro |bot= da marca, nos parâmetros passados para o robô "|" e ";" foram trocados para ",", e foram feitas outras alterações e correções
Linha 19:
 
-adicionar:TEMA Adiciona esse tema à marca se ele já não existir. Para mais de um
tema use a barra vertical: TEMA1|,TEMA2
 
-exceção:TEMA Só adiciona o tema se TEMA não estiver na marca.
 
-imp:TEMA:I Adiciona importância I para TEMA. Para mais de um tema separe
com ";", exemplo: -imp:TEMA1:2;,TEMA2:3
 
-eimp:I Só adiciona a importância se a importância já não for I. Para mais
Linha 38:
-comandos Exibe na tela todos os comandos disponíveis para especificar as páginas
"""
import re, time
import pywikibot
from pywikibot import pagegenerators
from datetime import date
 
 
Linha 143 ⟶ 142:
bimp = re.compile(u'importância ?= ?0?(\d)')
brev = re.compile(u'rev ?= ?\d{8}')
qs = [{u'1', u'2', u'3', u'4', u'5', u'AB', u'6', u'AD']}
 
def atualizar(page, qavalia=False, adadicionar=u''[], exexcecoes=u''[], imp={}, eximp=[], rmbot=False):
if page.namespace() == 0:
page = page.toggleTalkPage()
elif page.namespace() != 1:
return None
try:
if page.exists():
texto = page.get()
except pywikibot.NoPage:
else:
texto = u''
rev = None
ad, ex = ad and ad.split(u'|'), ex and ex.split(u'|')
bot = False
adtema = []
temas = {}
qualidade = None
 
# Marca nova
marca = bmarca.search(texto)
if marca: # Tem marca nova
marca = [p for p in marca.group(1).split('|')]
tema = None
n = 1
if len(marca) > 1: # Tem marca nova e ela tem parâmetros
for param in marca:
if param.startswith(u'rev='): # Tem |rev= na marca
rev = param
elif param.startswith(u'bot='): # Tem parâmetro |bot=
bot = param
elif u'=' not in param: # Não tem "=" no parâmetro
if n == 1: # Primeiro parâmetro é a qualidade
qualidade = param
elif n % 2 == 0: # Parâmetro par é tema
tema = param
else: # Parâmetro impor é importância
temas[tema] = param
tema = None
n += 1
if tema: # Último tema não tem importância
temas[tema] = u'?'
rmbot = rmbot and bot # Só considera que vai remover o |bot= se tiver
# Marcas antigas
marcas = [[m[1]]+[m[3]] for m in bmarcas.findall(texto)]
if marcas: # Tem marcas antigas
imarcas = [[m[0]] + bimp.findall(m[1]) for m in marcas] # Importâncias nas marcas antigas
for m in imarcas: # Pega os parâmetros das marcas antigas
if len(m) == 2:
temas[m[0]] = m[1]
else:
temas[m[0]] = u'?'
if not rev: # Não tem rev na marcas novas
rev = brev.search(str(marcas)) # Busca rev nas antigas
rev = rev and rev.group(0)
if not qualidade: # Não tem qualidade na marca nova
qmarcas = bqua.search(str(marcas)) # Busca qualidade em marcas antigas
if qmarcas:
qualidade = qmarcas.group(1) in (u'AB', u'AD') and {u'AB': u'5', u'AD': u'6'}[qmarcas.group(1)] or qmarcas.group(1)
# Adição de temas
if not filter(lambda t:t in excecoes, temas):
for ad in adicionar:
if ad not in temas:
temas[ad] = u'?'
adtema.append(ad)
# Adição de importância
imp = dict((tema, i) for tema, i in imp.items() if tema in temas and temas[tema] not in [i] + eximp)
for tema in imp:
temas[tema] = imp[tema]
 
# Verificações:
# Não tem marca antiga ou nova nem vai adicionar
if not marcas and not marca and not ad and not impadtema:
if texto:
pywikibot.output(u'Não foram encontradas marcas em ' + page.title())
Linha 168 ⟶ 218:
pywikibot.output(page.title() + u' não existe...')
return None
# Não tem marca antiga e ( (tem nova emas não vai avaliar, eadicionar (nãotema, temadicionar temaexceção paraou adicionarremover bot) ou (não tem ummarca temanova e não vai adicionar) exceção)
elif not marcas and ((marca and not qavalia and (not filter(lambdaadtema a:aand not inimp marca,and not adrmbot) or filter(lambda e:e innot marca, exand adtema)):
pywikibot.output(u'Não foram encontradas marcas para atualizar em ' + page.title())
return None
# Ou avalia ou remove o |bot=
if q: # Vai avaliar
if rmbot and avalia:
q = avaliar(page.toggleTalkPage())
pywikibot.output(u'Erro: ou avalia ou remove o parâmetro bot')
if marca: # Tem marca nova
qualidadereturn = marca[0]None
 
elif marcas: # Tem marca antiga
if avalia: # Fazer avaliação robótica
qmarcas = bqua.findall(str(marcas)) # Qualidade em marcas antigas
bot = avaliar(page.toggleTalkPage())
if qmarcas:
if bot[0] > 4: # Avaliação automática retornou 5 ou 6
qualidade = qmarcas[0]
qualidade = str(bot[0]) # Avaliação automática 5 e 6 passam para o campo de avaliação humana
else:
qualidadebot = None
 
else: # Não tem marca nova nem antiga
# Monta a nova marca
qualidade = None
ifnova = u'{{Marca de projeto|' + qualidade not+ in(rev qs:and #u'|' Qualidade+ nãorev estáor emu'') + u'|' + u'|'.join(1,t 2,+ 3,u'|' 4,+ 5,i 6,for ABt, ADi in temas.items())
if bot qualidadeand =not u'?'rmbot:
# type(bot) == tuple é uma nova avaliação, type(bot) == unicode é uma avaliação antiga
if q and q[0] > 4: # Avaliação automática retornou 5 ou 6
nova += type(bot) == tuple and u'|bot=%d/{{subst:CURRENTYEAR}}{{subst:CURRENTMONTH}}{{subst:CURRENTDAY2}}' % bot[0] or u'|' + bot
qualidade = str(q[0]) # Avaliação automática 5 e 6 passam para o campo de avaliação humana
q = False
nova = u'{{marca de projeto|%s' % qualidade
rev = None
if marca and len(marca) > 1: # Tem marca nova e ela tem parâmetros
for i, p in enumerate(marca):
if p.startswith(u'rev='): # Parâmetro |rev=
rev = p
elif p.startswith(u'bot='): # Parâmetro |bot=
# Vai avaliar e não tem o parâmetro -forçar e já foi avaliado a menos de 6 meses
if q and not reav and p[6:] and date(int(p[6:10]), int(p[10:12]), int(p[12:14])).toordinal() + 182 > date.today().toordinal():
pywikibot.output(page.title() + u' foi avaliado por robô a menos de 6 meses, não foi reavaliado.')
return None
marca = filter(lambda x:u'=' not in x, marca) # Remove parâmetros com nome (|x=y)
if len(marca) % 2 == 0:
marca.append(u'?') # Adiciona |? se qualidade mais temas e importâncias der número impar (alguém esqueceu do |? no último tema)
for p in marca[1:]:
nova += u'|' + p # Monta uma nova marca com os parâmetros da anterior
if marcas: # Tem marcas antigas
imarcas = [[m[0]] + bimp.findall(m[1]) for m in marcas] # Importâncias nas marcas antigas
for m in imarcas: # Adiciona os parâmetros da marcas antigas na nova
if len(m) == 2:
nova += u'|' + m[0] + u'|' + m[1]
else:
nova += u'|' + m[0] + u'|?'
# Seria para adicionar um tema mas existe um tema exceção
if ad and filter(lambda e:e in nova.split(u'|'), ex):
ad = None
elif ad: # Vai adicionar um tema
ad = [a for a in ad.split(u'|') if not u'|' + a.lower() + u'|' in nova.lower()]
for m in ad: nova += u'|' + m + u'|?'
# Se vai avaliar adiciona a avaliação e data no parâmetro |bot=
if q:
nova += u'|bot=%d/{{subst:CURRENTYEAR}}{{subst:CURRENTMONTH}}{{subst:CURRENTDAY2}}' % q[0]
if not rev:
rev = brev.search(str(marcas))
if rev:
rev = rev.group(0)
if rev and qualidade != u'?': # Tem |rev= na marca e não tem avaliação humana
nova += u'|' + rev
nova += u'}}\n'
 
impsum = {}
# Substitui marcas no texto
if imp: # Colocação de importância
for i in imp: # imp = {'tema1':'imp1', 'tema2':'imp2', ..., 'eimp': ['x', 'y', 'z']}
if i == 'eimp': # imp['eimp'] guarda as exceções
continue
iindex = nova.lower().find(i.strip().lower() + u'|') + len(i) + 1 # Posição da importância para esse tema na nova marca
if iindex > 20 and nova[iindex] not in imp['eimp']: # Encontrada a posição e a importância não é uma exceção
nova = nova[0:iindex] + imp[i].strip() + nova[iindex + 1:] # Nova importância
impsum[i] = imp[i] # guarda a importância para detalhar no sumário
if marcas: # Remove marcas antigas da página
texto = bmarcas.sub('', texto)
Linha 244 ⟶ 248:
texto = re.sub(ur'{{[Aa]vançarDiscussão}}\n?', u'', texto) # Remove {{avanção discussão}} se tiver
texto = re.sub(ur'^({{[Aa]vançarDiscussão}} ?\n?|.*?)', r'\1' + nova, texto) # Adiciona a marca no inicio ou depois de {{avançar discussão}}
 
if type(q) == tuple: # Foi feita uma avaliação
# Sumário ifda ad:edição
if type(bot) == tuple: # Foi feita uma avaliação
sumario = u'Bot: adicioando marca "%s" e avaliando [[Wikipédia:Qualidade|qualidade]]: %d (%s)' % (ad[0], q[0], q[1])
if adtema:
sumario = u'Bot: adicioando marca{} {} e avaliando [[Wikipédia:Qualidade|qualidade]]: {} ({})'.format(len(adtema) > 1 and u's' or u'',
listar(adtema), bot[0], bot[1])
else:
sumario = u'Bot: avaliando [[Wikipédia:Qualidade|qualidade]]: %d{} (%s{})' % .format(qbot[0], qbot[1])
elif adadtema: # Não foi feita avaliação mas foi adicionado um tema
if marcas:
sumario = u'Bot: adicionando marca{0} "%s"{1} e atualizando marca(s){2} de wikiprojeto{2}'.format(slen(adtema) > 1 and u's' %or ad[0]u'', listar(adtema),
len(marcas) > 1 and u's' or u'')
else:
sumario = u'Bot: adicionando marca{} "%{}'.format(len(adtema) > 1 and u's"' %or u'', ad[0]listar(adtema))
elif imp: # Não foi avaliado nem adicionado tema mas foi adicionada importância
sumario = u'Bot: colocando importância em marca(s){0} de wikiprojeto{0}: {1}'.format(slen(imp) > 1 and u's' or u'',
listar([u'importância {} para {}'.format(i, tema) for tema, i in imp.items()]))
else:
sumario = u'Bot: atualizando marca(s){0} de wikiprojeto{0}'.format(slen(temas) > 1 and u's' or u'')
 
if impsum: # Detalhar no sumário as importâncias adicionadas
for i in impsum:
sumario += u', importância %s para %s' % (impsum[i], i)
if simular: # Com o parâmetro -simular não salva
if page.exists():
Linha 273 ⟶ 280:
return
return (nova, sumario)
 
def listar(itens):
lista = u''
n = len(itens) > 1 and len(itens) - 1 or 1
for i, item in enumerate(itens):
lista += (i == n and u' e ' or i > 0 and u', ' or u'') + item
return lista
 
simular, reav = False, False
Linha 278 ⟶ 292:
def main(*args):
site = pywikibot.getSite()
params = {}
av, predef, cat, subcat, ad, atu , ex, imp, eimp= False, None, None, u'', u'', None, u'', [], []
genFactory = pagegenerators.GeneratorFactory()
for arg in pywikibot.handleArgs(*args):
if arg.startswith( == u'-predefavaliar'):
pywikibot.output(u'A qualidade não é mais avaliada por robô na Wikipédia, para apenas ver a avaliação use -avaliar:"nome do artigo"')
predef = arg[8:]
if not predef:return
predef = pywikibot.input(u'Qual predefinição?')
if predef:
if predef.find(u':') != -1:
predef = pywikibot.Page(site, predef)
else:
predef = pywikibot.Page(site, u'Predefinição:' + predef)
elif arg == u'-avaliar':
av = True
elif arg.startswith(u'-adicionar:'):
adparams['adicionar'] = [a.strip() for a in arg[11:].split(u',')]
elif arg.startswith(u'-avaliar:'):
qualidade = avaliar(pywikibot.Page(site, arg[9:]))
Linha 299 ⟶ 305:
return
elif arg.startswith(u'-exceção:'):
exparams['excecoes'] = [e.strip() for e in arg[9:].split(u':')]
elif arg.startswith(u'-imp:'):
params['imp'] = dict([i.strip().split(u':', 1) for i in arg[5:].split(u';,')])
elif arg.startswith(u'-eimp:'):
params['eimp'] = arg[6:].split(u',')
elif arg.startswith(u'-rmbot'):
params['rmbot'] = True
elif arg == u'-simular':
global simular
simular = True
elif arg == u'-forçar':
global reav
reav = True
elif arg == u'-comandos':
pywikibot.output(pagegenerators.parameterHelp)
Linha 316 ⟶ 321:
pywikibot.output(u'#Comando não encontrado: '+ arg)
return
if imp:
imp['eimp'] = eimp
for page in pagegenerators.PreloadingGenerator(genFactory.getCombinedGenerator()):
if not page.namespace() in [0, 1]:
continue
novo = atualizar(page, av, ad, ex, imp**params)
t = page.title()
t = t[0:t.find(u':') + 1] + u'\03{lightblue}' + t[t.find(u':') + 1:] + u'\03{default}' # Cor