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