Utilisateur:DSisyphBot/Script/modele lien a remplacer.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
from pywikibot import i18n, textlib

def add_parenthesis(article):
	particle= re.sub(u'\(',u'\(',article)
	particle= re.sub(u'\)',u'\)',particle)
	particle= re.sub(u'\#',u'\#',particle)
	particle= re.sub(u'\-',u'\-',particle)
	particle= re.sub(u'\.',u'\.',particle)
	return particle
 
def main():
	category = u"Category:Page utilisant Lien pour un article existant"
	#category = u"Catégorie:Article contenant un appel à traduction en portugais"
	portail = u"Aéroport A"
	languefr = u"fr"
	display = 1
	
	sitefr = pywikibot.getSite(languefr,'wikipedia')
	cat = catlib.Category(sitefr, category)
	choix = 1
	#choix= input(u"1. Liste d'articles\n2. Liste de cat\n3. Liste d'article d'un portail-modele\n4. Liste.txt\n")
	if choix==1:
		lst2 = cat.articlesList(True)
	elif choix==2:
		lst2 = cat.subcategoriesList(True)
	elif choix==3:
		lst2 = []
		page = pywikibot.Page(sitefr,u"Modèle:"+portail)
		
		pywikibot.output( page)
		if page.isRedirectPage():
			page = page.getRedirectTarget()
		for t in page.getReferences():
			s = t.namespace()
			if s==10 : 
				t = t.title()
				lst2.append(pywikibot.Page(sitefr, t))
	elif choix==4:
		f = open ('Liste.txt', 'r')
		octet = f.read().decode('utf-8')
		octet = octet.replace(u'\ufeff',u'')
		lines = octet.split(u'\n')
		lst2 = []
		for l in lines:
			lst2.append(pywikibot.Page(sitefr, l))

	
	lst2.sort()
	#lst2 = lst2[-100:]
	c= len(lst2)
	
	f3 = open (u'Resultnofor.txt','w')
	f2 = open (u'Resultbugfor.txt','w')
	f4 = open (u'Resultnofr.txt','w')
	f2.close()
	f3.close()
	f4.close()
	f3 = open (u'Resultnofor.txt','a')
	f2 = open (u'Resultbugfor.txt','a')
	f4 = open (u'Resultnofor.txt','a')

	for p in pagegenerators.PreloadingGenerator(lst2,500):
		c = c-1
		if c%100==0:		print c
		#p = pywikibot.Page(sitefr,u"Modèle:Palette Aéronefs Let Kunovice")
		if p.isRedirectPage() :
			#pywikibot.output(p.title())
			#raw_input("redirect bizarre")
			p = p.getRedirectTarget()
		etape = 0
		languefor=u''
		if p.exists():
			
			pagename = p.title()
			#raw_input( pagename)
			text = p.get()
			newtext = u''
			textminuscule = re.sub(u'{{ *[Ll]ien *\| *',u'{{Lien|',text)
			edit = 0
			editvide = 1
			lines = textminuscule.split('{{Lien|')
			for l in lines :
				etape = 0
				
				languefor=u''
				articletrad = u''
				articlefr = u''
				articletexte = u''
				articlevide = u''
				iftrad=0
				l=u'{{Lien|'+l
				print " DEPART"
				if l.count(u'{{Lien|') + l.count(u'{{lien|') == 1 and re.search(u'{{[Ll]ien\|[^{]*}}',l): #ligne avec un seul modèle lien et sans modèle imbriqué
					#pywikibot.output(pagename)
					print "LIEN a analyser"
					if  re.search(u'{{[Ll]ien\|[^}{]*langu?e? *= *([^|}{]+)',l):
						languefor = re.search(u'{{[Ll]ien\|[^}{]*langu?e? *= *([^|}{]*)',l).group(1)
						languefor = languefor.replace(u' ',u'')
						if display >=1:	print "dedans langue a"
						etape = 1
					else :
						languefor = u'en'
						if display >=1:print "dedans langue b"
						etape = 1
					if  re.search(u'{{[Ll]ien\|[^}{]*trad *= *([^|}{]+)',l):
						articletrad = re.search(u'{{[Ll]ien\|[^}{]*trad *= *([^|}{]+)',l).group(1)
						if display >=1: print "dedans trad a"
						iftrad = 1
						etape = 1
					else :
						articletrad = u''
						iftrad = 0
						if display >=1: print "dedans trad b"
						etape = 1
					if  re.search(u'{{[Ll]ien\|[^}{]*texte *= *([^|}{]+)',l):
						articletexte = re.search(u'{{[Ll]ien\|[^}{]*texte *= *([^|}{]+)',l).group(1)
						if display >=1: print "dedans texte a"
						etape = 1
					else :
						articletexte = u''
						if display >=1: print "dedans texte b"
						etape = 1
					if  re.search(u'{{[Ll]ien\|[^}{]*fr *= *([^|}{]+)',l):
						articlefr = re.search(u'{{[Ll]ien\|[^}{]*fr *= *([^|}{]+)',l).group(1)
						if display >=1: print "dedans fr a"
						etape = 1
					else :
						articlefr = u''
						if display >=1: print "dedans fr b"
						etape = 1
					if  re.search(u'{{[Ll]ien\|([^|{}=]*)\|([^|{}=]*)(\||})',l):
						articletexte = re.search(u'{{[Ll]ien\|([^|{}=]*)\|([^|{}=]*)(\||})',l).group(2)
						articletrad = re.search(u'{{[Ll]ien\|([^|{}=]*)\|([^|{}=]*)(\||})',l).group(1)
						articlefr = re.search(u'{{[Ll]ien\|([^|{}=]*)\|([^|{}=]*)(\||})',l).group(1)
						#print articletexte,articletrad
						print "dedans vide a1"
						etape = 1
					
					elif re.search(u'{{[Ll]ien\|([^|{}=]*)(\||})',l):
						articlevide = re.search(u'{{[Ll]ien\|([^|{}=]*)(\||})',l).group(1)
						pywikibot.output( articlevide)
						print "dedans vide a2"
						etape = 1
						editvide = 1
					elif  re.search(u'{{[Ll]ien\|[^{}\|]*=[^{}\|]*\|([^|{}=]*)(\||})',l):
						articlevide = re.search(u'{{[Ll]ien\|[^{}]*\|([^|{}=]*)(\||})',l).group(1)
						pywikibot.output( articlevide)
						print "dedans vide a3"
						etape = 1
						editvide = 1
					elif  re.search(u'{{[Ll]ien\|[^{}\|]*=[^{}\|]*\|[^{}\|]*=[^{}\|]*\|([^|{}=]*)(\||})',l):
						articlevide = re.search(u'{{[Ll]ien\|[^{}]*\|[^{}\|]*=[^{}\|]*\|([^|{}=]*)(\||})',l).group(1)
						pywikibot.output( articlevide)
						print "dedans vide a4"
						etape = 1
						editvide = 1
					elif  re.search(u'{{[Ll]ien\|[^{}\|]*=[^{}\|]*\|[^{}\|]*=[^{}\|]*\|[^{}\|]*=[^{}\|]*\|([^|{}=]*)(\||})',l):
						articlevide = re.search(u'{{[Ll]ien\|[^{}]*\|[^{}\|]*=[^{}\|]*\|[^{}\|]*=[^{}\|]*\|([^|{}=]*)(\||})',l).group(1)
						pywikibot.output( articlevide)
						print "dedans vide a5"
						etape = 1
						editvide = 1
					elif  re.search(u'{{[Ll]ien\|[^{}\|]*=[^{}\|]*\|[^{}\|]*=[^{}\|]*\|[^{}\|]*=[^{}\|]*\|[^{}\|]*=[^{}\|]*\|([^|{}=]*)(\||})',l):
						articlevide = re.search(u'{{[Ll]ien\|[^{}]*\|[^{}\|]*=[^{}\|]*\|[^{}\|]*=[^{}\|]*\|[^{}\|]*=[^{}\|]*\|([^|{}=]*)(\||})',l).group(1)
						pywikibot.output( articlevide)
						print "dedans vide a6"
						etape = 1
						editvide = 1
					else :
						articlevide =u''
						#print "dedans vide b"
						etape = 1

					

					if articletrad == u'':
						if articlefr == u'':
							articletrad = articlevide
						elif articlevide != u'':
							etape = 2
							articletrad = articlefr
							#raw_input('dedans etape2')
						else :
							articletrad = articlefr
							
					if articlefr == u'':
						if articlevide != u'':
							articlefr = articlevide
						else : 
							articlefr = articletrad
					if articletexte == u'':
						if articlefr == u'':
							articletexte = articletrad
						else : 
							articletexte = articlefr

					particletrad= add_parenthesis(articletrad)
					particletexte= add_parenthesis(articletexte)
					particlefr= add_parenthesis(articlefr)
					particlevide= add_parenthesis(articlevide)


					if etape >= 1 and (len(particlevide)!=2 or (articletrad!=u'' and articlefr!=u'' and articletexte!=u'')) and languefor!=u'd': #risque d'avoir la langue en partie vide #languefor hors wikidata
						print "dedansX"
						try:
						#if 1==1:

							pagefr = pywikibot.Page(sitefr,articlefr)
							if  pagefr.exists():
								pywikibot.output( articlefr)
								print ' dedans exists'
								#pywikibot.output(articlefr)
								#print articletrad, articlefr, articletrad, languefor
								#print particletrad, particlefr, particletrad, languefor


								if re.search(u"{{ *[Ll]ien *\| *[^}{]*%s\s*[\|}][^}{]*}?}" %particlefr ,l) and articletexte!=articlefr and len(l)>0:
									l = re.sub(u"{{ *[Ll]ien *\| *[^}{]*%s\s*[\|}][^}{]*}?}" %particlefr,u"[[%s|%s]]" %(articlefr,articletexte),l)
									edit = 1
									print "dedans 001a"

								elif re.search(u"{{ *[Ll]ien *\| *[^}{]*%s\s*[\|}][^}{]*}?}" %particlefr,l) and articletexte==articlefr :
									l = re.sub(u"{{ *[Ll]ien *\| *[^}{]*%s\s*[\|}][^}{]*}?}" %particlefr,u"[[%s]]" %(articlefr),l)
									edit = 1
									print "dedans 001b"
								#else :
									#raw_input('manque condition')
									#pass
									
								
							else :
								pywikibot.output( articlefr)
								print ' dedans does not exist'
								nopage = 0
								#pywikibot.output(articlefr)
								try :
									if etape>0:
										sitefor = pywikibot.getSite(languefor,'wikipedia')
										pagefor = pywikibot.Page(sitefor,articletrad)
										if not pagefor.exists():
											nopage = 1
											if etape == 2 :
												pagefor = pywikibot.Page(sitefor,articlevide)
												if (pagefor.exists() and etape==2):
													nopage = 1
												else : etape = 1
								except :
									print "bug getsite"
									pywikibot.output( sitefor)
								
								#try :
								if 1==1:
									if nopage==1:
										

										pywikibot.output(pagename)
										#print articletrad, articlefr, languefor
										#raw_input("lien foreign non existant, modele lien a corriger")
										#pagesnoiw = u'#<nowiki>[[%s:</nowiki>[[:%s]]<nowiki>]]</nowiki>‎ lien vers [[:%s:%s]] inexistant\n' % (languefr,pagename, languefor, articletrad) 
										#pagesnoiw = u"|-\n| [[:%s:%s]]‎ inexistant, pour [[%s]] lié par [[%s]] ([[Spécial:Pages liées/%s|d'autres pages]])\n" % (languefor,articletrad,pagename,articlefr, articlefr) 

										lst3=[]
										pagearticlefr = pywikibot.Page(sitefr,articlefr)
										if pagearticlefr.isRedirectPage():
											pagearticlefr = pagearticlefr.getRedirectTarget()
										for t in pagearticlefr.getReferences():
											s = t.namespace()
											if s==0 :
												t = t.title()
												
												lst3.append(pywikibot.Page(sitefr, t))
										if re.search(u'{{[Pp]ortail[ \|](.+)}}',text):
											portailliste = re.search(u'{{[Pp]ortail[ \|](.+)}}',text).group(1)
											portailliste = re.sub(u'\|',u', ',portailliste)
										else :
											portailliste = u"aucun"
										occurrence = str(len(lst3)-1)
										if int(occurrence) <10 :
											occurrence = u'  ' + occurrence
										
										if int(occurrence)<=0:
											lienocc = u"[[Spécial:Pages liées/%s|autre page]]" % articlefr
										elif  int(occurrence)==1:
											lienocc = u"[[Spécial:Pages liées/%s|autre page]]" % articlefr
										else :
											lienocc = u"[[Spécial:Pages liées/%s|autres pages]]" % articlefr
											
										if iftrad == 1 :
											pagesnoiw = u"|-\n| [[%s]]‎ || [[%s]] ||=%s %s || [[:%s:%s]] || || %s \n" % (pagename,articlefr, occurrence ,lienocc,languefor,articletrad,portailliste) 
										elif etape == 2 :
											pagesnoiw = u"|-\n| [[%s]]‎ || [[%s]] ||=%s %s || [[:%s:%s]] || [[:%s:%s]] || %s \n" % (pagename,articlefr, occurrence ,lienocc,languefor,articletrad,languefor,articlevide,portailliste) 
										else :
											articletradspace = articletrad.replace(u' ',u'+')
											pagesnoiw = u"|-\n| [[%s]]‎ || [[%s]] ||=%s %s || [[:%s:%s]] || @wd [https://www.wikidata.org/w/index.php?search=%s %s] sur wikidata || %s \n" % (pagename,articlefr, occurrence ,lienocc,languefor,articletrad,articletradspace,articletrad,portailliste) 
										
										f3.write(pagesnoiw.encode('utf-8'))
										f3.close()
										f3 = open (u'Resultnofor.txt','a')
									else :
										interwiki = pagefor.langlinks()
										#print 'dedans1'
										for i in interwiki:
											if i.site.code== languefr:
												i = pywikibot.page.Page(i)
												categorie = i.title(withNamespace=False)
												print 'dedans2 '
												pagesnofr = u'| [[%s]] || [[:%s]] ||  %s\n|-\n' % (pagename, articlefr, i) 
##												f4.write(pagesnofr.encode('utf-8'))
##												f4.close()
##												f4 = open (u'Resultnofr.txt','a')
												#raw_input("lien interlangue existant, modele lien a supprimer ")
##								except :
##									"bug foreign"
##									pagesnoiw = u'#<nowiki>[[%s:</nowiki>[[:%s]]<nowiki>]]</nowiki>‎ lien vers [[:%s:%s]] pas au bon format\n' % (languefr,pagename, languefor, articletrad) 
##									f2.write(pagesnoiw.encode('utf-8'))
##									f2.close()
##									f2 = open (u'Resultbugfor.txt','a')
						except :
							print "bug articlefr vide"
							pywikibot.output( articlefr)
					elif languefor == u'd':
						pass
				elif l.count(u'{{Lien|') + l.count(u'{{lien|') > 1 :
					pywikibot.output(l)
					raw_input(u'plusieurs lien')
				elif not re.search(u'{{[Ll]ien\|[^{]*}}',l) and re.search(u'{{[Pp]alette',l) :
					pywikibot.output(l)
					pywikibot.output(u'VOIR MODELE')
				elif l.count(u'{{Lien|') + l.count(u'{{lien|') < 1 :
					pywikibot.output(l)
					raw_input(u'pas plusieurs lien')
				#else : raw_input(u'AUTRE0')
					
				newtext += l			
			if edit == 1 and editvide == 1 and 1==1:
				newtext = newtext[7:]
				pywikibot.showDiff(text, newtext)
				choice = 'u'
				#choice = pywikibot.inputChoice(u'upload, Skip', [ 'upload', 'Skip' ], ['u', 'S'], 's')
				if choice == 'u' :
					p.put(newtext,u"Bot, transformation de liens avec le modèle {{Lien}} en lien interne, suite à la création de l'article correspondant")

			elif not re.search(u'{{[Ll]ien\|',newtext[7:]):
				pywikibot.output(pagename)
				#raw_input(u'PAS TROUVE LIEN , VOIR MODELE')
	 
if __name__ == '__main__':
	try:
		main()
	finally:
		pywikibot.stopme()