La documentación para este módulo puede ser creada en Módulo:Convertir/doc

local p  = {}
local es = mw.language.new('an')

local elementoTabla = require('Módulo:Tablas').elemento
local enlazar       = require('Módulo:Wikidata/Formatos').enlazar
local redondear     = require('Módulo:Math')._round

-- Constantes
local unidatz = {
	['Q794261'] = {
		['etiqueta']    = 'metro cubico por segundo',
		['abreviadura'] = 'm³/s',
		['cambio unidat'] = {
		},
		['unidat SI'] = true,
	},	
	['Q25343'] = {
		['etiqueta']    = 'metro quadrau',
		['abreviadura'] = 'm²',
		['cambio unidat'] = {
			{'Q712226', 1000000, '>'}, -- km²
			{'Q35852', 10000, '>'} -- ha
		},
		['unidat SI'] = true,
	},	
	['Q712226'] = {
		['etiqueta']    = 'kilometro quadrau',
		['abreviadura'] = 'km²',
		['conversionSI'] = { 1000000, 'Q25343'}, -- 1 km² = 1000 000 m²
		['unidat SI'] = true,
	},
	['Q35852']  = {
		['etiqueta']    = 'hectaria',
		['abreviadura'] = 'ha',
		['conversionSI'] = {10000, 'Q25343'}, -- 1 hectaria = 10.000 m²
		['unidat SI'] = true,
	},
	['Q81292'] = {
		['etiqueta'] = 'acre',
		['enlace']    = 'acre (unidat de superficie)',
		['plural']    = 'acres',
		['conversionSI'] = { 4046.8564224, 'Q25343'} -- 1 acre = 4046,8564224 m²
	},
	['Q232291'] = {
		['etiqueta']    = 'milla quadrada',
		['abreviadura'] = 'mi²',		
		['conversionSI'] = {2589988.110336, 'Q25343'} -- 1 milla quadrada = 2 589 988,110336 m²
	},
	['Q216795'] = {
		['etiqueta']    = 'dunam',
		['conversionSI'] = {1000, 'Q25343'}
	},
	['Q23931109'] = {
		['etiqueta']    = 'dunam metrico',
		['conversionSI'] = {1000, 'Q25343'}
	},
    -- Unidades de longitud
	['Q11573'] = {
		['etiqueta']    = 'metro',
		['abreviadura'] = 'm',
		['plural']    = 'metros',		
		['cambio unidat'] = {
			{'Q828224', 1000, '>'}, -- km
		},
		['unidat SI'] = true,
	},
	['Q1811'] = {
		['etiqueta']    = 'unidat astronomica',
		['abreviadura'] = 'ua',
		['conversionSI'] = { 149597870691, 'Q11573'}, -- 1 unidat astronomica = 149 597 870 691 metros
		['unidat SI'] = true,
	},
	['Q12129'] = {
		['etiqueta']    = 'pársec',
		['abreviadura'] = 'pc',
		['conversionSI'] = {30856775814913672.7891393795779647161073192116040917980140401922770232921869992968698321353388065559933270120238005882778325, 'Q11573'},
		['unidat SI'] = true,
	},
	['Q531'] = {
		['etiqueta']    = 'anyo luz',
		--['abreviadura'] = 'mi',
		['plural']    = 'anyos luz',		
		['conversionSI']  = {9460730472580800 , 'Q11573'}, -- 1 anyo luz = 9460730472580800  m
		['unidat SI'] = true,
	},

	['Q93318'] = {
		['etiqueta']    = 'milla nautica',
		--['abreviadura'] = 'mi',
		['plural']    = 'millas náuticas',		
		['conversionSI']  = {1852 , 'Q11573'}, -- 1 milla nautica = 1852  m
		--['unidat SI'] = true,
	},

	['Q253276'] = {
		['etiqueta']    = 'milla',
		['abreviadura'] = 'mi',
		['conversionSI']  = {1609.344, 'Q11573'} -- 1 milla = 1609,344 m
	},
	['Q828224'] = {
		['etiqueta']    = 'kilometro',
		['abreviadura'] = 'km',
		['conversionSI'] = { 1000, 'Q11573'}, -- 1 kilometro = 1000 metros	
		['unidat SI'] = true,
	},
	['Q3710'] = {
		['etiqueta']    = 'piet',
		--['abreviadura'] = 'ft',
		['plural']    = 'pies',		
		['conversionSI']  = {0.3048006, 'Q11573'}, -- 1 piet = 0,3048006 m
		['enlace']    = 'piet (unidat)',
	},
	['Q218593'] = {
		['etiqueta']    = 'pulgada',
		--['abreviadura'] = 'in',
		['plural']    = 'pulgadas',		
		['conversionSI']  = {0.0254, 'Q11573'} -- 1 pulgada = 0,0254 m
	},
	['Q174728'] = {
		['etiqueta']    = 'centimetro',
		['abreviadura'] = 'cm',
		['conversionSI']  = {0.01, 'Q11573'}, -- 1 centimetro = 0.01 m
		['unidat SI'] = true,
	},
	['Q174789'] = {
		['etiqueta']    = 'milimetro',
		['abreviadura'] = 'mm',
		['conversionSI']  = {0.001, 'Q11573'}, -- 1 milimetro = 0.001 m
		['unidat SI'] = true,		
	},
	['Q175821'] = {
		['etiqueta']    = 'micrometro',
		['abreviadura'] = 'µm',
		['conversionSI']  = {0.000001, 'Q11573'}, -- 1 micrometro = 0.000001 m
		['unidat SI'] = true,		
	},
	['Q178674'] = {
		['etiqueta']    = 'nanometro',
		['abreviadura'] = 'nm',
		['conversionSI']  = {0.000000001, 'Q11573'}, -- 1 nanometro = 0,000000001 m
		['unidat SI'] = true,		
	},
    -- Unidades de masa
	['Q11570'] = {
		['etiqueta']    = 'kilogramo',
		['abreviadura'] = 'kg',
		['plural']    = 'kilogramos',		
		--['cambio unidat'] = {
		--	{'Q828224', 1000, '>'}, -- km
		--},
		['unidat SI'] = true,
	},
}

local function formatearMagnitut(cantidad, unidat, opcions)
	if not unidadConversion and unidat['cambio unidat'] then
		for k, v in pairs( unidat['cambio unidat'] ) do
			if cantidad >= v[2] then
				return formatearMagnitut(cantidad / v[2], unidatz[v[1]], opcions)
			end
		end
	end
	
	--if true then return require('Módulo:Tablas').tostring(opcions) end
	
	local precision = opcions['precisión'] or 2
	
	unidat.enlace = unidat.enlace or unidat.etiqueta

	--if true then return require('Módulo:Tablas').tostring(opcions) end
	
	-- Redondear a dos decimales, formatear y anyadir la unidat enlazada en su caso
	if unidat.abreviadura then
		return es:formatNum(redondear(cantidad, precision)) .. ' ' .. enlazar(unidat.enlace, unidat.abreviadura, nil, opcions)		
	elseif cantidad == 1 or not unidat.plural then
		return es:formatNum(redondear(cantidad, precision)) .. ' ' .. enlazar(unidat.enlace, unidat.etiqueta, nil, opcions)
	else
		return es:formatNum(redondear(cantidad, precision)) .. ' ' .. enlazar(unidat.enlace, unidat.plural, nil, opcions)
	end
end

function p.amostrarValor(valor, unidatOrichinal, opcions)
	if not valor then
		return
	end
	
	if not unidatOrichinal then
		return valor
	end
	
	opcions = opcions or {}
	
	--if true then return valor end
	
	local datosUnidatOrichinal = unidatz[unidatOrichinal]
	
	if not datosUnidatOrichinal then
		datosUnidatOrichinal = {}
		local entidat = mw.wikibase.getEntityObject(unidatOrichinal)
		--if true then return require('Módulo:Tablas').tostring(entidat) end
		datosUnidatOrichinal.etiqueta = elementoTabla(entidat, 'labels', 'es', 'value')
		datosUnidatOrichinal.enlace   = elementoTabla(entidat, 'sitelinks', 'eswiki', 'title')
		datosUnidatOrichinal.conversionSI = {
			   [1]=tonumber((elementoTabla(entidat,'claims','P2370',1,'mainsnak','datavalue','value','amount'):gsub('+','') or ''))
			 , [2]=elementoTabla(entidat,'claims','P2370',1,'mainsnak','datavalue','value','unit'):gsub('^.-/(Q%d+)$', '%1')
		}
		
		--if true then return require('Módulo:Tablas').tostring(datosUnidatOrichinal) end
	end
	
	--if true then return require('Módulo:Tablas').tostring(opcions) end
	
	local conversionSI = datosUnidatOrichinal.conversionSI
	
	if opcions.unidadConversion and opcions.unidadConversion ~= '' then
	elseif not conversionSI then
		return formatearMagnitut(tonumber(valor), datosUnidatOrichinal, opcions)
	elseif conversionSI and datosUnidatOrichinal['unidat SI'] then
		return formatearMagnitut(tonumber(valor) * conversionSI[1], unidatz[conversionSI[2]], opcions)
	else
		return formatearMagnitut(tonumber(valor), datosUnidatOrichinal, opcions) .. 
		' (' .. formatearMagnitut(tonumber(valor) * conversionSI[1], unidatz[conversionSI[2]], opcions) .. ')'		
	end
	
end
	
function p.amostrar(frame)
	local args = frame.args
	
	return p.amostrarValor(args[1], args[2], {unidadConversion=args[3], ['precisión']=args[4], disp=args.disp,enlace=args.enlace})
end

return p