Difference between revisions 18754739 and 18852698 on frwiktionary

[[Catégorie:JackBot|{{SUBPAGENAME}}]]
<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 labs Wikimedia :
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) Gère des modèles {{voir}} en début de page.
7) Ajoute les anagrammes (pour les petits mots)
8) Teste les URL et indique si elles sont brisées avec {{lien brisé}}, et les transforme en modèle s'il existe pour leur site
9) Remplace les modèles catégorisés comme obsolètes
10) Créer dGère les liens absentinternes cassés : http://fr.wiktionary.org/w/index.php?title=radiateur&diff=prev&oldid=14443668
11) Détecte les modèles à ajouter : http://fr.wiktionary.org/w/index.php?title=cl%C3%A9&diff=prev&oldid=14443625
12) Crée les redirection d'apostrophe dactylographique vers apostrophe typographique
Testé ici : http://fr.wiktionary.org/w/index.php?title=Utilisateur%3AJackBot%2Ftest&diff=14533806&oldid=14533695
'''

# Importation des modules
(contracted; show full)Section.append(u'méronymes')
Modele.append(u'-noms-vern-')
Section.append(u'noms vernaculaires')
Modele.append(u'-ortho-arch-')
Section.append(u'anciennes orthographes')
Modele.append(u'-paro-')
Section.append(u'paronymes')

Modele.append(u'-phrases-')
Section.append(u'phrases')
Modele.append(u'-q-syn-')
Section.append(u'quasi-synonymes')
Modele.append(u'-syn-')
Section.append(u'synonymes')
Modele.append(u'-tran-')
Section.append(u'transcriptions')
Modele.append(u'-trans-')
Section.append(u'transcriptions')
(contracted; show full)Modele.append(u'admin')
Modele.append(u'administration')
Modele.append(u'affectueux')
Modele.append(u'agri')
Modele.append(u'agriculture')
Modele.append(u'algèbre')
Modele.append(u'algèbre‎')
Modele.append(u'al
latifgues‎')
Modele.append(u'allatif')
Modele.append(u'alpi')
Modele.append(u'alpinisme')
Modele.append(u'anal')
Modele.append(u'analogie')
Modele.append(u'anat')
Modele.append(u'anatomie')
Modele.append(u'angl')
Modele.append(u'anglicisme')
Modele.append(u'animaux')
Modele.append(u'anthro')
Modele.append(u'anthropologie')
Modele.append(u'antilopes')
Modele.append(u'antiq')
Modele.append(u'antiquité')
Modele.append(u'aphérèse')
Modele.append(u'apiculture')
Modele.append(u'apiculture')
Modele.append(u'apocope')
Modele.append(u'arch')
Modele.append(u'archaïque')
(contracted; show full)Modele.append(u'canoë')
Modele.append(u'canoë-kayak')
Modele.append(u'capoeira')
Modele.append(u'capoeira')
Modele.append(u'cardin')
Modele.append(u'cardinal')
Modele.append(u'cartes')

Modele.append(u'catch')
Modele.append(u'caténatif')
Modele.append(u'champignons')
Modele.append(u'charpenterie')
Modele.append(u'chasse')
Modele.append(u'chiens')
Modele.append(u'chim')
Modele.append(u'chimie')
Modele.append(u'chimie organique')
Modele.append(u'chimie physique')
Modele.append(u'chir')
Modele.append(u'chiromancie')
Modele.append(u'chirurgie')
Modele.append(u'christianisme')
Modele.append(u'ciné')
Modele.append(u'cinéma')
Modele.append(u'coiffure')
Modele.append(u'combat')
Modele.append(u'comm')
Modele.append(u'commerce')
Modele.append(u'commerces')
Modele.append(u'comparatif de')
Modele.append(u'composants')
Modele.append(u'confiserie')
Modele.append(u'confiseries')
Modele.append(u'conjugaison')
Modele.append(u'constr')
Modele.append(u'construction')
Modele.append(u'contemporain')
(contracted; show full)Modele.append(u'informatique')
Modele.append(u'informel')
Modele.append(u'injur')
Modele.append(u'injurieux')
Modele.append(u'insecte')
Modele.append(u'instrumental')
Modele.append(u'instruments')

Modele.append(u'insultes')
Modele.append(u'interjection')
Modele.append(u'internet')
Modele.append(u'intrans')
Modele.append(u'intransitif')
Modele.append(u'iron')
Modele.append(u'ironie')
Modele.append(u'ironique')
Modele.append(u'irrég')
Modele.append(u'irrégulier')
Modele.append(u'islam')
Modele.append(u'jardi')
Modele.append(u'jardin')
Modele.append(u'jardinage')
Modele.append(u'jazz')
Modele.append(u'jeu vidéo')
Modele.append(u'jeux vidéo')
Modele.append(u'jeux')
Modele.append(u'joaillerie')
Modele.append(u'jogging')
Modele.append(u'jonglage')
Modele.append(u'journal')
Modele.append(u'journalisme')
Modele.append(u'judaïsme')
Modele.append(u'judo')
Modele.append(u'juri')
Modele.append(u'jurisprudence')
Modele.append(u'just')
Modele.append(u'justice')
Modele.append(u'karaté')
Modele.append(u'langues')
Modele.append(u'latinisme')
Modele.append(u'ling')
Modele.append(u'linguistique')
Modele.append(u'litote')
Modele.append(u'litt')
Modele.append(u'littér')
Modele.append(u'littéraire')
Modele.append(u'littérature')
Modele.append(u'liturgie')
(contracted; show full)Modele.append(u'minéraux')
Modele.append(u'miroiterie')
Modele.append(u'monnaies')
Modele.append(u'mot-valise')
Modele.append(u'motocyclisme')
Modele.append(u'muscle')
Modele.append(u'musi')

Modele.append(u'musiciens')
Modele.append(u'musique')
Modele.append(u'musiques')
Modele.append(u'myco')
Modele.append(u'mycol')
Modele.append(u'mycologie')
Modele.append(u'mythol')
Modele.append(u'mythologie')
Modele.append(u'méca')
Modele.append(u'mécanique')
Modele.append(u'méd')
Modele.append(u'méde')
Modele.append(u'médecine non conv')
Modele.append(u'médecine')
Modele.append(u'média')
Modele.append(u'médicaments')
Modele.append(u'mélio')
Modele.append(u'mélioratif')
Modele.append(u'métal')
Modele.append(u'métallurgie')
Modele.append(u'métaph')
Modele.append(u'métaphore')
Modele.append(u'méton')
Modele.append(u'métonymie')
Modele.append(u'métrol')
Modele.append(u'métrologie')
Modele.append(u'météo')
Modele.append(u'météorol')
Modele.append(u'météorologie')
Modele.append(u'narratol')
Modele.append(u'narratologie')
Modele.append(u'nata')
Modele.append(u'natation')
Modele.append(u'navig')
Modele.append(u'navigation')
Modele.append(u'neuro')
Modele.append(u'neurologie')
Modele.append(u'noblesse')
Modele.append(u'nom')
Modele.append(u'nombre')
Modele.append(u'nomin')
Modele.append(u'nominatif')
Modele.append(u'nosologie')
Modele.append(u'novlangue')
Modele.append(u'nucl')
Modele.append(u'nucléaire')
Modele.append(u'numis')
Modele.append(u'numismatique')
(contracted; show full)Modele.append(u'programmation')
Modele.append(u'pron')
Modele.append(u'pron-rég')
Modele.append(u'pronl')
Modele.append(u'pronominal')
Modele.append(u'propre')
Modele.append(u'protéines')

Modele.append(u'protocoles')
Modele.append(u'prov')
Modele.append(u'proverbial')
Modele.append(u'préhistoire')
Modele.append(u'prépositionnel')
Modele.append(u'psych')
Modele.append(u'psychia')
Modele.append(u'psychiatrie')
Modele.append(u'psycho')
Modele.append(u'psycho')
Modele.append(u'psychol')
Modele.append(u'psychologie')
Modele.append(u'pâtisserie')
Modele.append(u'pédol')
Modele.append(u'pédologie')
Modele.append(u'péj')
Modele.append(u'péjoratif')
Modele.append(u'pétanque')
Modele.append(u'pétro')
Modele.append(u'pétrochimie')
Modele.append(u'pétrochimie')
Modele.append(u'pêch')
Modele.append(u'pêche')
Modele.append(u'rare')
Modele.append(u'reli')
Modele.append(u'religieux')
Modele.append(u'religion')
Modele.append(u'religions')
Modele.append(u'reliure')
Modele.append(u'repro')
Modele.append(u'reproduction')
Modele.append(u'rhéto')
Modele.append(u'rhétorique')
Modele.append(u'roches')
Modele.append(u'rugby')
Modele.append(u'running')
Modele.append(u'récip')
Modele.append(u'réciproque')
Modele.append(u'réfl')
Modele.append(u'réflexif')
Modele.append(u'réfléchi')
Modele.append(u'réseau')
Modele.append(u'réseaux informatiques')
Modele.append(u'réseaux')
Modele.append(u'rhéto')
Modele.append(u'rhétorique')
Modele.append(u'robotiques')
Modele.append(u'roches')
Modele.append(u'rugby')
Modele.append(u'running')
Modele.append(u'saccusatif')
Modele.append(u'satellites')
Modele.append(u'sci-fi')
Modele.append(u'sciences')
Modele.append(u'scol')
Modele.append(u'scolaire')
Modele.append(u'scul')
Modele.append(u'sculpture')
(contracted; show full)Modele.append(u'voitures')
Modele.append(u'volcanologie')
Modele.append(u'volley')
Modele.append(u'volley-ball')
Modele.append(u'vulg')
Modele.append(u'vulgaire')
Modele.append(u'vx')

Modele.append(u'vx')
Modele.append(u'véhicules')
Modele.append(u'vétérinaire')
Modele.append(u'vête')
Modele.append(u'vêtements')
Modele.append(u'wiki')
Modele.append(u'yoga')
Modele.append(u'zool')
Modele.append(u'zoologie')
(contracted; show full)Modele.append(u'ébauche-trans')
Modele.append(u'ébauche-étym-nom-scientifique')
Modele.append(u'ébauche-étym')
Modele.append(u'ébauche-déf')
Modele.append(u'ébauche-exe')
Modele.append(u'ébauche-pron')
Modele.append(u'ébauche')

Modele.append(u'...')
# Modèles régionaux, pb du nocat pour les prononciations
limit5 = len(Modele)

Modele.append(u'Acadie')
Modele.append(u'Afrique du Sud')
Modele.append(u'Afrique')
Modele.append(u'Algérie')
Modele.append(u'Allemagne')
(contracted; show full)Modele.append(u'Marseille')
Modele.append(u'Maurice')
Modele.append(u'Mayotte')
Modele.append(u'Mexique')
Modele.append(u'Midi toulousain')
Modele.append(u'Midi')
Modele.append(u'Moldavie')

Modele.append(u'Namibie')
Modele.append(u'Nantes')
Modele.append(u'Navarre')
Modele.append(u'Niger')
Modele.append(u'Nigéria')
Modele.append(u'Normandie')
Modele.append(u'Nouvelle-Calédonie')
Modele.append(u'Nouvelle-Zélande')
Modele.append(u'Occitanie')
(contracted; show full)		Modele[] = u'imperfectif'
		Modele[] = u'perf'
		Modele[] = u'imperf'
		
Modele[] = u'T' : à synchroniser
'''


Nombre = []
Nombre.append(u'nombre')
Nombre.append(u'msing')
Nombre.append(u'fsing')
Nombre.append(u'nsing')
Nombre.append(u'mplur')
Nombre.append(u'fplur')
Nombre.append(u'nplur')
Nombre.append(u's')
Nombre.append(u'p')
Nombre.append(u'd')
Nombre.append(u'sp')
Nombre.append(u'singulare tantum')
Nombre.append(u'plurale tantum') 
Nombre.append(u'invariable')
Nombre.append(u'invar')

Genre = []
Genre.append(u'genre')
Genre.append(u'm')
Genre.append(u'f')
Genre.append(u'n')
Genre.append(u'c')
Genre.append(u'mf')
Genre.append(u'mf ?')
Genre.append(u'msing')
Genre.append(u'fsing')
Genre.append(u'nsing')
Genre.append(u'mplur')
Genre.append(u'fplur')
Genre.append(u'nplur')

# Modification du wiki
def modification(PageHS):
	summary = u'[[Wiktionnaire:Structure des articles|Autoformatage]]'
	if debogage: print u'------------------------------------'
	print(PageHS.encode(config.console_encoding, 'replace'))
	
	if PageHS.find(u'’') != -1:
		page = Page(site,PageHS.replace(u'’', u'\''))
(contracted; show full)		return
	PageTemp = PageBegin
	CleTri = CleDeTri.CleDeTri(PageHS)
	
	regex = ur'{{=([a-z\-]+)=}}'
	if re.search(regex, PageTemp):
		PageTemp = re.sub(regex, ur'{{langue|\1}}', PageTemp)

		if summary.find(u'{{langue}}') == -1: summary = summary + u', déploiement de {{langue}}'
	
	if page.namespace() == 0 or PageHS.find(u'Utilisateur:JackBot/') != -1:
		while PageTemp.find(u'{{ ') != -1:
			PageTemp = PageTemp[0:PageTemp.find(u'{{ ')+2] + PageTemp[PageTemp.find(u'{{ ')+3:len(PageTemp)]
(contracted; show full)		for p in range(1,limit2):
			if p == limit14: EgalSection = u'===='
			if p == limit15: EgalSection = u'====='
			
			regex = ur'[= ]*{{[\-loc]*(' + Modele[p] + u'|S\|'+ Section[p] + ur')([^}]*)}}[= ]*'
			if re.search(regex, PageTemp):
				PageTemp = re.sub(regex, EgalSection + ur' {{S|' + Section[p] + ur'\2}} ' + EgalSection, PageTemp)

				if summary.find(u'{{S}}') == -1 and re.search('{{-\w', PageBegin): summary = summary + u', [[WT:Prise de décision/Rendre toutes les sections modifiables|déploiement de {{S}}]]'
			
			regex = ur'[= ]*{{\-flex[\-loc]*(' + Modele[p] + u'|S\|' + Section[p] + ur')\|([^}]*)}}[= ]*'
			if re.search(regex, PageTemp):
				PageTemp = re.sub(regex, EgalSection + ur' {{S|' + Section[p] + ur'|\2|flexion}} ' + EgalSection, PageTemp)
				if summary.find(u'{{S}}') == -1 and re.search('{{-\w', PageBegin): summary = summary + u', [[WT:Prise de décision/Rendre toutes les sections modifiables|déploiement de {{S}}]]'
		
		if debogageLent: raw_input(PageTemp.encode(config.console_encoding, 'replace'))
		if PageTemp.find(u'|===') != -1 or PageTemp.find(u'{===') != -1:
			if debogage: print u' *==='
			return
		
		# Titres en minuscules
		#PageTemp = re.sub(ur'{{S\|([^}]+)}}', ur'{{S|' + ur'\1'.lower() + ur'}}', PageTemp)
(contracted; show full)
				if PageTemp2.find(u'|' + PageHS + u'}') != -1 and PageTemp2.find(u'|' + PageHS + u'}') < PageTemp2.find(u'}}'):
					PageTemp = PageTemp[0:PageTemp.find(u'{{voir|') + PageTemp2.find(u'|' + PageHS + u'}')] + PageTemp[PageTemp.find(u'{{voir|') + PageTemp2.find(u'|' + PageHS + u'}')+len(u'|' + PageHS):len(PageTemp)]
			

			'''pb dans [[i]]
			if debogage: print u' Retrait des {{voir| si {{voir/'
			while PageTemp.find(u'{{voir|') != -1 and PageTemp.find(u'{{voir/') != -1:
				PageTemp2 = PageTemp[PageTemp.find(u'{{voir|'):+len(PageTemp)u'{{voir|'):]
				PageTemp = PageTemp[0:PageTemp.find(u'{{voir|') + PageTemp2.find(u'}}')+2] + PageTemp[PageTemp.find(u'{{voir|') + PageTemp2.find(u'}}')+2:len(PageTemp)]
	]
			'''
			
			if debogage: print u' Nettoyage des {{voir}}...'
			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)]
(contracted; show full)
				PageTemp = PageTemp[0:PageTemp.find(baratin)] + PageTemp[PageTemp.find(baratin)+len(baratin):len(PageTemp)]
				summary = summary + u', {{clé de tri|}} supprimée'
			baratin = u'{{clé de tri|}}<!-- Veuillez mettre juste après « {{clé de tri| » le titre de la page en y enlevant tous les accents et éventuels apostrophes, et en changeant les éventuels traits d’union et autres caractères spéciaux par une espace ; s’il n’y a rien à changer, merci d’effacer ces lignes. -->'

			'''Inhibé depuis migration Lua :
			if PageTemp.find(baratin) != -1:
				PageTemp = PageTemp[0:PageTemp.find(baratin)] + PageTemp[PageTemp.find(baratin)+len(baratin):len(PageTemp)]
				summary = summary + u', {{clé de tri|}} supprimée'
			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|}} supprimée'
			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}} supprimée'
			if PageTemp.find(u'{{clé de tri|' + PageHS.lower() + u'}}') != -1 and PageTemp.find(u'{{S|verb pronominal|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}} supprimée'''

			if debogage: print u'Remplacements des balises'
			PageTemp = re.sub(ur'\[\[Category:', ur'[[Catégorie:', PageTemp)
			while PageTemp.find(u'</br>') != -1:
				PageTemp = PageTemp[0:PageTemp.find(u'</br>')] + u'<br/>' + PageTemp[PageTemp.find(u'</br>')+len(u'</br>'):len(PageTemp)]
			while PageTemp.find(u'<sup/>') != -1:
				PageTemp = PageTemp[0:PageTemp.find(u'<sup/>')] + u'</sup>' + PageTemp[PageTemp.find(u'<sup/>')+len(u'<sup/>'):len(PageTemp)]
		
			# Ajout de catégories
			'''if PageHS[len(PageHS)-len(u'ejar'):] == u'ejar':
				if PageTemp.find(u'{{langue|ca}}') != -1 and PageTemp.find(u'[[Catégorie:Verbes en catalan suffixés en -ejar]]') == -1:
					PageTemp2 = PageTemp[:PageTemp.find(u'{{langue|ca}}')+len(u'{{langue|ca}}'):]
					if PageTemp2.find(u'\n== {{langue|') != -1:
						if debogage: print u'cat au milieu'
						PageTemp = PageTemp[:PageTemp.find(u'{{langue|ca}}')+len(u'{{langue|ca}}')+PageTemp2.find(u'\n== {{langue|')] + u'\n[[Catégorie:Verbes en catalan suffixés en -ejar]]\n\n' + PageTemp[PageTemp.find(u'{{langue|ca}}')+len(u'{{langue|ca}}')+PageTemp2.find(u'\n== {{langue|'):]
					else:
						if debogage: print u'cat à la fin'
						PageTemp = PageTemp + u'\n\n[[Catégorie:Verbes en occitan suffixés en -ejar]]\n'

				if PageTemp.find(u'{{langue|oc}}') != -1 and PageTemp.find(u'[[Catégorie:Verbes en occitan suffixés en -ejar]]') == -1:
					PageTemp2 = PageTemp[PageTemp.find(u'{{langue|oc}}')+len(u'{{langue|oc}}'):]
					if PageTemp2.find(u'\n== {{langue|') != -1:
						if debogage: print u'cat au milieu'
						PageTemp = PageTemp[:PageTemp.find(u'{{langue|oc}}')+len(u'{{langue|oc}}')+PageTemp2.find(u'\n== {{langue|')] + u'\n[[Catégorie:Verbes en occitan suffixés en -ejar]]\n\n' + PageTemp[PageTemp.find(u'{{langue|oc}}')+len(u'{{langue|oc}}')+PageTemp2.find(u'\n== {{langue|'):]
					else:
						if debogage: print u'cat à la fin'
						PageTemp = PageTemp + u'\n\n[[Catégorie:Verbes en occitan suffixés en -ejar]]\n'
			
			elif PageHS[len(PageHS)-len(u'-able'):] == u'-able':
				if PageTemp.find(u'{{langue|fr}}') != -1 and PageTemp.find(u'[[Catégorie:Mots en français suffixés en -able]]') == -1:
				
				if PageTemp.find(u'{{langue|en}}') != -1 and PageTemp.find(u'[[Category:Mots en anglais suffixés en -able]]') == -1:'''

		if debogage: print u'Remplacements des modèles'
		PageTemp = re.sub(ur'{{(formatnum|Formatnum|FORMATNUM)\:([0-9]*) ', ur'{{\1:\2', PageTemp)
		PageTemp = re.sub(ur'{{terme*\|Registre neutre}} *', ur'', PageTemp)
		# Ligne de forme
		PageTemp = PageTemp.replace(u'[[' + PageHS + u']]', u'\'\'\'' + PageHS + u'\'\'\'')
(contracted; show full)
		PageTemp = PageTemp.replace(u'{{enm}}', u'moyen anglais')
		PageTemp = PageTemp.replace(u'{{en}}', u'anglais')
		PageTemp = PageTemp.replace(u'{{ru}}', u'russe')
		PageTemp = PageTemp.replace(u'{{nl}}', u'néerlandais')
		PageTemp = PageTemp.replace(u'{{pt}}', u'portugais')
		PageTemp = PageTemp.replace(u'{{it}}', u'italien')
		
PageTemp = PageTemp.replace(u'{{nds}}', u'bas allemand')
		PageTemp = PageTemp.replace(u'=== {{S|voir aussi}} ===\n{{Autres projets\n|w=AG}}', u'=== {{S|voir aussi}} ===\n* {{WP}}')

		# Modèles trop courts
		if debogage: print u'Modèles courts'
		PageTemp = PageTemp.replace(u'{{fp}}', u'{{fplur}}')
		PageTemp = PageTemp.replace(u'{{mp}}', u'{{mplur}}')
		PageTemp = PageTemp.replace(u'{{np}}', u'{{nlur}}')
		PageTemp = PageTemp.replace(u'{{mascul}}', u'{{au masculin}}')
		PageTemp = PageTemp.replace(u'{{fémin}}', u'{{au féminin}}')
(contracted; show full)
		while PageTemp.find(u'|notat=1') != -1:
			PageTemp = PageTemp[0:PageTemp.find(u'|notat=1')] + u'|nocat=1' + PageTemp[PageTemp.find(u'|notat=1')+len(u'|notat=1'):len(PageTemp)]
		regex = ur'\{\{ISBN\|([^\}]*)\}\}'
		if re.search(regex, PageTemp):
			PageTemp = re.sub(regex, ur'ISBN \1', PageTemp)

				
		LimiteReg = 13
		ModRegion = range(1, LimiteReg)
		ModRegion[1] = u'AU'
		ModRegion[2] = u'AR'
		ModRegion[3] = u'AT'
		ModRegion[4] = u'BE'
		ModRegion[5] = u'BR'
(contracted; show full)
		
		# Ajout des redirections des pronominaux
		if PageTemp.find(u'{{S|verbe|fr}}') != -1 and PageHS[:3] != u'se' and PageHS[:2] != u's’':
			PageTemp2 = PageTemp[PageTemp.find(u'{{S|verbe|fr}}'):]
			regex = ur'(\n|\')s(e |’)\'\'\''
			if re.search(regex, PageTemp2) 
< PageTemp2.find(u'{{S|') or (re.search(regex, PageTemp2) != -1 andis not None:
				if re.search(regex, PageTemp2) < PageTemp2.find(u'{{S|') or PageTemp2.find(u'{{S|') == -1):
						regex = ur'^[aeiouyàéèêôù]'
						if re.search(regex, PageHS):	# ne pas prendre [:1] car = & si encodage ASCII du paramètre DOS / Unix
							PageHS2 = u's’'+PageHS
						else:
							PageHS2 = u'se '+PageHS
						page2 = Page(site,PageHS2)
						if not page2.exists():
							if debogage: print u'Création de ' + CleDeTri.CleDeTri(PageHS2)
							summary2 = u'Création d\'une redirection provisoire catégorisante du pronominal'
							sauvegarde(page2, u'#REDIRECT[[' + PageHS + u']]\n<!-- Redirection temporaire avant de créer le verbe pronominal -->\n[[Catégorie:Wiktionnaire:Verbes pronominaux à créer en français]]', summary2)
						
		# Ajout de modèles pour les gentités et leurs adjectifs
		if debogage: print u'Gentilés'
		if PageTemp.find(u'{{langue|fr}}') != -1:
			ligne = 6
			colonne = 4
			ModeleGent = [[0] * (colonne+1) for _ in range(ligne+1)]
			ModeleGent[1][1] = ur'fr-accord-mixte'
(contracted; show full)				position = PageTemp.find("}}")
			elif PageTemp.find("|") == -1:
				position = PageTemp.find("}}")
			else:
				position = PageTemp.find("|")

			# Ajout des anagrammes pour cette nouvelle langue détectée
			if 
codelangue == u'conv':
				regex = ur'[= ]*{{S\|anagrammes}}[^}]+\|conv}}\n'
				if re.compile(regex).search(PageTemp):
					if debogage: print u'Retrait d\'anagramme en conv'
					PageEnd2 = PageTemp[:re.compile(regex).search(PageTemp).start()]
					PageTemp2 = PageTemp[re.compile(regex).search(PageTemp).end():]
					delta = re.compile(regex).search(PageTemp).end()
					regex = ur'[^}]+\|conv}}\n'
					while re.compile(regex).search(PageTemp2):
						if debogage: print u' autre anagramme en conv'
						delta = delta + re.compile(regex).search(PageTemp2).end()
						PageTemp2 = PageTemp2[re.compile(regex).search(PageTemp2).end():]
					PageTemp = PageEnd2 + PageTemp[delta:]
				
			elif NouvelleLangue == True and socket.gethostname() != "willow" and socket.gethostname() != "yarrow" and socket.gethostname() != "nightshade" and PageTemp.find(u'-S|erreur-') == -1 |' + codelangue) == -1 and PageTemp.find(u'S|faute|' + codelangue) == -1  and codelangue != u'conv': #and PageHS != u'six':
				if debogage: print u' Anagrammes pour ' + codelangue
				if PageTemp.find(u'{{S|anagr') == -1 and PageHS.find(u' ') == -1 and len(PageHS) <= TailleAnagramme: 
					anagrammes = anagram(PageHS)
					ListeAnagrammes = u''
					for anagramme in anagrammes:
						if anagramme != PageHS:
							if debogage: print anagramme.encode(config.console_encoding, 'replace')
(contracted; show full)
							PageEnd = PageEnd + PageTemp[0:position] + "|nocat=1}}"
						else:
							PageEnd = PageEnd + PageTemp[0:position] + "|" + codelangue + "}}"
						PageTemp = PageTemp[PageTemp.find("}}")+2:len(PageTemp)]
						break
					elif Modele[p] == u'chimie' or Modele[p] == u'chim' or Modele[p] == u'biochimie' or Modele[p] == u'bioch':
						if (EstCodeLangue == "false"


	) or (PageTemp.find(u'Catégorie:Acides gras'
	) != -1 and (PageTemp.find(u'Catégorie:Acides gras') < PageTemp.find(u'{{langue|') and PageTemp.find(u'{{langue|') != -1 or PageTemp.find(u'{{langue|') == -1
	) and (PageTemp.find(u':Catégorie:Acides gras') + 1 != PageTemp.rfind(u'Catégorie:Acides gras'))

	) or (PageTemp.find(u'Catégorie:Éléments chimiques'
	) != -1 and (PageTemp.find(u'Catégorie:Éléments chimiques') < PageTemp.find(u'{{langue|') and PageTemp.find(u'{{langue|') != -1 or PageTemp.find(u'{{langue|') == -1
	) and (PageTemp.find(u':Catégorie:Éléments chimiques') + 1 != PageTemp.rfind(u'Catégorie:Éléments chimiques'))

	) or (PageTemp.find(u'Catégorie:Substances chimiques'
(contracted; show full)							print u'Section introuvable : ' + TitreSection
							return
						if Index < limit1:
							# Paragraphe définition
							EstCodeLangue = "true"
							trad = u'false'
							# Ajouts en fin de ligne de forme
							if TitreSection == 'nom' and (codelangue == 'fr' or codelangue == 'e
s' or codelangue == 'pt' or codelangue == 'it' or codelangue == 'de' or codelangue == 'ar' or codelangue == 'ru'):
								if debogage: print u'Recherche du genre manquant'
								if PageTemp.find(u'\n\'\'\'' + PageHS + u'\'\'\'') != -1 and PageTemp.find(u'\n\'\'\'' + PageHS + u'\'\'\'') < 100:
									PageTemp2 = PageTemp[PageTemp.find(u'\n\'\'\'' + PageHS + u'\'\'\'')+len(u'\n\'\'\'' + PageHS + u'\'\'\''):]
									if (PageTemp2.find(u'{{genre') > PageTemp2.find(u'\n') or PageTemp2.find(u'{{genre') == -1) and (PageTemp2.find(u'{{m') > PageTemp2.find(u'\n') or PageTemp2.find(u'{{m') == -1) and (PageTemp2.find(u'{{f') > PageTemp2.find(u'\n') or PageTemp2.find(u'{{f') == -1) and (PageTemp2.find(u'{{n') > PageTemp2.find(u'\n') or PageTemp2.find(u'{{n') == -1):
										PageTemp = PageTemp[:PageTemp.find(u'\n\'\'\'' + PageHS + u'\'\'\'')+len(u'\n\'\'\'' + PageHS + u'\'\'\'')+PageTemp2.find(u'\n')] + u' {{genre|' + codelangue + u'}}' + PageTemp[PageTemp.find(u'\n\'\'\'' + PageHS + u'\'\'\'')+len(u'\n\'\'\'' + PageHS + u'\'\'\'')+PageTemp2.find(u'\n'):]
n' or codelangue == 'es' or codelangue == 'pt' or codelangue == 'it' or codelangue == 'de' or codelangue == 'ar' or codelangue == 'ru'):
								
								if debogage: print u'Recherche du nombre manquant'
								NombreManquant = True
								if PageTemp.find(u'\n\'\'\'' + PageHS + u'\'\'\'') != -1 and PageTemp.find(u'\n\'\'\'' + PageHS + u'\'\'\'') < 100:
									PageTemp2 = PageTemp[PageTemp.find(u'\n')+1:]
									if PageTemp2.find(u'{{' + codelangue + u'-') > PageTemp2.find(u'\n') or PageTemp2.find(u'{{' + codelangue + u'-') == -1:
										PageTemp2 = PageTemp[PageTemp.find(u'\n\'\'\'' + PageHS + u'\'\'\'')+len(u'\n\'\'\'' + PageHS + u'\'\'\''):]
										for n in range(0,len(Nombre)):
											if PageTemp2.find(u'{{' + Nombre[n] + u'|') != -1 or PageTemp2.find(u'{{' + Nombre[n] + u'}}') != -1:
												if debogage: print u' ' + Nombre[n] + u' trouvé'
												NombreManquant = False
										if NombreManquant == True:
											PageTemp = PageTemp[:PageTemp.find(u'\n\'\'\'' + PageHS + u'\'\'\'')+len(u'\n\'\'\'' + PageHS + u'\'\'\'')+PageTemp2.find(u'\n')] + u' {{nombre|' + codelangue + u'}}' + PageTemp[PageTemp.find(u'\n\'\'\'' + PageHS + u'\'\'\'')+len(u'\n\'\'\'' + PageHS + u'\'\'\'')+PageTemp2.find(u'\n'):]
								
								if codelangue != u'en':
									if debogage: print u'Recherche du genre manquant'
									GenreManquant = True
									if PageTemp.find(u'\n\'\'\'' + PageHS + u'\'\'\'') != -1 and PageTemp.find(u'\n\'\'\'' + PageHS + u'\'\'\'') < 100:
										PageTemp2 = PageTemp[PageTemp.find(u'\n\'\'\'' + PageHS + u'\'\'\'')+len(u'\n\'\'\'' + PageHS + u'\'\'\''):]
										for n in range(0,len(Genre)): 
											if PageTemp2.find(u'{{' + Genre[n] + u'|') != -1 or PageTemp2.find(u'{{' + Genre[n] + u'}}') != -1:
												if debogage: print u' ' + Genre[n] + u' trouvé'
												GenreManquant = False
										if GenreManquant == True:
											PageTemp = PageTemp[:PageTemp.find(u'\n\'\'\'' + PageHS + u'\'\'\'')+len(u'\n\'\'\'' + PageHS + u'\'\'\'')+PageTemp2.find(u'\n')] + u' {{genre|' + codelangue + u'}}' + PageTemp[PageTemp.find(u'\n\'\'\'' + PageHS + u'\'\'\'')+len(u'\n\'\'\'' + PageHS + u'\'\'\'')+PageTemp2.find(u'\n'):]
								
						else:
							# Paragraphe sans code langue
							EstCodeLangue = "false"
							if TitreSection == 'traductions':
								trad = u'true'
								# Ajout de {{trad-début}} si {{T| en français (pas {{L| car certains les trient par famille de langue)
								if PageTemp.find(u'{{') == PageTemp.find(u'{{T|') and codelangue == 'fr':
(contracted; show full)
								trad = u'true'
							else:
								trad = u'false'
						
						if debogage: print " EstCodeLangue = " + EstCodeLangue
						# Tous ces modèles peuvent facultativement contenir |clé= et |num=, et |genre= pour les prénoms
						if ((p < limit1 and p > 0) or (p == 0 and Section.index(TitreSection) < limit1)) and (PageTemp.find(u'|clé=') == -1 or PageTemp.find(u'|clé=') > PageTemp.find(u'}}')):
							if debogage
Lent: print u'  ' + str(p)
							if debogageLent: print u'  ' + str(Section.index(TitreSection))
							if debogageLent: print PageTemp[:PageTemp.find(u'}}')].encode(config.console_encoding, 'replace')
							TitreTemp = PageHS
							if codelangue == u'es':
								if TitreTemp.find(u'ñ') !=-1: TitreTemp = TitreTemp.replace(u'ñ',u'n€')
								if TitreTemp.find(u'ñ'.upper()) !=-1: TitreTemp = TitreTemp.replace(u'ñ'.upper(),u'n€')
							
							elif codelangue == u'fi':
								if TitreTemp.find(u'å') !=-1: TitreTemp = TitreTemp.replace(u'å',u'z€')
								if TitreTemp.find(u'å'.upper()) !=-1: TitreTemp = TitreTemp.replace(u'å'.upper(),u'z€')
								if TitreTemp.find(u'ä') !=-1: TitreTemp = TitreTemp.replace(u'ä',u'z€€')
								if TitreTemp.find(u'ä'.upper()) !=-1: TitreTemp = TitreTemp.replace(u'ä'.upper(),u'z€€')
								if TitreTemp.find(u'ö') !=-1: TitreTemp = TitreTemp.replace(u'ö',u'z€€€')
								if TitreTemp.find(u'ö'.upper()) !=-1: TitreTemp = TitreTemp.replace(u'ö'.upper(),u'z€€€')
								
							elif codelangue == u'os':
								if TitreTemp.find(u'ё') !=-1: TitreTemp = TitreTemp.replace(u'ё',u'е€')
								if TitreTemp.find(u'ё'.upper()) !=-1: TitreTemp = TitreTemp.replace(u'ё'.upper(),u'е€')
								if TitreTemp.find(u'ӕ') !=-1: TitreTemp = TitreTemp.replace(u'ӕ',u'а€')
(contracted; show full)			PageEnd = PageEnd.replace(u"{{genre|fr}}", u"{{m}}")
		if PageHS[-4:] == u'iste':
			PageEnd = PageEnd.replace(u"{{genre|fr}}", u"{{mf}}")
		if PageHS[-4:] == u'aire':
			PageEnd = PageEnd.replace(u"{{genre|fr}}", u"{{mf}}")
		if PageHS[-1:] == u'é':
			PageEnd = PageEnd.replace(u"{{genre|fr}}", u"{{m}}")
		
	
		if PageHS.find(u' 
		if debogage: print u'Genre manquant de locution'
		if PageHS.find(u' ') != -1 and PageHS.find(u'{{langue|fr}}') != -1:
			PageLemme = u''
			page2 = Page(site,PageHS[:PageHS.find(u' ')])
			if page2.exists():
				if page.namespace() !=0:
					print u'Page non traitée l 4591785'
					return
				else:
					try:
						PageLemme = page2.get()
					except wikipedia.NoPage:
						print "NoPage l 4597791"
					except wikipedia.IsRedirectPage: 
						print "IsRedirect l 4599793"
			else:
				print "NoPage l 4601795"
			if PageLemme != u'':
				genre = u''
				if PageLemme.find(u'|fr}} {{m}}') != -1:
					genre = u'{{m}}'
				elif PageLemme.find(u'|fr}} {{f}}') != -1:
					genre = u'{{f}}'
				if genre != u'':
(contracted; show full)			except wikipedia.IsRedirectPage: 
				print "IsRedirect l 4701"
				return
			if PageEN.find(u'==English==') != -1:
				PageEnd = PageEnd + u'\n[[en:' + PageHS + u']]'
				summary = summary + u', ajout d\'interwiki'
				
	# Syntaxe humaine imprévue de {{terme}}
 dans l'étymologie
	PageEnd = PageEnd.replace(u'{{nom|nocat=1}}', u"''(Nom)''")
	
	#Traitement de crawlerSearch(u'"source à préciser"')
	'''regex = ur'({{source\|)([^1}}])'
	if re.search(regex, PageEnd):
		if debogage: print u'source à préciser'
		PageEnd = re.sub(regex, ur'{{source|1=\2', PageEnd)
		summary = summary + u', précision de "(source à préciser)"'
	'''
	
	if debogage: print u'Test des URL'
	#PageEnd = hyperlynx.hyperlynx(PageEnd)
	if debogage: print (u'--------------------------------------------------------------------------------------------')
	if PageEnd != PageBegin:
		# Modifications mineures, ne justifiant pas une édition à elles seules
		PageEnd = PageEnd.replace(u'  ', u' ')
		PageEnd = PageEnd.replace(u'\n\n\n\n', u'\n\n\n')
		sauvegarde(page,PageEnd, summary)
	elif debogage:
		print "Aucun changement"
		

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

def addCat(PageTemp, lang, cat):
	if PageTemp.find(cat) == -1:
		PageTemp2 = PageTemp[PageTemp.find(u'{{langue|' + lang + u'}}')+len(u'{{langue|' + lang + u'}}'):]
		if PageTemp2.find(u'{{langue|') != -1:
			if debogage: print u' catégorie ajoutée avant la section suivante'
			if PageTemp2.find(u'== {{langue|') != -1:
				PageTemp = PageTemp[:PageTemp.find(u'{{langue|' + lang + u'}}')+len(u'{{langue|' + lang + u'}}')+PageTemp2.find(u'== {{langue|')] + cat + u'\n\n' + PageTemp[PageTemp.find(u'{{langue|' + lang + u'}}')+len(u'{{langue|' + lang + u'}}')+PageTemp2.find(u'== {{langue|'):]
			elif PageTemp2.find(u'=={{langue|') != -1:
				PageTemp = PageTemp[:PageTemp.find(u'{{langue|' + lang + u'}}')+len(u'{{langue|' + lang + u'}}')+PageTemp2.find(u'=={{langue|')] + cat + u'\n\n' + PageTemp[PageTemp.find(u'{{langue|' + lang + u'}}')+len(u'{{langue|' + lang + u'}}')+PageTemp2.find(u'=={{langue|'):]
			else:
				 print u'Modèle {{langue| mal positionné'
		else:
			if debogage: print u' catégorie ajoutée avant les interwikis'
			regex = ur'\n\[\[\w?\w?\w?:'
			if re.compile(regex).search(PageTemp):
				try:
					PageTemp = PageTemp[:re.search(regex,PageTemp).start()] + u'\n' + cat + u'\n' + PageTemp[re.search(regex,PageTemp).start():]
				except:
					print u'pb regex interwiki'
			else:
				if debogage: print u' catégorie ajoutée en fin de page'
				PageTemp = PageTemp + u'\n' + cat
	return PageTemp

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
(contracted; show full)			return

# Lancement
if len(sys.argv) > 1:
	if sys.argv[1] == u'test':
		TraitementPage = modification(u'User:' + mynick + u'/test')
	elif sys.argv[1] == u'txt':
		TraitementFichier = crawlerFile(u'articles_' +
 language + u'_' + family + u'.txt')
	elif sys.argv[1] == u'm':
		TraitementLiens = crawlerLink(u'Modèle:pl-cour',u'')
		TraitementLiens = crawlerLink(u'Modèle:pl-rare',u'')
	elif sys.argv[1] == u'cat':
		TraitementCategorie = crawlerCat(u'Catégorie:Pages using duplicate arguments in template calls',False,u'')
	elif sys.argv[1] == u'lien':
		TraitementLiens = crawlerLink(u'Modèle:sports de combat',u'finnois',False,u'tuulla')
	elif sys.argv[1] == u'lien':
		TraitementLiens = crawlerLink(u'Modèle:sports de combat',u'')
	elif sys.argv[1] == u'page':
		TraitementPage = modification(u'AG')
	elif sys.argv[1] == u's':
		TraitementRecherche = crawlerSearch(u'"source à préciser"')
	else:
		TraitementPage = modification(sys.argv[1])	# Format http://tools.wmflabs.org/jackbot/xtools/public_html/unicode-HTML.php
else:
	# Quotidiennement :
	TraitementCategorie = crawlerCat(u'Catégorie:Wiktionnaire:Codes langue manquantsTerminologie sans langue précisée',True,u'')
	TraitementCategorie = crawlerCat(u'Catégorie:Wiktionnaire:Flexions à vérifier',True,u'')
	TraitementCategorie = crawlerCat(u'Catégorie:Appels de modèles incorrects:fr-verbe-flexion incomplet',False,u'')
	TraitementCategorie = crawlerCat(u'Catégorie:Wiktionnaire:Ébauches à compléter',False,u'')
	TraitementLiens = crawlerLink(u'Modèle:trad',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:-',u'')
	TraitementLiens = crawlerLink(u'Modèle:-ortho-alt-',u'')
	TraitementLiens = crawlerLink(u'Modèle:mascul',u'')
	TraitementLiens = crawlerLink(u'Modèle:fémin',u'')
	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:-déf-',u'')
	TraitementCategorie = crawlerCat(u'Catégorie:Wiktionnaire:Utilisation d\'anciens modèles de section',True,u'')
	TraitementCategorie = crawlerCat(u'Catégorie:Pages à vérifier car créées automatiquement',False,u'')

'''	
	while 1:
		TraitementRC = crawlerRC_last_day()

TraitementLiensCategorie = crawlerCatLink(u'Catégorie:Modèles désuets',u'')
TraitementLiens = crawlerLink(u'Modèle:SAMPA',u'') : remplacer les tableaux de prononciations ?
TraitementLiens = crawlerLink(u'Modèle:trad-',u'')
TraitementCategorie = crawlerCat(u'Catégorie:Wiktionnaire:Conjugaisons manquantes en français',True,u'')
TraitementCategorie = crawlerCat(u'Catégorie:Appels de modèles incorrects:pron conv',True,u'')

# Modèles
TraitementPage = modification(u'Modèle:terme')
TraitementLiens = crawlerLink(u'Modèle:terme',u'')
TraitementFichier = crawlerFile(u'articles_WTin.txt')
TraitementLiensCategorie = crawlerCatLink(u'Modèles de code langue',u'')
TraitementCategorie = crawlerCat(u'Catégorie:Appels de modèles incorrects',True,u'')
TraitementRecherche = crawlerSearch(u'"en terme de"')
TraitementUtilisateur = crawlerUser(u'Utilisateur:JackBot', 800)
TraitementRedirections = crawlerRedirects()
TraitementTout = crawlerAll(u'')
	
python delete.py -lang:fr -family:wiktionary -file:articles_WTin.txt
python movepages.py -lang:fr -family:wiktionary -pairs:"articles_WTin.txt" -noredirect -pairs
python interwiki.py -lang:fr -family:wiktionary -page:"Wiktionnaire:Accueil communautaire"
'''
</source>