Aller au contenu

Module:Conversion

Une nouvelle de Wikinews, la source d'informations que vous pouvez écrire.

Modèle de mise en forme de valeur numérique éventuellement accompagnée d'une unité de mesure.

Fonctions exportables vers un autre module

[modifier le wikicode]
  • fonction p.convertvalue(value, sourceunit, displayformat) met en forme une valeur numérique éventuellement accompagné d'une unité de mesure
  • value doit être un nombre, ou une chaîne pouvant être convertie en nombre
  • sourceunit doit correspondre à une valeur acceptée sur Module:Conversion/Données.
  • la table displayformat contient les paramètres suivant :
  • showunit showunit = true affiche l'unité de mesure, en utilisant l'abréviation donnée dans Module:Conversion/Données. showunit = long utilise le format long ("mètres" à la place de "m").
  • showlink = affiche un lien vers l'article concernant l'unité de mesure (m -> m)
  • rounding = nombre de chiffres après la virgule

Fonctions exportables vers un modèle

[modifier le wikicode]
  • fonction p.display(frame) : sert d'intermédiaire entre le wikicode et la fonction displayvalue. Arguments:
  • 1 = valeur numérique
  • 2 = unité de mesure de la valeur d'origine
  • 3 = unité de mesure de la valeur à retourner
  • showunit = mettre "true" pour afficher l'unité de mesure
  • rounding = nombre de chiffres après la virgule
  • {{#invoke:Conversion|display|25|foot|metre}} 7,62
  • {{#invoke:Conversion|display|25|foot|metre|rounding=0|showunit = true}} 8 m

Modules externes et autres éléments dont ce module a besoin pour fonctionner

[modifier le wikicode]

local math_mod = require "Module:Math"
local formatnum = require "Module:Format".do_formatnum
local params = require "Module:Conversion/Données"
local defaultlang = 'fr'

local p = {}

local i18n = {
	invalidunit = 'Page avec une unité de mesure non prise en charge'
}

local function numString(val, rounding, displayformat) -- transforme un nombre en chaîne
	if rounding then
		val = math_mod._round( val, rounding )
	end
	val = formatnum({tostring(val)})
	if displayformat and displayformat.suffix then
		val = val .. suffix
	end
	return val
end

local function convert(value, sourceunitdata, targetunitdata) -- convertir une valeur numérique en son équivalent dans une autre unité de mesure
	if not value then
		return nil
	end
	if type(value) ~= 'number' then
		return error("bad datatype: " .. type(value))
	end
	if (not sourceunitdata) or (not targetunitdata) then
		return value
	end
	return value * sourceunitdata[2] / targetunitdata[2]
end

function p.displayvalue(val, sourceunit, displayformat, errhandling) -- affiche une valeur formatée)
	
	-- préparation des paramètres
	local numval = tonumber(val)
	if not numval then -- si les données sont inhabituelles, on laisse la fonction appelante se débrouiller
		return val
	end
	
	if not displayformat or type(displayformat) ~= 'table' then
		displayformat = {}
	end
	local showunit, showlink, rounding, targetunit = displayformat.showunit, displayformat.showlink, displayformat.rounding, displayformat.targetunit
	
	-- récupération des donnnées concernant les unités
	if sourceunit and not targetunit then
		targetunit = sourceunit
	end
	local sourceunitdata, targetunitdata = sourceunit, targetunit
	if type(sourceunitdata) ~= 'table' then
		sourceunitdata = params.units[sourceunit] or params.units[params.redirects[sourceunit]]
	end
	if type(targetunitdata) ~= 'table' then	
		targetunitdata = params.units[targetunit] or params.units[params.redirects[targetunit]]
	end
	
	if sourceunitdata and targetunitdata and (targetunitdata[1] ~= sourceunitdata[1]) then
		return error("measurement unit mismatch: " .. sourceunitdata[1] .. ' and ' .. targetunitdata[1] )
	end
	
	-- partie numérique
	if (sourceunit and targetunit) and (sourceunit ~= targetunit) then
		numval = convert(numval, sourceunitdata, targetunitdata)
	end
	local numstr = numString(numval, rounding)


	-- affichage de l'unité
	local unitstr, link
	if not targetunitdata then -- pour éviter les bugs
		targetunitdata = {}
	end
	if showunit == 'long' then -- format long = montrer l'unité en entier
		if (numval or 0) > 1 then
			unitstr = targetunitdata[7]
		else
			unitstr = targetunitdata[6]
		end
	elseif showunit then
		unitstr = targetunitdata[3]
	end
	if sourceunit and showunit and (not unitstr) then
		numstr = numstr .. '[[Category:' .. i18n.invalidunit .. ']]'
	end
	-- showlink
	if type( displayformat.showlink == 'string') then --liens personnalisés
		link = displayformat.showlink
	elseif displayformat.showlink == true then -- liens vers l'article dédié
		link =  targetunitdata[5]
	end
	if unitstr and link then
		unitstr = '[[' .. link .. '|' .. unitstr .. ']]'
	end

	return numstr .. ' ' .. (unitstr or '')
end

function p.display(frame)
	local args = frame.args
	local value, origunit, targetunit = args[1], args[2], args[3]
	local rounding = args.rounding
	local showlink, showunit = 	args.showlink, args.showunit
	if showunit == 'true' then
		showunit = true
	end
	if showlink == 'true' then
		showlink = true
	end
	displayformat = {showunit = showunit, showlink = showlink, rounding = rounding, targetunit = targetunit}
	return p.displayvalue(value, origunit, displayformat)
end
return p