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 mwTrim = mw.text.trim

local function trim( texte )
	if type( texte ) == 'string' and texte ~= '' then
		texte = mwTrim( texte )
		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 = 1, #liste do
		if valeur == liste[ i ] 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 i = 1, #argsList do
		local argName = argsList[ i ]
		args[ argName ] = trim( rawArgs[ argName ] )
	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