Szerkesztő:Hunyadym/szubcsonk-rewrite.py

A Wikipédiából, a szabad enciklopédiából
#!/usr/bin/python
# -*- coding: utf-8  -*-
"""
-ro                csak olvasás mód teszteléshez, nem módosít a lapokon
 
A pywikipedia 2013. augusztus 31-i, rewrite branches változatával működik
 
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. Módosítja a Szubcsonkok és a
Tennivalók-lista/szubcsonkok sablont.
 
Eredeti: Dhanak, 2006-2007
Bináris módosításaival, 2010. 08. 29.:
- import wikipedia as pywikibot (a jövőbeni kompatibilitásért);
- a substubs szótár már nem cikkcímeket, hanem a page objektumokat tárolja
  (így újra felhasználhatóak a hossz ellenőrzésekor, a page változó jelentése egységes);
- a jelentősen megrövidült cikkek figyelmeztető jelzést kapnak
  (új függvény: shortenedMark(page))
 
Bináris, 2010. 10. 17.:
A wikipedia.py kiegészítésével a lapméretek a fullVersionHistory() helyett 
a getVersionHistory() függvénnyel is lekérdezhetőek, így gyorsabban kell futnia.
A kiegészítésben Tgr segített.
 
Dani, 2012. 01. 23.:
* page.aslink cseréje page.title(asLink=True)-ra a pywiki változtatásai miatt

Hunyadym, 2013.08.31.:
Átalakítás, hogy a core (leánykori nevén rewrite) branch-en működjön.
Emiatt a megrövidülés miatti méretcsökkenést figyelő részt ideiglenesen kivettem.

"""
 
import sys, re, datetime
import pywikibot
from pywikibot import pagegenerators
from pywikibot import date
 
 
site = pywikibot.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)
            except pywikibot.NoPage:
                pywikibot.output(u"HIBA: Nem találom a %s lapot" % page.title())
                continue
            except pywikibot.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("|2013. augusztus 31., 14:02 (CEST)", text, count = 1)
        if count == 0:
            pywikibot.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:
            pywikibot.output(u"HIBA: Az időbélyeget nem sikerült pótolnom")
            return unknown
 
    def shortenedMark(self, page):
        #Ha a szubcsonk volt már a jelenlegi méretének kétszerese vagy +1000 byte,
        #akkor visszaad egy figyelmeztető jelet, amit a cím mellé lehet tenni.
        #Különben üres stringet ad.
        
		#Ideiglenesen kivéve, mert az új framework nem adja vissza a méretet – Hunyadym, 2013.08.31.
		#versions=page.getVersionHistory()
        #curLength=versions[0][4]
        #sizes=[]
        #for version in versions:
        #   sizes.append(version[4])
        #maxLength=max(sizes)
        #if maxLength>=2*curLength or maxLength>curLength+1000:
        #   return u'[[File:Ambox warning orange.svg|16px|A cikk jelentősen megrövidült!]]'
        #else:
        #   return ''
        return ''
 
    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%s\n" % (page.title(asLink=True),self.shortenedMark(page))
 
        pywikibot.output(listText)
 
        if not self.readOnly:
            listPage = pywikibot.Page(site, u"Wikipédia:Szubcsonk")
            oldText = listPage.get()
            listRe = re.compile("(?<=" + re.escape(u"<!-- szubcsonk lista eleje -->") +
                                ").*?(?=" + re.escape(u"<!-- szubcsonk lista vége -->") + ")",
                                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 = pywikibot.Page(site, pageName)
            oldText = tmpl.get()
            groupRe = re.compile("(?<=" + re.escape("<!-- kezdet:") + "([<=>][0-9])" + re.escape(" -->") +
                                 ").*?(?=" + re.escape(u"<!-- vég:") + "\\1" + re.escape(" -->") + ")",
                                 flags = re.DOTALL)
            newText = groupRe.sub(self.listStubsOfGivenAge, oldText)
            if newText != oldText:
                pywikibot.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.title(asLink=True)+self.shortenedMark(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 pywikibot.handleArgs():
        if arg == '-ro':
            readOnly = True
        else:
            pywikibot.output(u"Nem várt argumentum: " + arg)
            sys.exit(1)
 
    tmpl = pywikibot.Page(site, u"Sablon:Szubcsonk")
    gen = pagegenerators.PreloadingGenerator(
        pagegenerators.ReferringPageGenerator(tmpl, onlyTemplateInclusion = True))
 
    SzubcsonkBot(gen, readOnly = readOnly).run()
 
 
if __name__ == "__main__":
    try:
        main()
 
    finally:
        pywikibot.stopme()