Module:Contrôle
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