Difference between revisions 14444358 and 14530462 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
'''

# 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

# Modèles du site à traiter
limit6=93744
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[169] = u'PàS'
Modele[170] = u'vérifier'
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'
Modele[198] = u'figuré'
Modele[199] = u'formel'
Modele[200] = u'gallicisme'
Modele[201] = u'abréviation'titre alt'
Modele[177] = u'titre mis en forme'
Modele[178] = u'trad'
Modele[179] = u'trad+'
Modele[180] = u'trad-'
Modele[181] = u'trad--'
Modele[182] = u'préciser'
Modele[183] = u'?'
Modele[184] = u'doute'
Modele[185] = u'm'
Modele[186] = u'f'
limit25 = 187
Modele[187] = u'n'
Modele[188] = u'c'
Modele[189] = u'mf'
Modele[190] = u'mf?'
Modele[191] = u'fm ?'
Modele[192] = u'plus courant'
Modele[193] = u'moins courant'
Modele[194] = u'plus rare'
Modele[195] = u'beaucoup plus courant'
Modele[196] = u'beaucoup moins courant'
Modele[197] = u'pl-cour'
Modele[198] = u'm-cour'
Modele[199] = u'pl-rare'
Modele[200] = u'b-pl-cour'
Modele[201] = u'b-m-cour'
limit3 = 202 # 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[202] = u'hapax'
Modele[203] = u'hispanisme'
Modele[204] = u'humour'
Modele[205] = u'hyperbole'
Modele[206] = u'idiotisme'
Modele[207] = u'indéfini'
Modele[208] = u'joaillerie'
Modele[209] = u'informel'
Modele[210] = u'injurieux'
Modele[211] = u'interjection'
Modele[212] = u'ironique'
Modele[213] = u'litote'
Modele[214] = u'littéraire'
Modele[215] = u'm-courpéjoratif'
Modele[216] = u'mélioratif'
Modele[217] = u'métaphore'
Modele[218] = u'métonymie'
Modele[219] = u'mot-valise'
Modele[220] = u'néologisme'
Modele[221] = u'néol litt'
Modele[222] = u'anglicisme'
Modele[223] = u'antiquité'
Modele[224] = u'ordinal'
Modele[225] = u'palindrome'
Modele[226] = u'archaïque'
Modele[227] = u'poissons'
Modele[228] = u'péjoratif'
Modele[229] = u'pl-cour'
Modele[230] = u'pl-rarvirologie'
Modele[229] = u'viticulture'
Modele[230] = u'zoologie'
Modele[231] = u'plaisanterie'
Modele[232] = u'poétique'
Modele[233] = u'populaire'
Modele[234] = u'propre'
Modele[235] = u'proverbial'
Modele[236] = u'rare'
Modele[237] = u'sigle'
(contracted; show full)Modele[418] = u'tourisme'
Modele[419] = u'transport'
Modele[420] = u'travail'
Modele[421] = u'typographie'
Modele[422] = u'télécommunications'
Modele[423] = u'urbanisme'
Modele[424] = u'vêtements'
Modele[425] = u'
virologie'
Modele[426] = u'viticulture'
Modele[427] = u'zoologie'
Modele[428] = u'b-pl-courmarketing'
Modele[426] = u'aphérèse'
Modele[427] = u'apocope'
Modele[428] = u'argot'
Modele[429] = u'cardinal'
Modele[430] = u'comparatif'
Modele[431] = u'contemporain'
Modele[432] = u'courant'
Modele[433] = u'dérision'
Modele[434] = u'jazz'
Modele[435] = u'tennis de table'
Modele[436] = u'volley-ball'
Modele[437] = u'volley'
Modele[438] = u'badminton'
Modele[438] = u'bases de données'
Modele[439] = u'BDD'
Modele[440] = u'pharma'
Modele[441] = u'apiculture'
Modele[442] = u'coiffure'
Modele[443] = u'astronautique'
Modele[444] = u'animaux'
Modele[445] = u'plantes'
Modele[446] = u'marketing'
Modele[447] = u'aphérèse'
Modele[448] = u'apocope'
Modele[449] = u'argot'
Modele[450] = u'b-m-courcapoeira'
Modele[447] = u'jeu vidéo'
Modele[448] = u'skate'
Modele[449] = u'skateboard'
Modele[450] = u'patin'
Modele[451] = u'escalade'
Modele[452] = u'archéo'
Modele[453] = u'armement'
Modele[454] = u'astrol'
Modele[455] = u'astron'
Modele[456] = u'audiovis'
Modele[457] = u'automo'
(contracted; show full)Modele[783] = u'acron'
Modele[784] = u'pronominal'
Modele[785] = u'abrév'
Modele[786] = u'snowboard'
Modele[787] = u'snow'
Modele[788] = u'transitif'
Modele[789] = u'intransitif'
Modele[790] = u'
capoeira'
Modele[791] = u'jeu vidéo'

limit4 = 792	# ébauches
Modele[793] = u'ébauche-déf'
Modele[794] = u'ébauche-étym'
Modele[795] = u'ébauche-pron'
Modele[796] = u'ébauche'
Modele[797] = u'ébauche-exe'
Modele[798] = u'ébauche-pron'
Modele[799] = u'ébauche-syn'
Modele[800] = u'ébauche-étym-nom-scientifique'
Modele[801] = 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 = 802
Modele[803] = u'Berry'
Modele[804] = u'Bolivie'
Modele[805] = u'Bordelais'
Modele[806] = u'Bourgogne'
Modele[807] = u'Brésil'
Modele[808] = u'Bretagne'
Modele[809] = u'Burkina Faso'
Modele[810] = u'Cameroun'enfantin'
Modele[791] = u'épithète'
Modele[792] = u'euphémisme'
Modele[793] = u'ex-rare'
Modele[794] = u'exagératif'
Modele[795] = u'expression'
Modele[796] = u'familier'
Modele[797] = u'figuré'
Modele[798] = u'formel'
Modele[799] = u'gallicisme'
Modele[800] = u'abréviation'
Modele[801] = u'par ellipse'

limit4 = 802	# ébauches
Modele[802] = u'ébauche-déf'
Modele[803] = u'ébauche-étym'
Modele[804] = u'ébauche-pron'
Modele[805] = u'ébauche'
Modele[806] = u'ébauche-exe'
Modele[807] = u'ébauche-pron'
Modele[808] = u'ébauche-syn'
Modele[809] = u'ébauche-étym-nom-scientifique'
Modele[810] = 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 = 811
Modele[811] = u'Canada'
Modele[812] = u'Catalogne'
Modele[813] = u'Champagne'
Modele[814] = u'Chili'
Modele[815] = u'Chine'
Modele[816] = u'Colombie'
Modele[817] = u'Commonwealth'
(contracted; show full)Modele[927] = u'Argentine'
Modele[928] = u'Australie'
Modele[929] = u'Autriche'
Modele[930] = u'Auvergne'
Modele[931] = u'Baléares'
Modele[932] = u'Belgique'
Modele[933] = u'Luxembourg'
Modele[934] = u'Bénin'

Modele[935] = u'Berry'
Modele[936] = u'Bolivie'
Modele[937] = u'Bordelais'
Modele[938] = u'Bourgogne'
Modele[939] = u'Brésil'
Modele[940] = u'Bretagne'
Modele[941] = u'Burkina Faso'
Modele[942] = u'Cameroun'

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

# Modèles des autres Wiktionnaires à convertir
LimitTemplate = 82
Template = range(1, LimitTemplate+1)
TemplateFR = range(1, LimitTemplate+1)
(contracted; show full)Template[78] = u'proto:sla-pro'
TemplateFR[78] = u'proto-slave'
Template[79] = u'proto:tupi-guarani'
TemplateFR[79] = u'proto-tupi-guarani'
Template[80] = u'proto:wint-pro'
TemplateFR[80] = u'proto-wintuan'
Template[81] = u'proto:cost-pro'
TemplateFR[81] = u'proto-
wintucostanoan'
	
	
# Modification du wiki
def modification(PageHS):
	summary = u'[[Wiktionnaire:Structure des articles|Autoformatage]]'
	if debogage == True: print u'------------------------------------'
	print(PageHS.encode(config.console_encoding, 'replace'))
(contracted; show full)
		while PageHS.find(u'&#225;') != -1:
			PageHS = PageHS[0:PageHS.find(u'&#225;')] + u'á' + PageHS[PageHS.find(u'&#225;')+len(u'&#225;'):len(PageHS)]
		while PageHS.find(u'&#250;') != -1:
			PageHS = PageHS[0:PageHS.find(u'&#250;')] + u'ú' + PageHS[PageHS.find(u'&#250;')+len(u'&#250;'):len(PageHS)]	
			
		
	
		# Clés de tri
		if debogage == True: print u'Clés de tri'
		baratin = u'{{clé de tri|}}<!-- supprimer si le mot ne contient pas de caractères accentués ni de caractères typographiques (par ex. trait d’union ou apostrophe) ; sinon suivez les instructions à [[Modèle:clé de tri]] -->'
		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|}} inutile'
		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}}') != -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 and ClePage.lower() != PageHS.lower():
				'''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'''if PageTemp.find(u'Catégorie:Périodes géologiques en français') != -1 and PageTemp.find(u'{{Temps géologiques') == -1:
			PageTemp = PageTemp.replace(u'{{-nom-pr-|fr}}',u'{{-nom-|fr}}')
			# Ajout de la période géologique
			''''pageTemps = Page(site,u'Modèle:Temps géologiques')
			if page.exists():
				try:
					PageTemps = pageTemps.get()
				except wikipedia.NoPage:
					print "NoPage l 1392"
					return
			else:
				return'''
			#print u'en travaux : ajouter un modèle de navigation en couleur ou modèle en Lua ?'
			
			# Création de l'adjectif correspondant
			PageHSMin = PageHS[0:1].lower() + PageHS[1:]
			if PageHSMin != PageHS:
				PageMin = Page(site,PageHSMin)
				if not PageMin.exists():
					if PageHS[0:1] == u'a' or PageHS[0:1] == u'e' or PageHS[0:1] == u'i' or PageHS[0:1] == u'o' or PageHS[0:1] == u'u' or PageHS[0:1] == u'y' or PageHS[0:1] == u'é' or PageHS[0:1] == u'è' or PageHS[0:1] == u'à' or PageHS[0:1] == u'A' or PageHS[0:1] == u'E' or PageHS[0:1] == u'I' or PageHS[0:1] == u'O' or PageHS[0:1] == u'U' or PageHS[0:1] == u'Y' or PageHS[0:1] == u'É' or PageHS[0:1] == u'È' or PageHS[0:1] == u'À':
						article = u"à l’"
					else:
						article = u"au "
					if PageHS[len(PageHS)-2:len(PageHS)] == u'en':
						modeleFlex = u'{{fr-accord-en}}'
					else:
						modeleFlex = u'{{fr-rég}}'
					PageEnd2 = u"{{voir|" + PageHS + u"}}\n=={{langue|fr}}==\n{{-étym-}}\n:{{cf|" + PageHS + u"}}.\n\n{{-adj-|fr}}\n" + modeleFlex + u"\n'''{{subst:PAGENAME}}\''' {{pron||fr}} {{m}}\n# Relatif " + article + u"[[" + PageHS + u"]].\n\n{{-trad-}}\n{{ébauche-trad}}"
					sauvegarde(PageMin,PageEnd2, u"Création de l'adjectif à partir du nom")
					
					
		# Clés de tri
		if debogage == True: print u'Clés de tri'
		baratin = u'{{clé de tri|}}<!-- supprimer si le mot ne contient pas de caractères accentués ni de caractères typographiques (par ex. trait d’union ou apostrophe) ; sinon suivez les instructions à [[Modèle:clé de tri]] -->'
		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 and ClePage.lower() != PageHS.lower():
				if PageTemp.rfind(u'\n\n[[') != -1:
					PageTemp2 = PageTemp[PageTemp.rfind(u'\n\n[['):len(PageTemp)]
					if PageTemp2[4:5] == u':' or PageTemp2[5:6] == u':':
						PageTemp = PageTemp[0:PageTemp.rfind(u'\n\n[[')] + u'\n\n{{clé de tri|' + ClePage + u'}}' + PageTemp[PageTemp.rfind(u'\n\n[['):len(PageTemp)]
					else:
						PageTemp = PageTemp + u'\n\n{{clé de tri|' + ClePage + u'}}\n'
				else:
(contracted; show full)
				PageTemp = PageTemp[0:PageTemp.find(u'{{clé de tri|')+len(u'{{clé de tri|')] + CleDeTri(PageHS) + PageTemp[PageTemp.find(u'{{clé de tri|')+len(u'{{clé de tri|')+PageTemp2.find(u'}}'):len(PageTemp)]
		while PageTemp.find(u'\n{clé de tri') != -1:
			PageTemp = PageTemp[0:PageTemp.find(u'\n{clé de tri')+1] + u'{' + PageTemp[PageTemp.find(u'\n{clé de tri'):len(PageTemp)]
		

			
		if debogage == True: print u'Remplacements des modèles'
		if PageTemp.find(u'Catégorie:Périodes géologiques en français') != -1 and PageTemp.find(u'{{Temps géologiques') == -1:
			print u'en travaux : ajouter un modèle de navigation en couleur ?'

		PageTemp = re.sub(ur'{{(formatnum|Formatnum|FORMATNUM)\:([0-9]*) ', ur'{{\1:\2if PageTemp.find(baratin) != -1:
			PageTemp = PageTemp[0:PageTemp.find(baratin)] + PageTemp[PageTemp.find(baratin)+len(baratin):len(PageTemp)]
			summary = summary + u', {{clé de tri|}} inutile'
		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}}') != -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 debogage == True: 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)]
			
		if debogage == True: 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)
		while PageTemp.find(u'\n {') != -1:
			PageTemp = PageTemp[0:PageTemp.find(u'\n {')+1] + PageTemp[PageTemp.find(u'\n {')+2:len(PageTemp)]		
		while re.compile('{{T\|.*\n\n\*[ ]*{{T\|').search(PageTemp):
			i1 = re.search(u'{{T\|.*\n\n\*[ ]*{{T\|',PageTemp).end()
			PageTemp = PageTemp[:i1][0:PageTemp[:i1].rfind(u'\n')-1] + PageTemp[:i1][PageTemp[:i1].rfind(u'\n'):len(PageTemp[:i1])] + PageTemp[i1:]
(contracted; show full)
						if (EstCodeLangue == "false"
	) or (PageTemp.find(u'Catégorie:Gentilés'
	) != -1 and (PageTemp.find(u':Catégorie:Gentilés') < PageTemp.find(u'{{langue|') and PageTemp.find(u'{{langue|') != -1 or PageTemp.find(u'{{langue|') == -1
	) and (PageTemp.find(u':Catégorie:Gentilés') + 1 != PageTemp.rfind(u'Catégorie:Gentilés'))


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

	) or (PageTemp.find(u'Catégorie:Pays'
(contracted; show full)								PageEnd = PageEnd + PageTemp[0:4] + "-"
								PageTemp = PageTemp[position:len(PageTemp)]
								break
							except wikipedia.ServerError:
								PageEnd = PageEnd + PageTemp[0:4] + "-"
								PageTemp = PageTemp[position:len(PageTemp)]
								break

							except pywikibot.exceptions.InvalidTitle:
								PageEnd = PageEnd + PageTemp[0:4] + "-"
								PageTemp = PageTemp[position:len(PageTemp)]
								break
							if pageExt.exists():
								PageEnd = PageEnd + PageTemp[0:4] + "+"
								PageTemp = PageTemp[position:len(PageTemp)]
								break
							else:
								PageEnd = PageEnd + PageTemp[0:4] + "-"
								PageTemp = PageTemp[position:len(PageTemp)]
								break
(contracted; show full)							
						PageEnd = PageEnd + PageTemp[0:PageTemp.find(u'}}')+2]

					elif p < limit2:	# Paragraphe sans code langue
						EstCodeLangue = "false"
						trad = u'false'
						PageEnd = PageEnd + PageTemp[0:position] + "}}"
					elif p < limit
325:	# Paragraphe sans code langue contenant un texte
						EstCodeLangue = "false"
						trad = u'false'
						if PageTemp.find(u'}}') > PageTemp.find(u'{{') and PageTemp.find(u'{{') != -1:
							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 < limit3:	# Modèle sans paramètre
						PageEnd = PageEnd + PageTemp[0:position] + "}}"
					elif p < limit4:	# Paragraphe avec code langue
						if EstCodeLangue == "true":
							PageEnd = PageEnd + PageTemp[0:position] + "|" + codelangue + "}}"
						else:
							PageEnd = PageEnd + PageTemp[0:position] + "|nocat=1}}"		
					elif p < limit5:	# ébauche : catégorisée quel que soit EstCodeLangue
						if codelangue:
							PageEnd = PageEnd + PageTemp[0:position] + "|" + codelangue + "}}"
(contracted; show full)		PagesHS.close()

# Traitement d'une catégorie
def crawlerCat(category,recursif,apres):
	modifier = u'False'
	cat = catlib.Category(site, category)
	pages = cat.articlesList(False)
	
for Page in pagegenerators.PreloadingGenerator(pagesgen =  pagegenerators.NamespaceFilterPageGenerator(pages, [0])
	for Page in pagegenerators.PreloadingGenerator(gen,100):
		if not apres or apres == u'' or modifier == u'True':
			modification(Page.title()) #crawlerLink(Page.title())
		elif Page.title() == apres:
			modifier = u'True'
	if recursif == True:
		subcat = cat.subcategories(recurse = True)
		for subcategory in subcat:
			pages = subcategory.articlesList(False)
			for Page in pagegenerators.PreloadingGenerator(pages,100):
				modification(Page.title())

# Traitement des pages liées
def crawlerLink(pagename,apres):
	modifier = u'False'
	#pagename = unicode(arg[len('-links:'):], 'utf-8')
	page = wikipedia.Page(site, pagename)
	gen = pagegenerators.ReferringPageGenerator(page)
	#gen =  pagegenerators.NamespaceFilterPageGenerator(gen, namespaces[0])
	for Page in pagegenerators.PreloadingGenerator(gen,100):
		#print(Page.title().encode(config.console_encoding, 'replace'))
		if not apres or apres == u'' or modifier == u'True':
			modification(Page.title()) #crawlerLink(Page.title())
		elif Page.title() == apres:
			modifier = u'True'

# Traitement des pages liées des entrées d'une catégorie
def crawlerCatLink(pagename,apres):
	modifier = u'False'
	cat = catlib.Category(site, pagename)
	pages = cat.articlesList(False)
	for Page in pagegenerators.PreloadingGenerator(pages,100):
		page = wikipedia.Page(site, Page.title())
		gen = pagegenerators.ReferringPageGenerator(page)
		#gen =  pagegenerators.NamespaceFilterPageGenerator(gen, namespaces[0])
		for PageLiee in pagegenerators.PreloadingGenerator(gen,100):
			#print(Page.title().encode(config.console_encoding, 'replace'))
			if not apres or apres == u'' or modifier == u'True':
				modification(PageLiee.title()) #crawlerLink(Page.title())
			elif PageLiee.title() == apres:
				modifier = u'True'
				
(contracted; show full)		except wikipedia.BadTitle: 
			print "BadTitle en sauvegarde"
			return
		except AttributeError:
			print "AttributeError en sauvegarde"
			return
# Lancement
Traitement
Categorie = crawlerCat(u'Catégorie:Périodes géologiques en français',False,u'')
Liens = crawlerLink(u'Modèle:moins courant',u'Sénégalais')
'''
# Quotidiennement :
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:-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:trad-',u'')

TraitementLiens = crawlerLink(u'Modèle:R:DAF8',u'')
TraitementLiens = crawlerLink(u'Modèle:Import:DAF8',u'')
TraitementLiens = crawlerLink(u'Modèle:R:Littré',u'')
TraitementLiens = crawlerLink(u'Modèle:Import:Littré',u'')

# Modèles
TraitementPage = modification(u'Utilisateur:JackBot/test')
TraitementLiens = crawlerLink(u'Modèle:R:DAF8',u'homme# Modèles
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>