Jump to content
Basculer le menu
Changer de menu des préférences
Basculer le menu personnel
Non connecté(e)
Votre adresse IP sera visible au public si vous faites des modifications.
Version datée du 4 octobre 2025 à 08:50 par Hiob (discussion | contributions) (Page créée avec « local p = {} function p.main(frame) local args = frame:getParent().args -- Paramètres local categorie = args.categorie or args[1] or '' local colonnes = tonumber(args.colonnes) or 3 local ordre = args.ordre or 'alpha' -- alpha, récent, taille local format = args.format or 'liste' -- liste, tableau, cartes local afficherDescription = args.description or 'oui' local afficherImage = args.image or 'non' if categorie ==... »)
(diff) ← Version précédente | Version actuelle (diff) | Version suivante → (diff)

La documentation pour ce module peut être créée à Module:Liste/doc

local p = {}

function p.main(frame)
    local args = frame:getParent().args
    
    -- Paramètres
    local categorie = args.categorie or args[1] or ''
    local colonnes = tonumber(args.colonnes) or 3
    local ordre = args.ordre or 'alpha' -- alpha, récent, taille
    local format = args.format or 'liste' -- liste, tableau, cartes
    local afficherDescription = args.description or 'oui'
    local afficherImage = args.image or 'non'
    
    if categorie == '' then
        return '<span class="error">Erreur : Aucune catégorie spécifiée</span>'
    end
    
    -- Vérifier que la catégorie existe
    local catTitle = mw.title.new(categorie, 'Catégorie')
    if not catTitle or not catTitle.exists then
        return '<span class="error">Erreur : La catégorie "' .. categorie .. '" n\'existe pas</span>'
    end
    
    -- Récupérer les pages de la catégorie avec DPL
    local dplArgs = {
        category = categorie,
        namespace = '',
        ordermethod = 'title',
        mode = 'userformat',
        listseparators = '@@START@@,@@PAGE@@,@@END@@',
        format = ',%PAGE%,',
    }
    
    -- Appliquer l'ordre
    if ordre == 'récent' then
        dplArgs.ordermethod = 'lastedit'
        dplArgs.order = 'descending'
    elseif ordre == 'taille' then
        dplArgs.ordermethod = 'size'
        dplArgs.order = 'descending'
    end
    
    -- Appeler DPL
    local dplResult = frame:callParserFunction('#dpl', dplArgs)
    
    -- Parser le résultat
    local pages = {}
    for page in dplResult:gmatch('@@PAGE@@([^@]+)') do
        if page ~= '' then
            table.insert(pages, mw.text.trim(page))
        end
    end
    
    if #pages == 0 then
        return '<div class="notice">Aucune page dans la catégorie "' .. categorie .. '"</div>'
    end
    
    -- Générer l'affichage selon le format
    if format == 'tableau' then
        return p.formatTableau(frame, pages, afficherDescription, afficherImage)
    elseif format == 'cartes' then
        return p.formatCartes(frame, pages, colonnes, afficherDescription, afficherImage)
    else
        return p.formatListe(frame, pages, colonnes, afficherDescription)
    end
end

-- Format : Liste simple en colonnes
function p.formatListe(frame, pages, colonnes, afficherDescription)
    local result = {}
    table.insert(result, '<div style="column-count:' .. colonnes .. '; column-gap: 2em;">')
    
    for _, page in ipairs(pages) do
        table.insert(result, '<div style="break-inside: avoid; margin-bottom: 1em;">')
        table.insert(result, "* '''[[" .. page .. "]]'''")
        
        if afficherDescription == 'oui' then
            local desc = frame:callParserFunction('#invoke:PageInfo', {'getDescription', page})
            if desc and desc ~= '' and desc ~= "''Aucune description disponible''" then
                table.insert(result, "<br/><small>" .. desc .. "</small>")
            end
        end
        
        table.insert(result, '</div>')
    end
    
    table.insert(result, '</div>')
    return table.concat(result, '\n')
end

-- Format : Tableau
function p.formatTableau(frame, pages, afficherDescription, afficherImage)
    local result = {}
    table.insert(result, '{| class="wikitable sortable"')
    
    -- En-têtes
    local headers = {'! Nom'}
    if afficherImage == 'oui' then
        table.insert(headers, '! Image')
    end
    if afficherDescription == 'oui' then
        table.insert(headers, '! Description')
    end
    table.insert(result, table.concat(headers, ' || '))
    
    -- Lignes
    for _, page in ipairs(pages) do
        local cells = {'| [[' .. page .. ']]'}
        
        if afficherImage == 'oui' then
            local image = frame:callParserFunction('#invoke:PageInfo', {'getMainImage', page})
            if image and image ~= '' and image ~= "''Aucune image''" then
                table.insert(cells, '| [[Fichier:' .. image .. '|100px]]')
            else
                table.insert(cells, '| —')
            end
        end
        
        if afficherDescription == 'oui' then
            local desc = frame:callParserFunction('#invoke:PageInfo', {'getDescription', page})
            if desc and desc ~= '' and desc ~= "''Aucune description disponible''" then
                table.insert(cells, '| ' .. desc)
            else
                table.insert(cells, '| —')
            end
        end
        
        table.insert(result, '|-')
        table.insert(result, table.concat(cells, ' || '))
    end
    
    table.insert(result, '|}')
    return table.concat(result, '\n')
end

-- Format : Cartes (style moderne)
function p.formatCartes(frame, pages, colonnes, afficherDescription, afficherImage)
    local result = {}
    
    -- CSS inline pour les cartes
    table.insert(result, '<div style="display: grid; grid-template-columns: repeat(' .. colonnes .. ', 1fr); gap: 1.5em; margin: 1em 0;">')
    
    for _, page in ipairs(pages) do
        table.insert(result, '<div style="border: 1px solid #ddd; border-radius: 8px; padding: 1em; background: #f9f9f9; transition: box-shadow 0.2s;">')
        
        -- Image si demandée
        if afficherImage == 'oui' then
            local image = frame:callParserFunction('#invoke:PageInfo', {'getMainImage', page})
            if image and image ~= '' and image ~= "''Aucune image''" then
                table.insert(result, '<div style="text-align: center; margin-bottom: 0.5em;">[[Fichier:' .. image .. '|150px]]</div>')
            end
        end
        
        -- Titre
        table.insert(result, '<div style="font-size: 1.2em; font-weight: bold; margin-bottom: 0.5em;">[[' .. page .. ']]</div>')
        
        -- Description si demandée
        if afficherDescription == 'oui' then
            local desc = frame:callParserFunction('#invoke:PageInfo', {'getDescription', page})
            if desc and desc ~= '' and desc ~= "''Aucune description disponible''" then
                table.insert(result, '<div style="color: #666; font-size: 0.9em;">' .. desc .. '</div>')
            end
        end
        
        table.insert(result, '</div>')
    end
    
    table.insert(result, '</div>')
    return table.concat(result, '\n')
end

return p
Les témoins (''cookies'') nous aident à fournir nos services. En utilisant nos services, vous acceptez notre utilisation de témoins.