Perfectionnement en Lua/Manipuler une table complexe
Nous poursuivons notre étude de la librairie Site ; en nous intéressant à la table namespace, qui contient les données relatives aux espaces de noms.
La lecture de la documentation mw:#LUAREF nous indique que la table namespaces contient une table pour chaque espace de nom, indexée par son numéro d’identifiant. Nous disposons également du nom des clés contenues dans chaque table et des fonctions fournies par la librairie.
Nous souhaitons produire un résumé des espaces des noms contenant les informations suivantes pour chaque espace sujet :
id ; name ; canonicalName ; id_associated_space; name , canonicalName
Prérequis
modifierCe chapitre suppose que vous ayez assimilé la leçon [[]].
Créer un script Lua avec des tables complexes
modifier- Accéder au Module:Bac à sable.
- Supprimer le code existant.
- Ajouter le code suivant et enregistrer la page :
Pour commencer nous ajoutons une fonction capable de sélectionner la table relative à un espace donné. La table site utilise des clés numériques, nous devons tester le résultat de la commande tonumber(). Nous souhaitons également pouvoir sélectionner les tables selon leur nom. Ensuite nous améliorons notre fonction showTable, de sorte à pouvoir l’utiliser sans frame…
local p = {}
local site = mw.site -- La variable locale récupère l’objet
local namespaces = mw.site.namespaces
function p.namespace(frame) -- Reçoit le numéro ou bien le label de l'espace ; appel form_ns() et retourne le formulaire des propriétés.
local r = '' -- Résultats
local ns_id = tonumber(frame.args[1]) -- nil si impossible number désigne id
local ns_name = tostring(frame.args[1]) -- string désigne label
local t = {} -- table des résultats
if ns_id == nil then -- si ns_id est nul
t = mw.site.namespaces[ns_name] -- reçoit le label
else -- si ns_id existe
t = mw.site.namespaces[ns_id] -- reçoit l'identifiant
end
r = r .. form_table(t) -- Affiche formulaire pour l'espace de noms
return r -- Retourne le formulaire des propriétés scribunto de l'espace
end
function p.showTable(frame)
t = site
key1 = frame.args[1]
key2 = frame.args[2]
if key1 ~= nil then t = site[key1] end
if key2 ~= nil then
if tonumber(key2) ~= nil then t = t[tonumber(key2)] end
else t = t[key2]
end
local r = showTable(t)
return r
end
function showTable(t)
local r = '' -- Variable texte pour le résultat
for k, v in pairs(t) do -- Itération de la table
r = r .. '* ' .. tostring(k).. ' ; ' .. tostring(v) .. '\n'
end
return r
end
Suite
modifierEn comparant le résultat de la fonction showTable() et celui de la fonction form_table() ; nous observons que la seconde fonction n’affiche pas les données de type booléen.
Nous corrigeons la fonction form_table en ajoutant la ligne suivant dans la boucle.
if type(v) == 'boolean' then r = r ..'; '..k ..' : '..tostring(v)..'\n' end
Lorsque l’utilisateur souhaite lire le contenu de la table namespaces (tous les espaces) ; nous afficherons dans un premier temps la liste des espaces sujets avec le label et le nom canonique.
if frame.args[1] == nil then
t = site.subjectNamespaces -- On ne tient compte que des
r = form_namespaces(t) -- espaces sujets
else
r = r .. form_table(t) -- Affiche formulaire pour l'espace de noms
end
Pour être en mesure d’afficher chaque valeur contenue dans les tables spécifiques aux espaces de noms ; nous modifions la fonction namespace. Ajoutez la ligne suivante à la fin la fonction :
if frame.args[2] ~= nil then r = t[frame.args[2]] end --tostring pour les booléns ?
Tester votre nouveau script
modifier- Rendez-vous sur "votre page de test".
- Ajouter le code suivant et enregistrer la page:
{{#Invoke:Site lib2|namespace|Aide}} {{#Invoke:Site lib2|namespace|4}} {{#Invoke:Site lib2|showTable|namespaces|1}}
Le résultat doit correspondre à ceci
modifierid 12 canonicalName Help name Aide
id 4 canonicalName Project name Wikiversité
isMovable ; true isCapitalized ; true isContent ; false id ; 1 isIncludable ; true canonicalName ; Talk aliases ; table associated ; table hasGenderDistinction ; false subject ; table isSubject ; false isTalk ; true name ; Discussion talk ; table hasSubpages ; true
Comprendre le nouveau script
modifierConclusion
modifierFélicitation! Vous êtes capable de créer, tester et comprendre un script Lua qui contient des tables indexées par une clé numérique. Vous êtes en mesure d’extraire de la bibliothèque site, les informations propres aux espaces de noms.
Continuez avec le chapitre organiser les fonctions. À partir du code développé dans les deux leçons précédentes ; vous apprendrez à organiser vos fonctions.
Voir aussi
modifier- Tableau_(structure_de_données) sur Wikipédia
Références
modifiermw:Extension:Scribunto/Lua_reference_manual/fr