Főmenü megnyitása

Ez a bot a Wikipédia:Statisztikák/Hosszú nevű lapok allapjait készíti el. No nem túl gyakran. Megírásában a puszta kíváncsiság vezérelt, hogy melyek a leghosszabb című szócikkeink. De hamar öncélúvá vált a fejlesztés, amikor láttam, mennyit tudok tanulni általa a Pythonról és a pywikibotról. Tanulás közben bőségesen kommenteltem, így mások is hasznát vehetik. Máskor is belepiszkáltam már a pywikibot moduljaiba, hogy a saját képemre szabjam őket, de ez az első önálló futtatásra szánt programom, amit 2010. július 31-én élesben is használtam a Wikipédiában.

#!/usr/bin/python
# -*- coding: utf-8  -*-
"""
This bot creates lists of the longest page titles in different name spaces. For result see [[Wikipédia:Statisztikák/Hosszú nevű lapok]]

Ez a bot a basic.py felhasználásával készült.
Összegyűjti a leghosszabb című cikkeket, névterenként külön allapra.
(MAXDARAB leghosszabb, de ha holtverseny van, folytatja, amíg kell.)
Fejleszthető: külön a redirek is? Nem biztos, hogy olyan érdekes, és lehet, hogy nagyon lelassítaná, mert minden oldalt be kell tölteni hozzá.
Futtatása: / Run: cimhossz.py -namespace:<num> -start:!

Az -xml paramétert és a többszörös névtereket jelen formájában nem támogatja. :-(
"""
#
# (C) Pywikipedia bot team, 2006-2010
# Originally: basic.py (if some of the code still reminds you)
# Distributed under the terms of the MIT license.
# 
__version__ = '$Id: basic.py 8278 2010-06-11 17:01:24Z xqt $'
# Rewritten by [[hu:user:Bináris]] as cimhossz.py (no rights reserved)
# Credit to [[nl:user:Multichill]] for giving me a hand. (http://pywiki.pastey.net/139123)
# Looking for beauty end elegance in the code is strictly not recommended. :-) I am just learning Python. Don't blame me!
# version 1.0

import wikipedia as pywikibot
import pagegenerators, sys
#The next line is for private use only, this is to update my log. Feel free to remove it. 
#See also the end of run().
import binbotutils

# This is required for the text that is shown when you run this script
# with the parameter -help.
docuReplacements = {
    '&params;': pagegenerators.parameterHelp
}

#Globális változók:
MAXDARAB=32 #Ennyi lesz a toplista hossza (legyen kerek szám – mondta a rendőr)
HOVATEGYEM=u'Wikipédia:Statisztikák/Hosszú nevű lapok/'
cimlista=[]
cimekszama=0 
cikkekszama=0
nevter=None #A paramétervizsgálatnál kap értéket.
nevterneve=''
nevterek = {
             '0':   u'Szócikk',
             '2':   u'Szerkesztő',
             '4':   u'Wikipédia',
             '6':   u'Fájl',
             '8':   u'MediaWiki',
             '10':  u'Sablon',
             '14':  u'Kategória',
             '100': u'Portál'
           }

class BasicBot:
    # Edit summary message that should be used.
    msg = {
        'hu': u'A leghosszabb című lapok statisztikájának frissítése',
    }

    def __init__(self, generator):
        """
        Constructor. Parameters:
            * generator - The page generator that determines on which pages
                          to work on.
        """
        self.generator = generator
        # Set the edit summary message
        self.summary = pywikibot.translate(pywikibot.getSite(), self.msg)

    def run(self):
        #Ez a ciklus a lapokra
        for page in self.generator:
            self.treat(page)
        #Innentől záróakkord

        #Most jönnek a végső kiírások, először a képernyőre:
        print '---------'
        print cimlista
        print len(cimlista)
        s=u'== %s névtér ==\n'% nevterneve

        #Kategóriák és képek nevét kettősponttal kell megadni!
        for item in cimlista:
           if nevter=='6' or nevter=='14':
              s+='# [[:%s|%s]] (%d karakter)\n' % (item[1], item[1], item[0])
           else:
              s+='# [[%s]] (%d karakter)\n' % (item[1], item[0])
        s+=u'\n\nÁtnézett lapok száma: %d. <small>Frissítette: ~~~~</small>\n' % cikkekszama
        pywikibot.output(s)

        #Remove the next 4 lines if you want to use the bot, this updates my own log.
        #A munkanapló frissítése:
        stat = {'fix':'','modm':0,'moda':1,'not':0,'skip':0,'err': 0,}
        naplo=binbotutils.munkanaplo()
        naplo.run(u'Statisztika (hosszú címek)','user:BinBot/cimhossz.py',nevterneve+u' névtér',HOVATEGYEM+nevterneve, stat)

        #És a lista feltolása a Wikipédiára:
        oldal = pywikibot.Page(pywikibot.getSite(), HOVATEGYEM+nevterneve)
        #És íme, a várva várt botflag kapcsoló!
        #A botflaget és az aprót kikapcsoljuk, hadd lássa mindenki a frissítést a FV-n.
        oldal.put(s, self.summary,minorEdit=False, botflag=False) 

    def treat(self, page):
        """
        Ez itt egy oldal feldolgozása.
        """
        global cimekszama, cikkekszama, cimlista, MAXDARAB
        #http://bobobobo.wordpress.com/2009/03/21/unboundlocalerror-local-variable-referenced-before-assignment/
        #
        #A MAXDARAB leghosszabb című cikk (kivéve, ha holtverseny van)
        cikkekszama+=1 #Megszámoljuk, ha már itt vagyunk
        if cikkekszama % 200==0: #Lássuk, hol tartunk
           pywikibot.output(u'>>> \03{lightyellow}%d. cikk: \03{default}\03{lightpurple}%s\03{default} <<<' % (cikkekszama,page.aslink()))
        cim=page.title()
        hossz=len(cim)
        if not cimlista: #vagyis még üres
           cimlista=[(hossz,cim)]
           print 0,(hossz,cim)
           cimekszama=1
        #Most jön a beillesztés, ha még belefér a toplistába egyáltalán
        elif cimekszama<MAXDARAB or hossz>=cimlista[cimekszama-1][0]: 
           i=0
           while i<cimekszama and hossz<=cimlista[i][0]: #Egyenlőségnél mögé illessze
              i+=1
           if i<=cimekszama:
              #A következő sor hibakeresésre való, de a folyamat követésére se rossz.
              print i,(hossz,cim), cimekszama
              cimlista.insert(i,(hossz,cim))
              cimekszama+=1
           #Eddig ebben van véletlen is: ha még a MAXDARAB elérése előtt
           #csak egy is előjön a minimális hosszúságú címek közül,
           #akkor az összes be fog kerülni. Ezért most takarítás jön.
           #Csak a MAXDARAB meghaladása után kell takarítani!
           #Tehát figyelünk, hogy lehet több egyforma, akár a MAXDARAB túllépésével is.
           if cimekszama>MAXDARAB:
              i=MAXDARAB #=utolsó kívánt index + 1!
              while cimlista[i][0]==cimlista[MAXDARAB-1][0] and i<cimekszama-1:
                 i+=1 #Most i az első kitakarítandó cím indexe
              #Az utolsót sajnos indextúllépés miatt külön kell vizsgálni:
              if i==cimekszama-1 and cimlista[i][0]==cimlista[MAXDARAB-1][0]:
                 i+=1
              j=cimekszama-1 #az utolsó -- feltételesen -- kitakarítandó cím indexe
              while j>=i:
                 cimlista.remove(cimlista[j])
                 j-=1
                 cimekszama-=1
                 #A remove az első előfordulást törli, de a cím miatt mind egyedi.


def main():
    global nevter, nevterneve
    # This factory is responsible for processing command line arguments
    # that are also used by other scripts and that determine on which pages
    # to work on.
    genFactory = pagegenerators.GeneratorFactory()
    # The generator gives the pages that should be worked upon.
    gen = None
    # This temporary array is used to read the page title if one single
    # page to work on is specified by the arguments.
    pageTitleParts = []

    # Parse command line arguments
    #Az eredeti dry törölve, helyette keressük a névteret, mert játékunk lesz vele.
    for arg in pywikibot.handleArgs():
        if arg.startswith("-namespace"):
            #Ezt még nem pontosan értem, a pagegenerators.py alapján csináltam.
            #A teszt szerint listaként adja vissza a névtér sorszámát.
            #A [0]-t én írtam a végére, ettől unicode string lesz belőle.
            #int()-tel lehetne egésszé alakítani,  de szótárkulcsnak így is jó lesz.
            nevter=arg[len('-namespace:'):].split(",")[0]
            genFactory.handleArg(arg)
        elif arg.startswith("-ns"):
            nevter=arg[len('-ns:'):].split(",")[0]
            #A névteret rögtön továbbítani kell a generátornak, mert még egyszer 
            #nem olvashatja ki! Ez a megoldás Multichilltől származik:
            genFactory.handleArg(arg)
        else:
            # check if a standard argument like
            # -start:XYZ or -ref:Asdf was given.
            if not genFactory.handleArg(arg):
                pageTitleParts.append(arg)

    if pageTitleParts != []:
        # We will only work on a single page.
        pageTitle = ' '.join(pageTitleParts)
        page = pywikibot.Page(pywikibot.getSite(), pageTitle)
        gen = iter([page])

    if not gen:
        gen = genFactory.getCombinedGenerator()
    if gen:
        # The preloading generator is responsible for downloading multiple
        # pages from the wiki simultaneously.
        gen = pagegenerators.PreloadingGenerator(gen)

        #Most pedig ellenőrizzük, hogy legális névteret adtunk-e meg, és nevesítjük.
        if not nevter: #None volt az alapérték, nem adtunk meg ilyen paramétert.
           nevter='0'
           nevterneve='Vegyes'
           nevterkiiras=u'Nem adtál meg névteret.\nAz eredmény a /Vegyes lapra kerül további feldolgozás céljából.'
        elif nevterek.has_key(nevter):
           nevterneve=nevterek[nevter]
           nevterkiiras=u'A %s. névtérben dolgozunk, az eredmény a /%s allapra kerül.' % (nevter,nevterneve)
        else:
           #A szótárban meg nem adott névtér, nehogy már a nyúl vigye a puskát!
           pywikibot.output(u'\03{lightyellow}\n\nIllegális névtér: %s. Megadható névterek: páros (0-10), 14, 100.\03{default}\n\n' % nevter)
           sys.exit()
           #Viszlát, program!

        #Mostantól a nevter és nevterneve garantáltan érvényes értékkel rendelkezik.
        pywikibot.output(nevterkiiras)
        #Ez itt valamiért nem megy, pedig fent működik, még nem értem.
        #pywikibot.output('>>> \03{ligthred} %s \03{default}<<<',nevterkiiras)
        bot = BasicBot(gen)
        bot.run()
    else:
        pywikibot.showHelp()


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