Aller au contenu

Module:Image

Cette page est protégée.
Une page de Wikipédia, l'encyclopédie libre.
Ceci est une version archivée de cette page, en date du 5 novembre 2022 à 08:55 et modifiée en dernier par Od1n (discuter | contributions) (et justement, vu que « é » est un caractère multibyte, et qu'il est ici présent dans une "character class", il est nécessaire d'utiliser mw.ustring.gsub() sinon il n'est pas reconnu). Elle peut contenir des erreurs, des inexactitudes ou des contenus vandalisés non présents dans la version actuelle.

 Documentation[créer] [purger]
-- 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 mw.ustring.gsub( args[ 'légende' ], '%[%[[%s_]*[Cc]at[ée]gor[yi]e?[%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'
	
	return p.image( args )
end


return p