« Module:Liste » : différence entre les versions
De Nefald
Autres actions
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 ==... » |
(Aucune différence)
|
Version du 4 octobre 2025 à 08:50
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