Ce module contrôle que des erreurs n'ont pas été commises dans la gestion de certains modèles. Pour plus de détails sur l’utilisation de ces fonctions voir la page Aide:Maintenance à l'aide du Lua.


La fonction p.avancement effectue un certain nombre de vérifications sur les pages contenant le Modèle:Évaluation et catégorise automatiquement les pages contenant des imperfections. Cette fonction vérifie notamment que :

  • Le Modèle:Évaluation a bien été placé dans la page de discussion du sommaire d'une leçon.
  • L'avancement attribué à la leçon n’est pas sous-évalué en calculant un avancement minimal de la leçon et en catégorisant les leçons dont l'avancement est inférieur à cet avancement calculé.

local p = {}

local categorie = ""

require("Module:Réserve")

function souspage(param)
	local reponse = "Rien trouvée"
	local debut = mw.ustring.find(param,"/",1,true)
	local fin = 1
	if debut then
		fin = mw.ustring.find(param,"|",debut+1,true)
	end
	if debut and fin then
		reponse = mw.ustring.sub(param,debut,fin-1)
	end
	return reponse
end

function p.evalue()
	local title = mw.title.getCurrentTitle()
	local titre = title.text
	local sommaire = lit(titre)
	if mw.ustring.find(sommaire,"{{Leçon") == nil then
		categorie = categorie.."[[Catégorie:Avancement d'une page qui n'est pas une leçon]] "
	end
	return categorie
end

function p.avancement(frame)
	local indice_monopage = 10 -- Indique le rapport acceptable par lequel une page a un contenu inférieur à la moyenne des autres pages
	local indice_multipage = 6 -- Indique le rapport acceptable par lequel un nombre de pages peut avoir un contenu insuffisant par rapport aus autres
	local page_vide = 70 -- Nombres de caractères en dessous duquel une page à un contenu nul
	local contenu_insuffisant = 600  -- Nombre de caractères qui suppose qu’il y a guère plus que le modèle en haut de page
	local avancement = 0 -- Avancement de la leçon calculée par le programme
	local av = 0 -- Avancement attribué dans la page de discussion
	local nbrexo = 0 -- Nombre réel de pages d'exercices
	local bonexo = 0 -- Repère une page d'exercice ayant un contenu suffisant
	local nbrcha = 0 -- Nombre réel de chapitres
	local boncha = 0 -- Repère un chapitre avec un contenu suffisant
	local peuchapitre = false -- repère un nombre insuffisant de chapitre
	local chapitre_defaillant = 0 -- Nombre de chapitres avec un contenu insuffisant
	local exo_defaillant = 0 -- Nombre d'exercices avec un contenu insuffisant
	local nbrsl = 0 -- Compte les sous-leçons
	local note_chap = 2 -- Note attribuée aux chapitres sur 2
	local note_exo = 2 -- Note attribuée aux exercices sur 2
	local chapitres = {} -- Table contenant la taille de chaque chapitre
	local exercices = {} -- Table contenant la taille de chaque page d'exercices (y compris quiz et TP)
	local nombre_chapitres -- Nombre de chapitres dans la leçon
	local nombre_exercices -- Nombres de page d'exercices dans la leçon (y compris quiz et TP)
	local moyenne_chap = 0 -- Taille moyenne des chapitres
	local moyenne_exo = 0  -- Taille moyenne des pages d'exercices (y comprie quiz et TP)
	local chapitre = true -- Indique que la sous page est un chapitre et pas une sous leçon
	local title = mw.title.getCurrentTitle() -- Objet title de la page de sommaire
	local titre = title.text -- titre de la page de sommaire
	local model = frame:getParent() -- table contenant les paramètres du modèle Leçon dans la page de sommaire
	categorie = categorie.."<br />Ce qui suit est produit par un script Lua destiné à détecter les leçons dont l'avancement est mal évalué."
	categorie = categorie.."<br />Les commentaires, donnés par le script, sont destinés à faciliter l'évaluation de la leçon."
	categorie = categorie.."<br />Ces commentaires peuvent être érronés, car le produit d'un programme informatique limité."
		categorie = categorie.."<br />Ils ne doivent, en aucun cas, être considérés comme des reproches."
	categorie = categorie.."<br />Veuillez nous excuser pour la gène occasionnée et ne pas tenir compte de ces commentaires destinés à la maintenance."
	categorie = categorie.."<br />Ces messages devraient disparaître prochainement.<br />"
	categorie = categorie.."<br />'''<u>Liste des chapitres.</u>'''" -- Commentaire
	nombre_chapitres = 0
	for index, objet in ipairs(model.args) do -- Pour mémoriser la taille des chapitres dans la table chapitres
		nombre_chapitres = nombre_chapitres + 1 -- On compte les chapitres
		chapitre = true -- On suppose que le nouveau chapitre n'est pas une leçon
		local contenu = "" -- Contiendra le contenu de la sous-page
		local taille = 0 -- initialisation de la taille de la sous-page
		local spage = souspage(model.args[index]) -- Mémorise provisoirement l'extension de la sous-page
		spage = titre..spage -- Mémorise de nom complet de la sous-page
		local titlesp = mw.title.new(spage) -- créé l’objet title de la sous-page
		if titlesp.exists then -- si la sous-page a été créée
			contenu = titlesp.getContent(titlesp) -- on récupère son contenu
			if mw.ustring.find(contenu,"{{Leçon",1,true) then chapitre = false end -- on regarde si le chapitre est une sous-leçon
			if chapitre then
				taille = mw.ustring.find(contenu,"{{Bas de page",1,true) -- on calcule sa taille
				if taille then
					chapitres[nombre_chapitres] = taille -- et on la mémorise
					categorie = categorie.."<br />Le chapitre : '''"..spage.."'''  a une taille de : "..taille -- Commentaire
				else
					chapitres[nombre_chapitres] = 0 -- si le contenu n'a pas pu être évalué, on mémorise 0
					categorie = categorie.."<br />Le chapitre : '''"..spage.."'''  a une taille évalué à 0 (modèle ''Bas de page'' non trouvé)" -- Commentaire
					categorie = categorie.."[[Catégorie:Leçon avec sous-pages sans bas de page]] " -- on signale si on a trouvé une sous-page sans bas de page
				end
			else
				nombre_chapitres = nombre_chapitres - 1 -- Ce n'était pas un chapitre
				nbrsl = nbrsl + 1 -- mais c’était une sous-leçon
				categorie = categorie.."<br />Le chapitre : '''"..spage.."'''  est en réalité une sous-leçon, donc n'est pas pris en compte !" -- Commentaire
			end
		else
			chapitres[nombre_chapitres] = 0 -- si le contenu est vide, on mémorise 0
			categorie = categorie.."<br />Le chapitre : '''"..spage.."'''  a une taille de : 0 (Chapitre prévu mais non créé)" -- Commentaire
		end
	end
	if nombre_chapitres > 0 then
		categorie = categorie.."<br />Ce qui nous fait en tout "..nombre_chapitres.." chapitres" -- Commentaire
		if nbrsl > 0 then categorie = categorie.." et "..nbrsl.." sous-leçons" end -- Commentaire
		categorie = categorie..".<br />"
	else
		categorie = categorie.."<br />Aucun chapitre n'a été trouvé dans cette leçon. Ce qui est étrange !<br />" -- Commentaire
	end
	categorie = categorie.."<br />'''<u>Liste des pages d'entraînement.</u>'''" -- Commentaire
	nombre_exercices = 0
	for index, objet in pairs(model.args) do -- On recommence ce qui a été fait précédemment pour la partie exercice
		if mw.ustring.find(index,"exo",1,true) or mw.ustring.find(index,"quiz",1,true) or mw.ustring.find(index,"tp",1,true) then
			nombre_exercices = nombre_exercices + 1 -- on compte le nombre de page d'exercices (y compris quiz et TP)
			local contenu = "" --destné à mémoriser le contenu de la page
			local taille = 0 -- Initialisation de la page
			spage = souspage(model.args[index]) --Mémorise provisoirement le nom de l'extension de la sous-page
			spage = titre..spage
			titlesp = mw.title.new(spage) -- Création de l’objet title de la sous-page
			if titlesp.exists then -- Si la sous-page a été créée
				contenu = titlesp.getContent(titlesp) -- on mémorise son contenu
				taille = mw.ustring.find(contenu,"{{Bas de page",1,true) -- et on calcule sa taille
			end
			if taille then -- Si la taille a pu être calculée
				exercices[nombre_exercices] = taille -- on la mémorise
				categorie = categorie.."<br />La page : '''"..titlesp.text.."''' a une taille de "..taille --Commentaire
			else
				exercices[nombre_exercices] = 0 -- Si la taille n'a pas pu être évalué, on mémorise 0
				categorie = categorie.."<br />La page : '''"..titlesp.text.."''' a une taille de 0" --Commentaire
				categorie = categorie.."[[Catégorie:Leçon avec sous-pages sans bas de page]] " -- et on signale qu'une sous page n'a pas de bas de page
			end
		end
	end
	if nombre_exercices > 0 then
		categorie = categorie.."<br />Ce qui nous fait en tout "..nombre_exercices.." pages d'exercices, quiz ou TP<br />" -- Commentaire
	else
		categorie = categorie.."<br />Aucune pages d'exercices, quiz ou TP n'a été trouvées.<br />"
	end
	categorie = categorie.."<br />'''<u>Commentaires.</u>'''" -- Commentaire
	if nombre_chapitres > 0 then -- S'il y a des chapitres, on calcule la moyenne des tailles
		for i = 1, nombre_chapitres do
			moyenne_chap = moyenne_chap+chapitres[i]
		end
		moyenne_chap = moyenne_chap/nombre_chapitres
		categorie = categorie.."<br />La moyenne des tailles des chapitres est : "..moyenne_chap
	end
	if nombre_exercices > 0 then -- S'il y a des pages d'exercices, on calcule la moyenne des tailles
		for i = 1, nombre_exercices do
			moyenne_exo = moyenne_exo+exercices[i]
		end
		moyenne_exo = moyenne_exo/nombre_exercices
		categorie = categorie.."<br />La moyenne des tailles des exercices est : "..moyenne_exo
	end
	moyenne_chap = moyenne_chap/indice_monopage -- On calcule un minimum acceptable pour la taille d'une page
	moyenne_exo = moyenne_exo/indice_monopage -- On calcule un minimum acceptable pour la taille d'une page
	if moyenne_chap < contenu_insuffisant then moyenne_chap = contenu_insuffisant end -- mettre le modèle de haut de page ne suffit pas à remplir un chapitre
	if moyenne_exo < contenu_insuffisant then moyenne_exo = contenu_insuffisant end -- mettre le modèle de haut de page ne suffit pas à remplir une page
	for i = 1, nombre_chapitres do -- On compte le nombres de chapitres avec un contenu insuffisant
		if chapitres[i] < moyenne_chap then chapitre_defaillant = chapitre_defaillant + 1 end
		if chapitres[i] > contenu_insuffisant then -- On compte aussi le nombre de pages d'exercices ayant un minimum de contenu
			nbrcha = nbrcha + 1
			boncha = i
		end
	end
	for i = 1, nombre_exercices do -- On compte le nombre de pages d'exercice avec un contenu insuffisant
		if exercices[i] < moyenne_exo then exo_defaillant = exo_defaillant + 1 end
		if exercices[i] > contenu_insuffisant then -- On compte aussi le nombre de pages d'exercices ayant un minimum de contenu
			nbrexo = nbrexo + 1
			bonexo = i
		end
	end
	if chapitre_defaillant > 0 then
		categorie = categorie.."<br />Il y a "..chapitre_defaillant.." chapitres avec relativement peu de contenu (ou non-créés)" -- Commentaire
	end
	if chapitre_defaillant > nombre_chapitres/indice_multipage then
		note_chap = 1 -- S'il y a trop de chapitre insuffisant, on met 1 comme note
		categorie = categorie.." et ce nombre est jugé excessif.(relativement au nombre total de chapitres)" -- Commentaire
	end
	if chapitre_defaillant > nombre_chapitres - 2 then
		note_chap = 0 -- Si presque tout les chapitres sont insuffisants, on met 0 comme note
		categorie = categorie.."<br />Quasiment tous les chapitres sont insuffisants." -- Commentaire
	end
	if nbrsl > 0 and nbrsl >= nbrcha then
		categorie = categorie.."[[Catégorie:Leçons avec une majorité de sous leçons]] "
	end
	if exo_defaillant > 0 then
		categorie = categorie.."<br />Il y a "..exo_defaillant.." pages d'exercices avec relativement peu de contenu"-- Commentaire"
	end
	if exo_defaillant > nombre_exercices/indice_multipage then
		note_exo = 1 -- S'il y a trop de pages d'exo insuffisant, on met 1 comme note
		categorie = categorie.." et ce nombre est jugé excessif.(relativement au nombre total de pages d'entraînement)" -- Commentaire
	end
	if exo_defaillant > nombre_exercices - 1 then
		note_exo = 0 -- Si toutes les pages d'exercices sont insuffisants, on met 0 comme note
		if nombre_exercices > 0 then categorie = categorie.."<br />Toutes les pages d'exercices n'ont pas beaucoup de contenu." end -- Commentaire
	end
	if nombre_chapitres < 2 then
		note_chap = 0 -- S'il y a moins de 2 chapitres, on met 0 comme note
		categorie = categorie.."<br />Il n'y a pas assez de chapitres dans cette leçon" -- Commentaire
	end
	if nombre_exercices < 1 then
		note_exo = 0 -- S'il n'y a pas d'exercices, on met 0 comme note
		categorie = categorie.."<br />Il n'y a pas d'exercices, de quiz ou de TP dans cette leçon, ce qui limite l'avancement à 2 au maximum." -- Commentaire
	end
	if moyenne_chap < page_vide then
		note_chap = 0 -- Si les chapitres ont trop peu de contenu, on met 0 comme note
		categorie = categorie.."<br />Les chapitres ont, en moyenne, un contenu très restreint. (Pris en compte)" -- Commentaire
	end
	if moyenne_exo < page_vide then
		note_exo = 0 -- Si les pages d'exercices ont trop peu de contenu, on met 0 comme note
		if nombre_exercices > 0 then
			categorie = categorie.."<br />Les pages d'exercices sont moyennement très pauvres en contenu. (Pris en compte)" -- Commentaire
		end
	end
	if note_chap == 2 and note_exo == 0 then
		categorie = categorie.."<br />Le cours semble suffisant, mais il n'y a pas de quoi s'entraîner." -- Commentaire
	end
	if note_exo == 2 and nbrexo == 1 and exercices[bonexo] < 2000 then note_exo = 1 end -- Une seule page d'exercice avec peu de contenu
	if note_exo == 1 and nbrexo == 1 and exercices[bonexo] < 1000 then note_exo = 0 end -- Une seule page d'exercice avec presque rien
	if note_chap == 2 and nombre_chapitres == 2 then -- Mettre 2 s'il y a que deux chapitres est excessif
		note_chap = 1
		peuchapitre = true
	end
	if note_chap == 0 and nbrcha == 1 and chapitres[boncha] > 2000 then note_chap = 1 end -- s'il y a un chapitre avec beaucoup de contenu, on ne met pas 0
	avancement = note_chap + note_exo -- On calcule l'avancement de la leçon en ajoutant la note des chapitres avec la note des exercices
	categorie = categorie.."<br />La note des chapitres est de  "..note_chap.." sur 2."
	if peuchapitre then categorie = categorie.." (deux chapitres seulement)" end
	categorie = categorie.."<br />La note des pages d'entraînement est de  "..note_exo.." sur 2."
	if nombre_exercices == 0 then categorie = categorie.." (car il n'y a pas d'exercices, pas de quiz et pas de TP !)" end
	local titlesom = mw.title.new(titre.."/Présentation de la leçon")
	if not titlesom.exists and avancement == 4 then -- On regarde si la présentation a été rempli pour les leçons ayant un bon contenu
		categorie = categorie.."<br />Comme la présentation de la leçon n'a pas été remplis, on limite à 3 l'avancement. " -- punition
		avancement = 3 -- Faut remplir la présentation
		categorie = categorie.."[[Catégorie:Leçon avec sommaire incomplet]] " -- on le signale
	end
	local titlesom = mw.title.new(titre.."/Objectifs")
	if not titlesom.exists and avancement == 4 then -- On regarde si les objectifs ont été remplis pour les leçons avec un bon contenu
		categorie = categorie.."<br />Comme les objectif n'ont pas été remplis, on limite à 3 l'avancement. " -- punition
		avancement = 3 -- Faut remplir les objectifs
		categorie = categorie.."[[Catégorie:Leçon avec sommaire incomplet]] " -- on le signale
	end
	local titlesom = mw.title.new(titre.."/Prérequis conseillés")
	if not titlesom.exists and avancement == 4 then -- On regarde si les prérequis ont été remplis pour les leçons avec un bon contenu
		categorie = categorie.."<br />Comme les prérequis n'ont pas été remplis, on limite à 3 l'avancement. " -- punition
		avancement = 3 -- Faut remplir les prérequis
		categorie = categorie.."[[Catégorie:Leçon avec sommaire incomplet]] " -- On le signale
	end
	categorie = categorie.."<br />L'avancement calculé pour la leçon est donc de "..avancement.." sur 4. (note chapitres + note pages entraînement)"
	local titledis = title.talkPageTitle -- Création de l’objet tetle de la page de discussion
	if titledis.exists then -- Si la page de discussion a été créée
		local rep -- repère de recherche dans la page de discussion
		local textedis = titledis.getContent(titledis) -- On extrait le contenu de la page de discussion
		rep = mw.ustring.find(textedis,"avancement",1,true) -- on se position au début de l'avancement
		rep = mw.ustring.find(textedis,"=",rep,true) -- on recherche le prochain = pour lire l'avancement
		if rep then
			if tonumber(mw.ustring.sub(textedis,rep+1,rep+1)) then -- il n'y a pas d'espace avant l'avancement
				av = tonumber(mw.ustring.sub(textedis,rep+1,rep+1)) -- on recueille l'avancement
			else -- il y a un espace avant l'avancement
				av = tonumber(mw.ustring.sub(textedis,rep+2,rep+2))  -- on recueille l'avancement
			end
			if av then
				categorie = categorie.."<br />Dans la page de discussion, on trouve un avancement de "..av.." sur 4." -- Commentaire
				if av == 0 then
					categorie = categorie.." (Ébauche)"
				elseif av == 1 then
					categorie = categorie.." (En cours)"
				elseif av == 2 then
					categorie = categorie.." (Bien avancé)"
				elseif av == 3 then
					categorie = categorie.." (Presque complet)"
				elseif av == 4 then
					categorie = categorie.." (Complet)"
				end
				if av < avancement then -- on compre l'avancement calculé avec l'avancement attribué dans la page de discussion
					categorie = categorie.."<br />L'avancement de la page de discussion est peut-être sous-estimé."
					categorie = categorie.."[[Catégorie:Leçon avec avancement insuffisant]] "
				elseif av > avancement then
					categorie = categorie.."<br />L'avancement de la page de discussion est peut-être sur-estimé."
					categorie = categorie.."[[Catégorie:Leçon avec avancement excessif]] "
				else
					categorie = categorie.."<br />L'avancement de la page de discussion semble donc convenable."
				end
			else
				categorie = categorie.."[[Catégorie:Leçons sans évaluation]] " -- l'avancement attribué n'a pas été trouvé
			end
		else
			categorie = categorie.."[[Catégorie:Leçons sans évaluation]] " -- l'avancement n'a pas été trouvé
		end
	else
		categorie = categorie.."[[Catégorie:Leçon sans page de discussion]] "
	end
	if (nbrexo == 1 or nbrexo == 2) and note_exo == 2 then
		avancement = avancement -1
		categorie = categorie.."<br />'''Attention :''' Compte-tenu du peu d'exercices de cette leçon, une erreur a peut-être été commise "
		categorie = categorie.."dans l'évaluation de l'avancement."
		categorie = categorie.."<br />Selon la matière et le niveau (non pris en compte par le script), plus de pages d'entrainement "
		categorie = categorie.."peuvent être nécessaires."
		categorie = categorie.."<br />L'avancement calculé doit alors être revu à la baisse et ramené à "..avancement.." sur 4."
		if av == avancement then
			categorie = categorie.."<br />Ce qui, dans ce cas, signifie que l'avancement dans la page de discussion"
			categorie = categorie.." n'a pas été sous-estimé, mais est alors convenable."
		end
		if av == avancement + 1 then
			categorie = categorie.."[[Catégorie:Leçons avec peu de pages d'entrainement]] "
		end
	end
	return categorie
end

return p