Usuari:RRHGbot/replace mod.py
De Viquipèdia
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()

