<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://wicri-demo.istex.fr/Wicri/Oceanie/fr/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://wicri-demo.istex.fr/Wicri/Oceanie/fr/index.php?action=history&amp;feed=atom&amp;title=Module%3AOutils"/>
	<link rel="alternate" type="text/html" href="https://wicri-demo.istex.fr/Wicri/Oceanie/fr/index.php?title=Module:Outils&amp;action=history"/>
	<updated>2026-04-19T06:40:04Z</updated>
	<subtitle>Historique des versions pour cette page sur le wiki</subtitle>
	<generator>MediaWiki 1.31.10</generator>
	<entry>
		<id>https://wicri-demo.istex.fr/Wicri/Oceanie/fr/index.php?title=Module:Outils&amp;diff=93&amp;oldid=prev</id>
		<title>Jacques Ducloy : 1 révision importée</title>
		<link rel="alternate" type="text/html" href="https://wicri-demo.istex.fr/Wicri/Oceanie/fr/index.php?title=Module:Outils&amp;diff=93&amp;oldid=prev"/>
		<updated>2020-12-27T22:39:53Z</updated>

		<summary type="html">&lt;p&gt;1 révision importée&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;fr&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← Version précédente&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Version du 27 décembre 2020 à 22:39&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;fr&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(Aucune différence)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Jacques Ducloy</name></author>
		
	</entry>
	<entry>
		<id>https://wicri-demo.istex.fr/Wicri/Oceanie/fr/index.php?title=Module:Outils&amp;diff=92&amp;oldid=prev</id>
		<title>Jacques Ducloy : 1 révision importée</title>
		<link rel="alternate" type="text/html" href="https://wicri-demo.istex.fr/Wicri/Oceanie/fr/index.php?title=Module:Outils&amp;diff=92&amp;oldid=prev"/>
		<updated>2020-12-07T15:43:14Z</updated>

		<summary type="html">&lt;p&gt;1 révision importée&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'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 ) == 'string' and texte~= '' then&lt;br /&gt;
		texte = texte:gsub( '^%s*(%S?.-)%s*$', '%1' )&lt;br /&gt;
		if texte ~= '' 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'erreur&lt;br /&gt;
function Outils.erreur( texte )&lt;br /&gt;
	local message = Outils.trim( texte ) or &amp;quot;''erreur : raison non précisée''&amp;quot;&lt;br /&gt;
	return '&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;' .. 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;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 == 'table' then&lt;br /&gt;
		local nextFunc = pairs( var )   -- n'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 == 'number' and var ~= 0 ) or tvar == 'function' then&lt;br /&gt;
		return var&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if select( '#', ... ) &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'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 ) == 'table' then&lt;br /&gt;
		if type( frame.getParent ) == 'function' 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 =  '-' pour une espace insécable avant l'abréviation, '+' pour l'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 ''	&lt;br /&gt;
		-- retoune l'abréviation ou au minimum une chaine vide s'il n'y a pas de texte&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local wikiText = { '&amp;lt;abbr' }&lt;br /&gt;
	if not args.visible then&lt;br /&gt;
		table.insert( wikiText, ' class=&amp;quot;abbr&amp;quot;' )&lt;br /&gt;
	end&lt;br /&gt;
	table.insert( wikiText, ' title=&amp;quot;' .. args[2] )&lt;br /&gt;
	if args[3] then &lt;br /&gt;
		table.insert( wikiText, '&amp;quot; lang=&amp;quot;' .. args[3] )&lt;br /&gt;
	end&lt;br /&gt;
	table.insert( wikiText, '&amp;quot;&amp;gt;' .. args[1] .. '&amp;lt;/abbr&amp;gt;' )&lt;br /&gt;
	if args.nbsp == '-' then&lt;br /&gt;
		table.insert( wikiText, 1, '&amp;amp;nbsp;' )&lt;br /&gt;
	elseif args.nbsp == '+' then&lt;br /&gt;
		table.insert( wikiText, '&amp;amp;nbsp;' )&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 )  == 'number' or Outils.trim( texte) then &lt;br /&gt;
		return '&amp;lt;span class=&amp;quot;nowrap&amp;quot;&amp;gt;' .. texte .. '&amp;lt;/span&amp;gt;'&lt;br /&gt;
	else&lt;br /&gt;
		return ''&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 '[[lien|texte]]' de str et retourne : texte, lien&lt;br /&gt;
	Si le lien est '[[texte]]', 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és comme des liens.&lt;br /&gt;
	Si str n'est pas une chaine, retourne : nil&lt;br /&gt;
]=]&lt;br /&gt;
function Outils.texteLien( str )&lt;br /&gt;
	if type( str ) == 'string' then&lt;br /&gt;
		for lien, texte in string.gmatch( str, '%[%[ *([^%[%]|]*)|? *([^%[%]]*)%]%]' ) do&lt;br /&gt;
			texte = ( texte ~= '' 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, '^fichier:' ) &lt;br /&gt;
				or  string.match( testlien, '^image:' )&lt;br /&gt;
				or  string.match( testlien, '^file:' )&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 '[adresse texte]' de str et retourne : texte, adresse&lt;br /&gt;
	Une adresse doit commencer par 'http://'&lt;br /&gt;
	Si le lien est '[adresse]', retourne : '', 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 '[', retourne l'adresse suivante ou str&lt;br /&gt;
	Si str n'est pas une chaine, retourne : nil&lt;br /&gt;
]=]&lt;br /&gt;
function Outils.texteAdresse( str )&lt;br /&gt;
	if type( str ) == 'string' then&lt;br /&gt;
		local lien, texte = string.match( str, '%[(https?://[^%[%] ]*) *([^%[%]]-)%]' )&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'abréviation de l'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 ''&lt;br /&gt;
	else&lt;br /&gt;
		local nom = Outils.nombre2texte_reel( nombre, nil, 'ordinal', 'réformée', feminin and 'féminin' )&lt;br /&gt;
		return Outils.abr{ num .. '&amp;lt;sup&amp;gt;e&amp;lt;/sup&amp;gt;', 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'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'importe lequel des paramètres)&lt;br /&gt;
  La fonction retourne le texte ou 'nil' si la valeur est zéro (pour gérer les 0 millier…)&lt;br /&gt;
  Le paramètre 'langue' 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'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'unité&lt;br /&gt;
			resu = Data.infcent[c1] .. &amp;quot; cent&amp;quot;&lt;br /&gt;
			-- si pas d'unité 100 prend un 's'&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'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'il y a une virgule, on l'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'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 : 'ordinal'&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'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'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( 'Module:Outils/Data' )&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'é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'é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 'nil' 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'ajoute, s'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'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'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'appel qui n'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 '''du module'''&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>Jacques Ducloy</name></author>
		
	</entry>
</feed>