Moduulin Fr:Conversion käyttöohje
Tämä sivu on kopio. Tätä ohjetta muokataan muokkaamalla suomenkielisessä Wikipediassa olevaa alkuperäistä versiota jonka muutokset kopioituvat automaattisesti tälle sivulle. Tämä moduuli on osa ranskankielisestä Wikipediasta kopioitua Wikidata ja Interface Wikidata -moduulikokonaisuutta (ks. ohjeet ja esimerkit). Listauksen kaikista tähän liittyvistä moduuleista löydät Ranskankielisen Wikipedian Wikidata-moduulit -sivulta.
|
local math_mod = require "Module:Fr:Math"
local formatnum = require "Module:Fr:Format".do_formatnum
local params = require "Module:Fr:Conversion/Données"
local defaultlang = 'fr'
local p = {}
local i18n = {
invalidunitcat = 'Page with an unsupported measurement unit',
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î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 / targetunitdata
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, targetunit = displayformat.showunit, displayformat.showlink, displayformat.targetunit
local rounding = displayformat.rounding or 2
-- 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 or params.units]
end
if type(targetunitdata) ~= 'table' then
targetunitdata = params.units or params.units]
end
local maintenancestr = ""
-- conversion
local function invalidsourcefallback(val, sourceunit) -- text to be shown when source unit is not supported
local str = tostring(val)
if sourceunit:match('Q%d+') or sourceunit:match('q%d+') then -- wikidata item
sourceunit = mw.wikibase.label(sourceunit)
end
return val .. ' ' .. i18n:gsub('$1', sourceunit) .. ']'
end
-- escape if source unit is invalid
if (sourceunit and targetunit) and (targetunit~= sourceunit) and (not sourceunitdata or not sourceunitdata) then
return invalidsourcefallback(val, sourceunit)
end
if sourceunit and (not sourceunitdata) then
local label = sourceunit
local item = sourceunit:match('q%d+') or sourceunit:match('Q%d+')
local link
local symbol
if item then
label = 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 then
symbol = symbol.value
end
end
end
sourceunitdata = {nil, 1, symbol or label, item, link, label, label}
targetunit, targetunitdata = sourceunit, sourceunitdata
end
-- warn if targetunit is unknown
if targetunit and (not targetunitdata) then
targetunit, targetunitdata = sourceunit, sourceunitdata
maintenancestr = maintenancestr .. " " .. i18n:gsub('$1', targetunit) .. ']'
end
-- check for type mismatch
if (sourceunitdata and targetunitdata) and (targetunitdata ~= sourceunitdata) then
local errmsg = i18n.typemismatch
errmsg = errmsg:gsub('$1', sourceunit)
errmsg = errmsg:gsub('$2', targetunit)
maintenancestr = maintenancestr .. '(' .. errmsg .. ')'
targetunit, targetunitdata = sourceunit, sourceunitdata
end
-- convert if needed
if (sourceunit and targetunit) and (sourceunit ~= targetunit) then
numval = convert(numval, sourceunitdata, targetunitdata)
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
else
unitstr = targetunitdata
end
elseif showunit then
unitstr = targetunitdata
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
end
if unitstr and link then
unitstr = ']'
end
return numstr .. ' ' .. (unitstr or '') .. maintenancestr
end
function p.display(frame)
local args = frame.args
local value, origunit, targetunit = args, args, args
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