Vés al contingut

Usuari:CastorBot/desorfena

De la Viquipèdia, l'enciclopèdia lliure
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
== Descripció ==
Programa que s'encarrega de revisar la categoria dels articles orfes i eliminar
la plantilla en cas que l'article rebi com a mínim un enllaç intern d'un altre
article.

L'enllaç que rebi no pot ser de cap article d'anys (per exemple: 1991 o 123) o
dies (2 d'agost), l'enllaç tampoc pot provenir d'una pàgina de desambiguació.

En alguns articles ens trobem que l'enllaç que hi ha forma part d'una plantilla
que enllaça cap a l'altre article, però, no hi manté cap tipus de relació (per
exemple: la plantilla polisèmia) en aquests casos es comprovarà si hi ha més
d'un enllaç cap a l'article.

== Coses a fer ==
- Permetre la inclusió de parametres inicials que ens permetin modificar els
camps següents:
    - verbose: activa el mode 'verbose', per defecte està desactivat
    - edit: activa el mode 'edit', els canvis es desaran a la Viquipèdia,
    - minlink: nombre mínim d'enllaços per a eliminar la plantilla d'orfe,
               per defecte és 1
    - page : només s'actuarà sobre una pàgina
    - start : comença a partir d'un article fins al final

- Revisar que no faltin plantilles conflictives a les variables: templates_re i
  other_tpl_re

== Historial ==
Gener/2011 - Joancreus, primera versió del programa
Juliol/2011 - Coet, optimitzades les expressions regulars utilitzades
Juliol/2011 - Joancreus, arreglats diversos errors en les expressions regulars
Febrer/2013 - Castor, segona versió, afegit el suport a noves plantilles,
              arreglada la detecció dels anys, afegida la detecció de mesos,
              d'enllaços interns a través de plantilles, documentació del codi.
Agost/2014 - Coet: anglicise variables (en tenim en català i en anglés, i sempre
             que estiguen en anglés facilita que altres ho entenguen i afegisc
             la possibilitat de "paràmetres inicials", a més de modificar el
             codi i reestructurar-lo per a complir amb els estàndards i
             convencions pythòniques.

== Ús ==
Des de la consola, terminal, cmd... executar:

python desorfena.py

"""
import re, sys
import catlib, wikipedia, query

def main():
    arts = catlib.Category(site, u"Articles orfes").articlesList(recurse=1) if \
        not args.page else (wikipedia.Page(site, args.page),)
    
    

    #Varibles amb expressions regulars:
    #templates_re: conté totes les plantilles de desambiguacio
    templates_re = re.compile(ur"\{\{(?:[Dd]esambigua|[Dd]isambig|[Dd]esambigCurta|[Aa]crònim|[Oo]nomàstica|[Bb]iografies|[Bb]iografia)\}?\}?")
    
    #other_tpl_re: conté plantilles que enllaçen cap a l'article orfe
    other_tpl_re = re.compile(ur"\{\{([Vv]egeu|[Vv]egeu3|[pP]olisèmia|[Ff]usió des de|[Ff]usió de|[Cc]onfusió)")
    
    #year_re: expressió per detectar anys. No s'hauria de modificar
    #months_re: conté totes les categories dels mesos. No s'hauria de modificar
    year_re = re.compile(r"\d+")
    months_re=re.compile(ur"\[\[Categoria:([Gg]ener|[Ff]ebrer|[Mm]arç|[Aa]bril|[Mm]aig|[Jj]uny|[Jj]uliol|[Aa]gost|[Ss]etembre|[Oo]ctubre|[Nn]ovembre|[Dd]esembre)")
    
    start = args.start
         
    for art in arts:
        if start and art.title != start: continue
        elif start and art.title == start: start = False
        if args.debug: wikipedia.output(u">>> %s <<<" % art.title())
        #Aquesta query, retorna tots els enllaços de l'article a l'espai principal.
        params = {
            "action":"query",
            "list":"backlinks",
            "blnamespace": "0",
            "bltitle": art.title(),
            "bllimit":1000,
            "blfilterredir": "nonredirects"
        }
        pages = query.GetData(params)
        links_to_page = pages["query"]["backlinks"]
        if args.debug: wikipedia.output(u"Hi ha %d enllaços, a l'espai principal" % len(links_to_page))
        if len(links_to_page)>0:
            years = 0 #Num articles d'anys
            desambigs = 0 #Num. articles desambiguacions o que tenen plantilles amb enllaços
            months = 0 #Num d'articles que tenen com a categoria algun mes
            links = re.compile(u"\[\[%s" % art.title()) #Expressio per trobar enllaços interns cap a l'article orfe
            
            #Recorrem tots els articles que tenen enllaços cap a l'article orfe
            for p in links_to_page:
                page = wikipedia.Page(site, p["title"])
                text = page.get()
                if args.debug: wikipedia.output("\tRevisant article: %s" % page.title())
                if re.match(year_re, page.title()):
                    years+=1
                elif re.search(templates_re,text):
                    desambigs+=1
                elif re.search(months_re,text):
                    months+=1
                elif re.search(other_tpl_re,text):
                    if len(re.findall(links,text))<2:
                                            #Comptabilitzem la pagina com si fos de desambiguacio
                        desambigs+=1
    
                    #El total de pagines d'anys, mesos i desambiguacions son inferiors al nombre de pagines que enllacen cap a l'article orfe, tenim algun enllaç valid
            if ((years+desambigs+months) < len(links_to_page)): 
                text = art.get()	#Agafem el text de la pagina que revisem i eliminem la plantilla d'orfe
                new_text = re.sub(r"\{\{[Oo]rfe(.*?)\}\}\n","", text)
                if args.debug: wikipedia.showDiff(text,new_text)
                #Diferenciem el cas d'un enllaç de multiples, queda mes maco
                if len(links_to_page) > 1:
                    if args.edit: art.put(new_text, u"""Robot treu la plantilla "Orfe" ja que l'article rep %d enllaços, dels quals %d són desambiguacions o anys""" % (len(links_to_page),(desambigs+years)))
                else:
                    if args.edit: art.put(new_text, u"""Robot treu la plantilla "Orfe" ja que l'article rep %d enllaç, que no és ni desambiguació ni any.""" % len(links_to_page))
                if args.debug: wikipedia.output("Robot treu la plantilla Orfe")
            else:
                if not args.debug: wikipedia.output("No fem res")

if __name__ == '__main__':
    args = lambda: x
    args.edit = args.verbose = False
    args.start = args.page = None
    args.num = 1
    for arg in wikipedia.handleArgs():
        if ":" in arg:
            arg, value = arg.split(":", 1)
        if arg in ("-d", "--debug"):
            args.debug = True
            output (u"Mode \3{lightpurple}verbose\3{default} activat.")
        elif arg in ("-e", "--edit"):
            args.edit = True
            output (u"Mode \3{lightpurple}verbose\3{default} activat, s'editarà!.")
        elif arg in ("-n", "--num"):
            args.num = int(value) if value.isdigit() else 1
            output (u"Nombre d'enllaços canviat a \3{lightpurple}%i\3{default}." % args.num)
        elif arg in ("-p", "--page"):
            args.page = value.strip()
            output (u"Es revisarà \3{lightpurple}%s\3{default}." % args.page)
        elif arg in ("-s", "--start"):
            args.start = value.strip()
            output (u"Es començara per l'article \3{lightpurple}%s\3{default}." % args.start)
    site = wikipedia.getSite()
    main()
    wikipedia.stopme()