Wikiproyecto:Bots/Repositorio/contenido-pr.py

De Wikipedia, la enciclopedia libre

actualizar · discusión · código desprotegido  

Información de fichero
  • Nombre del fichero: contenido-pr.py
  • Lenguaje: Python
  • Estado: no protegido
Detalles de edición
  • Detalles:
Script de BOTijo (disc. · contr. · bloq.) para actualizar Wikipedia:Contenido por wikiproyecto. Originalmente tarea021.py
# -*- coding: utf-8 -*-

# Copyright (C) 2009 emijrp
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# 
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# 
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

#todo:
# no contabiliza enlaces con \' en el dump pagelinks? mejorar regexp
# 

import _mysql
import gzip
import re
import os
import sets
import sys
import time

import wikipedia

def percent(c, d=1000):
    if c % d == 0: wikipedia.output(u'Llevamos %d' % c)

def loadProjects(site):
    wikipedia.output(u'Loading projects names')
    projects, projectsall = [], []
    wii=wikipedia.Page(site, u'Wikipedia:Contenido por wikiproyecto/Wikiproyectos')
    if wii.exists() and not wii.isRedirectPage():
        for trozo in wii.get().splitlines():
            trozo=re.sub(ur'(?i) *(Wikiproyecto|Wikiproject) *: *', ur'', trozo.strip())
            trozo=re.sub('_', ' ', trozo).strip()
            projectsall.append(trozo)
            if trozo[0]=='#': continue
            if projects.count(trozo)==0:
                wikipedia.output(u'PR:%s' % trozo)
                projects.append(trozo)
        projectsall.sort()
        wii.put('\n'.join(projectsall), u'BOT - Ordenado lista de wikiproyectos y quitando repeticiones si las hay')
    return projects

def parsePRCAT(site):
    #WhatLinksHere to PRCAT
    
    #parse parameters
    
    #update lists
    
    return None

def loadCategories(site, project):
    categories = []
    wikipedia.output(u'Loading categories for %s project' % project)
    wii=wikipedia.Page(site, u'Wikipedia:Contenido por wikiproyecto/%s/Categorías' % project)
    if wii.exists() and not wii.isRedirectPage():
        trozos=wii.get().splitlines()
        for trozo in trozos:
            trozo=re.sub(ur'(?i) *(Categoría|Category) *: *', ur'', trozo.strip())
            trozo=re.sub('_', ' ', trozo)
            if len(trozo)<1 or trozo[0]=='#': continue
            if categories.count(trozo)==0:
                categories.append(trozo)
        categories.sort()
        wii.put('\n'.join(categories), u'BOT - Ordenado lista de categorías y quitando repeticiones si las hay')
    return categories

def loadNewPages(site, limitenuevos):
    nuevos_dic, nuevos_list = {}, []
    newpagesgen=site.newpages(number=limitenuevos)

    for newpage in newpagesgen:
        newpagetitle=newpage[0].title()
        newpagedate=newpage[1]
        newpageuser=re.sub(ur'( \(aún no redactado\)|(Contribuciones|Contributions)\/|\" class\=\"mw\-userlink)', ur'', newpage[4])
        if not nuevos_dic.has_key(newpagetitle):
            nuevos_dic[newpagetitle]={'date':newpagedate,'user':newpageuser}
            nuevos_list.append(newpagetitle) #para conservar orden cronologico usando el indice de la list[]
    
    return nuevos_dic, nuevos_list

def loadTemplates(conn):
    #cargamos page_id y page_title para plantillas
    templates={} #nos va a hacer falta luego para las imagenes inservibles
    conn.query("SELECT page_id, page_title from page where page_namespace=10;")
    c=0
    r=conn.use_result()
    row=r.fetch_row(maxrows=1, how=1)
    while row:
        if len(row)==1:
            page_id=int(row[0]['page_id'])
            page_title=re.sub("_", " ", unicode(row[0]['page_title'], 'utf-8'))
            c+=1;percent(c, 10000)
            templates[page_id]=page_title
        row=r.fetch_row(maxrows=1, how=1)
    wikipedia.output(u"Cargadas %d plantillas de eswiki" % (c))
    return templates

def loadBadImages(conn, templates):
    #generamos lista de imagenes inservibles
    badimages=sets.Set()
    conn.query("SELECT il_from, il_to from imagelinks;")
    c=0;cc=0
    r=conn.use_result()
    row=r.fetch_row(maxrows=1, how=1)
    while row:
        if len(row)==1:
            c+=1;percent(c, 100000)
            il_from=int(row[0]['il_from'])
            try:
                il_to=re.sub('_', ' ', unicode(row[0]['il_to'], "utf-8"))
            except:
                wikipedia.output(row[0]['il_to'])
            if templates.has_key(il_from):
                badimages.add(il_to)
                cc+=1
        row=r.fetch_row(maxrows=1, how=1)
    wikipedia.output(u"%d enlaces a imágenes, %d imágenes inservibles" % (c, cc))
    return badimages

def main():
    lang="es"
    if len(sys.argv)>1:
        lang=sys.argv[1]
    
    #os.system('rm /mnt/user-store/%swiki-latest-pagelinks.sql.gz' % lang) #borramos para descargar luego la versión más nueva
    
    clasificacion={0:u'·',1:u'Destacado',2:u'Bueno',3:u'Esbozo',4:u'Miniesbozo',5:u'Desambiguación'}
    #calidad={0:u'·',1:u'Bueno ([[Imagen:Artículo bueno.svg|14px|Artículo bueno]])',2:u'Destacado ([[Imagen:Cscr-featured.svg|14px|Artículo destacado]])'}
    importancia={0:u'·',1:u'Clase-A',2:u'Clase-B',3:u'Clase-C',4:u'Clase-D'}
    namespaces={104:u'Anexo'}
    namespaces_={104:u'Anexo:'}
    limitenuevos=2000
    avisotoolserver=u'<noinclude>{{aviso|Esta página se actualiza automáticamente. No hagas cambios aquí.}}</noinclude>\n'
    nohay=u':No hay contenido con estas características.'
    
    conn = _mysql.connect(host='sql-s7-rr', db='%swiki_p' % lang, read_default_file='~/.my.cnf')
    site=wikipedia.Site(lang, "wikipedia")
    projects=loadProjects(site)
    [nuevos_dic, nuevos_list]=loadNewPages(site, limitenuevos)
    templates=loadTemplates(conn)
    badimages=loadBadImages(conn, templates)
    
    for project in projects:
        pr=project
        wikipedia.output(u"PR:%s" % project)
        parsePRCAT(site)
        categories=loadCategories(site, project)
        
        for category in categories:
            wikipedia.output(u"  CAT:%s" % category)
        
        #Recorremos CategoryLinks buscando las categorías de este wikiproyecto y capturamos los cl_from
        conn.query("SELECT cl_from, cl_to from categorylinks;")
        r=conn.use_result()
        row=r.fetch_row(maxrows=1, how=1)
        projectpages=sets.Set()
        wikipedia.output(u"Buscando páginas que pertenezcan a este wikiproyecto")
        c=0
        while row:
            if len(row)==1:
                cl_from=int(row[0]['cl_from'])
                cl_to=re.sub("_", " ", unicode(row[0]['cl_to'], 'utf-8'))
                if cl_to in categories and cl_from not in projectpages: # Revisamos todas las categorías de este wikiproyecto
                    projectpages.add(cl_from)
                    c+=1;percent(c)
            row=r.fetch_row(maxrows=1, how=1)
        wikipedia.output(u"A este wikiproyecto pertenecen %d páginas (todos los espacios de nombres, incluso categorías)" % len(projectpages))
        
        #Inicializamos diccionario para las páginas de este wikiproyecto
        conn.query("SELECT page_id, page_title, page_len, page_namespace, page_is_redirect from page where (page_namespace=0 or page_namespace=104);")# and page_is_redirect=0;")
        r=conn.use_result()
        row=r.fetch_row(maxrows=1, how=1)
        c=0
        wikipedia.output(u"Cargando páginas del wikiproyecto %s" % (project))
        pages={}
        pagetitle2pageid={}
        allpageidsnm0=sets.Set()
        allpagetitlesnm0=sets.Set()
        while row:
            if len(row)==1:
                page_id=int(row[0]['page_id'])
                page_title=re.sub('_', ' ', unicode(row[0]['page_title'], 'utf-8'))
                page_len=int(row[0]['page_len'])
                page_nm=int(row[0]['page_namespace'])
                page_is_redirect=int(row[0]['page_is_redirect'])
                page_new=False
                #hace falta para contar enlaces entrantes provenientes del nm=0
                allpageidsnm0.add(page_id) #meter redirecciones también? sí, para que no salgan enlaces rojos de más
                allpagetitlesnm0.add(page_title) #meter redirecciones también? sí, para que no salgan enlaces rojos de más
                if page_is_redirect == 0: #no creamos perfil de página para las redirecciones
                    if nuevos_dic.has_key(page_title):
                        page_new=True
                    if page_id in projectpages:
                        c+=1;percent(c)
                        pagetitle2pageid[page_title]=page_id
                        pages[page_id]={'t':page_title, 'l':page_len, 'nm':page_nm, 'i':0, 'c':0, 'cat':0, 'iws':0, 'im':0, 'en':0, 'f':False, 'con':False, 'rel':False, 'wik':False, 'edit':False, 'ref':False, 'obras':False, 'neutral':False, 'trad':False, 'discutido':False, 'nuevo':page_new}
            row=r.fetch_row(maxrows=1, how=1)
        wikipedia.output(u"Cargadas %d páginas para analizar, solo nm=0 y nm=104, no redirecciones" % (c))
        
        """#Ranking de usuarios
        conn.query("SELECT rc_cur_id, rc_user_text from recentchanges where (rc_namespace=0 or rc_namespace=104);") #rc no muestra si es redirect, pero la filtramos con pages.has_key
        r=conn.use_result()
        row=r.fetch_row(maxrows=1, how=1)
        c=0
        wikipedia.output(u"Cargando cambios recientes a páginas del wikiproyecto %s" % (project))
        users={}
        while row:
            if len(row)==1:
                rc_cur_id=int(row[0]['rc_cur_id'])
                rc_user_text=re.sub('_', ' ', unicode(row[0]['rc_user_text'], 'utf-8'))
                if pages.has_key(rc_cur_id):
                    if users.has_key(rc_user_text):
                        users[rc_user_text]+=1
                    else:
                        users[rc_user_text]=1
                    c+=1;percent(c, 100)
            row=r.fetch_row(maxrows=1, how=1)
        wikipedia.output(u"Se han contado %d cambios recientes a páginas de este wikiproyecto" % (c))
        u=[]
        for k, v in users.items():
            u.append([v, k])
        u.sort()
        u.reverse()
        print u[:15]
        """
        #Recorremos CategoryLinks sumando categorías para los artículos
        conn.query("SELECT cl_from, cl_to from categorylinks;")
        r=conn.use_result()
        row=r.fetch_row(maxrows=1, how=1)
        c=0
        while row:
            if len(row)==1:
                cl_from=int(row[0]['cl_from'])
                cl_to=re.sub("_", " ", unicode(row[0]['cl_to'], 'utf-8'))
                                
                if pages.has_key(cl_from):
                    pages[cl_from]['cat']+=1
                    c+=1;percent(c)
            row=r.fetch_row(maxrows=1, how=1)
        wikipedia.output(u"Las páginas de este wikiproyecto están categorizadas %d veces" % (c))
        
        #Plantillas de mantenimiento
        miniesbozo_pattern=re.compile(ur'(?im)^mini ?esbozo')
        esbozo_pattern=re.compile(ur'(?im)^esbozo')
        desamb_pattern=re.compile(ur'(?im)^(Des|D[ei]sambig|Desambiguaci[oó]n)$')
        destacado_pattern=re.compile(ur'(?im)^Artículo destacado$')
        bueno_pattern=re.compile(ur'(?im)^Artículo bueno$')
        fusionar_pattern=re.compile(ur'(?im)^Fusionar$')
        contextualizar_pattern=re.compile(ur'(?im)^Contextualizar$')
        sinrelevancia_pattern=re.compile(ur'(?im)^Sin ?relevancia$')
        wikificar_pattern=re.compile(ur'(?im)^Wikificar$')
        copyedit_pattern=re.compile(ur'(?im)^Copyedit$')
        sinreferencias_pattern=re.compile(ur'(?im)^(Referencias|Artículo sin fuentes|Unreferenced)$')
        enobras_pattern=re.compile(ur'(?im)^(En ?obras|En ?desarrollo)$')
        noneutral_pattern=re.compile(ur'(?im)^(NN|No ?neutral|NPOV|No ?neutralidad)$')
        traduccion_pattern=re.compile(ur'(?im)^Traducción$')
        discutido_pattern=re.compile(ur'(?im)^Discutido$')
        
        wikipedia.output(u"Cargando enlaces a plantillas")
        conn.query("SELECT tl_from, tl_title from templatelinks where tl_namespace=10;")
        r=conn.use_result()
        row=r.fetch_row(maxrows=1, how=1)
        c=0
        while row:
            if len(row)==1:
                tl_from=int(row[0]['tl_from'])
                try:
                    tl_title=re.sub("_", " ", unicode(row[0]['tl_title'], "utf-8"))
                except:
                    wikipedia.output(row[0]['tl_title'])
                if pages.has_key(tl_from):
                    c+=1;percent(c, 10000)
                    if re.search(destacado_pattern, tl_title): pages[tl_from]['c']=1
                    elif re.search(bueno_pattern, tl_title): pages[tl_from]['c']=2
                    elif re.search(esbozo_pattern, tl_title): pages[tl_from]['c']=3
                    elif re.search(miniesbozo_pattern, tl_title): pages[tl_from]['c']=4
                    elif re.search(desamb_pattern, tl_title): pages[tl_from]['c']=5
                    #sino es ninguna de las 5 cosas, se queda el 0 que significa desconocida
                    
                    if re.search(fusionar_pattern, tl_title): pages[tl_from]['f']=True
                    if re.search(contextualizar_pattern, tl_title): pages[tl_from]['con']=True
                    if re.search(sinrelevancia_pattern, tl_title): pages[tl_from]['rel']=True
                    if re.search(wikificar_pattern, tl_title): pages[tl_from]['wik']=True
                    if re.search(copyedit_pattern, tl_title): pages[tl_from]['edit']=True
                    if re.search(sinreferencias_pattern, tl_title): pages[tl_from]['ref']=True
                    if re.search(enobras_pattern, tl_title): pages[tl_from]['obras']=True
                    if re.search(noneutral_pattern, tl_title): pages[tl_from]['neutral']=True
                    if re.search(traduccion_pattern, tl_title): pages[tl_from]['trad']=True
                    if re.search(discutido_pattern, tl_title): pages[tl_from]['discutido']=True
            row=r.fetch_row(maxrows=1, how=1)
        wikipedia.output(u"%d plantillas de mantenimiento en las páginas de este wikiproyecto" % (c))
        
        #Conteo de imágenes (obviando las inservibles)
        conn.query("SELECT il_from, il_to from imagelinks;")
        r=conn.use_result()
        row=r.fetch_row(maxrows=1, how=1)
        c=0
        while row:
            if len(row)==1:
                il_from=int(row[0]['il_from'])
                try:
                    il_to=re.sub('_', ' ', unicode(row[0]['il_to'], 'utf-8'))
                except:
                    wikipedia.output(row[0]['il_to'])
                if pages.has_key(il_from) and il_to not in badimages:
                    pages[il_from]['i']+=1
                    c+=1;percent(c, 100000)
            row=r.fetch_row(maxrows=1, how=1)
        wikipedia.output(u"%d enlaces a imágenes" % (c))
        
        #Contar interwikis
        conn.query("SELECT ll_from, ll_lang from langlinks;")
        r=conn.use_result()
        row=r.fetch_row(maxrows=1, how=1)
        c=0
        while row:
            if len(row)==1:
                ll_from=int(row[0]['ll_from'])
                try:
                    ll_lang=re.sub('_', ' ', unicode(row[0]['ll_lang'], 'utf-8'))
                except:
                    wikipedia.output(row[0]['ll_lang'])
                if pages.has_key(ll_from):
                    pages[ll_from]['iws']+=1
                    c+=1;percent(c, 500000)
            row=r.fetch_row(maxrows=1, how=1)
        wikipedia.output(u"%d interwikis tienen las páginas de este wikiproyecto" % (c))
        
        #Contar enlaces entrantes
        try:
            f=gzip.open('/mnt/user-store/%swiki-latest-pagelinks.sql.gz' % lang, 'r')
        except:
            os.system('wget http://download.wikimedia.org/%swiki/latest/%swiki-latest-pagelinks.sql.gz -O /mnt/user-store/%swiki-latest-pagelinks.sql.gz' % (lang, lang, lang)) #entorno a 150MB
            f=gzip.open('/mnt/user-store/%swiki-latest-pagelinks.sql.gz' % lang, 'r')
        c=0
        pagelinks_pattern=re.compile(ur'(?i)\((\d+)\,(0|104)\,\'([^\']*?)\'\)[\,\;]') #104 anexo:
        redlinks = {}
        for line in f:
            line=line[:len(line)-1] #evitamos \n
            m=re.findall(pagelinks_pattern, line)
            for i in m:
                c+=1;percent(c, 1000000)
                pl_from=int(i[0])
                pl_nm=int(i[1])
                pl_title=None
                try:
                    pl_title=re.sub('_', ' ', unicode(i[2], 'utf-8'))
                    pl_title=re.sub(ur"\\", ur"", pl_title) #evitamos \ en títulos que tienen comillas protegidas \" en el dump
                except:
                    pl_title=None
                
                if not pl_title:
                    continue
                
                if pl_nm!=0 and pl_nm!=104: #solo nos interesan los enlaces desde nm=0 y hacia nm=0
                    continue
                
                if pl_title not in allpagetitlesnm0: #el enlace va a un artículo que no existe
                    if pages.has_key(pl_from): #si el enlace surge de un artículo de este wikiproyecto (no vamos a coger todos los rojos)
                        if redlinks.has_key(pl_title): #deberíamos almacenar una lista con los ids, para evitar que multiples enlaces desde un mismo artículo sumen como varios, pero bueno...
                            redlinks[pl_title] += 1
                        else:
                            redlinks[pl_title] = 1
                else: #el enlace va a un artículo que sí existe
                    if pagetitle2pageid.has_key(pl_title): #el enlace va a un artículo de este wikiproyecto?
                        pl_to=pagetitle2pageid[pl_title] #ya tenemos en pl_to hacia qué artículo se dirige el enlace
                        if pages.has_key(pl_to): #no debería decir false nunca
                            pages[pl_to]['en'] += 1 #+1 entrante, im es importancia
        wikipedia.output(u"%d enlaces entre páginas" % (c))
        f.close()
        
        #Resto
        #empezamos el analisis propiamente dicho
        limpag=500
        limcabecera=50
        limkblist=5
        cabeceratabla=u'\n|-\n! # !! Artículo !! Disc !! Tamaño !! Clasificación !! Importancia !! Ent !! Cat !! Img !! Iw !! Otros '
        
        wikipedia.output(u'Generando análisis para %s' % project)
        inicio=u'{{Wikipedia:Contenido por wikiproyecto/Inicio|%s}}\n\n== Índice ==\n{{Wikipedia:Contenido por wikiproyecto/%s/Índice}}\n\n== Artículos ==\n\'\'Actualizado por última vez a las {{subst:CURRENTTIME}} ([[UTC]]) del {{subst:CURRENTDAY}} de {{subst:CURRENTMONTHNAME}} de {{subst:CURRENTYEAR}}.\'\'\n<center>\n<span style="clear:left;float:left;">{{#ifexpr:{{SUBPAGENAME}}>1|← [[Wikipedia:Contenido por wikiproyecto/%s/{{#expr:{{SUBPAGENAME}}-1}}|Anterior]]|← Esta es la primera}}</span><span style="clear:right;float:right;">{{#ifexist:Wikipedia:Contenido por wikiproyecto/%s/{{#expr:{{SUBPAGENAME}}+1}}|[[Wikipedia:Contenido por wikiproyecto/%s/{{#expr:{{SUBPAGENAME}}+1}}|Siguiente]] →|Esta es la última →}}</span><span id="arriba">↓ [[#abajo|Ir al final]] ↓</span>\n{| class="wikitable sortable" style="text-align: center;"%s' % (project, project, project, project, project, cabeceratabla)
        fin=u'\n|}\n<span style="clear:left;float:left;">{{#ifexpr:{{SUBPAGENAME}}>1|← [[Wikipedia:Contenido por wikiproyecto/%s/{{#expr:{{SUBPAGENAME}}-1}}|Anterior]]|← Esta es la primera}}</span><span style="clear:right;float:right;">{{#ifexist:Wikipedia:Contenido por wikiproyecto/%s/{{#expr:{{SUBPAGENAME}}+1}}|[[Wikipedia:Contenido por wikiproyecto/%s/{{#expr:{{SUBPAGENAME}}+1}}|Siguiente]] →|Esta es la última →}}</span><span id="abajo">↑ [[#arriba|Ir al principio]] ↑</span>\n</center>\n\n{{Wikipedia:Contenido por wikiproyecto/Fin|%s}}' % (project, project, project, project)
        salida=inicio
        c=0
        resumen={'desconocida':0,'bueno':0,'destacado':0,'esbozo':0,'miniesbozo':0,'desambig':0,'>10':0,'>5':0,'>2':0,'>1':0,'<1':0,'<2':0}
        artstitles, artstitles2 = [], []
        for projectpage in projectpages:
            if pages.has_key(projectpage):
                artstitles.append([pages[projectpage]['t'], projectpage])
                artstitles2.append([pages[projectpage]['en'], pages[projectpage]['t'], projectpage])
        
        #ordenamos alfabeticamente
        artstitles.sort()
        #ordenamos por entrantes
        artstitles2.sort();artstitles2.reverse()
        
        lenartstitles=len(artstitles)
        qclasea=lenartstitles/100*2
        qclaseb=lenartstitles/100*5-qclasea
        qclasec=lenartstitles/100*20-qclaseb
        qclased=lenartstitles-qclasec
        listqclasea, listqclaseb = [], []
        
        #calculamos importancias
        i=0
        for artentrantes, arttitle, artid in artstitles2:
            if i<qclasea:
                pages[artid]['im']=1
                listqclasea.append([artentrantes, arttitle])
            elif i<qclasea+qclaseb:
                pages[artid]['im']=2
                listqclaseb.append([artentrantes, arttitle])
            elif i<qclasea+qclaseb+qclasec:
                pages[artid]['im']=3
            else:
                pages[artid]['im']=4
            i+=1
        
        #ordenamos listas de importancia
        listqclasea.sort();listqclasea.reverse()
        listqclaseb.sort();listqclaseb.reverse()
        
        #generamos salida de listas de importancia
        #A
        listqclaseaplana=u''
        for artentrantes, arttitle in listqclasea:
            if pagetitle2pageid.has_key(arttitle):
                artnm_=u''
                pageid=pagetitle2pageid[arttitle]
                if pages.has_key(pageid):
                    if pages[pageid]['nm']!=0:
                        artnm_=namespaces_[pages[pageid]['nm']]
                    listqclaseaplana+=u'# [[%s%s]] (%d enlaces entrantes)\n' % (artnm_, arttitle, artentrantes)
        #B
        listqclasebplana=u''
        for artentrantes, arttitle in listqclaseb:
            if pagetitle2pageid.has_key(arttitle):
                artnm_=u''
                pageid=pagetitle2pageid[arttitle]
                if pages.has_key(pageid):
                    if pages[pageid]['nm']!=0:
                        artnm_=namespaces_[pages[pageid]['nm']]
                    listqclasebplana+=u'# [[%s%s]] (%d enlaces entrantes)\n' % (artnm_, arttitle, artentrantes)
        #fin listas importancia
        
        #recorremos los articulos del wikiproyecto
        qfusionar=0;qcontextualizar=0;qsinrelevancia=0;qwikificar=0
        qcopyedit=0;qsinreferencias=0;qenobras=0;qnoneutral=0;
        qentraduccion=0;qveracidaddiscutida=0
        relatedchanges=u''
        for arttitle, pageid in artstitles:
            #resumen tamanios
            if pages[pageid]['l']>=10*1024: resumen['>10']+=1
            if pages[pageid]['l']>=5*1024: resumen['>5']+=1
            if pages[pageid]['l']>=2*1024: resumen['>2']+=1
            if pages[pageid]['l']>=1*1024: resumen['>1']+=1
            if pages[pageid]['l']<1*1024: resumen['<1']+=1
            if pages[pageid]['l']<2*1024: resumen['<2']+=1
            
            #resumen calidad
            if pages[pageid]['c']==1: resumen['destacado']+=1
            elif pages[pageid]['c']==2: resumen['bueno']+=1
            elif pages[pageid]['c']==3: resumen['esbozo']+=1
            elif pages[pageid]['c']==4: resumen['miniesbozo']+=1
            elif pages[pageid]['c']==5: resumen['desambig']+=1
            else: resumen['desconocida']+=1
            
            #columna otros
            c+=1
            otros=[]
            if pages[pageid]['f']: qfusionar+=1;otros.append(u'[[Wikipedia:Contenido por wikiproyecto/%s#Fusionar|fusionar]]' % pr)
            if pages[pageid]['con']: qcontextualizar+=1;otros.append(u'[[Wikipedia:Contenido por wikiproyecto/%s#Contextualizar|contextualizar]]' % pr)
            if pages[pageid]['rel']: qsinrelevancia+=1;otros.append(u'[[Wikipedia:Contenido por wikiproyecto/%s#Sin_relevancia|sin relevancia]]' % pr)
            if pages[pageid]['wik']: qwikificar+=1;otros.append(u'[[Wikipedia:Contenido por wikiproyecto/%s#Wikificar|wikificar]]' % pr)
            if pages[pageid]['edit']: qcopyedit+=1;otros.append(u'[[Wikipedia:Contenido por wikiproyecto/%s#Copyedit|copyedit]]' % pr)
            if pages[pageid]['ref']: qsinreferencias+=1;otros.append(u'[[Wikipedia:Contenido por wikiproyecto/%s#Sin_referencias|sin referencias]]' % pr)
            if pages[pageid]['obras']: qenobras+=1;otros.append(u'[[Wikipedia:Contenido por wikiproyecto/%s#En_obras|en obras]]' % pr)
            if pages[pageid]['neutral']: qnoneutral+=1;otros.append(u'[[Wikipedia:Contenido por wikiproyecto/%s#No_neutral|no neutral]]' % pr)
            if pages[pageid]['trad']: qentraduccion+=1;otros.append(u'[[Wikipedia:Contenido por wikiproyecto/%s#En_traducción|en traducción]]' % pr)
            if pages[pageid]['discutido']: qveracidaddiscutida+=1;otros.append(u'[[Wikipedia:Contenido por wikiproyecto/%s#Veracidad_discutida|discutido]]' % pr)
            if pages[pageid]['nuevo']: otros.append(u'[[Wikipedia:Contenido por wikiproyecto/%s#Nuevos|nuevo]]' % pr)
            otros=', '.join(otros)
            
            clasificacionplana=u'' #1 destacado, 2 es bueno, resto: esbozo, miniesbozo, desambig, ·
            if pages[pageid]['c']==1: clasificacionplana=u'[[Wikipedia:Contenido por wikiproyecto/%s#Artículos_destacados|Destacado]]' % pr
            elif pages[pageid]['c']==2: clasificacionplana=u'[[Wikipedia:Contenido por wikiproyecto/%s#Artículos_buenos|Bueno]]' % pr
            else: clasificacionplana=clasificacion[pages[pageid]['c']]
            
            importanciaplana=u''
            if pages[pageid]['im']==1: importanciaplana=u'[[Wikipedia:Contenido por wikiproyecto/%s#Importancia_Clase-A|Clase-A]]' % pr
            elif pages[pageid]['im']==2: importanciaplana=u'[[Wikipedia:Contenido por wikiproyecto/%s#Importancia_Clase-B|Clase-B]]' % pr
            else: importanciaplana=importancia[pages[pageid]['im']]
            
            artnm=u'';artnm_=u''
            if pages[pageid]['nm']!=0:
                artnm=namespaces[pages[pageid]['nm']];artnm+=u' ' # http://es.wikipedia.org/w/index.php?curid=1996845&diff=21475084&oldid=21403165
                artnm_=namespaces_[pages[pageid]['nm']]
            
            salida+=u'\n|-\n| %d || [[%s%s]] || [[%sDiscusión:%s|Disc]] || %d || %s || %s || %d || %d || %d || %d || %s ' % (c, artnm_, arttitle, artnm, arttitle, pages[pageid]['l'], clasificacionplana, importanciaplana, pages[pageid]['en'], pages[pageid]['cat'], pages[pageid]['i'], pages[pageid]['iws'], otros)
            relatedchanges+=u'# [[%s%s]]\n' % (artnm_, arttitle) #pagina 0
            #if c % limcabecera == 0:
            #    salida+=cabeceratabla
            if c % limpag == 0:
                salida+=fin
                wii=wikipedia.Page(site, u'Wikipedia:Contenido por wikiproyecto/%s/%d' % (pr, c/limpag)) #numeracion
                wii.put(salida, u'BOT - Actualizando lista para [[Wikiproyecto:%s]]' % pr)
                salida=inicio
        if salida!=inicio:
            salida+=fin
            wii=wikipedia.Page(site, u'Wikipedia:Contenido por wikiproyecto/%s/%d' % (pr, c/limpag+1)) #numeracion
            wii.put(salida, u'BOT - Actualizando lista para [[Wikiproyecto:%s]]' % pr)
        
        #pagina 0 para hacer relatedchanges
        if len(relatedchanges)<=10: #no existe el wikiproyecto o no tiene páginas asignadas?
            wikipedia.output(u"No existe tal wikiproyecto o no tiene páginas asignadas")
            continue #siguiente wikiproyecto
        if len(relatedchanges)<=1024*500: #limite de KBs #con 1 MB da error el servidor
            try:
                wii=wikipedia.Page(site, u'Wikipedia:Contenido por wikiproyecto/%s/0' % (pr))
                wii.put(relatedchanges, u'BOT - Actualizando lista para [[Wikiproyecto:%s]]' % pr)
            except:
                wikipedia.output(u"Error: No se pudo guardar la página 0 ¿demasiado grande?")
        #fin pagina 0
        
        salida=u''
        for i in range(1, c/limpag+2):
            if salida: salida+=u' – [[Wikipedia:Contenido por wikiproyecto/%s/%d|Página %d]]' % (pr, i, i)
            else: salida+=u'[[Wikipedia:Contenido por wikiproyecto/%s|Resumen]]: [[Wikipedia:Contenido por wikiproyecto/%s/%d|Página %d]]' % (pr, pr, i, i)
        wii=wikipedia.Page(site, u'Wikipedia:Contenido por wikiproyecto/%s/Índice' % pr) #index
        wii.put(salida, u'BOT - Actualizando índice para [[Wikiproyecto:%s]]' % pr)
        
        #resumen global
        
        #tabla de clasificacion
        tablaclasificacion=avisotoolserver
        tablaclasificacion+=u'<onlyinclude>{| class="wikitable" style="text-align: center;clear: {{{1|}}};float: {{{1|}}};"\n'
        tablaclasificacion+=u'! colspan=4 | Clasificación !! rowspan=2 | Total '
        tablaclasificacion+=u'\n|-\n! [[Wikipedia:Artículos destacados|Destacado]] [[Imagen:Cscr-featured.svg|14px|Artículo destacado]] !! [[Wikipedia:Artículos buenos|Bueno]] [[Imagen:Artículo bueno.svg|14px|Artículo bueno]] !! [[Wikipedia:Página de desambiguación|Desambiguación]] !! Desconocido'
        tablaclasificacion+=u'\n|-\n| [[Wikipedia:Contenido por wikiproyecto/%s#Artículos destacados|%d]] || [[Wikipedia:Contenido por wikiproyecto/%s#Artículos buenos|%d]] || %d || %d || %d ' % (pr, resumen['destacado'], pr, resumen['bueno'], resumen['desambig'], resumen['desconocida'], lenartstitles)
        tablaclasificacion+=u'\n|-\n| %.1f%% || %.1f%% || %.1f%% || %.1f%% || 100%%' % ((resumen['destacado']/(lenartstitles/100.0)), (resumen['bueno']/(lenartstitles/100.0)), (resumen['desambig']/(lenartstitles/100.0)), (resumen['desconocida']/(lenartstitles/100.0)))
        tablaclasificacion+=u'\n|}</onlyinclude>\n'
        
        wii=wikipedia.Page(site, u'Wikipedia:Contenido por wikiproyecto/%s/Resumen/Clasificación' % pr) #resumen
        wii.put(tablaclasificacion, u'BOT - Actualizando tabla de clasificación para [[Wikiproyecto:%s]]' % pr)
        
        #tabla de tamanios
        tablatamanos=avisotoolserver
        tablatamanos+=u'<onlyinclude>{| class="wikitable" style="text-align: center;clear: {{{1|}}};float: {{{1|}}};"\n'
        tablatamanos+=u'! colspan=6 | Tamaño !! rowspan=2 | Total '
        tablatamanos+=u'\n|-\n! > 10 KB !! > 5 KB !! > 2 KB !! > 1 KB !! < 1 KB !! < 2 KB '
        tablatamanos+=u'\n|-\n| %d || %d || %d || %d || %d || %d || %d ' % (resumen['>10'], resumen['>5'], resumen['>2'], resumen['>1'], resumen['<1'], resumen['<2'], lenartstitles)
        tablatamanos+=u'\n|-\n| %.1f%% || %.1f%% || %.1f%% || %.1f%% || %.1f%% || %.1f%% || 100%%' % ((resumen['>10']/(lenartstitles/100.0)), (resumen['>5']/(lenartstitles/100.0)), (resumen['>2']/(lenartstitles/100.0)), (resumen['>1']/(lenartstitles/100.0)), (resumen['<1']/(lenartstitles/100.0)), (resumen['<2']/(lenartstitles/100.0)))
        tablatamanos+=u'\n|}</onlyinclude>\n'
        
        wii=wikipedia.Page(site, u'Wikipedia:Contenido por wikiproyecto/%s/Resumen/Tamaños' % pr) #resumen
        wii.put(tablatamanos, u'BOT - Actualizando tabla de tamaños para [[Wikiproyecto:%s]]' % pr)
        
        #tabla de clases (importancia)
        tablaimportancia=avisotoolserver
        tablaimportancia+=u'<onlyinclude>{| class="wikitable" style="text-align: center;clear: {{{1|}}};float: {{{1|}}};"\n'
        tablaimportancia+=u'! colspan=4 | Importancia !! rowspan=2 | Total '
        tablaimportancia+=u'\n|-\n! Clase-A ↑↑ !! Clase-B ↑ !! Clase-C ↓ !! Clase-D ↓↓'
        tablaimportancia+=u'\n|-\n| [[Wikipedia:Contenido por wikiproyecto/%s#Importancia_Clase-A|%d]] || [[Wikipedia:Contenido por wikiproyecto/%s#Importancia_Clase-B|%d]] || %d || %d || %d ' % (pr, qclasea, pr, qclaseb, qclasec, qclased, lenartstitles)
        tablaimportancia+=u'\n|-\n| 1–2%s || 3–5%s || 6–10%s || 11–100%s || 100%s ' % (u'%', u'%', u'%', u'%', u'%')
        tablaimportancia+=u'\n|}</onlyinclude>\n'
        
        wii=wikipedia.Page(site, u'Wikipedia:Contenido por wikiproyecto/%s/Resumen/Importancia' % pr) #resumen
        wii.put(tablaimportancia, u'BOT - Actualizando tabla de importancia para [[Wikiproyecto:%s]]' % pr)
        
        #tabla de mantenimiento
        qmantenimiento=qfusionar+qcontextualizar+qsinrelevancia+qwikificar+qcopyedit+qsinreferencias+qenobras+qnoneutral+qentraduccion+qveracidaddiscutida
        tablamantenimiento=avisotoolserver
        tablamantenimiento+=u'<onlyinclude>{| class="wikitable" style="text-align: center;clear: {{{1|}}};float: {{{1|}}};"\n'
        tablamantenimiento+=u'! colspan=3 | Mantenimiento '
        tablamantenimiento+=u'\n|-\n! Fusionar \n| [[Wikipedia:Contenido por wikiproyecto/%s#Fusionar|%d]] \n| %.1f%% ' % (pr, qfusionar, (qfusionar/(qmantenimiento/100.0)))
        tablamantenimiento+=u'\n|-\n! Contextualizar \n| [[Wikipedia:Contenido por wikiproyecto/%s#Contextualizar|%d]] \n| %.1f%% ' % (pr, qcontextualizar, (qcontextualizar/(qmantenimiento/100.0)))
        tablamantenimiento+=u'\n|-\n! Sin relevancia \n| [[Wikipedia:Contenido por wikiproyecto/%s#Sin_relevancia|%d]] \n| %.1f%% ' % (pr, qsinrelevancia, (qsinrelevancia/(qmantenimiento/100.0)))
        tablamantenimiento+=u'\n|-\n! Wikificar \n| [[Wikipedia:Contenido por wikiproyecto/%s#Wikificar|%d]] \n| %.1f%% ' % (pr, qwikificar, (qwikificar/(qmantenimiento/100.0)))
        tablamantenimiento+=u'\n|-\n! Copyedit \n| [[Wikipedia:Contenido por wikiproyecto/%s#Copyedit|%d]] \n| %.1f%% ' % (pr, qcopyedit, (qcopyedit/(qmantenimiento/100.0)))
        tablamantenimiento+=u'\n|-\n! Sin referencias \n| [[Wikipedia:Contenido por wikiproyecto/%s#Sin_referencias|%d]] \n| %.1f%% ' % (pr, qsinreferencias, (qsinreferencias/(qmantenimiento/100.0)))
        tablamantenimiento+=u'\n|-\n! En obras \n| [[Wikipedia:Contenido por wikiproyecto/%s#En_obras|%d]] \n| %.1f%% ' % (pr, qenobras, (qenobras/(qmantenimiento/100.0)))
        tablamantenimiento+=u'\n|-\n! No neutral \n| [[Wikipedia:Contenido por wikiproyecto/%s#No_neutral|%d]] \n| %.1f%% ' % (pr, qnoneutral, (qnoneutral/(qmantenimiento/100.0)))
        tablamantenimiento+=u'\n|-\n! En traducción \n| [[Wikipedia:Contenido por wikiproyecto/%s#En_traducción|%d]] \n| %.1f%% ' % (pr, qentraduccion, (qentraduccion/(qmantenimiento/100.0)))
        tablamantenimiento+=u'\n|-\n! Veracidad discutida \n| [[Wikipedia:Contenido por wikiproyecto/%s#Veracidad_discutida|%d]] \n| %.1f%% ' % (pr, qveracidaddiscutida, (qveracidaddiscutida/(qmantenimiento/100.0)))
        tablamantenimiento+=u'\n|-\n| Total \n| %d \n| 100%% ' % (qmantenimiento)
        tablamantenimiento+=u'\n|}</onlyinclude>\n'
        
        wii=wikipedia.Page(site, u'Wikipedia:Contenido por wikiproyecto/%s/Resumen/Mantenimiento' % pr) #resumen
        wii.put(tablamantenimiento, u'BOT - Actualizando tabla de mantenimiento para [[Wikiproyecto:%s]]' % pr)
        
        #tabla con categorias y numero de articulos que contienen, en desuso
        """categoriasanalizadas=u'{| class="wikitable sortable" style="text-align: center;"\n! #\n! Categoría\n! Artículos'
        categoriasordenadas=[]
        for cat, arts in categories[pr].items():
            categoriasordenadas.append([cat, arts])
        categoriasordenadas.sort()
        cont=1
        for cat, arts in categoriasordenadas:
            categoriasanalizadas+=u'\n|-\n| %d || [[:Categoría:%s|%s]] || %d ' %  (cont, cat, cat, len(arts))
            cont+=1
        categoriasanalizadas+=u'\n|}'"""

        #pagina de resumen con hijas
        resumen=u'\'\'Actualizado por última vez a las {{subst:CURRENTTIME}} ([[UTC]]) del {{subst:CURRENTDAY}} de {{subst:CURRENTMONTHNAME}} de {{subst:CURRENTYEAR}}.\'\'\n'
        resumen+=u'{| style="background-color: transparent"\n| valign=top |\n'
        resumen+=u'{{Wikipedia:Contenido por wikiproyecto/%s/Resumen/Clasificación}}\n' % pr
        resumen+=u'<small>\'\'Esta tabla proviene de <nowiki>{{</nowiki>[[Wikipedia:Contenido por wikiproyecto/%s/Resumen/Clasificación]]<nowiki>}}</nowiki>\'\'.</small>\n' % pr
        resumen+=u'{{Wikipedia:Contenido por wikiproyecto/%s/Resumen/Tamaños}}\n' % pr
        resumen+=u'<small>\'\'Esta tabla proviene de <nowiki>{{</nowiki>[[Wikipedia:Contenido por wikiproyecto/%s/Resumen/Tamaños]]<nowiki>}}</nowiki>\'\'.</small>\n' % pr
        resumen+=u'{{Wikipedia:Contenido por wikiproyecto/%s/Resumen/Importancia}}\n' % pr
        resumen+=u'<small>\'\'Esta tabla proviene de <nowiki>{{</nowiki>[[Wikipedia:Contenido por wikiproyecto/%s/Resumen/Importancia]]<nowiki>}}</nowiki>\'\'.</small>\n' % pr
        resumen+=u'\nEn total han sido analizadas [[Wikipedia:Contenido por wikiproyecto/%s/Categorías|%d categorías]].\n' % (pr, len(categories))
        resumen+=u'| valign=top |\n{{Wikipedia:Contenido por wikiproyecto/%s/Resumen/Mantenimiento}}\n' % pr
        resumen+=u'<small>\'\'Esta tabla proviene de <nowiki>{{</nowiki>[[Wikipedia:Contenido por wikiproyecto/%s/Resumen/Mantenimiento]]<nowiki>}}</nowiki>\'\'.</small>\n' % pr
        resumen+=u'|}'
        
        #algunos detalles globales más para el resumen
        #todo: enlaces entrantes (resto de propiedades del dic pages?)
        algunaimagen=0.0;algunacategoria=0.0;alguninterwiki=0.0
        totalimagenes=0.0;totalcategorias=0.0;totalinterwikis=0.0
        for page, pagevalues in pages.items():
            if pagevalues['i']>0: algunaimagen+=1.0;totalimagenes+=pagevalues['i']
            if pagevalues['cat']>0: algunacategoria+=1.0;totalcategorias+=pagevalues['cat']
            if pagevalues['iws']>0: alguninterwiki+=1.0;totalinterwikis+=pagevalues['iws']
        
        resumen+=u'Algunos detalles más sobre las %d páginas analizadas:\n' % lenartstitles
        resumen+=u'* %d tienen alguna imagen (%.1f%%) y [[Wikipedia:Contenido por wikiproyecto/%s/Sin imágenes|%d no tienen ninguna]] (%.1f%%). La media de imágenes por página es de %.1f.\n' % (algunaimagen, algunaimagen/(lenartstitles/100.0), pr, lenartstitles-algunaimagen, 100.0-(algunaimagen/(lenartstitles/100.0)), totalimagenes/lenartstitles)
        resumen+=u'* %d tienen alguna categoría (%.1f%%) y %d no tienen ninguna (%.1f%%). La media de categorías por página es de %.1f.\n' % (algunacategoria, algunacategoria/(lenartstitles/100.0), lenartstitles-algunacategoria, 100.0-(algunacategoria/(lenartstitles/100.0)), totalcategorias/lenartstitles)
        resumen+=u'* %d tienen algún interwiki (%.1f%%) y %d no tienen ninguno (%.1f%%). La media de interwikis por página es de %.1f.\n' % (alguninterwiki, alguninterwiki/(lenartstitles/100.0), lenartstitles-alguninterwiki, 100.0-(alguninterwiki/(lenartstitles/100.0)), totalinterwikis/lenartstitles)
        #fin detalles
        
        wii=wikipedia.Page(site, u'Wikipedia:Contenido por wikiproyecto/%s/Resumen' % pr) #resumen
        wii.put(resumen, u'BOT - Actualizando resumen para [[Wikiproyecto:%s]]' % pr)
        
        #seccion importancia, mantenimiento
        clasea=avisotoolserver+listqclaseaplana
        claseb=avisotoolserver+listqclasebplana
        
        buenos=avisotoolserver;destacados=avisotoolserver
        fusionar=avisotoolserver;contextualizar=avisotoolserver
        sinrelevancia=avisotoolserver;wikificar=avisotoolserver
        copyedit=avisotoolserver;sinreferencias=avisotoolserver
        enobras=avisotoolserver;noneutral=avisotoolserver
        traduccion=avisotoolserver;discutido=avisotoolserver
        nuevos=avisotoolserver
        enlacesrojos=avisotoolserver
        sinimagenes=avisotoolserver
        nuevos_temp=[]
        
        for arttitle, pageid in artstitles:
            artnm=u'';artnm_=u''
            if pages[pageid]['nm']!=0:
                artnm, artnm_ = namespaces[pages[pageid]['nm']], namespaces_[pages[pageid]['nm']]
            if pages[pageid]['c']==1: destacados+=u'# [[%s%s]]\n' % (artnm_, arttitle)
            if pages[pageid]['c']==2: buenos+=u'# [[%s%s]]\n' % (artnm_, arttitle)
            if pages[pageid]['f']: fusionar+=u'# [[%s%s]]\n' % (artnm_, arttitle)
            if pages[pageid]['con']: contextualizar+=u'# [[%s%s]]\n' % (artnm_, arttitle)
            if pages[pageid]['rel']: sinrelevancia+=u'# [[%s%s]]\n' % (artnm_, arttitle)
            if pages[pageid]['wik']: wikificar+=u'# [[%s%s]]\n' % (artnm_, arttitle)
            if pages[pageid]['edit']: copyedit+=u'# [[%s%s]]\n' % (artnm_, arttitle)
            if pages[pageid]['ref']: sinreferencias+=u'# [[%s%s]]\n' % (artnm_, arttitle)
            if pages[pageid]['obras']: enobras+=u'# [[%s%s]]\n' % (artnm_, arttitle)
            if pages[pageid]['neutral']: noneutral+=u'# [[%s%s]]\n' % (artnm_, arttitle)
            if pages[pageid]['trad']: traduccion+=u'# [[%s%s]]\n' % (artnm_, arttitle)
            if pages[pageid]['discutido']: discutido+=u'# [[%s%s]]\n' % (artnm_, arttitle)
            if pages[pageid]['nuevo']: nuevos_temp.append(arttitle) #los almacenamos para despues ordenarlos cronologicamente
        
        #Nuevos
        for arttitle in nuevos_list:
            if nuevos_temp.count(arttitle)!=0:
                nuevos+=u'# [[%s%s]] (Creado el %s por [[Usuario:%s|%s]])\n' % (artnm_, arttitle, re.sub(ur'\d\d\:\d\d ', ur'', nuevos_dic[arttitle]['date']), nuevos_dic[arttitle]['user'], nuevos_dic[arttitle]['user'])
        
        #Enlaces rojos
        redlinks_temp=[]
        for redlink, count in redlinks.items():
            redlinks_temp.append([count, redlink])
        redlinks_temp.sort()
        redlinks_temp.reverse()
        for count, redlink in redlinks_temp[:500]:
            if count>=5:
                enlacesrojos+=u'# [[%s]] (%d)\n' % (redlink, count)
        
        #Sin imágenes
        sinimagenes_temp=[]
        for pageid, v in pages.items():
            if v['i'] == 0:
                pagetitle=v['t']
                if v['nm']!=0:
                    pagetitle=u"%s%s" % (namespaces_[v['nm']], pagetitle)
                sinimagenes_temp.append(pagetitle)
        sinimagenes_temp.sort()
        c=0
        for sinimagen in sinimagenes_temp:
            c+=1
            if c<=500:
                sinimagenes+=u'# [[%s]]\n' % (sinimagen)
        
        salida=u'== Calidad ==\n'
        subpages=[
            [destacados, u'Artículos destacados', u'[[Imagen:Cscr-featured.svg|14px|Artículo destacado]]'],
            [buenos, u'Artículos buenos', u'[[Imagen:Artículo bueno.svg|14px|Artículo bueno]]'],
            [clasea, u'Importancia Clase-A', u''],
            [claseb, u'Importancia Clase-B', u''],
            [fusionar, u'Fusionar', u''],
            [contextualizar, u'Contextualizar', u''],
            [sinrelevancia, u'Sin relevancia', u''],
            [wikificar, u'Wikificar', u''],
            [copyedit, u'Copyedit', u''],
            [sinreferencias, u'Sin referencias', u''],
            [enobras, u'En obras', u''],
            [noneutral, u'No neutral', u''],
            [traduccion, u'En traducción', u''],
            [discutido, u'Veracidad discutida', u''],
            [nuevos, u'Nuevos', u''],
            [enlacesrojos, u'Enlaces rojos', u''],
            [sinimagenes, u'Sin imágenes', u''],
        ]
        c=0
        for output, subpage, image in subpages:
            if output:
                if output==avisotoolserver:
                    output+=nohay
                wii=wikipedia.Page(site, u'Wikipedia:Contenido por wikiproyecto/%s/%s' % (pr, subpage))
                wii.put(output, u'BOT - Actualizando detalles para [[Wikiproyecto:%s]]' % pr)
                salida+=u'=== %s %s ===\n' % (subpage, image)
                salida+=u'{{#ifexpr:{{PAGESIZE:Wikipedia:Contenido por wikiproyecto/%s/%s|R}}<=%d*1024\n' % (pr, subpage, limkblist)
                salida+=u'|:\'\'Esta lista proviene de <nowiki>{{</nowiki>[[Wikipedia:Contenido por wikiproyecto/%s/%s]]<nowiki>}}</nowiki>\'\'.\n' % (pr, subpage)
                salida+=u'{{Wikipedia:Contenido por wikiproyecto/%s/%s}}\n' % (pr, subpage)
                salida+=u'|:\'\'Esta lista excede los %d KB y no se mostrará. Se puede consultar directamente en <nowiki>{{</nowiki>[[Wikipedia:Contenido por wikiproyecto/%s/%s]]<nowiki>}}</nowiki>\'\'.\n' % (limkblist, pr, subpage)
                salida+=u'}}\n\n'
            if c==1:
                salida+=u'== Importancia ==\n'
            elif c==3:
                salida+=u'== Mantenimiento ==\n'
            elif c==13:
                salida+=u'== Miscelánea ==\n'
            c+=1
        
        wii=wikipedia.Page(site, u'Wikipedia:Contenido por wikiproyecto/%s/Detalles' % pr) #detalles
        wii.put(salida, u'BOT - Actualizando detalles para [[Wikiproyecto:%s]]' % pr)
        
        #pagina principal del pr
        salida=u'{{Wikipedia:Contenido por wikiproyecto/Iconos|%s}}\nEsta página muestra el análisis del contenido de Wikipedia en español relacionado con el [[Wikiproyecto:%s]]. Para añadir páginas debes modificar la <span class="plainlinks">[http://es.wikipedia.org/w/index.php?title=Wikipedia:Contenido_por_wikiproyecto/%s/Categorías&action=edit lista de categorías]</span>.\n\n== Índice ==\n{{Wikipedia:Contenido por wikiproyecto/%s/Índice}}\n\n== Resumen ==\n{{Wikipedia:Contenido por wikiproyecto/%s/Resumen}}\n\n{{Wikipedia:Contenido por wikiproyecto/%s/Detalles}}\n\n[[Categoría:Wikipedia:Contenido por wikiproyecto|%s]]\n[[Categoría:Wikipedia:Contenido por wikiproyecto/%s| ]]' % (pr, pr, re.sub(u' ', u'_', pr), pr, pr, pr, pr, pr)
        wii=wikipedia.Page(site, u'Wikipedia:Contenido por wikiproyecto/%s' % pr) #principal
        wii.put(salida, u'BOT - Actualizando página de [[Wikiproyecto:%s]]' % pr)

    conn.close()

if __name__ == "__main__":
    main()