Usuari:RRHGbot/replace mod.py
Aparença
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()