Usuari:RRHGbot/replace mod.py

De la Viquipèdia, l'enciclopèdia lliure

Versió més simple de replace.py del pyWikipediaFramework. Accepta un fitxer de text amb els links als articles com a input, i un fitxer amb dades, les modificacions que s'han de fer han de ser escrites al codi, permetent així fer modificacions més complexes que l'original.

# -*- coding: utf-8  -*-
"""
 replace_mod.py 
 versió: 0.2.1 bugfix
         0.2   per afegir coordenades als municipis de catalunya
         0.1   va servir per afegir plantilles als anys del segle XX
 descripció: modificació i simplificació de replace.py per fer canvis més complicats
 ús: replace_mod.py -llista:llista [-dades:dades] [-log]
    els paràmetres entre [] són opcionals
    "llista" ha de ser un fitxer de text amb [[wikilinks]] als articles a cercar
    "dades" fitxer de dades opcional 
    -log activa la bitàcora
    
"""

from __future__ import generators
import sys, re, fileinput
import wikipedia, pagegenerators, catlib, config

class ReplaceRobot:
    def __init__(self, generator, dades, si_a_tot = False):
        self.generator = generator
        self.dades = dades
        self.si_a_tot = si_a_tot
        
    def doReplacements(self, original_text, titol_pagina):
        """
        Returns the text which is generated by applying all replacements to the
        given text.
        """

        # Especificar els canvis aqui dins, no de manera global per poder fer + coses 
        # old = regex a cercar
        # nou = text de substitució
        # opcions: fer OR: re.UNICODE|re.DOTALL|re.IGNORECASE...
        
        if self.dades :                              # en cas de dades fer: 
            primera_linia = u"(\*.*?}})"
            pl_re = re.compile ( primera_linia )
            m = pl_re.match( self.dades )
            if not m:
                wikipedia.output(u"ERROR: ja no queden dades?! pàg:%s" % titol_pagina)
                return original_text
            dada = m.group(1)                   # extreure primera linia
            fi_linia = m.end()
            # +1 pel salt de línia
            self.dades = self.dades[fi_linia + 1:]            # escurçar dades
            
            div = u'\[\[(.*?)\]\] \{\{coor dms\|(\d+)\|(\d+)\|(\d+)\|([NS])\|(\d+)\|(\d+)\|(\d+)\|([WE])\|}}'
            div_re = re.compile ( div )
            m = div_re.search ( dada )
            if not m :
                wikipedia.output(u"ERROR: %s no ha funcionat, la regex no ha funcionat per la linia" % titol_pagina)
                return original_text
            titol_dades = m.group(1)
            titol_dades = titol_dades.decode ('utf-8')
            if titol_dades != titol_pagina :
                wikipedia.output(u"ERROR: dades de: %s no concorda amb títol d'article: %s" % (titol_dades, titol_pagina))
                return original_text

            template = u"{{TaucatCoo|"
            d2 = m.group(2) + u"|"
            d3 = m.group(3) + u"|"
            d4 = m.group(4) + u"|"
            d5 = m.group(5) + u"|"
            d6 = m.group(6) + u"|"
            d7 = m.group(7) + u"|"
            d8 = m.group(8) + u"|"
            d9 = m.group(9)
            template = template + d2 + d3 + d4 + d5 + d6 + d7 + d8 + d9 + "}}"
            
            old = u'\{\{[Tt]aucatAlt\|(.*?)\}\}'
            nou = r'{{taucatAlt|\1}}' + u'\n' + template
            old_re = re.compile( old, re.UNICODE )
        else :
            #old = u'==[ ]*Pàgines que s\'hi relacionen[ ]*=='
                    # nou = r'\1 \2'  <-- per regexes que ho requereixin
            #nou = u'==Pàgines que s\'hi relacionen==\n{{commons|Category:' + titol_pagina + u'}}' 
            #old_re = re.compile( old, re.UNICODE )
            wikipedia.output(u"ERROR: else? això no toca")
            return original_text
        # --------------------------------
        
        new_text = original_text
        
        new_text = old_re.sub(nou, new_text)
        
        return new_text

    def run(self):
        """
        Starts the robot.
        """
        # Run the generator which will yield Pages which might need to be
        # changed.
        for page in self.generator:
            try:
                # Load the page's text from the wiki
                original_text = page.get()
                if not page.canBeEdited():
                    wikipedia.output(u'Skipping locked page %s' % page.title())
                    continue
            except wikipedia.NoPage:
                wikipedia.output(u'Page %s not found' % page.title())
                continue
            except wikipedia.IsRedirectPage:
                original_text = page.get(get_redirect=True)
            new_text = self.doReplacements(original_text, page.title())
            if new_text == original_text:
                wikipedia.output('No changes were necessary in %s' % page.title())
            else:
                wikipedia.output(u'>>> %s <<<' % page.title())
                wikipedia.showDiff(original_text, new_text)
                if not self.si_a_tot:
                    choice = wikipedia.inputChoice(u'Do you want to accept these changes?',  ['Yes', 'No', 'All'], ['y', 'N', 'a'], 'N')
                    if choice in ['a', 'A']:
                        self.si_a_tot = True
                if self.si_a_tot or choice in ['y', 'Y']:
                    page.put(new_text)


def main():
    
    si_a_tot = False
    dades = ""
    old = u''         # regex
    
    wikipedia.setAction( u'Robot: afegint [[Viquipèdia:Bots/coordenades|coordenades]] a municipis catalans' )
    
    for arg in sys.argv[1:]:
        arg = wikipedia.argHandler(arg, 'replace_mod')
        if arg:
            if arg.startswith('-llista'):             #  -file    [6:]
                fitxer_llista = arg[8:]
            elif arg.startswith('-dades'):
                fitxer_dades = arg[7:]
    
    
    if fitxer_dades:
        fitxer_entrada = file ( fitxer_dades, 'r' )
        dades = fitxer_entrada.read()
        fitxer_entrada.close()
    
    gen = pagegenerators.TextfilePageGenerator(fitxer_llista)
    preloadingGen = pagegenerators.PreloadingGenerator(gen, pageNumber = 5)
    bot = ReplaceRobot(preloadingGen, dades, si_a_tot)
    bot.run()
    


if __name__ == "__main__":
    try:
        main()
    finally:
        wikipedia.stopme()