« Module:Image » : différence entre les versions

De Neylandia - Wiki
Aller à la navigation Aller à la recherche
m (1 version importée)
fr>Od1n
(utilisation de mw.text.trim() (optimisé depuis T338561), au lieu de mettre une regex ici (en plus une moins efficace) ; remarquer que c'est le même code que Outils.trim(), j'ai hésité à ajouter un require() pour l'utiliser… ça reste envisageable ; refs à propos 209409461)
Ligne 2 : Ligne 2 :


local p = {}
local p = {}
local mwTrim = mw.text.trim


local function trim( texte )
local function trim( texte )
if type( texte ) == 'string' then
if type( texte ) == 'string' and texte ~= '' then
texte = texte:gsub( '^%s*(%S?.-)%s*$', '%1' )
texte = mwTrim( texte )
if texte ~= '' then
if texte ~= '' then
return texte
return texte
Ligne 44 : Ligne 46 :


local function valide( valeur, liste )
local function valide( valeur, liste )
for i, v in ipairs( liste ) do
for i = 1, #liste do
if valeur == v then
if valeur == liste[ i ] then
return valeur
return valeur
end
end
Ligne 57 : Ligne 59 :
local argsList = { 'image', 'format', 'upright', 'taille', 'border', 'légende', 'alt', 'link', 'page', 'class', 'lang', 'align', 'valign' }
local argsList = { 'image', 'format', 'upright', 'taille', 'border', 'légende', 'alt', 'link', 'page', 'class', 'lang', 'align', 'valign' }
local args = {}
local args = {}
for _, v in ipairs( argsList ) do
for i = 1, #argsList do
args[ v ] = trim( rawArgs[ v ] )
local argName = argsList[ i ]
args[ argName ] = trim( rawArgs[ argName ] )
end
end
if not args.image then
if not args.image then
Ligne 74 : Ligne 77 :
-- analyse de la légende
-- analyse de la légende
local legende = args[ 'légende' ] and args[ 'légende' ]
local legende = args[ 'légende' ] and args[ 'légende' ]
:gsub( '%[%[[%s_]*[Cc]at[ée]gor[yi]e?[%s_]*:.-%]%])', '' )
:gsub( '%[%[[%s_]*[Cc]atégorie[%s_]*:.-%]%]', '' )
:gsub( '%[%[[%s_]*[Cc]ategory[%s_]*:.-%]%]', '' )
-- analyse de la taille
-- analyse de la taille
Ligne 124 : Ligne 128 :
end
end
args.taille = taille .. 'px'
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 )
return p.image( args )

Version du 1 décembre 2023 à 06:07

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 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