Basculer le menu
Changer de menu des préférences
Basculer le menu personnel
Non connecté(e)
Votre adresse IP sera visible au public si vous faites des modifications.
Version datée du 29 septembre 2017 à 13:26 par Modèle>Od1n (code déplacé dans Module:Nombre2texte)

La documentation pour ce module peut être créée à Module:Outils/doc

local Outils = { }


--[[
	trim nettoie un paramètre non nommé (supprime les espaces et retours ligne au début et à la fin)
	retourne  nil si le texte est vide ou n'est pas du texte. Les nombres ne sont PAS considérés 
	comme du texte.
]]
function Outils.trim( texte )
	if type( texte ) == 'string' and texte~= '' then
		texte = texte:gsub( '^%s*(%S?.-)%s*$', '%1' )
		if texte ~= '' then
			return texte
		end
	end
	return nil
end


-- erreur génère un message d'erreur
function Outils.erreur( texte )
	local message = Outils.trim( texte ) or "''erreur : raison non précisée''"
	return '<span class="error">' .. message .. "</span>"
end


--[[
	validTextArg renvoit le premier paramètre chaine non vide
	Paramètre : 
		1 - tableau contenant tous paramètres
		2, ... - les noms des paramètres qui doivent êtres testés.
]]
function Outils.validTextArg( args, name, ... ) 
	local texte = Outils.trim( args[name] )
	if texte then
		return texte
	end
	if select( '#', ... ) > 0 then
		return Outils.validTextArg( args, ... )
	end
	return nil
end


--[[
	notEmpty renvoie le premier paramètre non vide ou nul. 
	Paramètre : 
		1, ... - les variables qui doivent êtres testés.
]]
function Outils.notEmpty( var, ... )
	local tvar = type( var )
	
	if Outils.trim( var ) then
		return Outils.trim( var )
	elseif tvar == 'table' then
		local nextFunc = pairs( var )   -- n'utilise pas next car non défini par mw.loadData
		if nextFunc( var ) ~= nil then
			return var
		end 
	elseif var == true or ( tvar == 'number' and var ~= 0 ) or tvar == 'function' then
		return var
	end
	
	if select( '#', ... ) > 0 then
		return Outils.notEmpty(  ... )
	end
end


--[[
	extractArgs permet de récupérer les arguements du modèle, 
	ou la table transmise à la fonction par une autre fonction d'un module
	Paramètres : 
		1 - un objet frame ou une table contenant les paramètre
		2, ...  - une liste de nom de paramètre pour déterminé si les paramètres sont transmis 
			par #invoke. Le premier paramètre de frame sera systématiquement testé.
]]
function Outils.extractArgs ( frame, ... )
	if type( frame ) == 'table' then
		if type( frame.getParent ) == 'function' then
			if Outils.notEmpty( frame.args.invokeArgsOnly ) then
				return frame.args
			else
				local args = frame:getParent().args;
				for k,v in pairs( frame.args ) do
					args[k] = v;
				end
				return args
			end
		else
			return frame 
		end
	else
		return { frame, ... }
	end
end


--[[
	abr génère une abréviation (discrète par défaut)
	paramètres : 
		1 = abréviation, 
		2 = texte, 
		3 = langue, 
		nbsp =  '-' pour une espace insécable avant l'abréviation, '+' pour l'avoir après.
		visible = true pour une abréviation non discrète
]]
function Outils.abr( frame, ... )
	local args = Outils.extractArgs( frame, ... )
	if args[2] == nil then 
		return args[1] or ''	
		-- retoune l'abréviation ou au minimum une chaine vide s'il n'y a pas de texte
	end

	local wikiText = { '<abbr' }
	if not args.visible then
		table.insert( wikiText, ' class="abbr"' )
	end
	table.insert( wikiText, ' title="' .. args[2] .. '"' )
	if args[3] then 
		table.insert( wikiText, ' lang="' .. args[3] .. '"' )
	end
	table.insert( wikiText, '>' .. args[1] .. '</abbr>' )
	if args.nbsp == '-' then
		table.insert( wikiText, 1, '&nbsp;' )
	elseif args.nbsp == '+' then
		table.insert( wikiText, '&nbsp;' )
	end

	return table.concat( wikiText )
end


--[=[
	texteLien trouve le premier lien interwiki '[[lien|texte]]' de str et retourne : texte, lien
	Si le lien est '[[texte]]', retourne : texte, texte.
	Si str ne contient pas de lien interwiki, retourne : str (et nil)
	Les fichiers et images ne sont pas considérés comme des liens.
	Si str n'est pas une chaine, retourne : nil
]=]
function Outils.texteLien( str )
	if type( str ) == 'string' then
		for lien, texte in string.gmatch( str, '%[%[ *([^%[%]|]*)|? *([^%[%]]*)%]%]' ) do
			texte = ( texte ~= '' and texte ) or lien or str
			if not lien then
				return str
			end
			local testlien = string.lower( lien )
			local fichier = string.match( testlien, '^fichier:' ) 
				or  string.match( testlien, '^image:' )
				or  string.match( testlien, '^file:' )
			if not fichier then 
				return texte, lien
			end
		end
		return str
	end
end


return Outils