#-*- 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()