A Wikipédiából, a szabad lexikonbó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"\{\{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("|~~~~~", 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"Segítség: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 = 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: 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 sys.argv[1:]:
arg = wikipedia.argHandler(arg, 'szubcsonk')
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:Szubcsonk")
gen = pagegenerators.PreloadingGenerator(
pagegenerators.ReferringPageGenerator(tmpl, onlyTemplateInclusion = True))
SzubcsonkBot(gen, readOnly = readOnly).run()
if __name__ == "__main__":
try:
main()
finally:
wikipedia.stopme()