Difference between revisions 14708474 and 14747086 on frwiktionary

[[Catégorie:JackBot]]
<source lang=python>
#!/usr/bin/env python
# coding: utf-8
'''
Ce script formate les pages du Wiktionnaire, tous les jours après minuit depuis le Toolserver :
1) Retire certains doublons de modèles et d'espaces.
2) Ajoute les clés de tris, prononciations vides, et certains liens vers les conjugaisons.
3) Met à jour les liens vers les traductions (modèles trad, trad+, trad-, trad-début et trad-fin), et les classe par ordre alphabétique.
4) Ajoute les codes langues appropriés dans les modèles du Wiktionnaire du namespace 0 et paragraphes appropriés (dont "nocat=1" si une catégorie le justifie).
5) Complète les flexions de verbes en français à vérifier.
6) Traduit les importations de en.wikt.
7) Gère des modèles {{voir}} en début de page.
8) Ajoute les anagrammes
9) Teste les URL et indique si elles sont brisées
10) Remplace les modèles obsolètes
11) Créer des liens absents : http://fr.wiktionary.org/w/index.php?title=radiateur&diff=prev&oldid=14443668
12) Détecte les modèles à ajouter : http://fr.wiktionary.org/w/index.php?title=cl%C3%A9&diff=prev&oldid=14443625

Testé ici : http://fr.wiktionary.org/w/index.php?title=Utilisateur%3AJackBot%2Ftest&diff=14533806&oldid=14533695
'''

# Importation des modules
import catlib, pagegenerators, os, codecs, urllib, re, collections, socket, hyperlynx
from wikipedia import *

# Déclaration
language = "fr"
family = "wiktionary"
mynick = "JackBot"
site = getSite(language,family)
debogage = False
debogageLent = False

# Modèles du site à traiter
limit6=9603
Modele = range(1, limit6+1)
# http://fr.wiktionary.org/wiki/Cat%C3%A9gorie:Mod%C3%A8les_de_type_de_mot_du_Wiktionnaire
Modele[1] = u'-adj-'
Modele[2] = u'-flex-adj-indéf-'
Modele[3] = u'-adj-dém-'
Modele[4] = u'-adj-excl-'
Modele[5] = u'-adj-indéf-'
(contracted; show full)Modele[811] = u'planche à roulettes'
Modele[812] = u'volcanologie'
Modele[813] = u'infographie'
Modele[814] = u'football américain'
Modele[815] = u'football canadien'
Modele[816] = u'geog'	# à remplacer ?
Modele[817] = u'scolaire'


limit4 = 818	# ébauches
Modele[818] = u'ébauche-étym-nom-scientifique'
Modele[819] = u'ébauche-trans'Modele[818] = u'logistique'
Modele[819] = u'lutherie'

limit4 = 819	# ébauches
Modele[820] = u'ébauche-déf'
Modele[821] = u'ébauche-étym'
Modele[822] = u'ébauche-pron'
Modele[823] = u'ébauche'
Modele[824] = u'ébauche-exe'
Modele[825] = u'ébauche-pron'
Modele[826] = u'ébauche-syn'
Modele[827] = u'ébauche-étym-nom-scientifique'
Modele[828] = u'ébauche-trans'
'''
# non traités
Modele[] = u'spécialement' 
Modele[] = u'T'
Modele[] = u'région'
Modele[] = u'régio'
Modele[] = u'régional'
'''
# Modèles régionaux, pb du nocat pour les prononciations
limit5 = 827
Modele[827] = u'Écosse'
Modele[828] = u'Espagne'
Modele[829] = u'États-Unis'9
Modele[830] = u'Europe'
Modele[831] = u'France'
Modele[832] = u'Franche-Comté'
Modele[833] = u'Gascogne'
Modele[834] = u'Gaspésie'
Modele[835] = u'Guadeloupe'
Modele[836] = u'Guinée'
(contracted; show full)Modele[951] = u'Congo-Brazzaville'
Modele[952] = u'Congo-Kinshasa'
Modele[953] = u'Corse'
Modele[954] = u'Corée du Nord'
Modele[955] = u'Corée du Sud'
Modele[956] = u'Costa Rica'
Modele[957] = u'Côte d’Ivoire'
Modele[958] = u'Cuba'

Modele[959] = u'Écosse'
Modele[960] = u'Espagne'
Modele[961] = u'États-Unis'

# Modèles de pronociation à synchroniser
Modele[95962] = u'en-conj-rég'
#Modele[] = u'fr-rég'
#Modele[] = u'fr-inv'

# Modèles des autres Wiktionnaires à convertir
LimitTemplate = 82
Template = range(1, LimitTemplate+1)
TemplateFR = range(1, LimitTemplate+1)
(contracted; show full)
			
		# Retrait des espaces intégrés au modèle
		while PageTemp.find(u'|pinv= ') != -1:
			PageTemp = PageTemp[0:PageTemp.find(u'|pinv= ')+len(u'|pinv=')] + PageTemp[PageTemp.find(u'|pinv= ')+len(u'|pinv= '):len(PageTemp)]
		while PageTemp.find(u'|pinv=. ') != -1:
			PageTemp = PageTemp[0:PageTemp.find(u'|pinv=. ')+len(u'|pinv=.')] + PageTemp[PageTemp.find(u'|pinv=. ')+len(u'|pinv=. '):len(PageTemp)]
		
#while PageTemp.find(u'|pinv=&nbsp;') != -1:
		#	PageTemp = PageTemp[0:PageTemp.find(u'|pinv=&nbsp;')+len(u'|pinv=')] + PageTemp[PageTemp.find(u'|pinv=&nbsp;')+len(u'|pinv=&nbsp;'):len(PageTemp)]
			
		while PageTemp.find(u'[[Annexe:Couleurs en français]]') != -1:
(contracted; show full)
			summary = summary + u', doublon {{R:Littré}}'
		while PageTemp.find(u'\n{{R:') != -1:
			PageTemp = PageTemp[0:PageTemp.find(u'\n{{R:')+1] + u'*' + PageTemp[PageTemp.find(u'\n{{R:')+1:len(PageTemp)]
		while PageTemp.find(u'\n{{Import:') != -1:
			PageTemp = PageTemp[0:PageTemp.find(u'\n{{Import:')+1] + u'*' + PageTemp[PageTemp.find(u'\n{{Import:')+1:len(PageTemp)]
		
		# 
Classement des traductions
		if debogage == True: print u'Classement des traductions'
		PageEnd = u''
		while PageTemp.find(u'{{T|') != -1:
			PageEnd = PageEnd + PageTemp[0:PageTemp.find(u'{{T|')]
			PageTemp = PageTemp[PageTemp.find(u'{{T|'):len(PageTemp)]Détection d'une première traduction aux normes
		regex = u'\* ?{{[a-z][a-z][a-z]?\-?[a-z]?[a-z]?[a-z]?}} :'
		PageEnd = u''
		while PageTemp.find(u'{{trad-début')!=-1:
			PageEnd = PageEnd + PageTemp[:PageTemp.find(u'{{trad-début')]
			PageTemp = PageTemp[PageTemp.find(u'{{trad-début'):]
			PageEnd = PageEnd + PageTemp[:PageTemp.find(u'\n')+1]
			PageTemp = PageTemp[PageTemp.find(u'\n')+1:]
			if re.search(regex, PageTemp):
				if re.search(regex, PageTemp).start() < PageTemp.find(u'{{'):
					if debogage == True: print u'Ajout d\'un modèle T'
					PageTemp = PageTemp[:PageTemp.find(u'{{')+2] + u'T|' + PageTemp[PageTemp.find(u'{{')+2:]
		PageTemp = PageEnd + PageTemp
			
		# Classement des traductions (et ajout des modèles T après le premier de la liste)
		if debogage == True: print u'Classement des traductions'
		PageEnd = u''
		while PageTemp.find(u'{{T|') != -1:
			PageEnd = PageEnd + PageTemp[0:PageTemp.find(u'{{T|')]
			PageTemp = PageTemp[PageTemp.find(u'{{T|'):len(PageTemp)]
			
			# Ajout des T
			PageTemp2 = PageTemp[PageTemp.find(u'\n'):]
			if re.search(regex, PageTemp2):
				if re.search(regex, PageTemp2).start() < PageTemp2.find(u'{{'):
					if debogage == True: print u'Ajout d\'un modèle T'
					PageTemp = PageTemp[:PageTemp.find(u'\n')+PageTemp2.find(u'{{')+2] + u'T|' + PageTemp[PageTemp.find(u'\n')+PageTemp2.find(u'{{')+2:]
			
			# Rangement de la ligne de la traduction par ordre alphabétique de la langue dans PageEnd
			langue1 = PageTemp[PageTemp.find(u'{{T|')+4:PageTemp.find(u'}')]
			if langue1.find(u'|') != -1: langue1 = langue1[0:langue1.find(u'|')]
			if langue1 != u'':
				Langue1 = Page(site,u'Modèle:' + langue1)
				try: PageTemp2 = Langue1.get()
				except wikipedia.NoPage:
(contracted; show full)		trad = u'false'
		codelangue = None
		position = 1
		p = 1
		while position > -1:	# On sauvegarde la partie traitée d'une page provisoire dans une page finale jusqu'à disparition de la première
			#print(PageEnd.encode(config.console_encoding, 'replace')[0:1000])
			#print(PageTemp.encode(config.console_encoding, 'replace')[0:1000])
			if debogage
Lent == True:
				if codelangue is None:
					print u'Boucle langue'
				else:
					print u'Boucle langue : ' + codelangue
			
			''' Eliminer les {{e}}...
			while PageTemp.find(u'}}') != -1 and PageTemp.find(u'}}') != PageTemp.find(u'}} ') and PageTemp.find(u'}}') != PageTemp.find(u'}}\n') and PageTemp.find(u'}}') != PageTemp.find(u'}}.'):
(contracted; show full)
					while PageTemp.find(u'{{') < PageTemp.find(u'}}') and PageTemp.find(u'{{') != -1 and PageTemp.find(u'}}') != -1:
						if debogage == True:
							print u'Modèle inclu dans '
							print PageTemp[:PageTemp.find(u'}}')].encode(config.console_encoding, 'replace')
						PageEnd = PageEnd + PageTemp[0:PageTemp.find(u'}}')+2]
						PageTemp = PageTemp[PageTemp.find("}}")+2:len(PageTemp)]

						#raw_input(PageTemp.encode(config.console_encoding, 'replace'))
						# Fin du nom du modèle
						if PageTemp.find("|") > PageTemp.find("}}"):
							position = PageTemp.find("}}")
						elif or PageTemp.find("|") == -1:
							position = PageTemp.find("}}")
						else:
							position = PageTemp.find("|")
						if position == -1:
							if debogage == True: print u'Erreur ligne 2271 : modèle brisé'
							return
							
					PageEnd = PageEnd + PageTemp[0:PageTemp.find(u'}}')+2]
					PageTemp = PageTemp[PageTemp.find("}}")+2:len(PageTemp)]
					break	# pb https://fr.wiktionary.org/w/index.php?title=ordre&curid=343&diff=14727763&oldid=14725107
						
					# Si on est dans un modèle spécial, le traiter, sinon par catégorie de génériques
					if not codelangue and (p < limit1 or p >= limit3) and Modele[p] != u'ébauche':
						# pb -nom-|fro}}
						#	'''hazard''' {{pron||fro}} {{m}}
						#	# {{variante de|hazart|fro}}.
						PageEnd = u'{{formater|Code langue manquant dans ' + Modele[p] + u' après le caractère ' + str(len(PageEnd)) + u'}}\n' + PageBegin
(contracted; show full)
								while PageTemp2.find(u'g') != -1 and PageTemp2.find(u'g') < PageTemp2.find(u'}}') and (PageTemp2.find(u'g') < PageTemp2.find(u'|') or PageTemp2.find(u'|') == -1): PageTemp = PageTemp[0:PageTemp.find(u'g')] + u'ɡ' + PageTemp[PageTemp.find(u'g')+1:len(PageTemp)]

								#if codelangue == u'es': β/, /ð/ et /ɣ/ au lieu de de /b/, /d/ et /ɡ/
							if PageTemp[0:8] == u'pron||}}':
								PageEnd = PageEnd + PageTemp[0:PageTemp.find("}}")] + codelangue + "}}"
								PageTemp = PageTemp[PageTemp.find("}}")+2:len(PageTemp)]
								break
							elif PageTemp[position:position+3] == u'|}}' or PageTemp[position:position+4] == u'| }}':
								PageEnd = PageEnd + PageTemp[0:position] + "||" + codelangue + "}}"
(contracted; show full)
								PageTemp = PageTemp[0:PageTemp.find(u'Ț')] + u'Ţ' + PageTemp[PageTemp.find(u'Ț')+1:len(PageTemp)]
						elif PageTemp2[0:PageTemp2.find(u'|')] == u'fon':
							while PageTemp.find(u'ε') != -1 and PageTemp.find(u'ε') < PageTemp.find(u'\n'):
								PageTemp = PageTemp[0:PageTemp.find(u'ε')] + u'ɛ' + PageTemp[PageTemp.find(u'ε')+1:len(PageTemp)]
						
elif PageTemp2[0:PageTemp2.find(u'|')] == u'nan':
							PageTemp = PageTemp[0:PageTemp.find(u'nan# http://fr.wiktionary.org/wiki/Mod%C3%A8le:code_interwiki
						elif PageTemp2[0:PageTemp2.find(u'|')] == u'cmn':
							PageTemp = PageTemp[0:PageTemp.find(u'cmn')] + u'zh' + PageTemp[PageTemp.find(u'cmn')+len(u'cmn'):len(PageTemp)]
						elif PageTemp2[0:PageTemp2.find(u'|')] == u'gsw':
							PageTemp = PageTemp[0:PageTemp.find(u'gsw')] + u'als' + PageTemp[PageTemp.find(u'gsw')+len(u'gsw'):len(PageTemp)]
						elif PageTemp2[0:PageTemp2.find(u'|')] +== u'zh-min-nanko-Hani':
							PageTemp = PageTemp[0:PageTemp.find(u'ko-Hani')] + u'ko' + PageTemp[PageTemp.find(u'nko-Hani')+len(u'nko-Hani'):len(PageTemp)]
						elif PageTemp2[0:PageTemp2.find(u'|')] == u'ko-hanja':
							PageTemp = PageTemp[0:PageTemp.find(u'ko-hanja')] + u'ko' + PageTemp[PageTemp.find(u'ko-hanja')+len(u'ko-hanja'):len(PageTemp)]
						elif PageTemp2[0:PageTemp2.find(u'|')] == u'ko-Hani':
							PageTemp = PageTemp[0:PageTemp.find(u'ko-Hani')] + u'ko' + PageTemp[PageTemp.find(u'ko-Hani')+len(u'ko-Hanilzh':
							PageTemp = PageTemp[0:PageTemp.find(u'lzh')] + u'zh-classical' + PageTemp[PageTemp.find(u'lzh')+len(u'lzh'):len(PageTemp)]
						elif PageTemp2[0:PageTemp2.find(u'|')] == u'nan':
							PageTemp = PageTemp[0:PageTemp.find(u'nan')] + u'zh-min-nan' + PageTemp[PageTemp.find(u'nan')+len(u'nan'):len(PageTemp)]
						elif PageTemp2[0:PageTemp2.find(u'|')] == u'rup':
							PageTemp = PageTemp[0:PageTemp.find(u'rup')] + u'roa-rup' + PageTemp[PageTemp.find(u'rup')+len(u'rup'):len(PageTemp)]
						elif PageTemp2[0:PageTemp2.find(u'|')] == u'yue':
							PageTemp = PageTemp[0:PageTemp.find(u'yue')] + u'zh-yue' + PageTemp[PageTemp.find(u'yue')+len(u'yue'):len(PageTemp)]
						
						# Bug du site fermé, ex : [[chat]]
						if PageTemp2[0:PageTemp2.find(u'|')] == u'mo': break # Bug du site fermé, voir [[chat]]
						
						
						# Identification des Wiktionnaires hébergeant les traductions
						SiteExt = u''
						PageExterne = u''
						PageTemp2 = PageTemp[position+1:len(PageTemp)]
						PageTemp3 = PageTemp2[PageTemp2.find(u'|')+1:len(PageTemp2)]
						if PageTemp2[0:PageTemp2.find(u'|')] == "": break
						elif PageTemp3.find(u'}}') == "" or not PageTemp3.find(u'}}'): break
(contracted; show full)			if PageTemp != u"{{/Stop}}":
				pywikibot.output (u"\n*** \03{lightyellow}Arrêt d'urgence demandé\03{default} ***")
				exit(0)

def sauvegarde(PageCourante, Contenu, summary):
	result = "ok"
	if debogage == True:
		
print(Contenu[len(Contenu)-2000if 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: 
(contracted; show full)
TraitementLiens = crawlerLink(u'Modèle:femin',u'')
TraitementLiens = crawlerLink(u'Modèle:sing',u'')
TraitementLiens = crawlerLink(u'Modèle:plur',u'')
TraitementLiens = crawlerLink(u'Modèle:pluri',u'')
TraitementLiens = crawlerLink(u'Modèle:=langue=',u'')
TraitementLiens = crawlerLink(u'Modèle:trad-',u'')
'''



# Modèles
TraitementFile = crawlerFile('articles_listWTin.txt')
TraitementPage = modification(u'Utilisateur:JackBot/test')
TraitementLiens = crawlerLink(u'Modèle:terme',u'')
TraitementLiens = crawlerLink(u'Modèle:R:DAF8',u'')
TraitementLiens = crawlerLink(u'Modèle:Import:DAF8',u'')
TraitementLiensCategorie = crawlerCatLink(u'Modèles de code langue',u'')
TraitementCategorie = crawlerCat(u'Catégorie:Appels de modèles incorrects',True)
TraitementRecherche = crawlerSearch(u'clé de tri')
TraitementUtilisateur = crawlerUser(u'Utilisateur:JackBot')
TraitementRedirections = crawlerRedirects()
TraitementTout = crawlerAll(u'')
while 1:
	TraitementRC = crawlerRC()
'''
</source>