Usuário:Danilo.bot/checkref.py

# -*- 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()