# -*- 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()