Utilisateur:DSisyphBot/Script/interwikification.py
Apparence
# -*- coding: utf-8 -*-
import re
import time
import sys
import urllib
import re
import unicodedata
import pywikibot
from pywikibot import pagegenerators
from pywikibot.pagegenerators import PreloadingGenerator
from pywikibot.compat import catlib
def normalize(titre):
if 1==2: pass
elif titre.find(u'(acteur)')>0: titre = titre.replace(u'(acteur)',u'(actor)')
elif titre.find(u'(actrice)')>0: titre = titre.replace(u'(actrice)',u'(actress)')
elif titre.find(u'(animateur)')>0: titre = titre.replace(u'(animateur)',u'(TV presenter)')
elif titre.find(u'(artiste)')>0: titre = titre.replace(u'(artiste)',u'(artist)')
elif titre.find(u'(athlétisme)')>0: titre = titre.replace(u'(athlétisme)',u'(athlete)')
elif titre.find(u'(aviron)')>0: titre = titre.replace(u'(aviron)',u'(rowing)')
elif titre.find(u'(auteur)')>0: titre = titre.replace(u'(auteur)',u'(author)')
elif titre.find(u'(bateau)')>0: titre = titre.replace(u'(bateau)',u'(ship)')
elif titre.find(u'(boxe)')>0: titre = titre.replace(u'(boxe)',u'(boxer)')
elif titre.find(u'(boxe anglaise)')>0: titre = titre.replace(u'(boxe anglaise)',u'(boxer)')
elif titre.find(u'(catch)')>0: titre = titre.replace(u'(catch)',u'(wrestling)')
elif titre.find(u'(chanson)')>0: titre = titre.replace(u'(chanson)',u'(song)')
elif titre.find(u'(chanteur)')>0: titre = titre.replace(u'(chanteur)',u'(singer)')
elif titre.find(u'(chanteuse)')>0: titre = titre.replace(u'(chanteuse)',u'(singer)')
elif titre.find(u'(chimiste)')>0: titre = titre.replace(u'(chimiste)',u'(chemist)')
elif titre.find(u'(cricket)')>0: titre = titre.replace(u'(cricket)',u'(cricketer)')
elif titre.find(u'(dessinateur)')>0: titre = titre.replace(u'(dessinateur)',u'(cartoonist)')
elif titre.find(u'(dessinatrice)')>0: titre = titre.replace(u'(dessinatrice)',u'(cartoonist)')
elif titre.find(u'(économiste)')>0: titre = titre.replace(u'(économiste)',u'(economist)')
elif titre.find(u'(écrivain)')>0: titre = titre.replace(u'(écrivain)',u'(writer)')
elif titre.find(u'(football américain)')>0: titre = titre.replace(u'(football américain)',u'(American football)')
elif titre.find(u'(fromage)')>0: titre = titre.replace(u'(fromage)',u'(cheese)')
elif titre.find(u'(groupe)')>0: titre = titre.replace(u'(groupe)',u'(band)')
elif titre.find(u'(gymnastique)')>0: titre = titre.replace(u'(gymnastique)',u'(gymnastics)')
elif titre.find(u'(hockey sur glace)')>0: titre = titre.replace(u'(hockey sur glace)',u'(ice hockey)')
elif titre.find(u'(homonymie)')>0: titre = titre.replace(u'(homonymie)',u'(disambiguation)')
elif titre.find(u'(homme politique)')>0: titre = titre.replace(u'(homme politique)',u'(politician)')
elif titre.find(u'(jeu vidéo)')>0: titre = titre.replace(u'(jeu vidéo)',u'(video game)')
elif titre.find(u'(jeu)')>0: titre = titre.replace(u'(jeu)',u'(game)')
elif titre.find(u'(journaliste)')>0: titre = titre.replace(u'(journaliste)',u'(journalist)')
elif titre.find(u'(musicien)')>0: titre = titre.replace(u'(musicien)',u'(musician)')
elif titre.find(u'(natation)')>0: titre = titre.replace(u'(natation)',u'(swimmer)')
elif titre.find(u'(philosophe)')>0: titre = titre.replace(u'(philosophe)',u'(philosopher)')
elif titre.find(u'(patinage de vitesse)')>0: titre = titre.replace(u'(patinage de vitesse)',u'(speed skater)')
elif titre.find(u'(pilote automobile)')>0: titre = titre.replace(u'(pilote automobile)',u'(racing driver)')
elif titre.find(u'(pilote moto)')>0: titre = titre.replace(u'(pilote moto)',u'(speedway rider)')
elif titre.find(u'(producteur)')>0: titre = titre.replace(u'(producteur)',u'(producer)')
elif titre.find(u'(professeur)')>0: titre = titre.replace(u'(professeur)',u'(academic)')
elif titre.find(u'(rivière)')>0: titre = titre.replace(u'(rivière)',u'(river)')
elif titre.find(u'(réalisateur)')>0: titre = titre.replace(u'(réalisateur)',u'(director)')
elif titre.find(u'(réalisatrice)')>0: titre = titre.replace(u'(réalisatrice)',u'(director)')
elif titre.find(u'(roman)')>0: titre = titre.replace(u'(roman)',u'(novel)')
elif titre.find(u'(route)')>0: titre = titre.replace(u'(route)',u'(road)')
elif titre.find(u'(rugby à XV)')>0: titre = titre.replace(u'(rugby à XV)',u'(rugby union)')
elif titre.find(u'(rugby à XIII)')>0: titre = titre.replace(u'(rugby à XIII)',u'(rugby league)')
elif titre.find(u'(scénariste)')>0: titre = titre.replace(u'(scénariste)',u'(writer)')
elif titre.find(u'(série télévisée)')>0: titre = titre.replace(u'(série télévisée)',u'(TV series)')
elif titre.find(u'\:Portail')>0: titre = titre.replace(u'\:Portail',u':Portal')
elif titre.find(u'\:Projet')>0: titre = titre.replace(u'\:Projet',u':Project')
elif titre.find(u'\:Utilisateur')>0: titre = titre.replace(u'\:Utilisateur',u':User')
if re.search(u'\(.*\)',titre): #nom de ville
titre = titre.replace(u' (',u', ')
titre = titre.replace(u')',u'')
listepays= [[u'Afrique du Sud',u'South Africa'],
[u'Angleterre',u'England'],
[u'Albanie',u'Albania'],
[u'Allemagne',u'Germany'],
[u'Argentine',u'Argentina'],
[u'Arménie',u'Armenia'],
[u'Australie',u'Australia'],
[u'Autriche',u'Austria'],
[u'Belgique',u'Belgium'],
[u'Brésil',u'Brazil'],
[u'Bulgarie', u'Bulgaria'],
[u'Californie',u'California'],
[u'Cameroun',u'Cameroon'],
[u'Chili',u'Chile'],
[u'Chine',u'China'],
[u'Chypre',u'Cyprus'],
[u'Croatie',u'Croatia'],
[u'Danemark', u'Denmark'],
[u'Égypte',u'Egypt'],
[u'Espagne', u'Spain'],
[u'Estonie', u'Estonia'],
[u'États-Unis',u'USA'],
[u'Finlande',u'Finland'],
[u'Floride',u'Florida'],
[u'Espagne',u'Spain'],
[u'Écosse',u'Scotland'],
[u'Grèce',u'Greece'],
[u'Grenade',u'Grenada'],
[u'Hongrie',u'Hungary'],
[u'Inde',u'India'],
[u'Indonésie',u'Indonesia'],
[u'Irlande',u'Ireland'],
[u'Islande',u'Iceland'],
[u'Italie',u'Italy'],
[u'Jamaïque',u'Jamaica'],
[u'Japon',u'Japan'],
[u'Lettonie', u'Latvia'],
[u'Namibie',u'Namibia'],
[u'Norvège',u'Norway'],
[u'Malte',u'Malta'],
[u'Maroc',u'Morocco'],
[u'Mauritanie',u'Mauritania'],
[u'Mexique',u'Mexico'],
[u'Pays de galles',u'Walles'],
[u'Pays-Bas', u'Netherlands'],
[u'Pérou',u'Peru'],
[u'Pologne',u'Poland'],
[u'République tchèque',u'Czech Republic'],
[u'Roumanie', u'Romania '],
[u'Royaume-Uni', u'United Kingdom'],
[u'Russie',u'Russia'],
[u'Serbie',u'Serbia'],
[u'Singapour',u'Singapore'],
[u'Slovaquie', u'Slovakia'],
[u'Slovénie ', u'Slovenia'],
[u'Suède',u'Sweden'],
[u'Suisse',u'Switzertland'],
[u'Zambie',u'Zambia'],]
for l in listepays:
titre = titre.replace(l[0],l[1])
if re.search(u'\(film, \d\d\d\d\)',titre):
date = re.search(u'\(film, (\d\d\d\d)\)',titre).group(1)
titre = re.sub(u'\(film, \d\d\d\d\)',u'('+date+u' film)',titre)
if re.search(u'\(\w*, \d\d\d\d\)',titre):
date = re.search(u'\((\w*), (\d\d\d\d)\)',titre).group(2)
activity = re.search(u'\((\w*), (\d\d\d\d)\)',titre).group(1)
titre = re.sub(u'\(film, \d\d\d\d\)',u'('+activity+u', born '+date+u')',titre)
elif titre.find(u'–')>0:
titre = titre.replace(u'–',u'-') #differents tirets
elif re.search(u" [ABCDEFGHIJKLMNOPQRSTUVWYXZÉ]",titre):
titre = titre.lower()
elif titre.find(u' et ')>0:
titre = titre.replace(u' et ',u' and ')
else:
titre = unicodedata.normalize('NFKD', titre).encode('ascii','ignore')
return titre
def replaces(l):
l = l.replace(u'<s>',u'')
l = l.replace(u'(R)',u'')
l = l.replace(u' ',u' ')
l = l.replace(u'</s>',u'')
l = l.replace(u'# [[',u'# <s>[[')
l = l+ u'</s>'
return l
def raye(oldlist):
suppr = 0
temp = u''
lines = oldlist.split(u'\n')
for l in lines:
if l.find(u'</s>')>0:
l = replaces(l)
suppr = 0
elif l.find(u'<s>')>=0:
l = replaces(l)
suppr = 1
elif suppr ==1:
l = replaces(l)
temp += l+u'\n'
return temp
def generatelistfr(newlist,n=0):
site = pywikibot.getSite('fr')
lstredirect = []
templist = []
newlistgen = []
for l in newlist:
if len(l)>1:
newlistgen.append(pywikibot.Page(site,l))
if n==0:
print u'****** Nombre de pages fr =', len(newlistgen)
elif n==1:
print u'****** Nombre de pages fr redirigees =', len(newlistgen)
c = len(newlistgen)
for pfr in pagegenerators.PreloadingGenerator(newlistgen,500):
if pfr.exists():
if pfr.isRedirectPage():
textredirect =pfr.get(get_redirect=True)
article = re.search(u'\[\[(.*)\]\]',textredirect).group(1) #Récupère la page en suivant la redirection
lstredirect.append(article)
else:
article = pfr.title()
templist.append(article) ## court-circuit, on ne vérifie pas la présence d'iw
## if pfr.langlinks()()==[]:
## templist.append(article)
if len(lstredirect)>0:
generatelistfr(lstredirect,1)
return templist
def generatelistforeign(newlist,lang,pagename,redirect=0):
site = pywikibot.getSite(lang)
sitefr = pywikibot.getSite('fr')
lstredirect = []
listgen = []
garder = u''
pagename2 = []
for l in newlist:
if re.search(u'Catégorie',l):
l = l.replace(u'Catégorie',u'Category')
pywikibot.output( l)
#pywikibot.output( l)
listgen.append(pywikibot.Page(site,l))
#print listgen[1]
if redirect==0:
print u'****** Nombre de pages etrangere =', len(listgen)
elif redirect==1:
print u'****** Nombre de pages etrangere redirigees ou lissees =', len(listgen)
d = len(listgen)
c = -1
## print newlist
## print u""
## print pagename
## print u""
## print listgen
## print u""
## print len(pagename),len(listgen)
## raw_input('pause')
try:
for pforeign in pagegenerators.PreloadingGenerator(listgen,1):
d=d-1
if d%100==0:print d
c = c+1 #compteur pour associer lien fr et lien foreign
ignore = 0
if pforeign.exists():
if pforeign.isRedirectPage():
textredirect = pforeign.get(get_redirect=True)
article = re.search(u'\[\[(.*)\]\]',textredirect).group(1) #Récupère la page en suivant la redirection
lstredirect.append(article)
pagename2.append(pagename[c])
else:
try :
article = pforeign.title()
textforeign = pforeign.get()
textforeign = textforeign.replace(u'<del>','<s>')
textforeign = textforeign.replace(u'</del>','</s>')
listeinter = pforeign.langlinks()
#print listeinter
for l in listeinter:
if l.site.code == 'fr':
pywikibot.output(u'fr link already present')
ignore = 1 #ignore les pages étrangères qui ont un lien fr
if ignore ==0:
#print pagename[c], lang+u':' + article
pfr = pywikibot.Page(sitefr,pagename[c])
if len(pfr.langlinks())==0: #on contrôle que la pagefr n'a pas d'iw
if redirect ==0:
garder += u'# [[:fr:'+ pagename[c] +u']] - [[:'+lang+u':' + article + u']]\n'
else:
garder += u'# (R) [[:fr:'+ pagename[c] +u']] - [[:'+lang+u':' + article + u']]\n'
except : pass
elif redirect == 0:# Lisse au premier tour seulement
article = pforeign.title()
pagename2.append(pagename[c])
article= normalize(article)
lstredirect.append(article)
#print pagename[c], article
#raw_input('pause')
except : pass
if len(lstredirect)>0:
garder += generatelistforeign(lstredirect,lang,pagename2,1) #deuxième tour
return garder
def main():
sitefr = pywikibot.getSite('fr')
f20 = open(u'Resultfinalcumul.txt','w')
f20.close()
lang = raw_input(u'langue etrangere ?')
lang = lang.lower()
lettre = raw_input(u'Quelle lettre? ')
if len(lettre)==1:
lettre = lettre.upper()
comment = u'Bot, mise à jour avec le dump du 1er novembre 2019' #9999
if lettre == u'Toutes':
lettre = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
#lettre = ['L','M','N','O','P','Q','R','S','T']
for lettre2 in lettre:
if lettre == u'esfr' or lettre == u'defr' or lettre == u'itfr':
lettre2 = lettre
elif lettre == u'Cat':
lettre2 = u'Catégorie'
elif lettre == u'0':
lettre2 = u'0-9'
elif lettre == u'@':
lettre2 = u'Autre'
elif lettre == u'ee':
lettre2 = lang+u'fr/exceptions'
comment = u'Bot, mise à jour des exceptions'
elif lettre == u'temp':
lettre2 = u'defr'
comment = u'Bot, mise à jour'
if lettre!=u'ee' and lettre!=u'temp':
f = open (lettre2+u'.txt', 'r') #La liste des pages sans iw est dans un fichier text
listphe = f.read().decode('utf-8')
listphe = listphe.replace(u'\ufeff',u'') #ménage
listphe = listphe.replace(u'_',u' ') #ménage
listphe = listphe.split('\n') #convertion en liste
else:
listphe = []
print lettre2 #montre la lettre en cours
listfr = generatelistfr(listphe) #une liste débarassée des pages avec iw depuis le dump
listfr.sort()
#9999 rajouter car u"%s contains illegal char(s) %s" % (repr(t), repr(m.group(0)))) InvalidTitle: u"Pierre-Antoine Fabre]] [[Cat\xe9gorie:Cacographie (trait d'union)" contains illegal char(s) u']'
if lang == u'en' or lettre==u'ee':
pagefr = pywikibot.Page(sitefr, u"Projet:Interwikification/"+lettre2)
else:
pagefr = pywikibot.Page(sitefr, u"Projet:Interwikification/"+lang+u"fr")
if pagefr.exists():
firsttext = pagefr.get()
firsttext = firsttext.replace(u'<del>','<s>')
firsttext = firsttext.replace(u'</del>','</s>')
firsttextraye = raye(firsttext) #raye les doublets
#récupère exceptions
pageexception = pywikibot.Page(sitefr,u"Projet:Interwikification/"+lang+u"fr/exceptions")
exceptiongene = pageexception.get() #récupère exceptions générales (text)
exceptiongene = exceptiongene.replace(u'<del>','<s>')
exceptiongene = exceptiongene.replace(u'</del>','</s>')
stripelist = []
firsttextraye = firsttextraye.split('\n')
for e in firsttextraye:
if e.find(u'<s>')>0:
e = re.search(u'\[\[:fr:(.*)\]\] -',e).group(1)
stripelist.append(e)
exceptionhost = stripelist #récupère exceptions locales (list)
listfr2 = []
for l in listfr:
if exceptiongene.find(u':'+l+u']]')<0 and l not in exceptionhost:
listfr2.append(l) #on enlève les exceptions
if lettre2 == u'Catégorie':
listfr3 = []
for l in listfr2:
l = l.replace(u'Catégorie',u'Category')
listfr3.append(l)
listfr2 = listfr3
#print listfr2[10]
listforeign = generatelistforeign(listfr2,lang,listfr2) #récupère text
listforeign = listforeign.split('\n')
templist = []
#mise en page
for l in listforeign:
templist.append(l)
templist.sort()
textforeign = u''
a = -1
for l in templist:
if a%25==0:
textforeign += u'== Break ==\n'
textforeign += l+u'\n'
a +=1
#supprime ratures locales inutiles
pywikibot.output(u'\n***** Traitement des ratures ***** \n')
exceptionhost = generatelistfr(exceptionhost)
exceptionhost.sort()
firsttextraye = generatelistforeign(exceptionhost,lang,exceptionhost)
textraye = firsttextraye.split('\n')
rature = u''
for l in textraye:
if len(l)>5:
l = l.replace(u'[[:fr:',u'<s>[[:fr:')+u'</s>\n'
l = l.replace(u'# (R) <s>',u'# <s>')
rature += l
textfinal = textforeign + u'__NOTOC__\n== Exceptions ==\n'+ rature
pywikibot.showDiff(firsttext, textfinal)
f2 = open(u'Resultfinal.txt','w')
f2.write(textfinal.encode('utf8'))
f2.close()
choice = 'u'
#choice = pywikibot.inputChoice(u'upload, Skip', [ 'upload', 'Skip' ], ['u', 'S'], 's')
if choice == 'u':
pagefr.put(textfinal,comment)
else :
listfr2 = listfr
listforeign = generatelistforeign(listfr2,lang,listfr2) #récupère text
listforeign = listforeign.split('\n')
templist = []
#mise en page
for l in listforeign:
templist.append(l)
templist.sort()
textforeign = u''
a = -1
for l in templist:
if a%25==0:
textforeign += u'== Break ==\n'
textforeign += l+u'\n'
a +=1
textfinal = textforeign
f2 = open(u'Resultfinal.txt','w')
f2.write(textfinal.encode('utf8'))
f2.close()
f20 = open(u'Resultfinalcumul.txt','a')
f20.write(textfinal.encode('utf8'))
f20.close()
if __name__ == '__main__':
try:
main()
finally:
pywikibot.stopme()