<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://fr.stargatewiki.noip.me/index.php?action=history&amp;feed=atom&amp;title=Module%3AOutils</id>
	<title>Module:Outils - Historique des versions</title>
	<link rel="self" type="application/atom+xml" href="https://fr.stargatewiki.noip.me/index.php?action=history&amp;feed=atom&amp;title=Module%3AOutils"/>
	<link rel="alternate" type="text/html" href="https://fr.stargatewiki.noip.me/index.php?title=Module:Outils&amp;action=history"/>
	<updated>2026-04-25T22:04:37Z</updated>
	<subtitle>Historique des versions pour cette page sur le wiki</subtitle>
	<generator>MediaWiki 1.44.0</generator>
	<entry>
		<id>https://fr.stargatewiki.noip.me/index.php?title=Module:Outils&amp;diff=178&amp;oldid=prev</id>
		<title>LIMAFOX76 : Page créée avec « 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&#039;es... »</title>
		<link rel="alternate" type="text/html" href="https://fr.stargatewiki.noip.me/index.php?title=Module:Outils&amp;diff=178&amp;oldid=prev"/>
		<updated>2016-02-01T11:28:20Z</updated>

		<summary type="html">&lt;p&gt;Page créée avec « 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&amp;#039;es... »&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nouvelle page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local Outils = { }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	trim nettoie un paramètre non nommé (supprime les espaces et retours ligne au début et à la fin)&lt;br /&gt;
	retourne  nil si le texte est vide ou n&amp;#039;est pas du texte. Les nombres ne sont PAS considérés &lt;br /&gt;
	comme du texte.&lt;br /&gt;
]]&lt;br /&gt;
function Outils.trim( texte )&lt;br /&gt;
	if type( texte ) == &amp;#039;string&amp;#039; and texte~= &amp;#039;&amp;#039; then&lt;br /&gt;
		texte = texte:gsub( &amp;#039;^%s*(%S?.-)%s*$&amp;#039;, &amp;#039;%1&amp;#039; )&lt;br /&gt;
		if texte ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			return texte&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- erreur génère un message d&amp;#039;erreur&lt;br /&gt;
function Outils.erreur( texte )&lt;br /&gt;
	local message = Outils.trim( texte ) or &amp;quot;&amp;#039;&amp;#039;erreur : raison non précisée&amp;#039;&amp;#039;&amp;quot;&lt;br /&gt;
	return &amp;#039;&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;&amp;#039; .. message .. &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	validTextArg renvoit le premier paramètre chaine non vide&lt;br /&gt;
	Paramètre : &lt;br /&gt;
		1 - tableau contenant tous paramètres&lt;br /&gt;
		2, ... - les noms des paramètres qui doivent êtres testés.&lt;br /&gt;
]]&lt;br /&gt;
function Outils.validTextArg( args, name, ... ) &lt;br /&gt;
	local texte = Outils.trim( args[name] )&lt;br /&gt;
	if texte then&lt;br /&gt;
		return texte&lt;br /&gt;
	end&lt;br /&gt;
	if select( &amp;#039;#&amp;#039;, ... ) &amp;gt; 0 then&lt;br /&gt;
		return Outils.validTextArg( args, ... )&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	notEmpty renvoie le premier paramètre non vide ou nul. &lt;br /&gt;
	Paramètre : &lt;br /&gt;
		1, ... - les variables qui doivent êtres testés.&lt;br /&gt;
]]&lt;br /&gt;
function Outils.notEmpty( var, ... )&lt;br /&gt;
	local tvar = type( var )&lt;br /&gt;
	&lt;br /&gt;
	if Outils.trim( var ) then&lt;br /&gt;
		return Outils.trim( var )&lt;br /&gt;
	elseif tvar == &amp;#039;table&amp;#039; then&lt;br /&gt;
		local nextFunc = pairs( var )   -- n&amp;#039;utilise pas next car non défini par mw.loadData&lt;br /&gt;
		if nextFunc( var ) ~= nil then&lt;br /&gt;
			return var&lt;br /&gt;
		end &lt;br /&gt;
	elseif var == true or ( tvar == &amp;#039;number&amp;#039; and var ~= 0 ) or tvar == &amp;#039;function&amp;#039; then&lt;br /&gt;
		return var&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if select( &amp;#039;#&amp;#039;, ... ) &amp;gt; 0 then&lt;br /&gt;
		return Outils.notEmpty(  ... )&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	extractArgs permet de récupérer les arguements du modèle, &lt;br /&gt;
	ou la table transmise à la fonction par une autre fonction d&amp;#039;un module&lt;br /&gt;
	Paramètres : &lt;br /&gt;
		1 - un objet frame ou une table contenant les paramètre&lt;br /&gt;
		2, ...  - une liste de nom de paramètre pour déterminé si les paramètres sont transmis &lt;br /&gt;
			par #invoke. Le premier paramètre de frame sera systématiquement testé.&lt;br /&gt;
]]&lt;br /&gt;
function Outils.extractArgs ( frame, ... )&lt;br /&gt;
	if type( frame ) == &amp;#039;table&amp;#039; then&lt;br /&gt;
		if type( frame.getParent ) == &amp;#039;function&amp;#039; then&lt;br /&gt;
			if Outils.notEmpty( frame.args.invokeArgsOnly ) then&lt;br /&gt;
				return frame.args&lt;br /&gt;
			else&lt;br /&gt;
				local args = frame:getParent().args;&lt;br /&gt;
				for k,v in pairs( frame.args ) do&lt;br /&gt;
					args[k] = v;&lt;br /&gt;
				end&lt;br /&gt;
				return args&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			return frame &lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return { frame, ... }&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	abr génère une abréviation (discrète par défaut)&lt;br /&gt;
	paramètres : &lt;br /&gt;
		1 = abréviation, &lt;br /&gt;
		2 = texte, &lt;br /&gt;
		3 = langue, &lt;br /&gt;
		nbsp =  &amp;#039;-&amp;#039; pour une espace insécable avant l&amp;#039;abréviation, &amp;#039;+&amp;#039; pour l&amp;#039;avoir après.&lt;br /&gt;
		visible = true pour une abréviation non discrète&lt;br /&gt;
]]&lt;br /&gt;
function Outils.abr( frame, ... )&lt;br /&gt;
	local args = Outils.extractArgs( frame, ... )&lt;br /&gt;
	if args[2] == nil then &lt;br /&gt;
		return args[1] or &amp;#039;&amp;#039;	&lt;br /&gt;
		-- retoune l&amp;#039;abréviation ou au minimum une chaine vide s&amp;#039;il n&amp;#039;y a pas de texte&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local wikiText = { &amp;#039;&amp;lt;abbr&amp;#039; }&lt;br /&gt;
	if not args.visible then&lt;br /&gt;
		table.insert( wikiText, &amp;#039; class=&amp;quot;abbr&amp;quot;&amp;#039; )&lt;br /&gt;
	end&lt;br /&gt;
	table.insert( wikiText, &amp;#039; title=&amp;quot;&amp;#039; .. args[2] )&lt;br /&gt;
	if args[3] then &lt;br /&gt;
		table.insert( wikiText, &amp;#039;&amp;quot; lang=&amp;quot;&amp;#039; .. args[3] )&lt;br /&gt;
	end&lt;br /&gt;
	table.insert( wikiText, &amp;#039;&amp;quot;&amp;gt;&amp;#039; .. args[1] .. &amp;#039;&amp;lt;/abbr&amp;gt;&amp;#039; )&lt;br /&gt;
	if args.nbsp == &amp;#039;-&amp;#039; then&lt;br /&gt;
		table.insert( wikiText, 1, &amp;#039;&amp;amp;nbsp;&amp;#039; )&lt;br /&gt;
	elseif args.nbsp == &amp;#039;+&amp;#039; then&lt;br /&gt;
		table.insert( wikiText, &amp;#039;&amp;amp;nbsp;&amp;#039; )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return table.concat( wikiText )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function Outils.nobr( texte )&lt;br /&gt;
	if type( texte )  == &amp;#039;number&amp;#039; or Outils.trim( texte) then &lt;br /&gt;
		return &amp;#039;&amp;lt;span class=&amp;quot;nowrap&amp;quot;&amp;gt;&amp;#039; .. texte .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[=[&lt;br /&gt;
	texteLien trouve le premier lien interwiki &amp;#039;[[lien|texte]]&amp;#039; de str et retourne : texte, lien&lt;br /&gt;
	Si le lien est &amp;#039;[[texte]]&amp;#039;, retourne : texte, texte.&lt;br /&gt;
	Si str ne contient pas de lien interwiki, retourne : str (et nil)&lt;br /&gt;
	Les fichiers et images ne sont pas considéré comme des liens.&lt;br /&gt;
	Si str n&amp;#039;est pas une chaine, retourne : nil&lt;br /&gt;
]=]&lt;br /&gt;
function Outils.texteLien( str )&lt;br /&gt;
	if type( str ) == &amp;#039;string&amp;#039; then&lt;br /&gt;
		for lien, texte in string.gmatch( str, &amp;#039;%[%[ *([^%[%]|]*)|? *([^%[%]]*)%]%]&amp;#039; ) do&lt;br /&gt;
			texte = ( texte ~= &amp;#039;&amp;#039; and texte ) or lien or str&lt;br /&gt;
			if not lien then&lt;br /&gt;
				return str&lt;br /&gt;
			end&lt;br /&gt;
			local testlien = string.lower( lien )&lt;br /&gt;
			local fichier = string.match( testlien, &amp;#039;^fichier:&amp;#039; ) &lt;br /&gt;
				or  string.match( testlien, &amp;#039;^image:&amp;#039; )&lt;br /&gt;
				or  string.match( testlien, &amp;#039;^file:&amp;#039; )&lt;br /&gt;
			if not fichier then &lt;br /&gt;
				return texte, lien&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return str&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[=[&lt;br /&gt;
	texteLien trouve la première lien externe &amp;#039;[adresse texte]&amp;#039; de str et retourne : texte, adresse&lt;br /&gt;
	Une adresse doit commencer par &amp;#039;http://&amp;#039;&lt;br /&gt;
	Si le lien est &amp;#039;[adresse]&amp;#039;, retourne : &amp;#039;&amp;#039;, adresse.&lt;br /&gt;
	Si str ne contient pas de lien externe, retourne : str (et nil)&lt;br /&gt;
	Si adresse ou texte contenienne le caratère &amp;#039;[&amp;#039;, retourne l&amp;#039;adresse suivante ou str&lt;br /&gt;
	Si str n&amp;#039;est pas une chaine, retourne : nil&lt;br /&gt;
]=]&lt;br /&gt;
function Outils.texteAdresse( str )&lt;br /&gt;
	if type( str ) == &amp;#039;string&amp;#039; then&lt;br /&gt;
		local lien, texte = string.match( str, &amp;#039;%[(https?://[^%[%] ]*) *([^%[%]]-)%]&amp;#039; )&lt;br /&gt;
		&lt;br /&gt;
		texte = texte or str&lt;br /&gt;
		return texte, lien&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	ordinal renvoie une chaine correspondant à l&amp;#039;abréviation de l&amp;#039;adjectif ordinal du nombre.&lt;br /&gt;
	Paramètres :&lt;br /&gt;
		1 = nombre (string ou number) &lt;br /&gt;
		2 = true pour avoir première au lieu de premier su nombre = 1&lt;br /&gt;
--]]&lt;br /&gt;
function Outils.ordinal( nombre, feminin )&lt;br /&gt;
	local num = tonumber( nombre )&lt;br /&gt;
	if num == nil then&lt;br /&gt;
		return Outils.trim( tostring( nombre ) ) or &amp;#039;&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		local nom = Outils.nombre2texte_reel( nombre, nil, &amp;#039;ordinal&amp;#039;, &amp;#039;réformée&amp;#039;, feminin and &amp;#039;féminin&amp;#039; )&lt;br /&gt;
		return Outils.abr{ num .. &amp;#039;&amp;lt;sup&amp;gt;e&amp;lt;/sup&amp;gt;&amp;#039;, nom }&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
  Fonction de traitement d&amp;#039;une &amp;quot;tranche&amp;quot; de nombres entre 0 et 999.&lt;br /&gt;
  Retourne la forme texturelle (5 → cinq, 46 → quarante six, 432 → quatre cent trente deux…)&lt;br /&gt;
  Les paramètres sont les chiffres, du plus grand au plus petit (centaine, dizaine, unité).&lt;br /&gt;
  La valeur nil signifie &amp;quot;0&amp;quot; (pour n&amp;#039;importe lequel des paramètres)&lt;br /&gt;
  La fonction retourne le texte ou &amp;#039;nil&amp;#039; si la valeur est zéro (pour gérer les 0 millier…)&lt;br /&gt;
  Le paramètre &amp;#039;langue&amp;#039; indique la variante de langue (fr, be, ch ou ch2).&lt;br /&gt;
  Data est la table des données (issue de loadData())&lt;br /&gt;
--]]&lt;br /&gt;
function Outils.traite_tranche(_c1, _c2, _c3, langue, Data)&lt;br /&gt;
    local c1, c2, c3&lt;br /&gt;
	if (_c1 == nil) then c1 = 0 else c1 = tonumber(_c1) or 0 end&lt;br /&gt;
	if (_c2 == nil) then c2 = 0 else c2 = tonumber(_c2) or 0 end&lt;br /&gt;
	if (_c3 == nil) then c3 = 0 else c3 = tonumber(_c3) or 0 end&lt;br /&gt;
&lt;br /&gt;
	if (c1 == 0 and c2 == 0 and c3 == 0) then&lt;br /&gt;
		return nil -- sil signifie &amp;quot;zéro&amp;quot; (mais à traiter spécialement quand entouré)&lt;br /&gt;
	end&lt;br /&gt;
	local resu = &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	-- on calcule la valeur restante (sans les centaines)&lt;br /&gt;
	local val = 10*c2 + c3&lt;br /&gt;
	-- présence d&amp;#039;une centaine ?&lt;br /&gt;
	if (c1 ~= 0) then&lt;br /&gt;
		if (c1 == 1) then&lt;br /&gt;
			resu = &amp;quot;cent &amp;quot; -- séparateur&lt;br /&gt;
		else&lt;br /&gt;
			-- plusieurs centaines : on ajoute l&amp;#039;unité&lt;br /&gt;
			resu = Data.infcent[c1] .. &amp;quot; cent&amp;quot;&lt;br /&gt;
			-- si pas d&amp;#039;unité 100 prend un &amp;#039;s&amp;#039;&lt;br /&gt;
			if (val == 0) then&lt;br /&gt;
				resu = resu .. &amp;quot;s &amp;quot;&lt;br /&gt;
			else&lt;br /&gt;
				resu = resu .. &amp;quot; &amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- reste = 0 ?&lt;br /&gt;
	if (val == 0) then&lt;br /&gt;
		-- on retourne directement la centaine&lt;br /&gt;
		return resu&lt;br /&gt;
	end&lt;br /&gt;
	-- c&amp;#039;est forcément un nombre pré-défini&lt;br /&gt;
	local vvv&lt;br /&gt;
	if (langue == &amp;quot;fr&amp;quot;) then&lt;br /&gt;
		vvv = Data.infcent[val]&lt;br /&gt;
	elseif (langue == &amp;quot;be&amp;quot;) then&lt;br /&gt;
		vvv = Data.infcent_be[val] or Data.infcent[val]&lt;br /&gt;
	elseif (langue == &amp;quot;ch&amp;quot;) then&lt;br /&gt;
		vvv = Data.infcent_ch[val] or Data.infcent_be[val] or Data.infcent[val]&lt;br /&gt;
	else&lt;br /&gt;
		vvv = Data.infcent_ch2[val] or Data.infcent_be[val] or Data.infcent[val]&lt;br /&gt;
	end&lt;br /&gt;
	return resu .. vvv .. &amp;quot; &amp;quot;&lt;br /&gt;
	-- note : cette fonction retourne *toujours* un &amp;quot; &amp;quot; à la fin du terme&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
  Fonction principale&lt;br /&gt;
  Reçoit en paramètre (premier non nommé) le nombre à traiter.&lt;br /&gt;
  Retourne la forme textuelle de ce nombre.&lt;br /&gt;
--]]&lt;br /&gt;
function Outils.nombre2texte_reel(pnombre, plangue, ptype, porthographe, pgenre, pmajuscule, pordinal)&lt;br /&gt;
	-- le nombre à convertir (vient toujours du modèle)&lt;br /&gt;
	local valeur = pnombre&lt;br /&gt;
	if (valeur == nil) then&lt;br /&gt;
		return Outils.erreur(&amp;quot;Il faut un paramètre non nommé numérique.&amp;quot;)&lt;br /&gt;
	elseif type(valeur) == &amp;quot;sting&amp;quot; then&lt;br /&gt;
		&lt;br /&gt;
		-- s&amp;#039;il y a une virgule, on l&amp;#039;ignore&lt;br /&gt;
		local bla = mw.ustring.find(valeur, &amp;quot;[.,]&amp;quot;)&lt;br /&gt;
		if (bla ~= nil) then&lt;br /&gt;
			-- extraction de la partie avant la virgule&lt;br /&gt;
			valeur = mw.ustring.match(mw.text.trim(valeur), &amp;quot;^[-]?[0-9]*&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	elseif type(valeur) == &amp;quot;number&amp;quot; then&lt;br /&gt;
		valeur = math.floor(valeur)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local nvaleur = tonumber(valeur)&lt;br /&gt;
	if (type(nvaleur) ~= &amp;quot;number&amp;quot;) then&lt;br /&gt;
		return Outils.erreur(&amp;quot;Le paramètre doit être un nombre.&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	-- limites&lt;br /&gt;
	if (nvaleur &amp;lt; -999999999999 or nvaleur &amp;gt; 999999999999) then&lt;br /&gt;
		return Outils.erreur(&amp;quot;Nombre trop grand ou trop petit.&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	-- note : ici il faudrait s&amp;#039;assurer que le nombre est un entier !&lt;br /&gt;
&lt;br /&gt;
	-- on extrait le moins si présent&lt;br /&gt;
	local signe = false&lt;br /&gt;
	if (nvaleur &amp;lt; 0) then&lt;br /&gt;
		nvaleur = -nvaleur&lt;br /&gt;
		signe = true&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- option : choix de la langue&lt;br /&gt;
	local langue = plangue&lt;br /&gt;
	if (langue == nil) then&lt;br /&gt;
		langue = &amp;quot;fr&amp;quot;&lt;br /&gt;
	else&lt;br /&gt;
		langue = mw.text.trim(langue)&lt;br /&gt;
	end&lt;br /&gt;
	-- validation des valeurs permises&lt;br /&gt;
	if (langue ~= &amp;quot;fr&amp;quot; and langue ~= &amp;quot;be&amp;quot; and langue ~= &amp;quot;ch&amp;quot; and langue ~= &amp;quot;ch2&amp;quot;) then&lt;br /&gt;
		return Outils.erreur(&amp;quot;Paramètre langue non reconnu (fr, be, ch ou ch2).&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- type de résultat : seule valeur autorisée : &amp;#039;ordinal&amp;#039;&lt;br /&gt;
	local style = ptype&lt;br /&gt;
	if (style ~= nil and style ~= &amp;quot;ordinal&amp;quot;) then&lt;br /&gt;
		style = nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- type d&amp;#039;orthographe&lt;br /&gt;
	local ortho = porthographe&lt;br /&gt;
	if (ortho ~= nil and ortho ~= &amp;quot;réformée&amp;quot;) then&lt;br /&gt;
		ortho = nil&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- genre : uniquement pour l&amp;#039;ordinal &amp;quot;premier / première&amp;quot;&lt;br /&gt;
	local genre = pgenre&lt;br /&gt;
	if (genre ~= nil and genre ~= &amp;quot;féminin&amp;quot;) then&lt;br /&gt;
		genre = nil&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- majuscule : mettre une majuscule au premier mot&lt;br /&gt;
	local maj = pmajuscule&lt;br /&gt;
	if (maj ~= nil and maj ~= &amp;quot;oui&amp;quot;) then&lt;br /&gt;
		maj = nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- cas (très) simple : 0&lt;br /&gt;
	if (nvaleur == 0) then&lt;br /&gt;
		if (style == &amp;quot;ordinal&amp;quot;) then&lt;br /&gt;
			if (maj) then&lt;br /&gt;
				return &amp;quot;Zéroième&amp;quot;&lt;br /&gt;
			else&lt;br /&gt;
				return &amp;quot;zéroième&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			if (maj) then&lt;br /&gt;
				return &amp;quot;Zéro&amp;quot;&lt;br /&gt;
			else&lt;br /&gt;
				return &amp;quot;zéro&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- on charge les données&lt;br /&gt;
	local Data = mw.loadData( &amp;#039;Module:Outils/Data&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
	-- on traite les autres cas simples : le nombre est pré-codé&lt;br /&gt;
	local val&lt;br /&gt;
	if (langue == &amp;quot;fr&amp;quot;) then&lt;br /&gt;
		val = Data.infcent[nvaleur]&lt;br /&gt;
	elseif (langue == &amp;quot;be&amp;quot;) then&lt;br /&gt;
		val = Data.infcent_be[nvaleur] or Data.infcent[nvaleur]&lt;br /&gt;
	elseif (langue == &amp;quot;ch&amp;quot;) then&lt;br /&gt;
		val = Data.infcent_ch[nvaleur] or Data.infcent_be[nvaleur] or Data.infcent[nvaleur]&lt;br /&gt;
	else&lt;br /&gt;
		val = Data.infcent_ch2[nvaleur] or Data.infcent_be[nvaleur] or Data.infcent[nvaleur]&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local res = val or &amp;quot;&amp;quot;&lt;br /&gt;
	if (val == nil) then&lt;br /&gt;
		-- pas de résultat, on fait le &amp;quot;calcul&amp;quot;&lt;br /&gt;
&lt;br /&gt;
		-- on l&amp;#039;éclate en une table des différents caractères&lt;br /&gt;
		local tvaleur = mw.text.split(valeur, &amp;quot;&amp;quot;)&lt;br /&gt;
		local nb = #tvaleur -- nombre d&amp;#039;éléments&lt;br /&gt;
&lt;br /&gt;
		-- on boucle sur les triplets de chiffres et on stocke le résultat dans une table&lt;br /&gt;
		local tbl = {}&lt;br /&gt;
		while (true) do&lt;br /&gt;
			-- on prend les 3 valeurs concernées&lt;br /&gt;
			local p1 = tvaleur[nb-2]&lt;br /&gt;
			local p2 = tvaleur[nb-1]&lt;br /&gt;
			local p3 = tvaleur[nb]&lt;br /&gt;
			-- si les 3 sont &amp;#039;nil&amp;#039; on a terminé&lt;br /&gt;
			if (p1 == nil and p2 == nil and p3 == nil) then&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
			-- on calcule la valeur du bloc concerné (rangé dans la table)&lt;br /&gt;
			local tmp = mw.text.trim(Outils.traite_tranche(p1, p2, p3, langue, Data) or &amp;quot;zéro&amp;quot;)&lt;br /&gt;
			table.insert(tbl, tmp)&lt;br /&gt;
			-- décalage&lt;br /&gt;
			nb = nb - 3&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- on construit le résultat final en combinant les éléments&lt;br /&gt;
		-- et en ajoutant les milliers/millions/...&lt;br /&gt;
		local pos = 1&lt;br /&gt;
		while (tbl[pos] ~= nil) do&lt;br /&gt;
			local el = &amp;quot;&amp;quot;&lt;br /&gt;
			-- on l&amp;#039;ajoute, s&amp;#039;il existe&lt;br /&gt;
			if (tbl[pos] ~= &amp;quot;zéro &amp;quot; and tbl[pos] ~= &amp;quot;zéro&amp;quot;) then&lt;br /&gt;
				if (pos == 1) then&lt;br /&gt;
					-- rang &amp;quot;1&amp;quot;, on ajoute simplement la valeur&lt;br /&gt;
					el = tbl[pos] .. &amp;quot; &amp;quot;&lt;br /&gt;
				else&lt;br /&gt;
					-- si la valeur est &amp;quot;un&amp;quot; on ajoute seulement le rang&lt;br /&gt;
					if (tbl[pos] == &amp;quot;un &amp;quot; or tbl[pos] == &amp;quot;un&amp;quot;) then&lt;br /&gt;
						el = Data.sup[pos] .. &amp;quot; &amp;quot;&lt;br /&gt;
					else&lt;br /&gt;
						-- on ajoute X + rang&lt;br /&gt;
						el = tbl[pos] .. &amp;quot; &amp;quot; .. Data.sup[pos]&lt;br /&gt;
						-- le pluriel, sauf pour 1000, et le séparateur&lt;br /&gt;
						if (pos ~= 2) then&lt;br /&gt;
							el = el .. &amp;quot;s &amp;quot;&lt;br /&gt;
						else&lt;br /&gt;
							el = el .. &amp;quot; &amp;quot;&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			-- on insert&lt;br /&gt;
			res = el .. res&lt;br /&gt;
&lt;br /&gt;
			-- on passe au suivant&lt;br /&gt;
			pos = pos + 1&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- suppression espaces&lt;br /&gt;
		res = mw.text.trim(res)&lt;br /&gt;
&lt;br /&gt;
	end -- fin (si on n&amp;#039;avait pas trouvé en pré-défini)&lt;br /&gt;
&lt;br /&gt;
	if (style ~= nil) then&lt;br /&gt;
		-- ordinal : on cherche la fin du nombre pour ajouter le &amp;quot;ième&amp;quot; qui convient&lt;br /&gt;
		if (res == &amp;quot;zéro&amp;quot;) then&lt;br /&gt;
			res = &amp;quot;zéroième&amp;quot; -- eurk!&lt;br /&gt;
		elseif (res == &amp;quot;un&amp;quot;) then&lt;br /&gt;
			if (genre == nil) then&lt;br /&gt;
				res = &amp;quot;premier&amp;quot;&lt;br /&gt;
			else&lt;br /&gt;
				res = &amp;quot;première&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			-- on récupère le dernier mot&lt;br /&gt;
			local fin = mw.ustring.match(res, &amp;quot;%a*$&amp;quot;)&lt;br /&gt;
			-- on récupère le reste (début)&lt;br /&gt;
			local debut = mw.ustring.gsub(res, &amp;quot;%a*$&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
			&lt;br /&gt;
			-- on génère la fin en ordinal&lt;br /&gt;
			local nfin = Data.iemes[fin]&lt;br /&gt;
			if (nfin == nil) then&lt;br /&gt;
				nfin = Outils.erreur(&amp;quot;erreur interne d&amp;#039;ordinal.&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
			res = debut .. nfin&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- si orthographe réformée on remplace les espaces par des tirets&lt;br /&gt;
	if (ortho == &amp;quot;réformée&amp;quot;) then&lt;br /&gt;
		res = mw.ustring.gsub(res, &amp;quot;[ ]&amp;quot;, &amp;quot;-&amp;quot;)&lt;br /&gt;
	else&lt;br /&gt;
		-- sinon on remplace les espaces par des insécables&lt;br /&gt;
		res = mw.ustring.gsub(res, &amp;quot;[ ]&amp;quot;, &amp;quot;&amp;amp;#160;&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	if (style == nil) then&lt;br /&gt;
		-- traitement de signe éventuel (sauf ordinaux)&lt;br /&gt;
		if (signe) then&lt;br /&gt;
			res = &amp;quot;moins&amp;amp;#160;&amp;quot; .. res&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- si demandé on passe la première lettre en majuscule&lt;br /&gt;
	if (maj) then&lt;br /&gt;
		local langage = mw.getContentLanguage()&lt;br /&gt;
		res = langage:ucfirst(res)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- on retourne&lt;br /&gt;
	return res&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
  Fonction principale&lt;br /&gt;
  Reçoit en paramètre (premier non nommé) le nombre à traiter.&lt;br /&gt;
  Retourne la forme textuelle de ce nombre.&lt;br /&gt;
--]]&lt;br /&gt;
function Outils.nombre2texte(frame)&lt;br /&gt;
	local pframe = frame:getParent()&lt;br /&gt;
&lt;br /&gt;
	return Outils.nombre2texte_reel(&lt;br /&gt;
		 pframe.args[1] or frame.args[1], -- pas obligé. Pour permettre des exemples, avec priorité au modèle&lt;br /&gt;
		 frame.args[&amp;quot;langue&amp;quot;] or pframe.args[&amp;quot;langue&amp;quot;],&lt;br /&gt;
		 frame.args[&amp;quot;type&amp;quot;] or pframe.args[&amp;quot;type&amp;quot;],&lt;br /&gt;
		 frame.args[&amp;quot;orthographe&amp;quot;] or pframe.args[&amp;quot;orthographe&amp;quot;],&lt;br /&gt;
		 frame.args[&amp;quot;genre&amp;quot;] or pframe.args[&amp;quot;genre&amp;quot;],&lt;br /&gt;
		 frame.args[&amp;quot;majuscule&amp;quot;] or pframe.args[&amp;quot;majuscule&amp;quot;],&lt;br /&gt;
		 frame.args[&amp;quot;ordinal&amp;quot;] or pframe.args[&amp;quot;ordinal&amp;quot;]);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
  Comportement proche − mais plus simple − de notEmpty()&lt;br /&gt;
  Fait pour être appelé directement (#invoke), et retourne le premier de ses&lt;br /&gt;
    paramètres d&amp;#039;appel qui n&amp;#039;est pas vide (au sens contient autre chose que&lt;br /&gt;
    des espaces, retours à la ligne…)&lt;br /&gt;
  Paramètres non nommés uniquement, appelé directement (#invoke)&lt;br /&gt;
--]]&lt;br /&gt;
function Outils.premiereValeur(frame)&lt;br /&gt;
	local args = frame.args;  -- paramètres &amp;#039;&amp;#039;&amp;#039;du module&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
	for k,v in pairs( args ) do  -- parcours&lt;br /&gt;
		if (mw.text.trim(v) ~= &amp;quot;&amp;quot;) then&lt;br /&gt;
			-- si non vide on le retourne&lt;br /&gt;
			return mw.text.trim(v)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- trouvé aucun non vide, on retourne vide&lt;br /&gt;
	return &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
return Outils&lt;/div&gt;</summary>
		<author><name>LIMAFOX76</name></author>
	</entry>
</feed>