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 20 mai 2018 à 07:54 et modifiée en dernier par Zebulon84 (discuter | contributions) (attribuer une valeur nil a un élément de frame.args ne supprime pas la valeur, elle est de nouveau récupérée.). 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'  then
		if texte:match( '[%[<]' ) 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
	end
	return trim( texte )
end

local function valide( valeur, liste )
	for i, v in ipairs( liste ) do
		liste[v] = v
	end
	return liste[v]
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 )
	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' ]
		:gsub( '%[%[[%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', 'framless', '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', 'framless', '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:match( '.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