Difference between revisions 14011399 and 14094237 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.
# 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.
# 5) Complète les flexions de verbes à vérifier.
# 6) Traduit les importations de en.wikt.
# 7) Gère des modèles {{voir}} en début de page.

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

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

# Modèles du site à traiter
limit6=9278
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[114] = u'-symb-'
Modele[115] = u'-inf-'
Modele[116] = u'-onoma-'
Modele[117] = u'-onoma-'
Modele[118] = u'-flex-loc-verbe-'
Modele[119] = u'-class-'
Modele[120] = u'-sinogramme-'

limit1 = 121Modele[121] = u'-prénom-'
Modele[122] = u'-flex-prénom-'
limit1 = 123 # Paragraphes avec modèle catégorisant

# http://fr.wiktionary.org/wiki/Cat%C3%A9gorie:Mod%C3%A8les_de_contexte
Modele[121] = u'-trad-'
Modele[122] = u'-drv-int-'
Modele[123] = u'-étym-'
Modele[124] = u'-exp-'
Modele[125] = u'-faux-amis-'
Modele[126] = u'-gent-'
Modele[127] = u'-hist-'
Modele[128] = u'-holo-'
Modele[129] = u'-homo-'
Modele[130] = u'-hyper-'
Modele[131] = u'-hypo-'
Modele[132] = u'-image-'
Modele[133] = u'-méro-'
Modele[134] = u'-note-'	#notes
Modele[135] = u'-var-ortho-'
Modele[136] = u'-ortho-arch-'
Modele[137] = u'-paro-'
Modele[138] = u'-vidéo-'
Modele[139] = u'-q-syn-'
Modele[140] = u'-réf-'
Modele[141] = u'-sino-dico-'
Modele[142] = u'-sous-esp-'
Modele[143] = u'-syll-'
Modele[144] = u'-syn-'
Modele[145] = u'-noms-vern-'
Modele[146] = u'-drv-'
Modele[147] = u'-trans-'
Modele[148] = u'-translit-'
Modele[149] = u'-tropo-'
Modele[150] = u'-var-'
Modele[151] = u'-voc-'
Modele[152] = u'-voir-'
Modele[153] = u'-pron-'
Modele[154] = u'-abrév-'
Modele[155] = u'-anagr-'
Modele[156] = u'-ant-'
Modele[157] = u'-apr-'
Modele[158] = u'-cit-'
Modele[159] = u'-compos-'
Modele[160] = u'-conjug-'
Modele[161] = u'-décl-'
Modele[162] = u'-dial-'
limit2 = 163 # Paragraphes sans modèle catégorisant
Modele[163] = u'titre alt'
Modele[164] = u'titre mis en forme'Modele[163] = u'-trad-'
Modele[164] = u'-drv-int-'
limit2 = 165 # Paragraphes sans modèle catégorisant, {{voir| et {{voir/ sont gérés individuellement
Modele[165] = u'titre incorrect'
Modele[166] = u'formater'
Modele[167] = u'suppression'
Modele[168] = u'supp'
Modele[169] = u'PàS'
Modele[170] = u'vérifier'
#Modele[171] = u'voir'	# et u'voir/' sont gérés individuellement
limit3 = 172 # Paragraphes sans modèle catégorisant pouvant contenir des modèles

Modele[172] = u'ébauche-trans'
Modele[173] = u'ébauche-déf'
Modele[174] = u'ébauche-étym'
Modele[175] = u'ébauche-pron'
Modele[176] = u'ébauche-étym-nom-scientifique'
Modele[177] = u'ébauche-exe'
Modele[178] = u'ébauche-pron'
Modele[179] = u'ébauche-syn'
Modele[180] = u'ébauche'
limit4 = 181	# ébauches

# http://fr.wiktionary.org/wiki/Cat%C3%A9gorie:Mod%C3%A8les_de_domaine_d%E2%80%99utilisation
Modele[181] = u'déterminé'
Modele[182] = u'didactique'
Modele[183] = u'dim-lex'
Modele[184] = u'diminutif'
Modele[185] = u'diplomatie'
Modele[186] = u'informatique'
Modele[187] = u'diptote'
Modele[188] = u'élatif'
Modele[189] = u'ellipse'
Modele[190] = u'enclitique'Modele[171] = u'voir'	
Modele[172] = u'('
Modele[173] = u')'
Modele[174] = u'trad-début'
Modele[175] = u'trad-fin'
Modele[176] = u'm'
Modele[177] = u'f'
Modele[178] = u'n'
Modele[179] = u'c'
Modele[180] = u'mf'
Modele[181] = u'mf?'
Modele[182] = u'préciser'
Modele[183] = u'?'
Modele[184] = u'doute'
Modele[185] = u'trad'
Modele[186] = u'trad+'
Modele[187] = u'trad-'
Modele[188] = u'trad--'
Modele[189] = u'titre alt'
Modele[190] = u'titre mis en forme'
limit3 = 191 # Paragraphes sans modèle catégorisant pouvant contenir des modèles

# http://fr.wiktionary.org/wiki/Cat%C3%A9gorie:Mod%C3%A8les_de_domaine_d%E2%80%99utilisation
Modele[191] = u'enfantin'
Modele[192] = u'épithète'
Modele[193] = u'euphémisme'
Modele[194] = u'ex-rare'
Modele[195] = u'exagératif'
Modele[196] = u'expression'
Modele[197] = u'familier'
(contracted; show full)Modele[594] = u'antiq'
Modele[595] = u'litt'
Modele[596] = u'mythol'
Modele[597] = u'opti'
Modele[598] = u'geog'
Modele[599] = u'hyperb'
Modele[600] = u'gastron'
Modele[601] = u'
préciser'
Modele[602] = u'?didactique'
Modele[602] = u'déterminé'
Modele[603] = u'td'
Modele[604] = u'tr-dir'
Modele[605] = u'tr-indir'
Modele[606] = u'trad'
Modele[607] = u'trad+'
Modele[609] = u'trad-'
Modele[610] = u'trad--dim-lex'
Modele[607] = u'diminutif'
Modele[608] = u'diplomatie'
Modele[609] = u'informatique'
Modele[610] = u'diptote'
Modele[611] = u'alpi'
Modele[612] = u'anat'
Modele[613] = u'anthro'
Modele[614] = u'archi'
Modele[615] = u'angl'
Modele[616] = u'vaudou'
Modele[617] = u'maintenance'
Modele[618] = u'phyton'
Modele[619] = u'phytonimie'
Modele[620] = u'déterminé'
Modele[621] = u'indéterminé'
Modele[622] = u'dét'
Modele[623] = u'indét'
Modele[624] = u'affectueux'
Modele[625] = u'glaciol'
Modele[626] = u'fanta'
Modele[627] = u'anal'
Modele[628] = u'dénombrable'
Modele[629] = u'déndén'
Modele[625] = u'dénombrable'
Modele[626] = u'affectueux'
Modele[627] = u'glaciol'
Modele[628] = u'fanta'
Modele[629] = u'anal'
Modele[630] = u'indénombrable'
Modele[631] = u'indén'
Modele[632] = u'nominatif'
Modele[633] = u'nomin'
Modele[634] = u'accusatif'
Modele[635] = u'accus'
Modele[636] = u'datif'
Modele[637] = u'génitif'
Modele[638] = u'génit'
Modele[639] = u'vocatif'
Modele[640] = u'vocat'
Modele[641] = u'ablatif'
Modele[642] = u'ablat'
Modele[643] = u'allatif'
Modele[644] = u'instrumental'
Modele[645] = u'locat'
Modele[646] = u'locatif'
Modele[647] = u'prépositionnel'
Modele[648] = u'indéclinable'
Modele[649] = u'indécl'
Modele[650] = u'ppart'
Modele[651] = u'génitif'
Modele[652] = u'psychol'
Modele[653] = u'psycho'
Modele[654] = u'chim'
Modele[655] = u'injur'
Modele[656] = u'mycol'
Modele[657] = u'myco'
Modele[658] = u'Internet'
Modele[659] = u'Écossliturgie'
Modele[660] = u'diplomatie'
Modele[661] = u'tauromachie'
Modele[662] = u'germanisme'
Modele[663] = u'squelette'
Modele[664] = u'muscle'
Modele[665] = u'gymnastique'
Modele[666] = u'boxe'
Modele[667] = u'douteéverbal'
Modele[668] = u'liturgiesuperlatif'
Modele[669] = u'réflexif'
Modele[670] = u'r'
Modele[671] = u'irrég'
Modele[672] = u'irrégulier'
Modele[673] = u'arts martiaux'
Modele[674] = u'hydraulique'
Modele[675] = u'Commonwealthpar analogie'
Modele[676] = u'genre'
Modele[677] = u'minéral'
Modele[678] = u'iron'
Modele[679] = u'ironie'
Modele[680] = u'plais'
Modele[681] = u'très rare'
Modele[682] = u'didact'
Modele[683] = u'algèbre'
Modele[684] = u'acronyme'
Modele[685] = u'allatif'
Modele[686] = u'analogie'
Modele[687] = u'très très rare'
Modele[688] = u'physiol'
Modele[689] = u'reproduction'
Modele[690] = u'repro'
Modele[691] = u'presse'
Modele[692] = u'Pays-Bas'
Modele[693] = u'meuble'
Modele[694] = u'Jamaïmeuble'
Modele[693] = u'ellipse'
Modele[694] = u'enclitique'
Modele[695] = u'néol'
Modele[696] = u'archaïsme'
Modele[697] = u'nom'
Modele[698] = u'indéc'
Modele[699] = u'vétérinaire'
Modele[700] = u'reli'
Modele[701] = u'entom'
Modele[702] = u'entomol'
Modele[703] = u'pharmacie'
Modele[704] = u'pharmacol'
Modele[705] = u'athlétisme'
Modele[706] = u'athlé'
Modele[707] = u'christianisme'
Modele[708] = u'conjugaison'
Modele[709] = u'1ergroupe'
Modele[710] = u'2egroupe'
Modele[711] = u'3egroupe'
Modele[712] = u'dénominal de'
Modele[713] = u'déverbal de'
Modele[714] = u'superlatif de'
Modele[715] = u'narratol'
Modele[716] = u'passif'
Modele[717] = u'très-rare'
Modele[718] = u'extrêmement rare'
Modele[719] = u'jardi'
Modele[720] = u'sociol'
Modele[721] = u'papeterie'
Modele[722] = u'papèterie'
Modele[723] = u'Sénégal'
Modele[724] = u'geol'
Modele[725] = u'fami'
Modele[726] = u'tind'
Modele[727] = u'pédol'
Modele[728] = u'biophysique'
Modele[729] = u'psychia'
Modele[730] = u'paléontol'
Modele[731] = u'horticulture'
Modele[732] = u'probabilités'
Modele[733] = u'théorie des graphes'
Modele[734] = u'graphe'
Modele[735] = u'dessin'
Modele[736] = u'-prénom-'
Modele[737] = u'-flex-prénom-'
Modele[738] = u'('
Modele[739] = u')'
Modele[740] = u'trad-début'
Modele[741] = u'trad-finrécip'
Modele[737] = u'réciproque'
Modele[738] = u'CB'
Modele[739] = u'mah-jong'
Modele[740] = u'mahjong'
Modele[741] = u'majong'
Modele[742] = u'reliure'
Modele[743] = u'gravure'
Modele[744] = u'livre'
Modele[745] = u'canoe'
Modele[746] = u'footing'
Modele[747] = u'jogging'
Modele[748] = u'running'
Modele[749] = u'course à pied'
Modele[750] = u'Mexique'
Modele[750] = u'programmation'
Modele[751] = u'prog'
Modele[752] = u'jeux vidéo'
Modele[753] = u'judo'
Modele[754] = u'gén-indén'
Modele[755] = u'Liban'
Modele[756] = u'caténatif'
Modele[757] = u'fam.'
Modele[758] = u'm'
Modele[759] = u'f'
Modele[760] = u'n'
Modele[761] = u'c'
Modele[762] = u'mf'
Modele[763] = u'mf?'
Modele[764] = u'impers'
Modele[765] = u'impersonnel'
#Modele[766] = u'région'
#Modele[767] = u'régio'
#Modele[767] = u'régional'
Modele[768] = u'CB'
Modele[769] = u'mah-jong'
Modele[770] = u'mahjong'
Modele[771] = u'majongski alpin'
Modele[758] = u'ski de fond'
Modele[759] = u'canoë-kayak'
Modele[760] = u'canoë'
Modele[761] = u'artillerie'
Modele[762] = u'fonderie'
Modele[763] = u'réseau'
Modele[764] = u'impers'
Modele[765] = u'impersonnel'
Modele[766] = u'scol'
Modele[767] = u'obsolète'
Modele[768] = u'surf'
Modele[769] = u'édition'
Modele[770] = u'fortification'
Modele[771] = u'dentisterie'
Modele[772] = u'réseau'
Modele[773] = u'réseaux informatiques'
Modele[774] = u'déverbal'
Modele[775] = u'superlatifkaraté'
Modele[775] = u'argot militaire'
Modele[776] = u'combat'
Modele[777] = u'sports de combat'
Modele[778] = u'capoeira'
Modele[779] = u'aïkido'
Modele[780] = u'karaté'
Modele[781] = u'argot militaire'
Modele[782] = u'argot polytechnicien'
Modele[783] = u'ski alpin'
Modele[784] = u'ski de fond'
Modele[785] = u'réseau'
Modele[786] = u'canoë-kayak'
Modele[787] = u'canoë'
Modele[788] = u'scol'
Modele[789] = u'obsolète'
Modele[789] = u'surf'
Modele[790] = u'édition'
Modele[791] = u'fortification'
Modele[792] = u'dentisterie'
Modele[793] = u'artillerie'
Modele[794] = u'fonderie'argot polytechnicien'
Modele[781] = u'élatif'
Modele[782] = u'joaillerie'
limit4 = 783	# ébauches

Modele[783] = u'ébauche-trans'
Modele[784] = u'ébauche-déf'
Modele[785] = u'ébauche-étym'
Modele[786] = u'ébauche-pron'
Modele[787] = u'ébauche-étym-nom-scientifique'
Modele[788] = u'ébauche-exe'
Modele[789] = u'ébauche-pron'
Modele[790] = u'ébauche-syn'
Modele[791] = u'ébauche'

limit5 = 795
# 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
Modele[795] = u'Argentine'
Modele[796] = u'Australie'
Modele[797] = u'Autriche'
Modele[798] = u'Auvergne'
Modele[799] = u'Baléares'
(contracted; show full)Modele[918] = u'Alsace'
Modele[919] = u'Amérique centrale'
Modele[920] = u'Amérique du Nord'
Modele[921] = u'Amérique du Sud'
Modele[922] = u'Amérique latine'
Modele[923] = u'Anjou'
Modele[924] = u'Antilles'
Modele[925] = u'Aquitaine'

Modele[926] = u'Japon'

# Modèles des autres Wiktionnaires à convertir
LimitTemplate = 66
Template = range(1, LimitTemplate+1)
TemplateFR = range(1, LimitTemplate+1)
Template[1] = u'===Adjective==='
TemplateFR[1] = u'{{-adj-}}'
(contracted; show full)
		if PageHS.find(u'é') != -1: PagesCleTotal = PagesCleTotal + u'|' + PageHS[0:PageHS.find(u'é')] + u'e' + PageHS[PageHS.find(u'é')+1:len(PageHS)]
		if PageHS.find(u'è') != -1: PagesCleTotal = PagesCleTotal + u'|' + PageHS[0:PageHS.find(u'è')] + u'e' + PageHS[PageHS.find(u'è')+1:len(PageHS)]
		if PagesCleTotal.find(CleDeTri(PageHS)) ==
 -1 and PageTemp.find(u'{{langue|eo}}') == -1: PagesCleTotal = PagesCleTotal + u'|' + CleDeTri(PageHS)
		# Filtre des pages de la liste "à voir"
		PagesCleRestant = PagesCleTotal + u'|'
		PagesCleTotal = u''
		PagesVoir = u''
		while PagesCleRestant != u'':
			HS = u'False'
			PageCourante = PagesCleRestant[0:PagesCleRestant.find(u'|')]
(contracted; show full)

	# Nettoyage
	if PageTemp.find(u'{{voir}}\n') != -1: PageTemp = PageTemp[0:PageTemp.find(u'{{voir}}\n')] + PageTemp[PageTemp.find(u'{{voir}}\n')+len(u'{{voir}}\n'):len(PageTemp)]
	if PageTemp.find(u'{{voir}}') != -1: PageTemp = PageTemp[0:PageTemp.find(u'{{voir}}')] + PageTemp[PageTemp.find(u'{{voir}}')+len(u'{{voir}}'):len(PageTemp)]
		
	# Clés de tri

	if PageTemp.find(u'{{clé de tri}}') != -1:
		PageTemp = PageTemp[0:PageTemp.find(u'{{clé de tri}}')] + PageTemp[PageTemp.find(u'{{clé de tri}}')+len(u'{{clé de tri}}'):len(PageTemp)]
		summary = summary + u', {{clé de tri}} inutile'
	if PageTemp.find(u'{{clé de tri|' + PageHS.lower() + u'}}') != -1 and PageTemp.find(u'{{-verb-pr-|fr}}') == -1:
		PageTemp = PageTemp[0:PageTemp.find(u'{{clé de tri|' + PageHS.lower() + u'}}')] + PageTemp[PageTemp.find(u'{{clé de tri|' + PageHS.lower() + u'}}')+len(u'{{clé de tri|' + PageHS.lower() + u'}}'):len(PageTemp)]
		summary = summary + u', {{clé de tri}} inutile'
	if PageTemp.find(u'{{clé de tri') == -1 and PageTemp.find(u'{{clef de tri') == -1:
		ClePage = CleDeTri(PageHS)
		if ClePage != u'' and ClePage != PageHS:
			if PageTemp.find(u'[[Catégorie:') != -1:
				PageTemp = PageTemp[0:PageTemp.find(u'[[Catégorie:')] + u'\n{{clé de tri|' + ClePage + u'}}\n' + PageTemp[PageTemp.find(u'[[Catégorie:'):len(PageTemp)]
			elif PageTemp.find(u'[[Category:') != -1:
				PageTemp = PageTemp[0:PageTemp.find(u'[[Category:')] + u'\n{{clé de tri|' + ClePage + u'}}\n' + PageTemp[PageTemp.find(u'[[Category:'):len(PageTemp)]
			else:	# Avant interwikis
				"""if PageTemp.find(u'[[en:') or PageTemp.find(u'[[ko:') or PageTemp.find(u'[[vi:') != -1:
					regex = ur'\[\[(.+?)(?:\]\]\n)'		# copié de pywikipedia mais pas infaillible, d'où le [[en:...
					if re.compile(regex).search(PageTemp):
						try:
							PageTemp = PageTemp[0:re.search(regex,PageTemp).end()] + u'\n{{clé de tri|' + ClePage + u'}}\n' + PageTemp[re.search(regex,PageTemp).end():len(PageTemp)]
						except:
							print u'pb regex interwiki'
					else:
						PageTemp = PageTemp + u'\n\n{{clé de tri|' + ClePage + u'}}\n'
				else:"""
				PageTemp = PageTemp + u'\n\n{{clé de tri|' + ClePage + u'}}\n'
						
	else:
		PageTemp2 = PageTemp[PageTemp.find(u'{{clé de tri'):len(PageTemp)]
		ClePage = PageTemp2[PageTemp2.find(u'|')+1:PageTemp2.find(u'}}')]
		if CleDeTri(PageHS) != ClePage:
			print (u'Fausse clé de tri dans :')
			print (PageHS.encode(config.console_encoding, 'replace'))
			print (ClePage.encode(config.console_encoding, 'replace'))
	if PageTemp.find(u'{{clé de tri}}') != -1:
		PageTemp = PageTemp[0:PageTemp.find(u'{{clé de tri}}')] + PageTemp[PageTemp.find(u'{{clé de tri}}')+len(u'{{clé de tri}}'):len(PageTemp)]
		summary = summary + u', {{clé de tri}} inutile'
	if PageTemp.find(u'{{clé de tri|' + PageHS.lower() + u'}}') != -1:
		PageTemp = PageTemp[0:PageTemp.find(u'{{clé de tri|' + PageHS.lower() + u'}}')] + PageTemp[PageTemp.find(u'{{clé de tri|' + PageHS.lower() + u'}}')+len(u'{{clé de tri|' + PageHS.lower() + u'}}'):len(PageTemp)]
		summary = summary + u', {{clé de tri}} inutile'|'):len(PageTemp)]
		ClePage = PageTemp2[0:PageTemp2.find(u'}}')]
		if CleDeTri(PageHS) != ClePage:
			if PageTemp.find(u'{{langue|fr}}') != -1 or PageTemp.find(u'{{langue|eo}}') != -1 or PageTemp.find(u'{{langue|en}}') != -1 or PageTemp.find(u'{{langue|es}}') != -1 or PageTemp.find(u'{{langue|de}}') != -1 or PageTemp.find(u'{{langue|pt}}') != -1 or PageTemp.find(u'{{langue|it}}') != -1:
				summary = summary + u', {{clé de tri}} corrigée'
				PageTemp = PageTemp[0:PageTemp.find(u'{{clé de tri|')+len(u'{{clé de tri|')] + CleDeTri(PageHS) + PageTemp[PageTemp.find(u'{{clé de tri|')+PageTemp2.find(u'}}'):len(PageTemp)]
			else:
				print (u'Fausse cle de tri')
				#print (PageHS.encode(config.console_encoding, 'replace'))
				#print (ClePage.encode(config.console_encoding, 'replace'))
		
	# Remplacements consensuels
	while PageTemp.find(u'&#32;') != -1:
		PageTemp = PageTemp[0:PageTemp.find(u'&#32;')] + u'&nbsp;' + PageTemp[PageTemp.find(u'&#32;')+len(u'&#32;'):len(PageTemp)]
	while PageTemp.find(u'&#224;') != -1:
		PageTemp = PageTemp[0:PageTemp.find(u'&#224;')] + u'à' + PageTemp[PageTemp.find(u'&#224;')+len(u'&#224;'):len(PageTemp)]
(contracted; show full)
					PageTemp = PageTemp[0:PageTemp.find(u'\n{{colonnes|')] + u'\n{{(}}' + PageTemp[PageTemp.find(u'\n{{colonnes|')+len(u'\n{{colonnes|'):len(PageTemp)]
			else: break
		while PageTemp.find(u'}}1=') != -1:
			PageTemp = PageTemp[0:PageTemp.find(u'}}1=')] + PageTemp[PageTemp.find(u'}}1=')+len(u'}}1='):len(PageTemp)]

		
	while PageTemp.find(u'  ') != -1:
		PageTemp = PageTemp[0:PageTemp.find(u'  ')] + PageTemp[PageTemp.find(u'  ')+1:len(PageTemp)]
	while PageTemp.find(u'\n\n\n') != -1:
		PageTemp = PageTemp[0:PageTemp.find(u'\n\n\n')] + PageTemp[PageTemp.find(u'\n\n\n')+1:len(PageTemp)]
	while PageTemp.find(u'\n #*') != -1:
		PageTemp = PageTemp[0:PageTemp.find(u'\n #*')+1] + PageTemp[PageTemp.find(u'\n #*')+2:len(PageTemp)]
	while PageTemp.find(u'\n #:') != -1:
		PageTemp = PageTemp[0:PageTemp.find(u'\n #:')+1] + PageTemp[PageTemp.find(u'\n #:')+2:len(PageTemp)]
	PageEnd = u''
	while PageTemp.find(u'\n#:') != -1:
		PageEnd = PageEnd + PageTemp[0:PageTemp.find(u'\n#:')+2]
		if PageEnd.rfind(u'{{langue|') == PageEnd.rfind(u'{{langue|fr}}'):
			PageTemp = u'*' + PageTemp[PageTemp.find(u'\n#:')+len(u'\n#:'):len(PageTemp)]
		else:
			PageTemp = u':' + PageTemp[PageTemp.find(u'\n#:')+len(u'\n#:'):len(PageTemp)]
	PageTemp = PageEnd + PageTemp
	PageEnd = u''
	'''while PageTemp.find(u'#*') != -1 and PageTemp.find(u'#*') != PageTemp.find(u'#*\'\'') and PageTemp.find(u'#*') != PageTemp.find(u'#* \'\''):
		PageTemp = PageTemp[0:PageTemp.find(u'#*')+2] + u'\'\'' + PageTemp[PageTemp.find(u'#*')+2:len(PageTemp)]'''
	
	while PageTemp.find(u'[[Annexe:Couleurs en français]]') != -1:
		PageTemp = PageTemp[0:PageTemp.find(u'[[Annexe:Couleurs en français]]')] + u'{{Thésaurus|fr|couleur}}' + PageTemp[PageTemp.find(u'[[Annexe:Couleurs en français]]')+len(u'[[Annexe:Couleurs en français]]'):len(PageTemp)]
	while PageTemp.find(u'{{Annexe|Couleurs en français}}') != -1:
(contracted; show full)
	if PageTemp.find(u'{{-nom-sciences-|conv}}') != -1 and PageTemp.find(u'[[Catégorie:Noms scientifiques]]') != -1:
		PageTemp = PageTemp[0:PageTemp.find(u'[[Catégorie:Noms scientifiques]]')] + PageTemp[PageTemp.find(u'[[Catégorie:Noms scientifiques]]')+len(u'[[Catégorie:Noms scientifiques]]'):len(PageTemp)]

	if PageTemp.find(u'{{-nom-ni-') != -1:
		PageEnd = PageTemp[0:PageTemp.find(u'{{-nom-ni-')+len(u'{{-nom-')]
		PageTemp = PageTemp[PageTemp.find(u'{{-nom-ni-')+len(u'{{-nom-ni-'):len(PageTemp)]
		PageEnd = PageEnd + PageTemp[0:PageTemp.find(u'\n')+1]
		PageTemp = PageTemp[PageTemp.find(u'\n')+1:len(PageTemp)]
		PageTemp = PageEnd + PageTemp[0:PageTemp.find(u'\n')] + u' {{tsolyáni-ni}}' + PageTemp[PageTemp.find(u'\n'):len(PageTemp)]
		if summary.find(u'tsolyáni') != -1: summary = summary + u', correction du tsolyáni'
	if PageTemp.find(u'{{-nom-nn-') != -1:
		PageEnd = PageTemp[0:PageTemp.find(u'{{-nom-nn-')+len(u'{{-nom-')]
		PageTemp = PageTemp[PageTemp.find(u'{{-nom-nn-')+len(u'{{-nom-nn-'):len(PageTemp)]
		PageEnd = PageEnd + PageTemp[0:PageTemp.find(u'\n')+1]
		PageTemp = PageTemp[PageTemp.find(u'\n')+1:len(PageTemp)]
		PageTemp = PageEnd + PageTemp[0:PageTemp.find(u'\n')] + u' {{tsolyáni-nn}}' + PageTemp[PageTemp.find(u'\n'):len(PageTemp)]
		if summary.find(u'tsolyáni') != -1: summary = summary + u', correction du tsolyáni'
	if PageTemp.find(u'{{-nom-nu-') != -1:
		PageEnd = PageTemp[0:PageTemp.find(u'{{-nom-nu-')+len(u'{{-nom-')]
		PageTemp = PageTemp[PageTemp.find(u'{{-nom-nu-')+len(u'{{-nom-nu-'):len(PageTemp)]
		PageEnd = PageEnd + PageTemp[0:PageTemp.find(u'\n')+1]
		PageTemp = PageTemp[PageTemp.find(u'\n')+1:len(PageTemp)]
		PageTemp = PageEnd + PageTemp[0:PageTemp.find(u'\n')] + u' {{tsolyáni-nu}}' + PageTemp[PageTemp.find(u'\n'):len(PageTemp)]
		if summary.find(u'tsolyáni') != -1: summary = summary + u', correction du tsolyáni'
	if PageTemp.find(u'{{-nom-npl-') != -1:
		PageEnd = PageTemp[0:PageTemp.find(u'{{-nom-npl-')] + u'{{-flex-nom-'
		PageTemp = PageTemp[PageTemp.find(u'{{-nom-npl-')+len(u'{{-nom-npl-'):len(PageTemp)]
		PageEnd = PageEnd + PageTemp[0:PageTemp.find(u'\n')+1]
		PageTemp = PageTemp[PageTemp.find(u'\n')+1:len(PageTemp)]
		PageTemp = PageEnd + PageTemp[0:PageTemp.find(u'\n')] + u' {{tsolyáni-npl}}' + PageTemp[PageTemp.find(u'\n'):len(PageTemp)]
		if summary.find(u'tsolyáni') != -1: summary = summary + u', correction du tsolyáni'
		
	# Modèles trop courts
	while PageTemp.find(u'{{fp}}') != -1:
		PageTemp = PageTemp[0:PageTemp.find(u'{{fp}}')+4] + u'lur' + PageTemp[PageTemp.find(u'{{fp}}')+4:len(PageTemp)] 
	while PageTemp.find(u'{{mp}}') != -1:
		PageTemp = PageTemp[0:PageTemp.find(u'{{mp}}')+4] + u'lur' + PageTemp[PageTemp.find(u'{{mp}}')+4:len(PageTemp)] 
	while PageTemp.find(u'{{np}}') != -1:
		PageTemp = PageTemp[0:PageTemp.find(u'{{np}}')+4] + u'lur' + PageTemp[PageTemp.find(u'{{np}}')+4:len(PageTemp)] 
		
	# Faux homophones : lemme et sa flexion
	if PageTemp.find(u'{{-flex-') != -1 and PageHS[len(PageHS)-1:len(PageHS)] == u's' and PageTemp.find(u'{{-homo-}}\n*[[' + PageHS[0:len(PageHS)-1] + u']]\n*') == -1 and PageTemp.find(u'{{-homo-}}\n*[[' + PageHS[0:len(PageHS)-1] + u']]') != -1 and PageTemp.find(u'{{-homo-}}\n*[[' + PageHS[0:len(PageHS)-1] + u']] ') == -1 and PageTemp.find(u'{{-homo-}}\n*[[' + PageHS[0:len(PageHS)-(contracted; show full)
	while PageTemp.find(u'{{-réf-}}\n{{Import:DAF8}}') != -1:
		PageTemp = PageTemp[0:PageTemp.find(u'{{Import:DAF8}}')] + u'*' + PageTemp[PageTemp.find(u'{{Import:DAF8}}'):len(PageTemp)]
	while PageTemp.find(u'{{-réf-}}\n{{Import:Littré}}') != -1:
		PageTemp = PageTemp[0:PageTemp.find(u'{{Import:Littré}}')] + u'*' + PageTemp[PageTemp.find(u'{{Import:Littré}}'):len(PageTemp)]
	
'''while PageTemp.find(u'[http://') != -1:
		PageTemp = PageTemp[0:PageTemp.find(u'[http://')+1] + PageTemp[PageTemp.find(u'[http://')+6:len(PageTemp)]	
	while PageTemp.find(u'[https://') != -1:
		PageTemp = PageTemp[0:PageTemp.find(u'[https://')+1] + PageTemp[PageTemp.find(u'[https://')+7:len(PageTemp)]	
		
	'''
	while PageTemp.find(u'{{dét|') != -1:
		PageTemp = PageTemp[0:PageTemp.find(u'{{dét|')] + u'déterminé' + PageTemp[PageTemp.find(u'{{dét|')+len(u'{{dét|'):len(PageTemp)]
	while PageTemp.find(u'{{dén|') != -1:
		PageTemp = PageTemp[0:PageTemp.find(u'{{dén|')] + u'dénombrable' + PageTemp[PageTemp.find(u'{{dén|')+len(u'{{dén|'):len(PageTemp)]
	
	# 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)]
		# 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'}')]
(contracted; show full)			PageTemp = u''
		#print(PageEnd.encode(config.console_encoding, 'replace'))
		#print(PageTemp.encode(config.console_encoding, 'replace'))
	PageTemp = PageEnd + PageTemp
	PageEnd = u''"""

	# Ajout des anagrammes francophones (prévoir si {{lien|}} pour les autres)
	if socket.gethostname() != 
u'"willow'":
		if PageTemp.find(u'{{-anagr-}}') == -1 and PageHS.find(u' ') == -1 and PageTemp.find(u'{{langue|fr}}') != -1 and len(PageHS) < 7: # sinon trop long ( > 1 h par page)
			anagrammes = anagram(PageHS)
			ListeAnagrammes = u''
			for anagramme in anagrammes:
				if anagramme != PageHS:
					pageAnagr = Page(site,anagramme)
					#print anagramme.encode(config.console_encoding, 'replace')
(contracted; show full)	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])
		#raw_input(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'}}.'):
			PageTemp = PageTemp[0:PageTemp.find(u'}}')+2] + u' ' + PageTemp[PageTemp.find(u'}}')+2:len(PageTemp)]
		while PageTemp.find(u'{{') != -1 and PageTemp.find(u'{{')-1 != PageTemp.find(u' {{') and PageTemp.find(u'{{')-1 != PageTemp.find(u'\n{{'):
			PageTemp = PageTemp[0:PageTemp.find(u'{{')] + u' ' + PageTemp[PageTemp.find(u'{{'):len(PageTemp)]
		# Fonctionne au clavier mais pas en .find ni avec &#171; &#187;, ni test = u'« ', ni &laquo;, ni test.encode : 
		#hexa /u... ?
		print (str(PageTemp.find(u'«')) + u' = ' + str(PageTemp.find(u'« ')))
		print (str(PageTemp.find(u'»')) + u' = ' + str(PageTemp.find(u' »')+1))
		#raw_input ("alors")
		if PageHS != u'«' and PageTemp.find(u'«') != -1 and PageTemp.find(u'«') != PageTemp.find(u'« '):
			PageTemp = PageTemp[0:PageTemp.find(u'«')+1] + u' ' + PageTemp[PageTemp.find(u'«')+1:len(PageTemp)]
		if PageHS != u'»' and PageTemp.find(u'»') != -1 and PageTemp.find(u'»')-1 != PageTemp.find(u' »'):
			PageTemp = PageTemp[0:PageTemp.find(u'»')] + u' ' + PageTemp[PageTemp.find(u'»'):len(PageTemp)]
		if PageTemp[PageTemp.find(u'«'):PageTemp.find(u'«')+1] != u' ':
			PageTemp = PageTemp[0:PageTemp.find(u'«')+1] + u' ' + PageTemp[PageTemp.find(u'«')+1:len(PageTemp)]
		if PageTemp[PageTemp.find(u'»')-1:PageTemp.find(u'»')] != u' ':
			PageTemp = PageTemp[0:PageTemp.find(u'»')] + u' ' + PageTemp[PageTemp.find(u'»'):len(PageTemp)]'''
		
		# Recherche de chaque modèle
		position = PageTemp.find(u'{{')		# On cherche chaque modèle
		if position < 0: break
		if position == PageTemp.find(u'{{caractère}}'):
			codelangue = u'conv'
			EstCodeLangue = u'false'
		elif position == PageTemp.find(u'{{='):
			PageTemp2 = PageTemp[position+3:len(PageTemp)]
			if PageTemp2.find("}}") < PageTemp2.find("|") or PageTemp2.find("|") == -1:
(contracted; show full)
				if PageTemp2.find(u'|') < PageTemp2.find(u'}}') and PageTemp2.find(u'|') != -1:
					if PageTemp2[0:PageTemp2.find(u'|')] == PageHS:
						PageTemp = PageTemp[0:position] + PageTemp[position+1+PageTemp2.find(u'|'):len(PageTemp)]
				else:
					if PageTemp2[0:PageTemp2.find(u'}}')] == PageHS:
						PageTemp = PageTemp[0:position] + PageTemp[position+1+PageTemp2.find(u'}}'):len(PageTemp)]
				
		
			# Nettoyage des doublons (tester avec ophtalmologie dans adelphe)
			'''PageTemp2 = PageTemp[position+1:len(PageTemp)]
			if codelangue and PageTemp2.find(PageTemp[0:position]) != -1 and PageTemp2.find(u'\n') != -1 and PageTemp2.find(u' {{' + PageTemp[0:position] + u'|' + codelangue + u'}}') < PageTemp2.find(u'\n'):
				PageTemp = PageTemp[0:position+1+PageTemp2.find(u' {{' + PageTemp[0:position] + u'|' + codelangue + u'}}')] + PageTemp[position+1+PageTemp2.find(u' {{' + PageTemp[0:position] + u'|' + codelangue + u'}}')+len(u' {{' + PageTemp[0:position] + u'|' + codelangue + u'}}'):len(PageTemp)]
			elif PageTemp2.find(PageTemp[0:position]) != -1 and PageTemp2.find(u'\n') != -1 and PageTemp2.find(u' {{' + PageTemp[0:position] + u'}}') < PageTemp2.find(u'\n'):
				PageTemp = PageTemp[0:position+1+PageTemp2.find(u' {{' + PageTemp[0:position] + u'}}')] + PageTemp[0:position+1+PageTemp2.find(u' {{' + PageTemp[0:position] + u'}}')+len(u' {{' + PageTemp[0:position] + u'}}'):len(PageTemp)]
			'''
		
			#print (PageEnd.encode(config.console_encoding, 'replace')[0:1000])
			#print (PageTemp[0:position].encode(config.console_encoding, 'replace'))
			# Comparaison avec chaque modèle connu dans Modele[p]
			for p in range(1,limit6):
				if Modele[p] == PageTemp[0:position]:
					#print (Modele[p].encode(config.console_encoding, 'replace'))
					# Si on est dans un modèle spécial, le traiter, sinon par catégorie de génériques
(contracted; show full)
						if codelangue != "" and codelangue is not None:
							if PageTemp[position:position+2] == u'}}' or PageTemp[position:position+4] == u'fr}}':
								PageEnd = PageEnd + PageTemp[0:position] + "||" + codelangue + "}}"
								PageTemp = PageTemp[PageTemp.find("}}")+2:len(PageTemp)]
							else:
								while PageTemp.find(u'{{') < PageTemp.find(u'}}')
 and PageTemp.find(u'{{') != -1:
									# On saute les différents modèles inclus
									PageEnd = PageEnd + PageTemp[0:PageTemp.find(u'}}')+2]
									PageTemp = PageTemp[PageTemp.find(u'}}')+2:len(PageTemp)]
								if PageTemp.find("|") > PageTemp.find(u'}}') or PageTemp.find(u'|') == -1:
									position = PageTemp.find("}}")
								else:
									position = PageTemp.find("|")
									PageTemp2 = PageTemp[position+1:len(PageTemp)]
									#raw_input(PageTemp.encode(config.console_encoding, 'replace'))
									if PageTemp2.find(u'|') != -1 and PageTemp2.find(u'|') < PageTemp2.find(u'}}'):
										# Code langue déjà renseigné
										break
									elif PageTemp.find(u'|') != -1 and PageTemp.find(u'|') < PageTemp.find(u'}}'):
										PageEnd = PageEnd + PageTemp[0:PageTemp.find(u'}}')] + u'|' + codelangue + "}}"
										PageTemp = PageTemp[PageTemp.find("}}")+2:len(PageTemp)]					
									else:
										PageEnd = PageEnd + PageTemp[0:PageTemp.find(u'}}')] + u'||' + codelangue + "}}"
										PageTemp = PageTemp[PageTemp.find("}}")+2:len(PageTemp)]
								#raw_input(PageTemp.encode(config.console_encoding, 'replace'))
								break
						else:
							break
					elif Modele[p] == u'perfectif' or Modele[p] == u'perf' or Modele[p] == u'imperfectif' or Modele[p] == u'imperf' or Modele[p] == u'déterminé' or Modele[p] == u'dét' or Modele[p] == u'indéterminé' or Modele[p] == u'indét':
						if (EstCodeLangue == "false") or PageEnd.rfind(u'(') > PageEnd.rfind(u')'): # Si on est dans des parenthèses
(contracted; show full)
							PageTemp2 = PageTemp[PageTemp.find(u'}}')+2:len(PageTemp)]
							PageEnd = PageEnd + PageTemp[0:PageTemp.find(u'}}')+2+PageTemp2.find(u'}}')+2]
							PageTemp = PageTemp[PageTemp.find(u'}}')+2+PageTemp2.find(u'}}')+2:len(PageTemp)]
							break
						else:
							PageEnd = PageEnd + PageTemp[0:PageTemp.find(u'}}')+2]
					elif p < limit4:	# 
ébauche : catégorisée quel que soit EstCodeLangue
						if codelangueParagraphe avec code langue
						if EstCodeLangue == "true":
							PageEnd = PageEnd + PageTemp[0:position] + "|" + codelangue + "}}"
						else:
							PageEnd = PageEnd + PageTemp[0:position] + "|nocat=1}}"		
					elif p < limit5:	# Paragraphe avec code langue
						if EstCodeLangue == "true"ébauche : catégorisée quel que soit EstCodeLangue
						if codelangue:
							PageEnd = PageEnd + PageTemp[0:position] + "|" + codelangue + "}}"
						else:
							PageEnd = PageEnd + PageTemp[0:position] + "|nocat=1}}"								
					else:				# Paragraphe régional
						if PageEnd.rfind(u'{{') != -1:
							PageEnd2 = PageEnd[0:PageEnd.rfind(u'{{')]
							if EstCodeLangue == "true" and (PageEnd2.rfind(u'{{') != PageEnd2.rfind(u'{{pron|') or PageEnd.rfind(u'{{pron|') < PageEnd.rfind(u'\n') or PageEnd2.rfind(u'{{pron|') == -1) and ((PageTemp.find(u'{{') != PageTemp.find(u'{{pron|') or PageTemp.find(u'{{pron|') > PageT(contracted; show full)
						except:
							print PageHS.encode(config.console_encoding, 'replace') + u' ' + langue.encode(config.console_encoding, 'replace') + u' ' + troisieme
				else:
					if PageHS[len(PageHS)-len(premier):len(PageHS)] == premier or PageHS[len(PageHS)-len(ppron):len(PageHS)] == ppron:
						try:
							i1 = re.search(u'{{\-verb[e]*\-[pr\-]*\|[ ]*' + langue + u'.*}}\n.*\'\'\'',PageEnd).end()
							
PageEnd = PageEnd[:i1] + u' {{pron||' + langue + u'}} {{conj|grp=1|' + langue + u'}}' + PageEnd[i1:]
						except:
							print PageHS.encode(config.console_encoding, 'replace') + u' ' + langue.encode(config.console_encoding, 'replace') + u' sans {{pron}}'
					elif PageHS[len(PageHS)-len(premier):len(PageHS)] == deuxieme or PageHS[len(PageHS)-len(ppron):len(PageHS)] == dpron:
						try:
							i1 = re.search(u'{{\-verb[e]*\-[pr\-]*\|[ ]*' + langue + u'.*}}\n[^\[]*\'\'\'',PageEnd).end()
							PageEnd = PageEnd[:i1] + u' {{pron||' + langue + u'}} {{conj|grp=2|' + langue + u'}}' + PageEnd[i1:]
						except:
							print PageHS.encode(config.console_encoding, 'replace') + u' ' + langue.encode(config.console_encoding, 'replace') + u' sans {{pron}}'
					elif PageHS[len(PageHS)-len(premier):len(PageHS)] == troisieme or PageHS[len(PageHS)-len(ppron):len(PageHS)] == tpron:
						try:
							i1 = re.search(u'{{\-verb[e]*\-[pr\-]*\|[ ]*' + langue + u'.*}}\n[^\[]*\'\'\'',PageEnd).end()
if PageEnd[i1:].find(u'{{conj') != -1 and PageEnd[i1:].find(u'{{conj') < PageEnd[i1:].find(u'\n') and (PageEnd[i1:].find(u'{{pron') == -1 or PageEnd[i1:].find(u'{{pron') > PageEnd[i1:].find(u'\n')):
								PageEnd = PageEnd[:i1] + u' {{pron||' + langue + u'}}' + PageEnd[i1:]
							elif PageEnd[i1:].find(u'{{pron') != -1 and PageEnd[i1:].find(u'{{pron') < PageEnd[i1:].find(u'\n') and (PageEnd[i1:].find(u'{{conj') == -1 or PageEnd[i1:].find(u'{{conj') > PageEnd[i1:].find(u'\n')):
								PageTemp2 = PageEnd[i1:][PageEnd[i1:].find(u'{{pron'):len(PageEnd[i1:])]
								PageEnd = PageEnd[:i1] + PageEnd[i1:][0:PageEnd[i1:].find(u'{{pron')+PageTemp2.find(u'}}')+2] + u' {{conj|grp=1|' + langue + u'}}' + PageEnd[i1:][PageEnd[i1:].find(u'{{pron')+PageTemp2.find(u'}}')+2:len(PageEnd[i1:])]
							elif (PageEnd[i1:].find(u'{{pron') == -1 or PageEnd[i1:].find(u'{{pron') > PageEnd[i1:].find(u'\n')) and (PageEnd[i1:].find(u'{{conj') == -1 or PageEnd[i1:].find(u'{{conj') > PageEnd[i1:].find(u'\n')):
								PageEnd = PageEnd[:i1] + u' {{pron||' + langue + u'}} {{conj|grp=1|' + langue + u'}}' + PageEnd[i1:]
						except:
							print PageHS.encode(config.console_encoding, 'replace') + u' ' + langue.encode(config.console_encoding, 'replace') + u' sans {{pron}}'
					elif PageHS[len(PageHS)-len(premier):len(PageHS)] == deuxieme or PageHS[len(PageHS)-len(ppron):len(PageHS)] == dpron:
						try:
							i1 = re.search(u'{{\-verb[e]*\-[pr\-]*\|[ ]*' + langue + u'.*}}\n[^\[]*\'\'\'',PageEnd).end()
							if PageEnd[i1:].find(u'{{conj') != -1 and PageEnd[i1:].find(u'{{conj') < PageEnd[i1:].find(u'\n') and (PageEnd[i1:].find(u'{{pron') == -1 or PageEnd[i1:].find(u'{{pron') > PageEnd[i1:].find(u'\n')):
								PageEnd = PageEnd[:i1] + u' {{pron||' + langue + u'}}' + PageEnd[i1:]
							elif PageEnd[i1:].find(u'{{pron') != -1 and PageEnd[i1:].find(u'{{pron') < PageEnd[i1:].find(u'\n') and (PageEnd[i1:].find(u'{{conj') == -1 or PageEnd[i1:].find(u'{{conj') > PageEnd[i1:].find(u'\n')):
								PageTemp2 = PageEnd[i1:][PageEnd[i1:].find(u'{{pron'):len(PageEnd[i1:])]
								PageEnd = PageEnd[:i1] + PageEnd[i1:][0:PageEnd[i1:].find(u'{{pron')+PageTemp2.find(u'}}')+2] + u' {{conj|grp=2|' + langue + u'}}' + PageEnd[i1:][PageEnd[i1:].find(u'{{pron')+PageTemp2.find(u'}}')+2:len(PageEnd[i1:])]
							elif (PageEnd[i1:].find(u'{{pron') == -1 or PageEnd[i1:].find(u'{{pron') > PageEnd[i1:].find(u'\n')) and (PageEnd[i1:].find(u'{{conj') == -1 or PageEnd[i1:].find(u'{{conj') > PageEnd[i1:].find(u'\n')):
								PageEnd = PageEnd[:i1] + u' {{pron||' + langue + u'}} {{conj|grp=2|' + langue + u'}}' + PageEnd[i1:]
						except:
							print PageHS.encode(config.console_encoding, 'replace') + u' ' + langue.encode(config.console_encoding, 'replace') + u' sans {{pron}}'
					elif PageHS[len(PageHS)-len(premier):len(PageHS)] == troisieme or PageHS[len(PageHS)-len(ppron):len(PageHS)] == tpron:
						try:
							i1 = re.search(u'{{\-verb[e]*\-[pr\-]*\|[ ]*' + langue + u'.*}}\n[^\[]*\'\'\'',PageEnd).end()
							if PageEnd[i1:].find(u'{{conj') != -1 and PageEnd[i1:].find(u'{{conj') < PageEnd[i1:].find(u'\n') and (PageEnd[i1:].find(u'{{pron') == -1 or PageEnd[i1:].find(u'{{pron') > PageEnd[i1:].find(u'\n')):
								PageEnd = PageEnd[:i1] + u' {{pron||' + langue + u'}}' + PageEnd[i1:]
							elif PageEnd[i1:].find(u'{{pron') != -1 and PageEnd[i1:].find(u'{{pron') < PageEnd[i1:].find(u'\n') and (PageEnd[i1:].find(u'{{conj') == -1 or PageEnd[i1:].find(u'{{conj') > PageEnd[i1:].find(u'\n')):
								PageTemp2 = PageEnd[i1:][PageEnd[i1:].find(u'{{pron'):len(PageEnd[i1:])]
								PageEnd = PageEnd[:i1] + PageEnd[i1:][0:PageEnd[i1:].find(u'{{pron')+PageTemp2.find(u'}}')+2] + u' {{conj|grp=3|' + langue + u'}}' + PageEnd[i1:][PageEnd[i1:].find(u'{{pron')+PageTemp2.find(u'}}')+2:len(PageEnd[i1:])]
							elif (PageEnd[i1:].find(u'{{pron') == -1 or PageEnd[i1:].find(u'{{pron') > PageEnd[i1:].find(u'\n')) and (PageEnd[i1:].find(u'{{conj') == -1 or PageEnd[i1:].find(u'{{conj') > PageEnd[i1:].find(u'\n')):
								PageEnd = PageEnd[:i1] + u' {{pron||' + langue + u'}} {{conj|grp=3|' + langue + u'}}' + PageEnd[i1:]
						except:
							print PageHS.encode(config.console_encoding, 'replace') + u' ' + langue.encode(config.console_encoding, 'replace') + u' sans {{pron}}'
	'''# Recherche de bug
	if PageEnd.find(u'{{trad-début|{{') != -1:		
(contracted; show full)
			PageT = PageT + "a"
			key = "yes"
		elif PageTitre[lettre:lettre+1] == u'ƀ' or PageTitre[lettre:lettre+1] == u'ƃ' or PageTitre[lettre:lettre+1] == u'Ɓ' or PageTitre[lettre:lettre+1] == u'Ƃ' or PageTitre[lettre:lettre+1] == u'Ƀ':
			PageT = PageT + "b"
			key = "yes"
		elif PageTitre[lettre:lettre+1] == u'ç' or PageTitre[lettre:lettre+1] == u'ć' or PageTitre[lettre:lettre+1] ==
 u'ĉ' or PageTitre[lettre:lettre+1] == u'ċ' or PageTitre[lettre:lettre+1] == u'č' or PageTitre[lettre:lettre+1] == u'ƈ' or PageTitre[lettre:lettre+1] == u'ȼ' or PageTitre[lettre:lettre+1] == u'Ç' or PageTitre[lettre:lettre+1] == u'Ć' or PageTitre[lettre:lettre+1] == u'Ĉ' or PageTitre[lettre:lettre+1] == u'Ċ' or PageTitre[lettre:lettre+1] == u'Č' or PageTitre[lettre:lettre+1] == u'Ƈ' or PageTitre[lettre:lettre+1] == u'Ȼ':
			# ĉ -> cx en espéranto
			PageT = PageT + "cPageT = PageT + "c"
			key = "yes"
		elif PageTitre[lettre:lettre+1] == u'ĉ':
			PageT = PageT + "cx"
			key = "yes"
		elif PageTitre[lettre:lettre+1] == u'ď' or PageTitre[lettre:lettre+1] == u'đ' or PageTitre[lettre:lettre+1] == u'ƌ' or PageTitre[lettre:lettre+1] == u'ȡ' or PageTitre[lettre:lettre+1] == u'Ď' or PageTitre[lettre:lettre+1] == u'Đ' or PageTitre[lettre:lettre+1] == u'Ɖ' or PageTitre[lettre:lettre+1] == u'Ɗ' or PageTitre[lettre:lettre+1] == u'Ƌ' or PageTitre[lettre:lettre+1] == u'ȸ&#x(contracted; show full)
			PageT = PageT + "e"
			key = "yes"
		elif PageTitre[lettre:lettre+1] == u'ƒ' or PageTitre[lettre:lettre+1] == u'Ƒ':
			PageT = PageT + "f"
			key = "yes"
		elif PageTitre[lettre:lettre+1] == u'ĝ'
 or:
			PageT = PageT + "gx"
			key = "yes"
		elif PageTitre[lettre:lettre+1] == u'ğ' or PageTitre[lettre:lettre+1] == u'ġ' or PageTitre[lettre:lettre+1] == u'ģ' or PageTitre[lettre:lettre+1] == u'ǥ' or PageTitre[lettre:lettre+1] == u'ǧ' or PageTitre[lettre:lettre+1] == u'ǵ' or PageTitre[lettre:lettre+1] == u'Ĝ' or PageTitre[lettre:lettre+1] == u'Ğ' or PageTitre[lettre:lettre+1] == u'Ġ' or PageTitre[lettre:lettre+1] == u'Ģ' or PageTitre[lettre:lettre+1] == u'Ɠ' or PageTitre[lettre:lettre+1] == u'Ǥ' or PageTitre[lettre:lettre+1] == u'Ǧ' or PageTitre[lettre:lettre+1] == u'Ǵ':
			PageT = PageT + "g"
			key = "yes"
		elif PageTitre[lettre:lettre+1] == u'ĥ' or:
			PageT = PageT + "hx"
			key = "yes"
		elif PageTitre[lettre:lettre+1] == u'ħ' or PageTitre[lettre:lettre+1] == u'ȟ' or PageTitre[lettre:lettre+1] == u'Ĥ' or PageTitre[lettre:lettre+1] == u'Ħ' or PageTitre[lettre:lettre+1] == u'Ȟ':
			PageT = PageT + "h"
			key = "yes"
(contracted; show full)= u'Ǐ' or PageTitre[lettre:lettre+1] == u'Ȉ' or PageTitre[lettre:lettre+1] == u'Ȋ' or PageTitre[lettre:lettre+1] == u'ij' or PageTitre[lettre:lettre+1] == u'IJ' or PageTitre[lettre:lettre+1] == u'ì' or PageTitre[lettre:lettre+1] == u'Ì' or PageTitre[lettre:lettre+1] == u'ï' or PageTitre[lettre:lettre+1] == u'Ï':
			PageT = PageT + "i"
			key = "yes"
		elif PageTitre[lettre:lettre+1] == u'ĵ'
 or:
			PageT = PageT + "jx"
			key = "yes"
		elif PageTitre[lettre:lettre+1] == u'ǰ' or PageTitre[lettre:lettre+1] == u'ȷ' or PageTitre[lettre:lettre+1] == u'ɉ' or PageTitre[lettre:lettre+1] == u'Ĵ' or PageTitre[lettre:lettre+1] == u'Ɉ':
			PageT = PageT + "j"
			key = "yes"
(contracted; show full)] == u'ř' or PageTitre[lettre:lettre+1] == u'ȑ' or PageTitre[lettre:lettre+1] == u'ȓ' or PageTitre[lettre:lettre+1] == u'ɍ' or PageTitre[lettre:lettre+1] == u'Ŕ' or PageTitre[lettre:lettre+1] == u'Ŗ' or PageTitre[lettre:lettre+1] == u'Ř' or PageTitre[lettre:lettre+1] == u'Ȑ' or PageTitre[lettre:lettre+1] == u'Ȓ' or PageTitre[lettre:lettre+1] == u'Ɍ':
			PageT = PageT + "r"
			key = "yes"

		elif PageTitre[lettre:lettre+1] == u'ŝ':
			PageT = PageT + "sx"
			key = "yes"
		elif PageTitre[lettre:lettre+1] == u'ſ' or PageTitre[lettre:lettre+1] == u'ś' or PageTitre[lettre:lettre+1] == u'ŝ' or PageTitre[lettre:lettre+1] == u'ş' or PageTitre[lettre:lettre+1] == u'š' or PageTitre[lettre:lettre+1] == u'ƪ' or PageTitre[lettre:lettre+1] == u'ș' or PageTitre[lettre:lettre+1] == u'ȿ' or PageTitre[lettre:lettre+1] == u'Ś' or PageTitre[lettre:lettre+1] == u'Ŝ' or PageTitre[lettre:lettre+1] == u'Ş' or PageTitre[lettre:lettre+1] == u'Š' or PageTitre[lettre:lettre+1] == u'Ʃ' or PageTitre[lettre:lettre+1] == u'Ș' or PageTitre[lettre:lettre+1] == u'ß':
			PageT = PageT + "s"
			key = "yes"
		elif PageTitre[lettre:lettre+1] == u'ţ' or PageTitre[lettre:lettre+1] == u'ť' or PageTitre[lettre:lettre+1] == u'ŧ' or PageTitre[lettre:lettre+1] == u'ƫ' or PageTitre[lettre:lettre+1] == u'ƭ' or PageTitre[lettre:lettre+1] == u'ț' or PageTitre[lettre:lettre+1] == u'ȶ' or PageTitre[lettre:lettre+1] == u'Ţ' or PageTitre[lettre:lettre+1] == u'Ť' or PageTitre[lettre:lettre+1] == u'Ŧ' or PageTitre[lettre:lettre+1] == u'Ƭ' or PageTitre[lettre:lettre+1] == u'Ʈ' or PageTitre[lettre:lettre+1] == u'Ț' or PageTitre[lettre:lettre+1] == u'Ⱦ' or PageTitre[lettre:lettre+1] == u'ⱦ':
			PageT = PageT + "t"
			key = "yes"
		elif PageTitre[lettre:lettre+1] == u'ŭ':
			PageT = PageT + "ux"
			key = "yes"
		elif PageTitre[lettre:lettre+1] == u'û' or PageTitre[lettre:lettre+1] == u'ũ' or PageTitre[lettre:lettre+1] == u'ū' or PageTitre[lettre:lettre+1] == u'ŭ' or PageTitre[lettre:lettre+1] == u'ů' or PageTitre[lettre:lettre+1] == u'ű' or PageTitre[lettre:lettre+1] == u'ų' or PageTitre[lettre:lettre+1] == u'ư' or PageTitre[lettre:lettre+1] == u'ǔ' or PageTitre[lettre:lettre+1] == u'ǖ' or PageTitre[lettre:lettre+1] == u'ǘ' or PageTitre[lettre:lettre+1] == u'ǚ' or PageTitre[lettre:lettre+1] == u'ǜ' or PageTitre[lettre:lettre+1] == u'ǟ' or PageTitre[lettre:lettre+1] == u'ǡ' or PageTitre[let(contracted; show full)	if key == "yes":
		while PageT[0:1] == u' ': PageT = PageT[1:len(PageT)]
		return PageT
	else:
		#raw_input(PageTitre.encode(config.console_encoding, 'replace'))
		return PageTitre


def trim(s):
    return s.strip(" \t\n\r\0\x0B")

def rec_anagram(counter):
	# Copyright http://www.siteduzero.com/forum-83-541573-p2-exercice-generer-tous-les-anagrammes.html
    if sum(counter.values()) == 0:
        yield ''
    else:
        for c in counter:
            if counter[c] != 0:
                counter[c] -= 1
                for _ in rec_anagram(counter):
                    yield c + _
                counter[c] += 1
def anagram(word):
    return rec_anagram(collections.Counter(word))
	
# Lecture du fichier articles_list.txt (au même format que pour replace.py)
def crawlerFile(source):
	if source:
		PagesHS = open(source, 'r')
		while 1:
			PageHS = PagesHS.readline()
			fin = PageHS.find("\t")
			PageHS = PageHS[0:fin]
(contracted; show full)										
# Traitement de toutes les pages du site
def crawlerAll(start):
	gen = pagegenerators.AllpagesPageGenerator(start,namespace=0,includeredirects=False)
	for Page in pagegenerators.PreloadingGenerator(gen,100):
		#print (Page.title().encode(config.console_encoding, 'replace'))
		modification(Page.title())

		
def trim(s):
    return s.strip(" \t\n\r\0\x0B")

def rec_anagram(counter):
	# Copyright http://www.siteduzero.com/forum-83-541573-p2-exercice-generer-tous-les-anagrammes.html
    if sum(counter.values()) == 0:
        yield ''
    else:
        for c in counter:
            if counter[c] != 0:
                counter[c] -= 1
                for _ in rec_anagram(counter):
                    yield c + _
                counter[c] += 1
def anagram(word):
    return rec_anagram(collections.Counter(word))
	
# Permet à tout le monde de stopper le bot en lui écrivant
def ArretDUrgence():
		page = Page(site,u'User talk:' + mynick)
		if page.exists():
			PageTemp = u''
			try:
				PageTemp = page.get()
			except wikipedia.NoPage: return
			except wikipedia.IsRedirectPage: return
			except wikipedia.LockedPage: return
			except wikipedia.ServerError: return
			except wikipedia.BadTitle: return
			except pywikibot.EditConflict: return
			if PageTemp != u"{{/Stop}}":
				pywikibot.output (u"\n*** \03{lightyellow}Arrêt d'urgence demandé\03{default} ***")
				exit(0)

def sauvegarde(PageCourante, Contenu, summary):
	ArretDUrgence()
	result = "ok"
	#print(Contenu.encode(config.console_encoding, 'replace')[0:4000])	#[len(Contenu)-2000:len(Contenu)]) #
	#result = raw_input("Sauvegarder ? (o/n)")
	if result != "n" and result != "no" and result != "non":
		if not summary: summary = u'[[Wiktionnaire:Structure des articles|Autoformatage]]'
		try:
			PageCourante.put(Contenu, summary)
		except wikipedia.NoPage: 
			print "NoPage l 3784en sauvegarde"
			return
		except wikipedia.IsRedirectPage: 
			print "NoPage l 3787IsRedirectPage en sauvegarde"
			return
		except wikipedia.LockedPage: 
			print "NoPage l 3790LockedPage en sauvegarde"
			return
		except pywikibot.EditConflict: 
			print "NoPage l 3793EditConflict en sauvegarde"
			return
		except wikipedia.ServerError: 
			print "NoPage l 3796ServerError en sauvegarde"
			return
		except wikipedia.BadTitle: 
			print "NoPage l 3799BadTitle en sauvegarde"
			return
	
# Lancement
TraitementCategorie = crawlerCat(u'Catégorie:Wiktionnaire:Codes langue manquants',True,u'')
TraitementCategorie = crawlerCat(u'Catégorie:Wiktionnaire:Flexions à vérifier',True,u'')
TraitementLiens = crawlerLink(u'Modèle:1ergroupe',u'')
TraitementLiens = crawlerLink(u'Modèle:2egroupe',u'')
TraitementLiens = crawlerLink(u'Modèle:3egroupe',u'')
TraitementLiens = crawlerLink(u'Modèle:trad',u'')
TraitementLiens = crawlerLink(u'Modèle:-',u'')
TraitementCategorie = crawlerCat(u'Catégorie:Appels de modèles incorrects:fr-verbe-flexion incomplet',False,u'')
TraitementLiens = crawlerLink(u'Modèle:=langue=',u'')
TraitementLiens = crawlerLink(u'Modèle:trad-',u'')
'''
TraitementPage = modification(u'Utilisateur:JackBot/test')
TraitementLiens = crawlerLink(u'Modèle:R:DAF8',u'homme')
TraitementFichier = crawlerFile('articles_list.txt')
TraitementLiensCategorie = crawlerCatLink(u'Modèles de code langue',u'')
TraitementCategorie = crawlerCat(u'Catégorie:Appels de modèles incorrects',True)
TraitementRecherche = crawlerSearch(u'chinois')
TraitementUtilisateur = crawlerUser(u'Utilisateur:JackBot')
TraitementRedirections = crawlerRedirects()
TraitementTout = crawlerAll(u'')
while 1:
	TraitementRC = crawlerRC()
'''
</source>