Leçons de niveau 14

Perfectionnement en Lua/Manipuler une table complexe

Une page de Wikiversité.
Sauter à la navigation Sauter à la recherche
Début de la boite de navigation du chapitre
Manipuler une table complexe
Icône de la faculté
Chapitre no 2
Leçon : Perfectionnement en Lua
Chap. préc. :Scribunto objet Site
Chap. suiv. :Organiser les fonctions
fin de la boite de navigation du chapitre
Icon falscher Titel.svg
En raison de limitations techniques, la typographie souhaitable du titre, « Perfectionnement en Lua : Manipuler une table complexe
Perfectionnement en Lua/Manipuler une table complexe
 », n'a pu être restituée correctement ci-dessus.


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[modifier | modifier le wikicode]

Ce chapitre suppose que vous ayez assimilé la leçon [[]].

Créer un script Lua avec des tables complexes[modifier | modifier le wikicode]

  1. Accéder au Module:Bac à sable.
  2. Supprimer le code existant.
  3. 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[modifier | modifier le wikicode]

En 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 | modifier le wikicode]

  1. Rendez-vous sur "votre page de test".
  2. 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:[modifier | modifier le wikicode]

id 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[modifier | modifier le wikicode]

Conclusion[modifier | modifier le wikicode]

Fé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 | modifier le wikicode]

Références[modifier | modifier le wikicode]

mw:Extension:Scribunto/Lua_reference_manual/fr