#!/usr/bin/env python
# coding: utf-8
# Ce script formate les pages de la Wikiversité :
# 1) Il retire les clés de tri devenues inutiles.
# 2) Il complète les modèles {{Chapitre}} à partir des {{Leçon}}.
# 3) Ajoute {{Bas de page}}.
# Reste à faire :
# 4) Remplir les {{Département}} à remplir à partir des {{Leçon}}.
# 5) Compléter les {{Bas de page}} existants.
# Importation des modules
import catlib, pagegenerators, os, codecs, urllib, re, hyperlynx
from wikipedia import *
# Déclaration
language = "fr"
family = "wikiversity"
mynick = "JackBot"
site = getSite(language,family)
debogage = False
CorrigerModeles = False
sizeT = 3
sizeP = 12
temp = range(1, sizeT)
Ttemp = range(1, sizeT)
temp[1] = u'numero'
Ttemp[1] = u'numéro'
# Modèle:Chapitre
param = range(1, sizeP)
param[1] = u'titre ' # espace pour disambiguiser
param[2] = u'idfaculté'
param[3] = u' leçon'
param[4] = u'page'
param[5] = u'numero'
param[6] = u'précédent'
param[7] = u'suivant'
param[8] = u'align'
param[9] = u'niveau'
param[10] = u'titre_leçon'
# Modification du wiki
def modification(PageHS):
summary = u'[[Aide:Syntaxe|Autoformatage]]'
PageEnd = "" # On sauvegarde la partie traitée d'une page provisoire dans une page finale jusqu'à disparition de la première
page = Page(site,PageHS)
print(PageHS.encode(config.console_encoding, 'replace'))
if page.exists():
try:
PageBegin = page.get()
except wikipedia.NoPage:
print "NoPage"
return
except wikipedia.IsRedirectPage:
print "Redirect page"
return
except wikipedia.LockedPage:
print "Locked/protected page"
return
else:
print u'Page inexistante'
return
PageTemp = PageBegin
# Clés de tri
sizeR = 7
regex = range(1, sizeR+1)
regex[1] = ur'()\n{{[Cc]lé de tri[^}]*}}'
regex[2] = ur'({{[Cc]hapitre[^}]*)\| *clé *=[^}\|]*'
regex[3] = ur'({{[Ll]eçon[^}]*)\| *clé *=[^}\|]*'
regex[4] = ur'({{[Cc]ours[^}]*)\| *clé *=[^}\|]*'
regex[5] = ur'({{[Dd]épartement[^}]*)\| *clé *=[^}\|]*'
regex[6] = ur'({{[Ff]aculté[^}]*)\| *clé *=[^}\|]*'
for p in range(1,sizeR-1):
if re.search(regex[p], PageTemp):
PageTemp = re.sub(regex[p], ur'\1', PageTemp)
if summary.find(u'clé de tri') == -1: summary = summary + u', retrait de la clé de tri'
# Remplacements consensuels
#if page.namespace() != 0 and page.namespace() != 106 and page.namespace() != 108 and page.title() != u'Utilisateur:JackBot/test' and page.title() != u'Utilisateur:JackBot/test/test2':
# return
for p in range(1,sizeT-1):
if PageTemp.find(u'{{' + temp[p] + u'|') != -1 or PageTemp.find(u'{{' + temp[p] + u'}}') != -1:
PageTemp = PageTemp[0:PageTemp.find(temp[p])] + Ttemp[p] + PageTemp[PageTemp.find(temp[p])+len(temp[p]):len(PageTemp)]
#p=p+1
# http://fr.wikiversity.org/wiki/Catégorie:Modèle_mal_utilisé
if CorrigerModeles == True:
if PageTemp.find('{Chapitre') != -1 or PageTemp.find('{chapitre') != -1:
''' Bug du modèle tronqué :
if re.compile('{Chapitre').search(PageTemp):
if re.compile('{Chapitre[.\n]*(\n.*align.*=.*\n)').search(PageTemp):
i1 = re.search(u'{{Chapitre[.\n]*(\n.*align.*=.*\n)',PageTemp).end()
i2 = re.search(u'(\n.*align.*=.*\n)',PageTemp[:i1]).start()
PageTemp = PageTemp[:i2] + u'\n' + PageTemp[i1:]
PageEnd = PageTemp[0:PageTemp.find(u'{{Chapitre')+len(u'{{Chapitre')]
PageTemp = PageTemp[PageTemp.find(u'{{Chapitre')+len(u'{{Chapitre'):len(PageTemp)]
elif re.compile('{chapitre').search(PageTemp):
if re.compile('{chapitre[.\n]*(\n.*align.*=.*\n)').search(PageTemp):
i1 = re.search(u'{{chapitre[.\n]*(\n.*align.*=.*\n)',PageTemp).end()
i2 = re.search(u'(\n.*align.*=.*\n)',PageTemp[:i1]).start()
PageTemp = PageTemp[:i2] + u'\n' + PageTemp[i1:]
PageEnd = PageTemp[0:PageTemp.find(u'{{chapitre')+len(u'{{chapitre')]
PageTemp = PageTemp[PageTemp.find(u'{{chapitre')+len(u'{{chapitre'):len(PageTemp)]
if re.compile('{{Chapitre[\n.]*(\n.*leçon.*=.*\n)').search(PageTemp):
print "leçon1"
if re.compile('{{Chapitre.*\n.*\n.*(\n.*leçon.*=.*\n)').search(PageTemp):
print "leçon2"
if re.compile('{{Chapitre.*\n.*\n.*\n.*(\n.*leçon.*=.*\n)').search(PageTemp):
print "leçon3"
if re.compile('{{Chapitre[.\n]*(\n.*niveau.*=.*\n)').search(PageTemp):
print "niveau"
print re.compile('{{Chapitre[.\n]*(\n.*niveau.*=.*\n)').search(PageTemp)
if re.compile('{{Chapitre[.\n]*(\n.*précédent.*=.*\n)').search(PageTemp):
print "précédent"
if re.compile('{{Chapitre[.\n]*(\n.*suivant.*=.*\n)').search(PageTemp):
print "suivant"
else: # Pas de modèle chapitre
print u'Pas de chapitre dans :'
print (PageHS.encode(config.console_encoding, 'replace'))
return
raw_input (PageTemp.encode(config.console_encoding, 'replace'))'''
Lecon = u''
# Majuscule
if PageTemp.find(u'Leçon') != -1 and PageTemp.find(u'Leçon') < 100:
PageTemp2 = PageTemp[PageTemp.find(u'Leçon'):len(PageTemp)]
Lecon = Valeur(u'Leçon',PageTemp)
# Minuscule
elif PageTemp.find(u'leçon') != -1 and PageTemp.find(u'leçon') < 100:
PageTemp2 = PageTemp[PageTemp.find(u'leçon'):len(PageTemp)]
Lecon = Valeur(u'leçon',PageTemp)
#raw_input (Lecon.encode(config.console_encoding, 'replace'))
if Lecon.find(u'|') != -1:
Lecon = Lecon[0:Lecon.find(u'|')]
while Lecon[0:1] == u'[':
Lecon = Lecon[1:len(Lecon)]
while Lecon[len(Lecon)-1:len(Lecon)] == u']':
Lecon = Lecon[0:len(Lecon)-1]
if (Lecon == u'../' or Lecon == u'') and PageHS.find(u'/') != -1:
Lecon = PageHS[0:PageHS.rfind(u'/')]
#raw_input (Lecon.encode(config.console_encoding, 'replace'))
if Lecon != u'' and Lecon.find(u'.') == -1:
page2 = Page(site,Lecon)
if page2.exists():
if page2.namespace() != 0 and page2.title() != u'Utilisateur:JackBot/test':
return
else:
try:
PageLecon = page2.get()
except wikipedia.NoPage:
print "NoPage"
return
except wikipedia.IsRedirectPage:
PageLecon = page2.getRedirectTarget().get()
except wikipedia.LockedPage:
print "Locked/protected page"
return
#raw_input (PageLecon.encode(config.console_encoding, 'replace'))
# Majuscule
if PageLecon.find(u'{{Leçon') != -1:
if Valeur(u'Leçon',PageTemp) == u'':
if PageTemp.find(u'Leçon') < PageTemp.find(u'}}') or PageTemp.find(u'Leçon') < PageTemp.find(u'}}'):
if Valeur(u'Leçon',PageTemp) == u'':
PageTemp2 = PageTemp[PageTemp.find(u'Leçon')+len(u'Leçon'):len(PageTemp)]
PageTemp2 = PageTemp2[0:PageTemp2.find(u'\n')]
while PageTemp2[len(PageTemp2)-1:len(PageTemp2)] == u' ' or PageTemp2[len(PageTemp2)-1:len(PageTemp2)] == u'\t':
PageTemp2 = PageTemp2[0:len(PageTemp2)-1]
if PageTemp2[len(PageTemp2)-1:len(PageTemp2)] == u'=':
PageEnd = PageEnd + PageTemp[0:PageTemp.find(u'Leçon')+len(u'Leçon')+PageTemp2.find(u'=')+1] + page2.title()
PageTemp = PageTemp[PageTemp.find(u'Leçon')+len(u'Leçon')+PageTemp2.find(u'=')+1:len(PageTemp)]
else:
print u'Signe égal manquant dans :'
print PageTemp2[len(PageTemp2)-1:len(PageTemp2)]
else:
PageEnd = PageEnd + u'\n|Leçon=' + page2.title()
PageEnd = PageEnd + PageTemp
if PageLecon.find(u'niveau') != -1:
PageTemp = PageLecon[PageLecon.find(u'niveau'):len(PageLecon)]
if PageTemp.find(u'=') < PageTemp.find(u'\n') and PageTemp.find(u'=') != -1:
if Valeur(u'niveau',PageLecon) != -1:
PageTemp = PageEnd
if PageTemp.find(u'{{Chapitre') != -1:
PageEnd = PageTemp[0:PageTemp.find(u'{{Chapitre')+len(u'{{Chapitre')]
PageTemp = PageTemp[PageTemp.find(u'{{Chapitre')+len(u'{{Chapitre'):len(PageTemp)]
elif PageTemp.find(u'{{chapitre') != -1:
PageEnd = PageTemp[0:PageTemp.find(u'{{chapitre')+len(u'{{chapitre')]
PageTemp = PageTemp[PageTemp.find(u'{{chapitre')+len(u'{{chapitre'):len(PageTemp)]
else: return
if PageTemp.find(u'niveau') < PageTemp.find(u'}}') and PageTemp.find(u'niveau') != -1:
PageTemp2 = PageTemp[PageTemp.find(u'niveau')+len(u'niveau'):len(PageTemp)]
while PageTemp2[0:1] == " " or PageTemp2[0:1] == "=":
PageTemp2 = PageTemp2[1:len(PageTemp2)]
if PageTemp2[0:PageTemp2.find(u'\n')] == u'':
PageEnd = PageEnd + PageTemp[0:PageTemp.find(u'niveau')+len(u'niveau')] + "=" + Valeur(u'niveau',PageLecon)
PageTemp = PageTemp2
elif Valeur(u'niveau',PageLecon) != PageTemp2[0:PageTemp2.find(u'\n')]:
if debogage == True:
print u'Différence de niveau dans ' + PageHS.encode(config.console_encoding, 'replace') + u' : '
print Valeur(u'niveau',PageLecon)
print PageTemp2[0:PageTemp2.find(u'\n')].encode(config.console_encoding, 'replace')
else:
PageEnd = PageEnd + u'\n | niveau = ' + Valeur(u'niveau',PageLecon)
#print (PageEnd.encode(config.console_encoding, 'replace'))
#raw_input (PageTemp.encode(config.console_encoding, 'replace'))
# Minuscule
elif PageLecon.find(u'{{leçon') != -1:
if Valeur(u'leçon',PageTemp) == u'':
if PageTemp.find(u'leçon') < PageTemp.find(u'}}') or PageTemp.find(u'leçon') < PageTemp.find(u'}}'):
if Valeur(u'leçon',PageTemp) == u'':
PageTemp2 = PageTemp[PageTemp.find(u'leçon')+len(u'leçon'):len(PageTemp)]
PageTemp2 = PageTemp2[0:PageTemp2.find(u'\n')]
while PageTemp2[len(PageTemp2)-1:len(PageTemp2)] == u' ' or PageTemp2[len(PageTemp2)-1:len(PageTemp2)] == u'\t':
PageTemp2 = PageTemp2[0:len(PageTemp2)-1]
if PageTemp2[len(PageTemp2)-1:len(PageTemp2)] == u'=':
PageEnd = PageEnd + PageTemp[0:PageTemp.find(u'leçon')+len(u'leçon')+PageTemp2.find(u'=')+1] + page2.title()
PageTemp = PageTemp[PageTemp.find(u'leçon')+len(u'leçon')+PageTemp2.find(u'=')+1:len(PageTemp)]
else:
print u'Signe égal manquant dans :'
print PageTemp2[len(PageTemp2)-1:len(PageTemp2)]
else:
PageEnd = PageEnd + u'\n|leçon=' + page2.title()
PageEnd = PageEnd + PageTemp
PageTemp = u''
if PageLecon.find(u'niveau') != -1:
niveauLecon = Valeur(u'niveau',PageLecon)
print niveauLecon
PageTemp = PageLecon[PageLecon.find(u'niveau'):len(PageLecon)]
if PageTemp.find(u'=') < PageTemp.find(u'\n') and PageTemp.find(u'=') != -1:
if niveauLecon != -1:
PageTemp = PageEnd
if PageTemp.find(u'{{Chapitre') != -1:
PageEnd = PageTemp[0:PageTemp.find(u'{{Chapitre')+len(u'{{Chapitre')]
PageTemp = PageTemp[PageTemp.find(u'{{Chapitre')+len(u'{{Chapitre'):len(PageTemp)]
elif PageTemp.find(u'{{chapitre') != -1:
PageEnd = PageTemp[0:PageTemp.find(u'{{chapitre')+len(u'{{chapitre')]
PageTemp = PageTemp[PageTemp.find(u'{{chapitre')+len(u'{{chapitre'):len(PageTemp)]
else: return
if PageTemp.find(u'niveau') < PageTemp.find(u'}}') and PageTemp.find(u'niveau') != -1:
PageTemp2 = PageTemp[PageTemp.find(u'niveau')+len(u'niveau'):len(PageTemp)]
while PageTemp2[0:1] == " " or PageTemp2[0:1] == "=":
PageTemp2 = PageTemp2[1:len(PageTemp2)]
niveauChapitre = PageTemp2[0:PageTemp2.find(u'\n')]
if niveauChapitre == u'':
PageEnd = PageEnd + PageTemp[0:PageTemp.find(u'niveau')+len(u'niveau')] + "=" + niveauLecon
PageTemp = PageTemp2
elif niveauChapitre != niveauLecon:
print u'Niveau du chapitre différent de celui de la leçon dans ' + PageHS.encode(config.console_encoding, 'replace')
else:
PageEnd = PageEnd + u'\n|niveau=' + niveauLecon
PageEnd = PageEnd + PageTemp
PageTemp = u''
#raw_input (PageEnd.encode(config.console_encoding, 'replace'))
'''print Valeur(u'niveau',PageEnd)
print u'********************************************'
print Valeur(u'numéro',PageEnd)
print u'********************************************'
print Valeur(u'précédent',PageEnd)
print u'********************************************'
print Valeur(u'suivant',PageEnd)
raw_input(u'Fin de paramètres')'''
NumLecon = u''
PageTemp2 = u''
if Valeur(u'numéro',PageEnd) == u'' or Valeur(u'précédent',PageEnd) == u'' or Valeur(u'suivant',PageEnd) == u'':
if PageLecon.find(PageHS) != -1:
PageTemp2 = PageLecon[0:PageLecon.find(PageHS)] # Nécessite que le département ait un nom déifférent et que les leçons soient bien nommées différemment
elif PageLecon.find(PageHS[PageHS.rfind(u'/')+1:len(PageHS)]) != -1:
PageTemp2 = PageLecon[0:PageLecon.find(PageHS[PageHS.rfind(u'/')+1:len(PageHS)])]
if PageTemp2 != u'':
while PageTemp2[len(PageTemp2)-1:len(PageTemp2)] == " " or PageTemp2[len(PageTemp2)-1:len(PageTemp2)] == "=" or PageTemp2[len(PageTemp2)-1:len(PageTemp2)] == "[" or PageTemp2[len(PageTemp2)-1:len(PageTemp2)] == "{" or PageTemp2[len(PageTemp2)-1:len(PageTemp2)] == "|" or PageTemp2[len(PageTemp2)-2:len(PageTemp2)] == "{C" or PageTemp2[len(PageTemp2)-2:len(PageTemp2)] == "{c" or PageTemp2[len(PageTemp2)-2:len(PageTemp2)] == "{L" or PageTemp2[len(PageTemp2)-2:len(PageTemp2)] == "{l":
PageTemp2 = PageTemp2[0:len(PageTemp2)-1]
if PageTemp2.rfind(u' ') > PageTemp2.rfind(u'|'):
NumLecon = PageTemp2[PageTemp2.rfind(u' ')+1:len(PageTemp2)]
else:
NumLecon = PageTemp2[PageTemp2.rfind(u'|')+1:len(PageTemp2)]
#print (PageTemp2.encode(config.console_encoding, 'replace'))
if NumLecon != u'' and NumLecon != u'département':
# Le numéro de la leçon permet de remplir les champs : |numéro=, |précédent=, |suivant=
if Valeur(u'numéro',PageEnd) == u'':
if PageEnd.find(u'numéro') == -1:
PageTemp = PageEnd
PageEnd = PageTemp[0:PageTemp.find(u'{{Chapitre')+len(u'{{Chapitre')]
PageTemp = PageTemp[PageTemp.find(u'{{Chapitre')+len(u'{{Chapitre'):len(PageTemp)]
if PageTemp.find(u'numéro') < PageTemp.find(u'}}') and PageTemp.find(u'numéro') != -1:
PageTemp2 = PageTemp[PageTemp.find(u'numéro')+len(u'numéro'):len(PageTemp)]
while PageTemp2[0:1] == " " or PageTemp2[0:1] == "=":
PageTemp2 = PageTemp2[1:len(PageTemp2)]
PageEnd = PageEnd + PageTemp[0:PageTemp.find(u'numéro')+len(u'numéro')] + "=" + NumLecon
PageTemp = PageTemp2
else:
PageEnd = PageEnd + u'\n|numéro=' + NumLecon
PageEnd = PageEnd + PageTemp
PageTemp = u''
if Valeur(u'précédent',PageEnd) == u'' and NumLecon == 1:
PageTemp = PageEnd
PageEnd = PageTemp[0:PageTemp.find(u'{{Chapitre')+len(u'{{Chapitre')]
PageTemp = PageTemp[PageTemp.find(u'{{Chapitre')+len(u'{{Chapitre'):len(PageTemp)]
if PageTemp.find(u'précédent') < PageTemp.find(u'}}') and PageTemp.find(u'précédent') != -1:
PageTemp2 = PageTemp[PageTemp.find(u'précédent')+len(u'précédent'):len(PageTemp)]
while PageTemp2[0:1] == " " or PageTemp2[0:1] == "=":
PageTemp2 = PageTemp2[1:len(PageTemp2)]
PageEnd = PageEnd + PageTemp[0:PageTemp.find(u'précédent')+len(u'précédent')] + "=" + NumLecon
PageTemp = PageTemp2
else:
PageEnd = PageEnd + u'\n|précédent=' + NumLecon
PageEnd = PageEnd + PageTemp
PageTemp = u''
elif Valeur(u'précédent',PageEnd) == u'' and Valeur(str(int(NumLecon)-1),PageLecon) != u'':
PageTemp = PageEnd
PageEnd = PageTemp[0:PageTemp.find(u'{{Chapitre')+len(u'{{Chapitre')]
PageTemp = PageTemp[PageTemp.find(u'{{Chapitre')+len(u'{{Chapitre'):len(PageTemp)]
if PageTemp.find(u'précédent') < PageTemp.find(u'}}') and PageTemp.find(u'précédent') != -1:
PageTemp2 = PageTemp[PageTemp.find(u'précédent')+len(u'précédent'):len(PageTemp)]
while PageTemp2[0:1] == " " or PageTemp2[0:1] == "=":
PageTemp2 = PageTemp2[1:len(PageTemp2)]
PageEnd = PageEnd + PageTemp[0:PageTemp.find(u'précédent')+len(u'précédent')] + "=" + Valeur(str(int(NumLecon)-1),PageLecon)
PageTemp = PageTemp2
else:
PageEnd = PageEnd + u'\n|précédent=' + Valeur(str(int(NumLecon)-1),PageLecon)
PageEnd = PageEnd + PageTemp
PageTemp = u''
if Valeur(u'suivant',PageEnd) == u'' and Valeur(str(int(NumLecon)+1),PageLecon) != u'':
PageTemp = PageEnd
PageEnd = PageTemp[0:PageTemp.find(u'{{Chapitre')+len(u'{{Chapitre')]
PageTemp = PageTemp[PageTemp.find(u'{{Chapitre')+len(u'{{Chapitre'):len(PageTemp)]
if PageTemp.find(u'suivant') < PageTemp.find(u'}}') and PageTemp.find(u'suivant') != -1:
PageTemp2 = PageTemp[PageTemp.find(u'suivant')+len(u'suivant'):len(PageTemp)]
while PageTemp2[0:1] == " " or PageTemp2[0:1] == "=":
PageTemp2 = PageTemp2[1:len(PageTemp2)]
PageEnd = PageEnd + PageTemp[0:PageTemp.find(u'suivant')+len(u'suivant')] + "=" + Valeur(str(int(NumLecon)+1),PageLecon)
PageTemp = PageTemp2
else:
if PageTemp.find(u'précédent') != -1:
PageTemp2 = PageTemp[PageTemp.find(u'précédent'):len(PageTemp)]
PageEnd = PageEnd + PageTemp[0:PageTemp.find(u'précédent')+PageTemp2.find(u'\n')] + u'\n|suivant=' + Valeur(str(int(NumLecon)+1),PageLecon)
PageTemp = PageTemp[PageTemp.find(u'précédent')+PageTemp2.find(u'\n'):len(PageTemp)]
else:
PageEnd = PageEnd + u'\n|suivant=' + Valeur(str(int(NumLecon)+1),PageLecon)
PageEnd = PageEnd + PageTemp
PageTemp = u''
else: # Pas de leçon
print u'Pas de leçon : '
print (Lecon.encode(config.console_encoding, 'replace'))
print u'dans : '
print (PageHS.encode(config.console_encoding, 'replace'))
#raw_input ('Attente')
PageEnd = PageEnd + PageTemp
PageTemp = u''
elif PageTemp.find(u'{Leçon') != -1 or PageTemp.find(u'{leçon') != -1:
# Evaluations
page2 = Page(site,u'Discussion:' + PageHS)
if page2.exists():
try:
PageDisc = page2.get()
except wikipedia.NoPage:
print "NoPage"
return
except wikipedia.IsRedirectPage:
print "Redirect page"
return
except wikipedia.LockedPage:
print "Locked/protected page"
return
else:
PageDisc = u''
if PageDisc.find(u'{{Évaluation') == -1 and PageDisc.find(u'{{évaluation') == -1: sauvegarde(page2, u'{{Évaluation|idfaculté=' + Valeur(u'idfaculté',PageTemp) + u'|avancement=?}}\n' + PageDisc, u'Ajout d\'évaluation inconnue')
# Synchronisations avec les niveaux des départements, et les évaluations des onglets Discussion:
#...
PageEnd = PageEnd + PageTemp
# Bas de page
if (PageEnd.find(u'{{Chapitre') != -1 or PageEnd.find(u'{{chapitre') != -1) and PageEnd.find(u'{{Bas de page') == -1 and PageEnd.find(u'{{bas de page') == -1:
idfaculte = u''
precedent = u''
suivant = u''
if PageEnd.find(u'idfaculté') != -1:
PageTemp = PageEnd[PageEnd.find(u'idfaculté'):len(PageEnd)]
idfaculte = PageTemp[0:PageTemp.find(u'\n')] # pb si tout sur la même ligne, faire max(0,min(PageTemp.find(u'\n'),?))
if PageEnd.find(u'précédent') != -1:
PageTemp = PageEnd[PageEnd.find(u'précédent'):len(PageEnd)]
precedent = PageTemp[0:PageTemp.find(u'\n')]
if PageEnd.find(u'suivant') != -1:
PageTemp = PageEnd[PageEnd.find(u'suivant'):len(PageEnd)]
suivant = PageTemp[0:PageTemp.find(u'\n')]
PageEnd = PageEnd + u'\n\n{{Bas de page|' + idfaculte + u'\n|' + precedent + u'\n|' + suivant + u'}}'
# Exercices (pb [[Spécial:diff/354352]])
'''PageTemp = PageEnd
PageEnd = u''
while PageEnd.find(u'{{CfExo') != -1 or PageEnd.find(u'{{cfExo') != -1:
PageTemp = PageEnd[
if
|exercice=[[
/Exercices/
/quiz/
PageEnd = PageEnd + PageTemp'''
PageEnd = PageEnd + PageTemp
PageTemp = u''
# Test des URL
if debogage == True: print u'Test des URL'
PageEnd = hyperlynx.hyperlynx(PageEnd)
if debogage == True: raw_input (u'--------------------------------------------------------------------------------------------')
if PageBegin != PageEnd: sauvegarde(page, PageEnd, summary)
# Permet à tout le monde de stopper le bot en lui écrivant
def ArretDUrgence():
arrettitle = ''.join(u'Discussion utilisateur:JackBot')
arretpage = pywikibot.Page(pywikibot.getSite(), arrettitle)
gen = iter([arretpage])
arret = arretpage.get()
if arret != u"{{/Stop}}":
pywikibot.output(u"\n*** \03{lightyellow}Arrêt d'urgence demandé\03{default} ***")
exit(0)
def Valeur(Mot,Page):
#raw_input(u'Bug http://fr.wikiversity.org/w/index.php?title=Initiation_à_l%27arithmétique/PGCD&diff=prev&oldid=386685')
if re.search(u'\n *' + Mot + u' *=', Page):
niveau = re.sub(u'\n *' + Mot + u' *=()[\n|\||}|{]', ur'$1', Page)
if debogage == True: raw_input(niveau)
#return
'''
if Page.find(u' ' + Mot) != Page.find(Mot)-1 and Page.find(u'|' + Mot) != Page.find(Mot)-1: # Pb du titre_leçon
PageTemp2 = Page[Page.find(Mot)+len(Mot):len(Page)]
else:
PageTemp2 = Page
if PageTemp2.find(Mot) == -1:
return u''
else:
PageTemp2 = PageTemp2[PageTemp2.find(Mot)+len(Mot):len(PageTemp2)]
PageTemp2 = PageTemp2[0:PageTemp2.find(u'\n')]
if PageTemp2.find (u'{{C|') != -1:
PageTemp2 = PageTemp2[PageTemp2.find (u'{{C|')+4:len(PageTemp2)]
PageTemp2 = u'[[../' + PageTemp2[0:PageTemp2.find (u'|')] + u'/]]'
while PageTemp2[0:1] == u' ' or PageTemp2[0:1] == u'\t' or PageTemp2[0:1] == u'=':
PageTemp2 = PageTemp2[1:len(PageTemp2)]
if PageTemp2[0:3] == u'[[/':
PageTemp2 = u'[[..' + PageTemp2[2:len(PageTemp2)]
return PageTemp2
'''
# Lecture du fichier articles_list.txt (au même format que pour replace.py)
def crawlerFile(source):
if source:
PagesHS = open(source, 'r')
while 1:
PageHS = PagesHS.readline()
fin = PageHS.find("\t")
PageHS = PageHS[0:fin]
if PageHS == '': break
if PageHS.find(u'[[') != -1:
PageHS = PageHS[PageHS.find(u'[[')+2:len(PageHS)]
if PageHS.find(u']]') != -1:
PageHS = PageHS[0:PageHS.find(u']]')]
# Conversion ASCII => Unicode (pour les .txt)
modification(HTMLUnicode.HTMLUnicode(PageHS))
PagesHS.close()
# Traitement d'une catégorie
def crawlerCat(category,recursif,apres):
modifier = u'False'
cat = catlib.Category(site, category)
pages = cat.articlesList(False)
gen = pagegenerators.NamespaceFilterPageGenerator(pages, [0])
for Page in pagegenerators.PreloadingGenerator(gen,100):
if not apres or apres == u'' or modifier == u'True':
modification(Page.title()) #crawlerLink(Page.title())
elif Page.title() == apres:
modifier = u'True'
if recursif == True:
subcat = cat.subcategories(recurse = True)
for subcategory in subcat:
pages = subcategory.articlesList(False)
for Page in pagegenerators.PreloadingGenerator(pages,100):
modification(Page.title())
# Traitement des pages liées
def crawlerLink(pagename,apres):
modifier = u'False'
#pagename = unicode(arg[len('-links:'):], 'utf-8')
page = wikipedia.Page(site, pagename)
gen = pagegenerators.ReferringPageGenerator(page)
gen = pagegenerators.NamespaceFilterPageGenerator(gen, [0])
for Page in pagegenerators.PreloadingGenerator(gen,100):
#print(Page.title().encode(config.console_encoding, 'replace'))
if not apres or apres == u'' or modifier == u'True':
modification(Page.title()) #crawlerLink(Page.title())
elif Page.title() == apres:
modifier = u'True'
# Traitement des pages liées des entrées d'une catégorie
def crawlerCatLink(pagename,apres):
modifier = u'False'
cat = catlib.Category(site, pagename)
pages = cat.articlesList(False)
for Page in pagegenerators.PreloadingGenerator(pages,100):
page = wikipedia.Page(site, Page.title())
gen = pagegenerators.ReferringPageGenerator(page)
gen = pagegenerators.NamespaceFilterPageGenerator(gen, [0])
for PageLiee in pagegenerators.PreloadingGenerator(gen,100):
#print(Page.title().encode(config.console_encoding, 'replace'))
if not apres or apres == u'' or modifier == u'True':
modification(PageLiee.title()) #crawlerLink(Page.title())
elif PageLiee.title() == apres:
modifier = u'True'
# Traitement d'une recherche
def crawlerSearch(pagename):
gen = pagegenerators.SearchPageGenerator(pagename, site = site, namespaces = "0")
for Page in pagegenerators.PreloadingGenerator(gen,100):
modification(Page.title())
# Traitement des modifications récentes
def crawlerRC_last_day(site=site, nobots=True, namespace='0'):
# Génère les modifications récentes de la dernière journée
ecart_last_edit = 30 # minutes
date_now = datetime.datetime.utcnow()
# Date de la plus récente modification à récupérer
date_start = date_now - datetime.timedelta(minutes=ecart_last_edit)
# Date d'un jour plus tôt
date_end = date_start - datetime.timedelta(1)
start_timestamp = date_start.strftime('%Y%m%d%H%M%S')
end_timestamp = date_end.strftime('%Y%m%d%H%M%S')
for item in site.recentchanges(number=5000, rcstart=start_timestamp, rcend=end_timestamp, rcshow=None,
rcdir='older', rctype='edit|new', namespace=namespace,
includeredirects=True, repeat=False, user=None,
returndict=False, nobots=nobots):
yield item[0]
def crawlerRC():
gen = pagegenerators.RecentchangesPageGenerator(site = site)
ecart_minimal_requis = 30 # min
for Page in pagegenerators.PreloadingGenerator(gen,100):
#print str(ecart_last_edit(Page)) + ' =? ' + str(ecart_minimal_requis)
if ecart_last_edit(Page) > ecart_minimal_requis:
modification(Page.title())
def ecart_last_edit(page):
# Timestamp au format MediaWiki de la dernière version
time_last_edit = page.getVersionHistory()[0][1]
match_time = re.match(r'(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})', time_last_edit)
# Mise au format "datetime" du timestamp de la dernière version
datetime_last_edit = datetime.datetime(int(match_time.group(1)), int(match_time.group(2)), int(match_time.group(3)),
int(match_time.group(4)), int(match_time.group(5)), int(match_time.group(6)))
datetime_now = datetime.datetime.utcnow()
diff_last_edit_time = datetime_now - datetime_last_edit
# Ecart en minutes entre l'horodotage actuelle et l'horodotage de la dernière version
return diff_last_edit_time.seconds/60 + diff_last_edit_time.days*24*60
# Traitement des modifications d'un compte
def crawlerUser(username,jusqua):
compteur = 0
gen = pagegenerators.UserContributionsGenerator(username)
for Page in pagegenerators.PreloadingGenerator(gen,100):
modification(Page.title())
compteur = compteur + 1
if compteur > jusqua: break
# Toutes les redirections
def crawlerRedirects():
for Page in site.allpages(start=u'', namespace=0, includeredirects='only'):
modification(Page.title())
# Traitement de toutes les pages du site
def crawlerAll(start):
gen = pagegenerators.AllpagesPageGenerator(start,namespace=0,includeredirects=False)
for Page in pagegenerators.PreloadingGenerator(gen,100):
#print (Page.title().encode(config.console_encoding, 'replace'))
modification(Page.title())
def sauvegarde(PageCourante, Contenu, summary):
result = "ok"
if debogage:
if len(Contenu) < 6000:
print(Contenu.encode(config.console_encoding, 'replace'))
else:
taille = 3000
print(Contenu[:taille].encode(config.console_encoding, 'replace'))
print u'\n[...]\n'
print(Contenu[len(Contenu)-taille:].encode(config.console_encoding, 'replace'))
result = raw_input("Sauvegarder ? (o/n) ")
if result != "n" and result != "no" and result != "non":
if PageCourante.title().find(u'Utilisateur:JackBot/') == -1: ArretDUrgence()
if not summary: summary = u'[[Wiktionnaire:Structure des articles|Autoformatage]]'
try:
PageCourante.put(Contenu, summary)
except wikipedia.NoPage:
print "NoPage en sauvegarde"
return
except wikipedia.IsRedirectPage:
print "IsRedirectPage en sauvegarde"
return
except wikipedia.LockedPage:
print "LockedPage en sauvegarde"
return
except pywikibot.EditConflict:
print "EditConflict en sauvegarde"
return
except wikipedia.ServerError:
print "ServerError en sauvegarde"
return
except wikipedia.BadTitle:
print "BadTitle en sauvegarde"
return
except AttributeError:
print "AttributeError en sauvegarde"
return
# Lancement
if len(sys.argv) > 1:
if sys.argv[1] == u'test':
TraitementPage = modification(u'User:' + mynick + u'/test')
elif sys.argv[1] == u'txt':
TraitementFichier = crawlerFile(u'articles_' + language + u'_' + family + u'.txt')
elif sys.argv[1] == u'cat':
TraitementCategorie = crawlerCat(u'Catégorie:SPARQL Protocol and RDF Query Language',False,u"SPARQL Protocol and RDF Query Language/Système d'implication")
elif sys.argv[1] == u'lien':
TraitementLiens = crawlerLink(u'Modèle:cite book',u'')
else:
TraitementPage = modification(sys.argv[1]) # Format http://tools.wmflabs.org/jackbot/xtools/public_html/unicode-HTML.php
else:
TraitementCategory = crawlerCat(u'Modèle mal utilisé')
'''
TraitementLiens = crawlerLink(u'Modèle:Chapitre')
TraitementLiens = crawlerLink(u'Modèle:CfExo')
TraitementUtilisateur = crawlerUser(u'Utilisateur:JackBot')
TraitementRecherche = crawlerSearch(u'chinois')
while 1:
TraitementRC = crawlerRC()
'''