Leçons de niveau 14

Perfectionnement en Lua/Scribunto objet Site

Une page de Wikiversité.
Sauter à la navigation Sauter à la recherche
Début de la boite de navigation du chapitre
Scribunto objet Site
Icône de la faculté
Chapitre no 1
Leçon : Perfectionnement en Lua
Retour auSommaire
Chap. suiv. :Manipuler une table complexe
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 : Scribunto objet Site
Perfectionnement en Lua/Scribunto objet Site
 », n'a pu être restituée correctement ci-dessus.


Nous révisons les principes de base ; en abordant la librairie site #LUAREF. Sur la base de la documentation nous sommes en mesure d’afficher les valeurs contenues dans les clés indiquées. La librairie en tant qu’objet est une table Lua que nous devons manipuler pour extraire les données.

Nous souhaitons écrire un module capable de retourner les informations de la table ; dont l’usage soit raisonnablement simple mais complet. Nous nous focalisons sur l’organisation du code, le traitement des arguments. Nous utilisons une mise en forme simple pour l’affichage des données.

Objectifs de la leçon
Consolider les principes abordés lors de l’initiation, voir Introduction au Lua. En particulier, l’itération des tables, l’utilisation des clés, l’affichage des valeurs, le test du type de données, l’organisation des fonctions et sous-fonctions.

Envisager un modèle capable d’afficher les données de la librairie

Prérequis[modifier | modifier le wikicode]

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

Créer un script Lua pour utiliser la librairie mw.site[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:
local p = {}
local site = mw.site -- La variable locale récupère l’objet

function p.showTable() --Itération k,v avec tostring pour commencer
	local r = ''   -- Variable texte pour le résultat 
	for k, v in pairs(site) do -- Itération de la table
		r = r .. '* ' .. tostring(k).. ' ; ' .. tostring(v) .. '\n'
	end  -- tostring affiche la chaine ’table’. Voir mw.dumpObject
	return r
end

-- Affiche la valeur de la clé passée en argument avec frame.
function p.site(frame)            -- Version 1 
	local key = frame.args[1] -- frame récupère la clé 
	local r = site[key]       -- appel la clé de la table
	return r                  -- retourne le résultat
end

--une fonction pour interpréter l’argument
--une fonction principale pour interpréter tous les arguments
--les sous-fonctions  pour recevoir les arguments

À ce stade l’utilisateur peut choisir une valeur dans la table, en précisant la clé, lorsqu’il invoque la fonction. Nous développons notre fonction pour lui permettre d’afficher par défaut, toutes le valeurs de la table principale (à l’exception des tables). Pour simplifier le code nous créons une sous-fonction : form_site.

function form_site() -- Met en forme les données sur le site
	local r = ''     -- Formulaire vierge
	for k, v in pairs(site) do 
		if type(v) == 'string'or type(v)=='number'  then r = r .. '; '.. k.. ': ' .. v .. '\n' end
	end              --Ajoute k et v au formulaire, si v est une chaine ou un nombre.
	return r
end

Pour utiliser cette sous fonction nous l’appelons à partir de la fonction site() ; lorsque le frame ne contient pas d’argument. Ajoutez la ligne suivante à la fonction site().

if frame.args[1] == nil then r = form_site() end

Manipuler les tables de l’objet Site[modifier | modifier le wikicode]

Nous souhaitons afficher les informations contenues dans la table stats. Nous devons gérer la présence d’un argument dont la valeur est une table. Nous afficherons pour cette table les clés dont les valeurs sont des chaines de caractères ou des nombres.

Nous modifions la sous fonction form_site pour qu’elle soit capable de traiter la table stats.

function form_table(t) 
	local r = ''     -- Formulaire vierge
	for k, v in pairs(t) do 
		if type(v) == 'string'or type(v)=='number'  then r = r .. '; '.. k.. ': ' .. v .. '\n' end
	end              --Ajoute k et v au formulaire, si v est une chaine ou un nombre.
	return r
end

Nous pouvons modifier la fonction site, en ajoutant la condition suivante qui reconnait une table passée en argument et affiche son contenu partiel.

if frame.args[1] == nil then r = form_table(site) end
if type(site[key]) == 'table' then r = form_table(site[key]) end


Accéder aux valeurs de la table stat contenue dans l’objet Site[modifier | modifier le wikicode]

Nous devons tester la présence d’un second argument, que nous utilisons pour filtrer la valeur de la table reçue en premier argument.

local key2 = frame.args[2]
if key2 ~= nil then r =  site[key][key2] end

Accéder aux valeurs de la table namespaces contenues dans l’objet Site[modifier | modifier le wikicode]

Lorsque nous invoquons la table namespaces notre script reste muet. Nous modifions la fonction showTable() pour qu’elle nous montre le contenu de la table namespaces.

function p.showTable(frame)
	if frame.args[1] ~= nil then t = site[frame.args[1]] else t = site end
	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

Tester votre nouveau script[modifier | modifier le wikicode]

{{#Invoke:Bac à sable|showTable|namespaces}}

Le résultat doit commencer ainsi:[modifier | modifier le wikicode]

  • 1 ; table
  • 2 ; table
  • 3 ; table

… La liste se poursuit, elle montre les clés correspondantes aux espaces de noms dont les données sont contenues dans des tables respectives.

En d’autre termes notre fonction form_table() reste muette, car toutes les valeurs sont des tables. Nous pouvons le vérifier en utilisant tostring(v)…


Le module Site lib2 trois fonctions :

  • p.site() est la fonction principale à ce stage, elle retourne toutes les propriétés ou bien uniquement celle de l’espace reçu en argument
  • p.namespace() retourne les propriétés de l’espace reçu en argument.
  • form_ns(t) est une sous-fonction qui reçoit une table des données à afficher et retourne les donnés mises en forme.

Tester votre nouveau script[modifier | modifier le wikicode]

  1. Utiliser cette page de discussion, ou bien votre page de test.
    Dans les deux cas pensez à désactiver vos tests une fois terminés. Encadrez les, avec la balise <nowiki> disponible dans la barre d’outils ; cela facilite le suivi des erreurs de scripts.
  2. Ajouter le code suivant et enregistrer la page :
{{#Invoke:Bac à sable|showTable}}
{{#Invoke:Bac à sable|site|siteName}}
{{#Invoke:Bac à sable|site}}
{{#Invoke:Bac à sable|site|stats}}

Le résultat doit correspondre à ceci:[modifier | modifier le wikicode]

  • stats ; table
  • siteName ; Wikiversité
  • currentVersion ; 1.29.0-wmf.7
  • interwikiMap ; function
  • talkNamespaces ; table
  • scriptPath ; /w
  • server ; //fr.wikiversity.org
  • stylePath ; /w/skins
  • namespaces ; table
  • subjectNamespaces ; table
  • contentNamespaces ; table

Wikiversité

siteName
Wikiversité
currentVersion
1.29.0-wmf.7
scriptPath
/w
server
//fr.wikiversity.org
stylePath
/w/skins


articles
12005
admins
9
edits
642824
users
35038
files
84
pages
40741
activeUsers
108

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 utilise la librairie Site. Vous savez utiliser l’objet frame pour passer les arguments à la fonction site. Vous êtes en mesure d’afficher les chaines et nombres contenus dans la table site et la table stats.

Continuez avec la leçon suivante pour savoir comment manipuler une table complexe.

Voir aussi[modifier | modifier le wikicode]

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

Lua for Wikiversity (en)