# -*- coding: utf-8 -*-

"""
Questo programma deriva da category.py presente nell bundle pywikipedia.
Lo si utilizza per generare le liste dei testi in ordine alfabetico per gli argomenti che non hanno un numero elevato di testi.

Per lanciarlo basta digitare:
python ListeTestiAlfabeto2.py argomento


Per lanciarlo per tutti gli argomenti:
python ListeTestiAlfabeto2.py tutto

Per sapere quali progetti sono conosciuti dal bot:
python ListeTestiAlfabeto2.py listaArgomenti

Ogni suggerimento o modifica è benvenuta!

iPork
http://it.wikisource.org/wiki/Utente:IPork
Qualc1
http://it.wikisource.org/wiki/Utente:Qualc1
Pietrodn
http://it.wikisource.org/wiki/Utente:Pietrodn
"""

#*************** INIZIO: PARAMETRI PER PROGETTI  ***************
# per aggiungere un nuovo progetto basta aggiungerlo nella sezione qui sotto.

parametri = {
# ARTI
	# ARTI VISIVE
'arti_visive': {
    'iconeSal': True,
    'liste': [
        ['testi delle arti visive', 'Testi delle arti visive', 'Wikisource:Elenco alfabetico dei testi delle arti visive'],
    ],
},
		# PITTURA
'pittura': {
    'iconeSal': True,
    'liste': [
        ['testi di pittura', 'Testi di pittura', 'Wikisource:Elenco alfabetico dei testi di pittura'],
    ],
},
	# LETTERATURA
		# BESTIARI
'bestiari': {
    'iconeSal': True,
    'liste': [
        ['bestiari', 'Bestiari', 'Wikisource:Elenco alfabetico dei bestiari'],
    ],
},
		# BIOGRAFIE
'biografie': {
    'iconeSal': True,
    'liste': [
        ['biografie', 'Biografie', 'Wikisource:Elenco alfabetico delle biografie'],
    ],
},			# AUTOBIOGRAFIE
'autobiografie': {
    'iconeSal': True,
    'liste': [
        ['autobiografie', 'Autobiografie', 'Wikisource:Elenco alfabetico delle autobiografie'],
    ],
},
		# CRITICA LETTERARIA
'bestiari': {
    'iconeSal': True,
    'liste': [
        ['testi di critica letteraria', 'Critica letteraria', 'Wikisource:Elenco alfabetico dei testi di critica letteraria'],
    ],
},
		# DIARI DI VIAGGIO
'diari_di_viaggio': {
    'iconeSal': True,
    'liste': [
        ['diari di viaggio', 'Diari di viaggio', 'Wikisource:Elenco alfabetico dei diari di viaggio'],
    ],
},
		# FANTASCIENZA
'fantascienza': {
    'iconeSal': True,
    'liste': [
        ['testi di fantascienza', 'Fantascienza', 'Wikisource:Elenco alfabetico dei testi di fantascienza'],
    ],
},
		# INTERVISTE
'interviste': {
    'iconeSal': True,
    'liste': [
        ['interviste', 'Interviste', 'Wikisource:Elenco alfabetico delle interviste'],
    ],
},	
		# LETTERATURA GIURIDICA
'letteratura_giuridica': {
    'iconeSal': True,
    'liste': [
        ['testi della letteratura giuridica', 'Letteratura giuridica', 'Wikisource:Elenco alfabetico dei testi della letteratura giuridica'],
    ],
},	
		# LETTERATURA PER RAGAZZI
'letteratura_per_ragazzi': {
    'iconeSal': True,
    'liste': [
        ['testi della letteratura per ragazzi', 'Letteratura per ragazzi', 'Wikisource:Elenco alfabetico dei testi della letteratura per ragazzi'],
    ],
},	
		# LETTERE
'lettere': {
    'iconeSal': True,
    'liste': [
        ['lettere', 'Lettere', 'Wikisource:Elenco alfabetico delle lettere'],
    ],
},	
		# LIBRETTI D'OPERA
'libretti_dopera': {
    'iconeSal': True,
    'liste': [
        ['libretti d\'opera', 'Libretti d\'opera', 'Wikisource:Elenco alfabetico dei libretti d\'opera'],
    ],
},	
		# NOVELLE
'novelle': {
    'iconeSal': True,
    'liste': [
        ['novelle', 'Novelle', 'Wikisource:Elenco alfabetico delle novelle'],
    ],
},	
		# POEMI
'poemi': {
    'iconeSal': True,
    'liste': [
        ['poemi', 'Poemi', 'Wikisource:Elenco alfabetico dei poemi'],
    ],
},	
			# POEMI EPICI
'poemi_epici': {
    'iconeSal': True,
    'liste': [
        ['poemi epici', 'Poemi epici', 'Wikisource:Elenco alfabetico dei poemi epici'],
    ],
},	
		# ROMANZI
'romanzi': {
    'iconeSal': True,
    'liste': [
        ['romanzi', 'Romanzi', 'Wikisource:Elenco alfabetico dei romanzi'],
    ],
},	
		# SAGGI
'saggi': {
    'iconeSal': True,
    'liste': [
        ['saggi', 'Saggi', 'Wikisource:Elenco alfabetico dei saggi'],
    ],
},	
		# SATIRA
'satira': {
    'iconeSal': True,
    'liste': [
        ['testi di satira', 'Satira', 'Wikisource:Elenco alfabetico dei testi di satira'],
    ],
},
	# STORIA DELL'ARTE
'storia_dellarte': {
    'iconeSal': True,
    'liste': [
        ['testi di storia dell\'arte', 'Testi di storia dell\'arte', 'Wikisource:Elenco alfabetico dei testi di storia dell\'arte'],
    ],
},
#FILOSOFIA
'filosofia': {
    'iconeSal': True,
    'liste': [
        ['testi di filosofia', 'Testi di filosofia', 'Wikisource:Elenco alfabetico dei testi di filosofia'],
    ],
},



}

#*************** FINE: PARAMETRI PER PROGETTI  ***************


#
# (C) Rob W.W. Hooft, 2004
# (C) Daniel Herding, 2004
#
__version__ = '$Id: category.py 3998 2007-08-07 20:28:27Z wikipedian $'
#
# Distributed under the terms of the MIT license.
#
import pickle, bz2
import wikipedia, catlib
import datetime


class CategoryDatabase:
    '''
    This is a temporary knowledge base saving for each category the contained
    subcategories and articles, so that category pages do not need to
    be loaded over and over again
    '''
    def __init__(self, rebuild = False, filename = 'category.dump.bz2'):
        if rebuild:
            self.rebuild()
        else:
            try:

                f = bz2.BZ2File(filename, 'r')
                wikipedia.output(u'Reading dump from %s' % filename)
                databases = pickle.load(f)
                f.close()
                # keys are categories, values are 2-tuples with lists as entries.
                self.catContentDB = databases['catContentDB']
                # like the above, but for supercategories
                self.superclassDB = databases['superclassDB']
                del databases
            except:
                # If something goes wrong, just rebuild the database
                self.rebuild()

    def rebuild(self):
        self.catContentDB={}
        self.superclassDB={}

    def getSubcats(self, supercat):
        '''
        For a given supercategory, return a list of Categorys for all its
        subcategories.
        Saves this list in a temporary database so that it won't be loaded from the
        server next time it's required.
        '''
        # if we already know which subcategories exist here
        if self.catContentDB.has_key(supercat):
            return self.catContentDB[supercat][0]
        else:
            subcatlist = supercat.subcategoriesList()
            articlelist = supercat.articlesList()
            # add to dictionary
            self.catContentDB[supercat] = (subcatlist, articlelist)
            return subcatlist

    def getArticles(self, cat):
        '''
        For a given category, return a list of Pages for all its articles.
        Saves this list in a temporary database so that it won't be loaded from the
        server next time it's required.
        '''
        # if we already know which articles exist here
        if self.catContentDB.has_key(cat):
            return self.catContentDB[cat][1]
        else:
            subcatlist = cat.subcategoriesList()
            articlelist = cat.articlesList()
            # add to dictionary
            self.catContentDB[cat] = (subcatlist, articlelist)
            return articlelist

    def getSupercats(self, subcat):
        # if we already know which subcategories exist here
        if self.superclassDB.has_key(subcat):
            return self.superclassDB[subcat]
        else:
            supercatlist = subcat.supercategoriesList()
            # add to dictionary
            self.superclassDB[subcat] = supercatlist
            return supercatlist

    def dump(self, filename = 'category.dump.bz2'):
        '''
        Saves the contents of the dictionaries superclassDB and catContentDB to disk.
        '''
        wikipedia.output(u'Dumping to %s, please wait...' % filename)
        f = bz2.BZ2File(filename, 'w')
        databases = {
            'catContentDB': self.catContentDB,
            'superclassDB': self.superclassDB
        }
        # store dump to disk in binary format
        try:
            pickle.dump(databases, f, protocol=pickle.HIGHEST_PROTOCOL)
        except pickle.PicklingError:
            pass
        f.close()

class CategoryListifyRobot:
    '''
    Creates a list containing all of the members in a category.
    '''
    listify_msg={
        'en':u'Robot: Listifying from %s (%d entries)',
        'it':u'Generazione elenco testi della categoria %s (%d testi)',
    }

    def __init__(self, infoPagine, editSummary, overwrite = True, subCats = False, talkPages = True, avz = True):
        textTitle, catTitle, listTitle = infoPagine
        self.textTitle = textTitle
        self.editSummary = editSummary
        self.overwrite = overwrite
        self.cat = catlib.Category(wikipedia.getSite(), 'Category:' + catTitle)
        self.listPage = wikipedia.Page(wikipedia.getSite(), listTitle)
        self.subCats = subCats
        self.talkPages = talkPages
        self.avz = avz

    def run(self):
        testoCat = self.textTitle
        listOfArticles = self.cat.articlesList()
        totale = len(listOfArticles)
        count = 0
        if self.subCats:
            listOfArticles += self.cat.subcategoriesList()
        if self.editSummary:
            wikipedia.setAction(self.editSummary)
        else:
            wikipedia.setAction(wikipedia.translate(wikipedia.getSite(), self.listify_msg) % (self.cat.title(), len(listOfArticles)))

        listString = "<noinclude>{{Lista Bot}}</noinclude>\n{|style=\"width:100%; background:transparent\"\n|-\n"
        for article in listOfArticles:
            count += 1
            if not article.isImage() and not article.isCategory():
                articleLink = ''
                if self.avz:
                    articleLink = '{{Testo|%s}}' % article.title()
                else:
                    articleLink = '[[%s]]' % article.title()
                if self.talkPages and not article.isTalkPage():
                    listString += "| '''" + articleLink + "'''\n| <small>[[%s|Fonte]]</small>\n|-\n" % (article.toggleTalkPage().title())
                else:
                    listString += "| '''" + articleLink + "'''\n| \n|-\n" % (article.title())
            else:
                articleLink = ''
                if self.avz:
                    articleLink = '{{Testo|:%s}}' % article.title()
                else:
                    articleLink = '[[:%s]]' % article.title()
                if self.talkPages and not article.isTalkPage():
                    listString += "| '''" + articleLink + "'''\n| <small>[[%s|Fonte]]</small>\n|-\n" % (article.toggleTalkPage().title())
                else:
                    listString += "| '''" + articleLink + "'''\n| \n|-\n" % (article.title())
        listString += "|}\n\n\n<div style=\"text-align:right;\"><small>''[[Aiuto:Elenchi generati da bot|Elenco aggiornato il {{Data ultima revisione|" + self.listPage.title() + "}}]]''</small></div>\n<!--  \nElenco dei testi formattato per il bot. \n\n"
        for article in listOfArticles:
            count += 1
            if not article.isImage() and not article.isCategory():
                if self.talkPages and not article.isTalkPage():
                    listString += "{{Testo|%s}}\n" % article.title()
                else:
                    listString += "{{Testo|%s}}\n" % article.title()
            else:
                if self.talkPages and not article.isTalkPage():
                    listString += "{{Testo|%s}}\n" % article.title()
                else:
                    listString += "{{Testo|%s}}\n" % article.title()
        listString += "\n -->\n<noinclude>[[Categoria:Liste alfabetiche %s| ]]</noinclude>" % testoCat
        if self.listPage.exists() and not self.overwrite:
            wikipedia.output(u'Page %s already exists, aborting.' % self.listPage.title())
        else:
            self.listPage.put(listString)

class CreateTableRobot:
    '''
    Creates a table.
    '''
    table_msg={
        'en':u'Robot: Listifying (%d - %d - %d - %d - %d - %d)',
        'it':u'Aggiornamento statistiche SAL (%d - %d - %d - %d - %d - %d)',
    }

    def __init__(self, infoPagine, editSummary, overwrite = True, subCats = False, talkPages = False):
        catTitle1, catTitle2, catTitle3, catTitle4, catTitle5, catTitle6, catTitle7, catTitle8, catTitle9, catTitle10, catTitle11, catTitle12, catTitle13, catTitle14, catTitle15, catTitle16, catTitle17, catTitle18, catTitle19, catTitle20, catTitle21, catTitle22, catTitle23, catTitle24, catTitle25, catTitle26, listTitle = infoPagine
        self.editSummary = editSummary
        self.overwrite = overwrite
        self.catName1 = catTitle1
        self.catName2 = catTitle2
        self.catName3 = catTitle3
        self.catName4 = catTitle4
        self.catName5 = catTitle5
        self.catName6 = catTitle6
        self.catName7 = catTitle7
        self.catName8 = catTitle8
        self.catName9 = catTitle9
        self.catName10 = catTitle10
        self.catName11 = catTitle11
        self.catName12 = catTitle12
        self.catName13 = catTitle13
        self.catName14 = catTitle14
        self.catName15 = catTitle15
        self.catName16 = catTitle16
        self.catName17 = catTitle17
        self.catName18 = catTitle18
        self.catName19 = catTitle19
        self.catName20 = catTitle20
        self.catName21 = catTitle21
        self.catName22 = catTitle22
        self.catName23 = catTitle23
        self.catName24 = catTitle24
        self.catName25 = catTitle25
        self.catName26 = catTitle26

        self.cat1 = catlib.Category(wikipedia.getSite(), 'Category:' + catTitle1)
        self.cat2 = catlib.Category(wikipedia.getSite(), 'Category:' + catTitle2)
        self.cat3 = catlib.Category(wikipedia.getSite(), 'Category:' + catTitle3)
        self.cat4 = catlib.Category(wikipedia.getSite(), 'Category:' + catTitle4)
        self.cat5 = catlib.Category(wikipedia.getSite(), 'Category:' + catTitle5)
        self.listPage = wikipedia.Page(wikipedia.getSite(), listTitle)
        self.subCats = subCats
        self.talkPages = talkPages

    def run(self):
        nomeCat1 = self.catName1
        nomeCat2 = self.catName2
        nomeCat3 = self.catName3
        nomeCat4 = self.catName4
        nomeCat5 = self.catName5
        listOfArticles1 = self.cat1.articlesList()
        listOfArticles2 = self.cat2.articlesList()
        listOfArticles3 = self.cat3.articlesList()
        listOfArticles4 = self.cat4.articlesList()
        listOfArticles5 = self.cat5.articlesList()
        totale1 = len(listOfArticles1)
        totale2 = len(listOfArticles2)
        totale3 = len(listOfArticles3)
        totale4 = len(listOfArticles4)
        totale5 = len(listOfArticles5)
        totaleTotale = totale1 + totale2 + totale3 + totale4 + totale5

        if self.editSummary:
            wikipedia.setAction(self.editSummary)
        else:
            wikipedia.setAction(wikipedia.translate(wikipedia.getSite(), self.table_msg) % (totale1, totale2, totale3, totale4, totale5, totaleTotale))

        listString = "{|{{prettytable|width=|align=|text-align=}}\n| colspan=\"6\"|'''<big>Statistiche</big>'''<br/><div style=\"float:right; margin-top:-19px;\"><small>[[Aiuto:Elenchi generati da bot|aggiornate il {{Data ultima revisione|" + self.listPage.title() + "}}]]</small></div>\n|-\n| width=\"100\" align=\"center\" style=\"background:#efefef;\" | [[Immagine:25%%.svg|12px]] '''[[:Categoria:%s|SAL 25%%]]'''\n| width=\"100\" align=\"center\" style=\"background:#efefef;\" | [[Immagine:50%%.svg|12px]] '''[[:Categoria:%s|SAL 50%%]]'''\n| width=\"100\" align=\"center\" style=\"background:#efefef;\" | [[Immagine:75%%.svg|12px]] '''[[:Categoria:%s|SAL 75%%]]'''\n| width=\"100\" align=\"center\" style=\"background:#efefef;\" | [[Immagine:100%%.svg|12px]] '''[[:Categoria:%s|SAL 100%%]]''' \n| width=\"100\" align=\"center\" style=\"background:#efefef;\" | [[Immagine:101%%.png|12px]] '''[[:Categoria:%s|Ed. WS]]'''\n| width=\"100\" align=\"center\" style=\"background:#efefef;\" | '''Totale'''\n|- style=\"text-align: center;\"\n| %d || %d || %d || %d || %d || %d \n|}" % (nomeCat1, nomeCat2, nomeCat3, nomeCat4, nomeCat5, totale1, totale2, totale3, totale4, totale5, totaleTotale)
        if self.listPage.exists() and not self.overwrite:
            wikipedia.output(u'Page %s already exists, aborting.' % self.listPage.title())
        else:
            self.listPage.put(listString)

def listaArgomenti():
    """Visualizza la lista dei progetti conosciuti dal bot"""

    wikipedia.output("\n\nDi seguito sono elencati i parametri da aggiungere per generare le statistiche dei testi dei diversi progetti:\n")
    for progetto in sorted(parametri.keys()):
        wikipedia.output("   " + progetto)
    wikipedia.output("\nPer generare le statistiche usare la forma \"python gestione_elenchi_SAL.py PARAMETRO\"\n")

def helpExit(avviso = ""):
    wikipedia.output("** " + avviso + " **")
    #wikipedia.showHelp('gestione_elenchi_SAL')
    print __doc__
    import sys
    sys.exit(1)

if __name__ == "__main__":
    editSummary = ''
    overwrite = True
    talkPages = True

    try:
        catDB = CategoryDatabase()
        action = None
        restore = False
        actions = []
        for arg in wikipedia.handleArgs():
            if arg in parametri:
                actions.append(arg)
            elif arg == 'listaArgomenti':
                listaArgomenti()
                import sys
                sys.exit()
            elif arg == 'tutto':
                 actions = sorted(parametri.keys())
            elif arg.startswith('-summary:'):
                editSummary = arg[len('-summary:'):]
            else:
                helpExit("Non conosco " + arg)
        if not actions:
            helpExit(u"Non c'è il parametro")
            
        for action in actions:
            for x in parametri[action]['liste']:
                currentBot = CategoryListifyRobot(x, editSummary, overwrite, subCats = False, talkPages = talkPages, avz = parametri[action]['iconeSal'])
                currentBot.run()

    finally:
        catDB.dump()