Wiki L'encyclopédie Moga
Wiki L'encyclopédie Moga

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.

Important.png
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 est false, on doit avoir une égalité entre la valeur et filt
    • Si regex est true, on vérifie si l'expression régulière filt correspond à la valeur.
  • regex : un bool, indique si filt 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 renvoyer nil : 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