Aller au contenu

Utilisateur:DSisyphBot/Script/interwikification.py

Une page de Wikipédia, l'encyclopédie libre.
# -*- 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()