Module:Contrôle

Une page de Wikiversité, la communauté pédagogique libre.

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