Module:Cunversione

Dae Wikipedia, s'entziclopedia lìbera.

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

--[[
* Mòdulu pro fàghere sa cunversione de unidade de medida.
*
* Modificadu partinde dae:
* http://fr.wikipedia.org/w/index.php?title=Module:Conversion&oldid=118515752
]]--

require('Module:No globals')

local cfg = mw.loadData('Module:Cunversione/Configuratzione')
local p = {}

-- Frunit su nùmeru arrotundadu a su nùmeru de tzifras detzimales pedidu
-- http://lua-users.org/wiki/SimpleRound
local function round(num, idp)
	local mult = 10 ^ (idp or 0)
	return math.floor(num * mult + 0.5) / mult
end

local function getUnit(val, targetunitdata, args)
	local ret, link, space

	if args.showunit then
		ret = targetunitdata.symbol
	elseif args.showunitlong then
	 	-- unidades pro estèndidu
		ret = val > 1 and targetunitdata.name2 or targetunitdata.name1
	end

	if args.showunitlink then
		link = targetunitdata.link
	end

	space = (args.showunit and targetunitdata.nospace) and '' or ' '

	return space .. (link and '[[' .. link .. '|' .. ret .. ']]' or ret)
end

-- FRunit su balore cunvertidu a s'unidade de medida e a sos sèberos ispetzificados
function p._main(strval, sourceunit, targetunit, args)
	local val, sourceunitdata, targetunitdata, cat

	val = tonumber(strval)
	-- si no est unu nùmeru frunit s'istringa non modificada
	if not val then
		return strval
	end
	if not args then
		args = {}
	end

	if sourceunit and not targetunit then
		targetunit = sourceunit
	end
	sourceunitdata = cfg.units[sourceunit] or cfg.units[cfg.alias[sourceunit]]
	targetunitdata = cfg.units[targetunit] or cfg.units[cfg.alias[targetunit]]
	if sourceunitdata and targetunitdata then
		if sourceunitdata.type ~= targetunitdata.type then
			error('unidade de medida incumpatìbiles: ' .. sourceunitdata.type .. ' e ' .. targetunitdata.type)
		end
		if sourceunitdata == targetunitdata then
			-- nothing
		elseif sourceunitdata.type == 'temperature' then
			val = (val - sourceunitdata.offset) * sourceunitdata.scale
			val = val / targetunitdata.scale + targetunitdata.offset
		else
			val = val * sourceunitdata.scale / targetunitdata.scale
		end
	else
		cat = '[[Categoria:Pàginas cun unidades de medida non suportadas]]'
	end

	-- arrotundamentu
	if args.rounding then
		val = round(val, args.rounding)
	end

	-- formatnum
	if args.formatnum then
		val = mw.language.getContentLanguage():formatNum(val)
	end

	-- unidade de mèdida
	if targetunitdata and (args.showunit or args.showunitlong) then
		val = val .. getUnit(val, targetunitdata, args)
	end

	return val .. (cat or '')
end

-- Entry-point pro {{#invoke:Conversione|main|...}}
function p.main(frame)
	local args = frame.args
	return p._main(args[1], args[2], args[3], args)
end

return p