Perfectionnement en Lua/Scribunto objet Site
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]- Accéder au Module:Bac à sable.
- Supprimer le code existant.
- 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]- 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.
- 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]