Szerkesztő:Bdamokos/nincsforras.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

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 [[Segítség: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"\{\{nincslicenc\|(" + dateptrn + ").*?\}\}", re.IGNORECASE)
        self.fixSubstubRe = re.compile(r"(?<=\{\{nincslicenc)(?=\}\})", 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("|~~~~~", text, count = 1)
        if count == 0:
            wikipedia.output((u"HIBA: A %s lapon nem találtam " +
                              u"megfelelő nincslicenc jelzést") % page.title())
            return unknown

        page.put(newText, u"Robot: nincslicencjelzé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"User:Bdamokos/Nincslicenc_bot")
            oldText = listPage.get()
            listRe = re.compile("(?<=" + re.escape(u"<!-- nincslicenc lista eleje -->") +
                                ").*?(?=" + re.escape(u"<!-- nincslicenc lista vége -->") + ")",
                                flags = re.DOTALL)
            newText = listRe.sub(listText, oldText)
            if newText != oldText:
                listPage.put(newText, u"Robot: nincslicenclista frissítése")

    def chgTemplate(self):
        if self.readOnly:
            return
        for pageName in iter([u"User:Bdamokos/Nincslicenc_lista"]):
            tmpl = wikipedia.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:
                wikipedia.showDiff(oldText, newText)
                tmpl.put(newText, u"Robot: nincslicenclista 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 = u"''nincs ilyen kép''"
        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 sys.argv[1:]:
        arg = wikipedia.argHandler(arg, 'nincslicenc')
        if arg:
            if arg == '-ro':
                readOnly = True
            else:
                wikipedia.output(u"Nem várt argumentum: " + arg)
                sys.exit(1)
    
    tmpl = wikipedia.Page(site, u"Sablon:nincslicenc")
    gen = pagegenerators.PreloadingGenerator(
        pagegenerators.ReferringPageGenerator(tmpl, onlyTemplateInclusion = True))

    SzubcsonkBot(gen, readOnly = readOnly).run()


if __name__ == "__main__":
    try:
        main()
        
    finally:
        wikipedia.stopme()