Module:Conversion

Documentation for this module may be created at Module:Conversion/doc

local math_mod = require "Module:Math"local formatnum = require "Module:Format".do_formatnumlocal params = require "Module:Conversion/Données"local defaultlang = 'fr'local p = {}local i18n = {invalidunitcat = 'Page avec une unité de mesure non supportée',invalidsourceunit = '$1 (unité non supportée)',invalidtargetunit = 'unité cible non supportée $1',typemismatch = 'impossible de convertir $1 en $2'}local function numString(val, rounding, displayformat) -- transforme un nombre en chaîneif rounding thenval = math_mod._round( val, rounding )endval = formatnum({tostring(val)})if displayformat and displayformat.suffix thenval = val .. suffixendreturn valendlocal function convert(value, sourceunitdata, targetunitdata) -- convertir une valeur numérique en son équivalent dans une autre unité de mesureif not value thenreturn nilendif type(value) ~= 'number' thenreturn error("bad datatype: " .. type(value))endif (not sourceunitdata) or (not targetunitdata) thenreturn valueendreturn value * sourceunitdata[2] / targetunitdata[2]endfunction p.displayvalue(val, sourceunit, displayformat, errhandling) -- affiche une valeur formatée)-- préparation des paramètreslocal numval = tonumber(val)if not numval then -- si les données sont inhabituelles, on laisse la fonction appelante se débrouillerreturn valendif not displayformat or type(displayformat) ~= 'table' thendisplayformat = {}endlocal showunit, showlink, targetunit = displayformat.showunit, displayformat.showlink, displayformat.targetunitlocal rounding = displayformat.rounding or 2-- récupération des donnnées concernant les unitésif sourceunit and not targetunit thentargetunit = sourceunitendlocal sourceunitdata, targetunitdata = sourceunit, targetunitif type(sourceunitdata) ~= 'table' thensourceunitdata = params.units[sourceunit] or params.units[params.redirects[sourceunit]]endif type(targetunitdata) ~= 'table' thentargetunitdata = params.units[targetunit] or params.units[params.redirects[targetunit]]endlocal maintenancestr = ""-- conversionlocal function invalidsourcefallback(val, sourceunit) -- text to be shown when source unit is not supportedlocal str = tostring(val)if sourceunit:match('Q%d+') or sourceunit:match('q%d+') then -- wikidata itemsourceunit = mw.wikibase.label(sourceunit)endreturn val .. ' ' .. i18n['invalidsourceunit']:gsub('$1', sourceunit) .. '[[Category:' .. i18n.invalidunitcat .. '|' .. sourceunit .. ']]'end-- escape if source unit is invalidif (sourceunit and targetunit) and (targetunit~= sourceunit) and (not sourceunitdata or not sourceunitdata[1]) thenreturn invalidsourcefallback(val, sourceunit)endif sourceunit and (not sourceunitdata) then local label = sourceunitlocal item = sourceunit:match('q%d+') or sourceunit:match('Q%d+')local linklocal symbolif item thenlabel = mw.wikibase.label(item)link = mw.wikibase.sitelink(item)if (displayformat.showunit) and (displayformat.showunit ~= 'long') then -- symbole retrieved only if needed (somewhat expensive)symbol = mw.wikibase.getEntityObject(item):formatPropertyValues( 'P558' )if symbol thensymbol = symbol.valueendendendsourceunitdata = {nil, 1, symbol or label, item, link, label, label}targetunit, targetunitdata  = sourceunit, sourceunitdata end-- warn if targetunit is unknownif targetunit and (not targetunitdata) thentargetunit, targetunitdata = sourceunit, sourceunitdatamaintenancestr = maintenancestr .. " "  .. i18n['invalidtargetunit']:gsub('$1', targetunit) .. '[[Category:' .. i18n.invalidunitcat .. '|' .. targetunit .. ']]'end-- check for type mismatchif (sourceunitdata and targetunitdata) and (targetunitdata[1] ~= sourceunitdata[1]) thenlocal errmsg = i18n.typemismatcherrmsg = errmsg:gsub('$1', sourceunit)errmsg = errmsg:gsub('$2', targetunit)maintenancestr = maintenancestr .. '(' .. errmsg .. ')'targetunit, targetunitdata = sourceunit, sourceunitdataend-- convert if neededif (sourceunit and targetunit) and (sourceunit ~= targetunit) thennumval = convert(numval, sourceunitdata, targetunitdata)endif displayformat.raw == true then -- nombre non formaté chaîne convertible en nombre sauf si catégorie de maintenancereturn (tostring(numval) or "") .. maintenancestrendlocal numstr = numString(numval, rounding)-- affichage de l'unitélocal unitstr, linkif not targetunitdata then -- pour éviter les bugstargetunitdata = {}endif showunit == 'long' then -- format long = montrer l'unité en entierif (numval or 0) > 1 thenunitstr = targetunitdata[7]elseunitstr = targetunitdata[6]endelseif showunit and (showunit ~= '-') thenunitstr = targetunitdata[3]end-- showlinklocal linkif (type(showlink) == 'string') and (showlink == '-') thenlink = nilelseif type(showlink) == 'string' thenlink = showlinkelseif showlink thenlink = targetunitdata[5]endif (unitstr and link) thenunitstr = '[[' .. link .. '|' .. unitstr .. ']]'endreturn numstr .. ' ' .. (unitstr or '') .. maintenancestrendfunction p.display(frame)local args = frame.argslocal value, origunit, targetunit = args[1], args[2], args[3]local rounding = args.roundinglocal showlink, showunit = args.showlink, args.showunitif showunit == 'true' thenshowunit = trueendif showlink == 'true' thenshowlink = trueenddisplayformat = {showunit = showunit, showlink = showlink, rounding = rounding, targetunit = targetunit}return p.displayvalue(value, origunit, displayformat)endreturn p