#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
-file:<file> Minden <file>-ban szereplő lapon frissíti a számlálókat
-cat:<kat> A <kat> kategória minden lapján frissíti a számlálókat
-link:<lap> A <lap> lapról hivatkozott minden lapon frissíti a számlálókat
-update Csak frissítés (ahol nincs darabszám, oda nem szúr be)
-noconfirm Ne kérdezzen rá a változtatásokra
Ez a bot a megadott wikipédia-lap(ok)on a laphivatkozások után beszúrja
(ill. frissíti) a hivatkozott lapokon szereplő szakaszcímek számát.
"""
import sys, re
import wikipedia, pagegenerators, catlib
class SzakaszszamBot:
def __init__(self, generator, updateOnly = False, confirm = True):
self.generator = generator
self.updateOnly = updateOnly
self.confirm = confirm
# group 1: wikicode of link, group 2: linked page name
linkPtrn = r"(\[\[([^]|]*?)(?:\|[^]]*?)?\]\])(?: *\([0-9]+ db\.?\))"
if not updateOnly:
linkPtrn += "?"
self.linkRe = re.compile(linkPtrn)
self.sectRe = re.compile(r"(==+).*?\1")
def run(self):
if self.confirm:
answer = ''
else:
answer = 'm'
for page in self.generator:
try:
text = page.get()
except wikipedia.NoPage:
wikipedia.output(u'HIBA: Nem találom a %s lapot' % page.title())
continue
except wikipedia.IsRedirectPage:
continue
newText = self.linkRe.sub(self.countSections(page.title()), text)
if newText != text:
wikipedia.showDiff(text, newText)
if answer != 'm':
answer = wikipedia.input(u"Módosítsam a %s lapot [(i)gen/(N)em/(m)ind]?" %
page.title())
if answer == 'i' or answer == 'm':
page.put(newText, u"Robot: szakaszszámlálók" +
(self.updateOnly and " " or u" beillesztése és ") +
u"frissítése")
def countSections(self, referringTitle):
def cS(match):
pageTitle = match.group(2)
if pageTitle.startswith("/"):
pageTitle = referringTitle + pageTitle
page = wikipedia.Page(wikipedia.getSite(), pageTitle)
if page.namespace() != 0:
return match.group()
try:
text = page.get()
except wikipedia.NoPage:
wikipedia.output(u'HIBA: Nem találom a %s lapot' % page.title())
return match.group()
except wikipedia.IsRedirectPage, arg:
try:
page = wikipedia.Page(wikipedia.getSite(), arg[0])
text = page.get()
except wikipedia.NoPage:
wikipedia.output(u"HIBA: Redirekt a nemlétező %s lapra" % arg[0].title())
return match.group()
except wikipedia.IsRedirectPage:
wikipedia.output(u"HIBA: Kettős redirekt: %s" % page.title())
return match.group()
count = len(self.sectRe.findall(text))
wikipedia.output(u"%s: %d db. szakaszcím" % (pageTitle, count))
return "%s (%d db)" % (match.group(1), count)
return cS
def main():
gen = None
updateOnly = False
confirm = True
pageTitle = []
for arg in wikipedia.handleArgs():
if arg.startswith('-file:'):
gen = pagegenerators.TextfilePageGenerator(arg[6:])
elif arg.startswith('-cat:'):
cat = catlib.Category(wikipedia.getSite(), u"Kategória:" + arg[5:])
gen = pagegenerators.CategorizedPageGenerator(cat)
elif arg.startswith('-link:'):
page = wikipedia.Page(wikipedia.getSite(), arg[6:])
gen = pagegenerators.LinkedPageGenerator(page)
elif arg == '-update':
updateOnly = True
elif arg == '-noconfirm':
confirm = False
else:
pageTitle.append(arg)
if pageTitle:
page = wikipedia.Page(wikipedia.getSite(), ' '.join(pageTitle))
gen = iter([page])
if not gen:
wikipedia.showHelp('szakaszszam')
else:
gen = pagegenerators.PreloadingGenerator(gen)
bot = SzakaszszamBot(gen, updateOnly = updateOnly, confirm = confirm)
bot.run()
if __name__ == "__main__":
try:
main()
finally:
wikipedia.stopme()