(infobox v2 : format "frameless", afin de ne pas upscaler les petites images car c'est très moche (exemples avec les utilisations du fichier LogoNebulaAward.png)) |
m (1 version importée : Infobox) |
Dernière version du 15 novembre 2023 à 12:10
La documentation pour ce module peut être créée à Module:Image/doc
-- Ce module permet de générer une image, en nettoyant les paramètres pour éviter d'avoir des erreurs de Lint : [[Special:LintErrors/bogus-image-options]].
local p = {}
local function trim( texte )
if type( texte ) == 'string' then
texte = texte:gsub( '^%s*(%S?.-)%s*$', '%1' )
if texte ~= '' then
return texte
end
end
return nil
end
-- Retire toutes catégories, liens internes, externes et balises html pour ne garder que le texte brut.
local function nettoyageAlt( texte )
if type( texte ) == 'string' and texte:match( '[%[<\n]' ) then
local function texteDuLien( l, t )
return ( t ~= '' and t ) or l
end
texte = texte
-- nettoyage des catégories
:gsub( '%[%[[%s_]*[Cc]atégorie[%s_]*:.-%]%]', '' )
:gsub( '%[%[[%s_]*[Cc]ategory[%s_]*:.-%]%]', '' )
-- nettoyage des fichiers
:gsub( '%[%[[Ff]ichier:[^%[%]]+%]%]', '' )
:gsub( '%[%[[Ff]ile:[^%[%]]+%]%]', '' )
:gsub( '%[%[[Ii]mage:[^%[%]]+%]%]', '' )
-- nettoyage des liens internes
:gsub( '%[%[([^%[%]|]*)|?([^%[%]]*)%]%]', texteDuLien )
-- nettoyage des liens externes
:gsub( '%[https?://[^%[%] ]* *([^%]]+)%]', '%1' )
:gsub( '%[//[^%[%] ]* *([^%]]+)%]', '%1' )
-- nettoyage des listes
:gsub( '\n[*#][^\n]+', '')
:gsub( '<li.-</li>', '' )
-- nettoyage des balises html
:gsub( '%b<>', '' )
-- nettoyage des retour ligne
:gsub( '\n', ' ' )
end
return trim( texte )
end
local function valide( valeur, liste )
for i, v in ipairs( liste ) do
if valeur == v then
return valeur
end
end
return nil
end
-- Génère l'appel au ficher image.
-- Si le paramètre image (nom du fichier) est vide, la fonction ne retourne rien
function p.image( rawArgs )
local argsList = { 'image', 'format', 'upright', 'taille', 'border', 'légende', 'alt', 'link', 'page', 'class', 'lang', 'align', 'valign' }
local args = {}
for _, v in ipairs( argsList ) do
args[ v ] = trim( rawArgs[ v ] )
end
if not args.image then
return
end
-- analyse du nom de fichier
local image = args.image
:gsub( '%[%[[%s_]*[Cc]atégorie[%s_]*:.-%]%]', '' )
:gsub( '%[%[[%s_]*[Cc]ategory[%s_]*:.-%]%]', '' )
:gsub( '%[%[[Ff]ichier:([^|%[%]]+).+', '%1' )
:gsub( '%[%[[Ii]mage:([^|%[%]]+).+', '%1' )
:gsub( '%[%[[Ff]ile:([^|%[%]]+).+', '%1' )
-- analyse de la légende
local legende = args[ 'légende' ] and args[ 'légende' ]
:gsub( '%[%[[%s_]*[Cc]atégorie[%s_]*:.-%]%]', '' )
:gsub( '%[%[[%s_]*[Cc]ategory[%s_]*:.-%]%]', '' )
-- analyse de la taille
local taille = args.taille and args.taille:gsub( '%s', '' ):gsub( '(%d)$', '%1px' )
if taille and not ( taille:match '%d+x?%d*px' or taille:match 'x%d+px' ) then
taille = nil
end
-- analyse de l'alternative
local alt = nettoyageAlt( args.alt )
-- génération du lien
local wiki = { image }
table.insert( wiki, valide( args.format, { 'thumb', 'frameless', 'frame', 'vignette', 'sanscadre', 'cadre', 'thumbnail', } ) )
table.insert( wiki, args.border and 'border' )
table.insert( wiki, taille )
if tonumber( args.upright )
and not taille
and valide(args.format, { 'thumb', 'vignette', 'thumbnail', 'frameless', 'sanscadre', } )
then
table.insert( wiki, 'upright=' .. args.upright )
end
table.insert( wiki, valide( args.align, { 'left', 'right', 'center', 'none', 'gauche', 'droite', 'centre', 'centré' } ) )
table.insert( wiki, valide( args.valign, { 'top', 'text-top', 'super', 'baseline', 'sub', 'middle', 'text-bottom', 'bottom', 'haut', 'haut-texte', 'sup', 'base', 'milieu', 'bas-texte', 'bas', } ) )
table.insert( wiki, alt and 'alt=' .. alt )
table.insert( wiki, args.link and 'link=' .. args.link )
table.insert( wiki, args.page and 'page=' .. args.page )
table.insert( wiki, args.class and 'class=' .. args.class )
if args.lang and image:sub( -4 ):lower() == '.svg' then
table.insert( wiki, 'lang=' .. args.lang )
end
table.insert( wiki, legende )
return '[[Fichier:' .. table.concat( wiki, '|' ) .. ']]'
end
function p.infoboxV2( frame )
local args = frame.args
if args.alt == '' then
args.alt = 'Image illustrative de l’article ' .. mw.title.getCurrentTitle().text
end
local taille = args.taille:gsub( '%D', '' )
taille = tonumber( taille ) or 280
if taille > 280 then
taille = 280
end
args.taille = taille .. 'px'
-- pareil que le format par défaut, parce qu'une taille en px est spécifiée,
-- mais n'agrandit pas l'image si elle est plus petite que cette taille
args.format = 'frameless'
return p.image( args )
end
return p