Module:Conversion
La documentation pour ce module peut être créée à Module:Conversion/doc
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 supportée'
}
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
local failure = false
if (sourceunit and targetunit) and (sourceunit ~= targetunit) then
numval = convert(numval, sourceunitdata, targetunitdata)
if (not targetunitdata) or (not targetunitdata[1]) or (not sourceunitdata) or (not sourceunitdata[1]) then
failure = true
end
end
local maintenancestr = ""
if failure then
maintenancestr = maintenancestr .. '[[Category:' .. i18n.invalidunit .. ']]'
end
if displayformat.raw == true then -- nombre non formaté chaîne convertible en nombre sauf si catégorie de maintenance
return (tostring(numval) or "") .. maintenancestr
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
-- 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 '') .. maintenancestr
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