Szerkesztő:Tobozka/1.py

A Wikipédiából, a szabad enciklopédiából
  1. !/usr/bin/python
  2. -*- 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()