Aller au contenu

Module:Harvapbrouillon

Une page de Wikipédia, l'encyclopédie libre.
Ceci est une version archivée de cette page, en date du 28 mars 2024 à 15:00 et modifiée en dernier par N25KC (discuter | contributions). Elle peut contenir des erreurs, des inexactitudes ou des contenus vandalisés non présents dans la version actuelle.

 Documentation[créer] [purger]
----
---- brouillon perso
----
-- Illustration du passage des paramètres dans les modules Lua
-- utilisation des itérations sur ipairs() et pairs()
local p = {};
function p.harvap_( frame )
    local args = frame:getParent().args

    -- Uniquement les paramètres non nommés (ou dont la clé est un indice entier séquentiel)
    local resultat = '; Paramètres séquentiels uniquement (entiers de 1 à N, sans aucun trou)\n';
    for rang, valeur in ipairs( args ) do
        resultat = resultat .. ': args[' .. rang .. '] = "' .. valeur .. '"\n';
    end

    resultat = resultat .. '; Tous les paramètres (dans un ordre arbitraire)\n';
    for clef, valeur in pairs( args ) do
        -- Noter que les deux variables `clef` et `valeur` sont locales à chaque boucle
        -- `for` qui les déclare implicitement : il est donc inutile de les déclarer avant
        -- car elles ne seraient pas utilisées et pas modifiées du tout, et leur valeur
        -- est inaccessible à la boucle suivante ou après la fin des boucles.
        if type( clef ) == 'number' then
            resultat = resultat .. ': args[' .. clef .. '] = "' .. valeur .. '"\n';
        else
            resultat = resultat .. ': args["' .. clef .. '"] = "' .. valeur .. '"\n';
        end
    end

    resultat = resultat .. '; Tous les paramètres (dans l’ordre numérique sinon lexicographique ASCII des clefs)\n';
    -- Forme une séquence contenant seulement les clefs dans un ordre quelconque en les
    -- mettant en valeur d'une autre clef, un numéro entier arbitraire mais séquentiel.
    local clefs = {}; -- séquence initialement vide
    for clef, _ in pairs( args ) do
        table.insert( clefs, clef );
    end
    -- Trie cette séquence.
    table.sort( clefs,
        function( a, b )
            --[[
            -- Pour pouvoir comparer les clés de types différents, on peut les convertir toutes
            -- en chaînes (sinon se produit l'erreur Lua: attempt to compare string with number).
            return tostring(a) < tostring(b);
            -- Noter qu'alors une clé comme '+' sera classée lexicographiquement avant la clé 1, et
            -- la clé 10 sera classée lexicographiquement avant la clé 2.
            --]]
            -- On peut aussi décider que lorsque les deux clés sont de types différents,
            -- on classe toute clé numérique avant celles d'un autre type
            -- if faut juste modifier cette fonction ainsi :
            if type(a) ~= type(b) then
                return type(a) == 'number';
            else
                return a < b;
            end
            
            -- Noter toutefois que Scribunto transmet tout paramètre dont le nom est numérique
            -- mais non entier tel que `{{#invoke|... |1.5=belge}}` sous forme de chaîne, qui
            -- sera donc triée ici lexicographiquement (comme clef="1.5" en Lua) et non
            -- pas numériquement (comme clef=1.5 en Lua) et la clef donc toujours listée après
            -- tous les autres paramètres dont le nom est n'importe quel entier même de valeur
            -- supérieur (le paramètre [20]="z" sera donc AVANT ["1.5"]="a").
            -- De même un paramètre dont le nom est entier mais inclut des décimales nulles
            -- sera transmis sous forme de chaîne.
            
            -- En revanche tout paramètre dont le nom est donné explicitement avec un signe `=`
            -- qu'il soit numérique ou pas, entier ou pas, avec des décimales nulles ou pas
            -- verra son nom chaine transmis sans aucun blanc au début ou à la fin, les autres
            -- blancs étant compressés en un espace unique; si Scribunto ne voit plus que des
            -- chiffres décimaux dans ce nom (éventuellement précédé d'un unique signe `-`)
            -- et si sa valeur est représentable en Lua sous forme d'un nombre entier Lua,
            -- il sera transmis en tant que nombre (qu'il forme une séquence continue ou pas);
            -- la valeur de ces paramètres verra ses blancs au début et à la fin aussi éliminés.
        end );
    -- Utilise les clés maintenant lues depuis la séquence triée
    for rang = 1, #clefs do
        local clef = clefs[rang];
        local valeur = args[clef];
        if type( clef ) == 'number' then
            resultat = resultat .. ': args[' .. clef .. '] = "' .. valeur .. '"\n';
        else
            resultat = resultat .. ': args["' .. clef .. '"] = "' .. valeur .. '"\n';
        end
    end

    return resultat;
end
return p;