Szerkesztő:Tobozka/1.py
- !/usr/bin/python
- -*- coding: utf-8 -*-
""" -ro csak olvasás mód teszteléshez, nem módosít a lapokon
Ez a bot a magyar wikipédia szubcsonk lapjainak adminisztrációját segíti. Végigmegy a szubcsonk sablonnal megjelölt szócikkeken, csoportosítja őket aszerint, hogy a jelzést mikor helyezték el, az eredményként kapott listát pedig kiteszi a Wikipédia:Szubcsonk lap \"Aktuális szubcsonkok\" szakaszába. """
import sys, re, datetime import wikipedia, date, pagegenerators
site = wikipedia.getSite()
monthptrn = "(?:" + '|'.join(date.makeMonthNamedList(site.language(), '%s')) + ")"
dateptrn = r"[0-9]{4}\. *" + monthptrn + r" *[0-9]{1,2}\."
class SzubcsonkBot:
def __init__(self, gen, readOnly = False): self.gen = gen self.readOnly = readOnly self.substubs = {}
self.substubRe = re.compile(r"\{\{szubcsonk\|(?:\[\^+\]\] )?(" + dateptrn + ").*?\}\}", re.IGNORECASE) self.fixSubstubRe = re.compile(r"(?<=\{\{szubcsonk)(?=\}\})", re.IGNORECASE)
def run(self): self.collectStubs() if len(self.substubs): self.listStubs() self.chgTemplate()
def collectStubs(self): for page in self.gen: try: self.substubs.setdefault(self.getTimestamp(page), []).append(page.title()) except wikipedia.NoPage: wikipedia.output(u"HIBA: Nem találom a %s lapot" % page.title()) continue except wikipedia.IsRedirectPage: continue
def getTimestamp(self, page): unknown = "Ismeretlen"; text = page.get() match = self.substubRe.search(text) if match: return match.group(1)
if self.readOnly: return unknown (newText, count) = self.fixSubstubRe.subn("|2007. május 22., 17:45 (CEST)", text, count = 1) if count == 0: wikipedia.output((u"HIBA: A %s lapon nem találtam " + u"megfelelő szubcsonk jelzést") % page.title()) return unknown
page.put(newText, u"Robot: szubcsonkjelzés-időbélyeg pótlása")
text = page.get(force = True) match = self.substubRe.search(text) if match: return match.group(1) else: wikipedia.output(u"HIBA: Az időbélyeget nem sikerült pótolnom") return unknown
def listStubs(self): listText = u"\n" dates = self.substubs.keys() dates.sort(datesort) for date in dates: listText += "=== %s ===\n" % date for page in self.substubs[date]: listText += "* %s\n" % page
wikipedia.output(listText) if not self.readOnly: listPage = wikipedia.Page(site, u"Wikipédia:Szubcsonk") oldText = listPage.get() listRe = re.compile("(?<=" + re.escape(u"") + ").*?(?=" + re.escape(u"") + ")", flags = re.DOTALL) newText = listRe.sub(listText, oldText) if newText != oldText: listPage.put(newText, u"Robot: szubcsonklista frissítése")
def chgTemplate(self): if self.readOnly: return for pageName in iter([u"Sablon:Szubcsonkok", u"Sablon:Tennivalók-lista/szubcsonkok"]): tmpl = wikipedia.Page(site, pageName) oldText = tmpl.get() groupRe = re.compile("(?<=" + re.escape("") + ").*?(?=" + re.escape(u"") + ")", flags = re.DOTALL) newText = groupRe.sub(self.listStubsOfGivenAge, oldText) if newText != oldText: wikipedia.showDiff(oldText, newText) tmpl.put(newText, u"Robot: szubcsonklista frissítése")
def listStubsOfGivenAge(self, match): op = match.group(1)[0] if op == "=": op = "==" delta = datetime.timedelta(int(match.group(1)[1])) today = datetime.date.today() dates = self.substubs.keys() dates.sort(datesort) liststr = "" for date in dates: if not eval("today - str2date(date) %s delta" % op): continue for page in self.substubs[date]: if liststr != "": liststr += ", " liststr += "" + page + "";
if liststr == "": liststr = "nincs ilyen szubcsonk" return liststr
def datesort(date1, date2):
return cmp(str2date(date1), str2date(date2))
monthIdx = date.formats['MonthName'][site.language()]
def str2date(date):
datere = re.compile("([0-9]{4}). (" + monthptrn + ") ([0-9]{1,2}).") m = datere.match(date) if m: return datetime.date(int(m.group(1)), monthIdx(m.group(2)), int(m.group(3))) else: return datetime.date.today()
def main():
readOnly = False for arg in wikipedia.handleArgs(): if arg == '-ro': readOnly = True else: wikipedia.output(u"Nem várt argumentum: " + arg) sys.exit(1) tmpl = wikipedia.Page(site, u"Sablon:Szubcsonk") gen = pagegenerators.PreloadingGenerator( pagegenerators.ReferringPageGenerator(tmpl, onlyTemplateInclusion = True))
SzubcsonkBot(gen, readOnly = readOnly).run()
if __name__ == "__main__":
try: main() finally: wikipedia.stopme()