Usuário:Danilo.bot/checkref.py
Aspeto
# -*- coding: utf-8 -*-
'''
Este script procura {{sem-fontes}} nos artigos e realisa as seguintes ações:
* Troca a {{sem-fontes}} por {{sem notas}} quando encontra uma seção de referências mas não encontra tags <ref>
* Troca a {{sem-fontes}} por {{mais notas}} quando for encontrado tags <ref> mas não em todas as seções
* Retira a {{sem-fontes}} quando for encontrado tags <ref> em todas as seções
Uso: Basta rodar o script que ele irá pedir a categoria onde deve ser feita a busca.
'''
import re
import wikipedia as pywikibot
import pagegenerators, query, catlib
site = pywikibot.getSite()
btag = re.compile(u'{{[Ss]em-fontes([^\n}]*?)}}')
br = re.compile(u'{{[Rr]efer[eê]ncias|{{[Rr]ef-?section|{{[Rr]odapé referências|==.*?[Rr]eferências.*?==|{{[Rr]eflist|== ?Bibliografia ?==')
bref = re.compile(u'<ref[^\n/]*?>.*?</ref>|<ref .+?/>',re.I|re.S)
bs = re.compile(u'(?s)\n== ?([^=\n}{]+?) ?==(.+?)(?=\n==[^=\n]|$)') # busca seções
excecoes = [u'Referências',u'Ver também',u'Notas',u'Notas e referências',u'Discografia',u'Galeria de imagens',
u'Referências gerais',u'Leitura adicional',u'Subdivisões',u'Leitura recomendada',u'Ligações externas',u'Bibliografia'] #exeções para seções
def main(*args):
gen = pagegenerators.CategorizedPageGenerator(catlib.Category(site,u'Categoria:'+pywikibot.input(u'Em qual categoria buscar?')))
preloadingGen = pagegenerators.PreloadingGenerator(gen)
todos = False
for page in preloadingGen:
texto = page.get()
busca = br.search(texto)
if busca and (texto.find(u'\n==') == -1 or btag.search(texto[0:texto.find(u'\n==')])):
ref = bref.findall(texto)
sec = filter(lambda s:s[0] not in excecoes,bs.findall(br.sub('',texto)))
secref = filter(lambda s:bref.search(s[1]),sec)
if len(ref) == 0: novo = (btag.sub(ur'{{sem notas\1}}',texto,count=1),
u'Bot: trocando {{sem-fontes}} por {{sem notas}} (encontrado %s)' % busca.group(0))
elif len(sec) == len(secref): novo = (btag.sub(u'',texto,count=1),
u'Bot: retirando {{sem-fontes}} (encontrado referências em todas seções)')
else: novo = (btag.sub(ur'{{mais notas\1}}',texto,count=1),
u'Bot: trocando {{sem-fontes}} por {{mais notas}} (encontrado referências em algumas seções)')
pywikibot.output(u'\n\n>>> \03{lightpurple}%s\03{default} <<<' % page.title())
pywikibot.showDiff(texto,novo[0])
if todos:
page.put(novo[0],novo[1])
continue
escolha = pywikibot.inputChoice(u'Você aceita essas mudanças?',[u'Sim', u'Não', u'Todos', u'Cancelar'],['S', 'N', 'T', 'C'],'N')
if escolha == 's': page.put(novo[0],novo[1])
elif escolha == 'n': continue
elif escolha == 't':
page.put(novo[0],novo[1])
todos = True
elif escolha == 'c': return
if __name__ == "__main__":
try: main()
finally: pywikibot.stopme()