Le module Database Accessors sert à regrouper les fonctions générales d'accès aux bases de données du wiki. Il n'a pas pour but d'être utilisé sur une page.
Ne modifiez pas ce module si vous n'êtes pas sûr de ce que vous faites !Méthodes publiques
get_value
La méthode get_value
envoie la réponse la plus appropriée, comprend la structure de la base de
données pour trouver le bon élément.
Fonctionne sur les principes suivants :
- On cherche si un (ou plusieurs) éléments correspondent à l'expression régulière filt
- On descend des niveaux dans le tableau en utilisant l'argument pat, chaque clef successive du tableau étant séparée par un "/"
- Lorsqu'on arrive au bout, OU alors que le sous-tableau ne contient pas la bonne sous-clef, on s'arrête
- Si on arrive sur une chaîne, on applique la regex
- Si c'est un tableau, on applique la regex sur tous les éléments, et renvoyer vrai si au moins un sous-élément fonctionne
Arguments :
- tab : un
table
- pat : une
string
, indique le chemin à suivre. La structure est donnée par le caractère "/".- Par exemple : "name/MH3U" indique que l'on doit descendre en utilisant la clef "name", puis la clef "MH3U" dans le sous-tableau. On utilise la clef "def" lorsque ces clefs ne sont pas trouvées.
- filt : une
string
, comment vérifier si la valeur finale correspond.- Si
regex
estfalse
, on doit avoir une égalité entre la valeur etfilt
- Si
regex
esttrue
, on vérifie si l'expression régulièrefilt
correspond à la valeur.
- Si
- regex : un
bool
, indique sifilt
doit être traitée comme une chaîne de caractères ou une expression régulière.
Débogage :
=p.get_value({name={b="c", def="a"}}, "name/b", ".+", true)
doit renvoyer"c"
: un élément correspond aux filtres=p.get_value({name={b="c", def="a"}}, "name/c", ".+", true)
doit renvoyer"a"
: utilisation de la clef par défaut=p.get_value({name={b="c", a="a"}}, "name/c", ".+", true)
doit renvoyernil
: aucun élément ne correspond
standard_filter
Cette méthode renvoie si au moins une valeur correspond aux filtres. C'est l'évaluation en booléen de get_value
.
Voir Spécial:Pages liées/Module:Database Accessors pour la liste des pages utilisant ce module.
Pour modifier cette page : Module:Database Accessors/doc.
--[[
Accesseurs standards aux bases de données du wiki.
Ont pour but d'être utilisés par d'autres modules.
]]
local p = {}
--[[
Renvoie la réponse la plus appropriée, comprend la structure de la base de
données pour trouver le bon élément. Fonctionne sur les principes suivants :
* On va chercher si un (ou plusieurs) éléments correspondent à l'expression
régulière filt
* On va descendre des niveaux dans le tableau en utilisant l'argument pat,
chaque clef successive du tableau étant séparée par un "/"
* Lorsque l'on est arrivé au bout, OU alors que le sous-tableau ne contient
pas la bonne sous-clef, on s'arrête
* Si on est arrivé sur une chaîne, on applique la regex
* Si c'est un tableau, on va appliquer la regex sur tous les éléments,
et renvoyer vrai si au moins un sous-élément fonctionne
]]
function p.get_value(tab, pat, filt, regex)
local sub_path, sub_tab, _, v, out
if tab == nil then
return
end
-- On vérifie si le tableau contient tous les arguments
sub_tab = tab
-- sting.gmatch est plus rapide, mais moins sûr que mw.ustring.gmatch
for sub_path in pat:gmatch("[^/]+") do
if not sub_tab then
return
end
-- Si on ne trouve pas l'argument recherché, on arrête de descendre
-- des niveaux de filtre
if not sub_tab[sub_path] then
break
end
sub_tab = sub_tab[sub_path]
end
-- Si on est toujours à un tableau, on va vérifier récursivement si au
-- moins un élément vérifie la condition
if type(sub_tab) == "table" then
-- On commence par vérifer l'existence d'argument par défaut
out = p.get_value(sub_tab["def"], "", filt, regex)
for _, v in pairs(sub_tab) do
out = out or p.get_value(v, "", filt, regex)
end
return out
end
-- Si c'est une chaîne de caractères (cas habituel),
-- on vérifie si elle correspond au filtre
if regex and mw.ustring.find(sub_tab, filt) or sub_tab == filt then
return sub_tab
end
end
--[[
Filtre standard qui permet de faire passer un test de type regex à un tableau.
* ex: standard_filter(value.name, langue, name) filtre parmis le tableau "name"
du monstre (en eliminant d'abord ceux qui n'ont pas la langue) ceux qui ont le
nom entré
* ex: standard_filter(value.name, game, name) filtre parmis les tableau "name"
(en éliminant ceux n'ayant pas le jeu entré) ceux qui ont le nom entré
]]
function p.standard_filter(tab, pat, filt, regex)
return not not p.get_value(tab, pat, filt, regex)
end
return p