Uso

El siguiente módulo permite convertir entre magnitudes.

Funciones utilizables desde otro módulo

  • mostrarValor(valor, unidad, opciones) muestra el valor junto a una unidad de medida. Los parámetros de la función son:
    • valor: valor numérico de la magnitud, por ejemplo 100.
    • unidad: unidad de la magnitud. De momento identificador de la unidad en Wikidata. Por ejemplo, Q35852 para hectáreas.
    • opciones: tabla de parámetros opcionales. Los parámetros permitidos son:
      • precisión: número de decimales que se muestran tras la coma decimal. El valor por defecto es 2.
      • enlace: si toma el valor de "no" no se enlaza la unidad. Si no se informa el parámetro o toma otro valor se enlaza la unidad.

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

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

-- Constantes
local unidades = {
	['Q794261'] = {
		['etiqueta']    = 'metro cúbico por segundo',
		['abreviatura'] = 'm³/s',
		['cambio unidad'] = {
		},
		['unidad SI'] = true,
	},	
	['Q25343'] = {
		['etiqueta']    = 'metro cuadrado',
		['abreviatura'] = 'm²',
		['cambio unidad'] = {
			{'Q712226', 1000000, '>'}, -- km²
			{'Q35852', 10000, '>'} -- ha
		},
		['unidad SI'] = true,
	},	
	['Q712226'] = {
		['etiqueta']    = 'kilómetro cuadrado',
		['abreviatura'] = 'km²',
		['conversionSI'] = { 1000000, 'Q25343'}, -- 1 km² = 1000 000 m²
		['unidad SI'] = true,
	},
	['Q35852']  = {
		['etiqueta']    = 'hectárea',
		['abreviatura'] = 'ha',
		['conversionSI'] = {10000, 'Q25343'}, -- 1 hectárea = 10.000 m²
		['unidad SI'] = true,
	},
	['Q81292'] = {
		['etiqueta'] = 'acre',
		['enlace']    = 'acre (unidad de superficie)',
		['plural']    = 'acres',
		['conversionSI'] = { 4046.8564224, 'Q25343'} -- 1 acre = 4046,8564224 m²
	},
	['Q232291'] = {
		['etiqueta']    = 'milla cuadrada',
		['abreviatura'] = 'mi²',		
		['conversionSI'] = {2589988.110336, 'Q25343'} -- 1 milla cuadrada = 2 589 988,110336 m²
	},
	['Q216795'] = {
		['etiqueta']    = 'dunam',
		['conversionSI'] = {1000, 'Q25343'}
	},
	['Q23931109'] = {
		['etiqueta']    = 'dunam métrico',
		['conversionSI'] = {1000, 'Q25343'}
	},
    -- Unidades de longitud
	['Q11573'] = {
		['etiqueta']    = 'metro',
		['abreviatura'] = 'm',
		['plural']    = 'metros',		
		['cambio unidad'] = {
			{'Q828224', 1000, '>'}, -- km
		},
		['unidad SI'] = true,
	},
	['Q1811'] = {
		['etiqueta']    = 'unidad astronómica',
		['abreviatura'] = 'ua',
		['conversionSI'] = { 149597870691, 'Q11573'}, -- 1 unidad astronómica = 149 597 870 691 metros
		['unidad SI'] = true,
	},
	['Q12129'] = {
		['etiqueta']    = 'pársec',
		['abreviatura'] = 'pc',
		['conversionSI'] = {30856775814913672.7891393795779647161073192116040917980140401922770232921869992968698321353388065559933270120238005882778325, 'Q11573'},
		['unidad SI'] = true,
	},
	['Q531'] = {
		['etiqueta']    = 'año luz',
		--['abreviatura'] = 'mi',
		['plural']    = 'años luz',		
		['conversionSI']  = {9460730472580800 , 'Q11573'}, -- 1 año luz = 9460730472580800  m
		['unidad SI'] = true,
	},

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

	['Q253276'] = {
		['etiqueta']    = 'milla',
		['abreviatura'] = 'mi',
		['conversionSI']  = {1609.344, 'Q11573'} -- 1 milla = 1609,344 m
	},
	['Q828224'] = {
		['etiqueta']    = 'kilómetro',
		['abreviatura'] = 'km',
		['conversionSI'] = { 1000, 'Q11573'}, -- 1 kilómetro = 1000 metros	
		['unidad SI'] = true,
	},
	['Q3710'] = {
		['etiqueta']    = 'pie',
		--['abreviatura'] = 'ft',
		['plural']    = 'pies',		
		['conversionSI']  = {0.3048006, 'Q11573'}, -- 1 pie = 0,3048006 m
		['enlace']    = 'pie (unidad)',
	},
	['Q218593'] = {
		['etiqueta']    = 'pulgada',
		--['abreviatura'] = 'in',
		['plural']    = 'pulgadas',		
		['conversionSI']  = {0.0254, 'Q11573'} -- 1 pulgada = 0,0254 m
	},
	['Q174728'] = {
		['etiqueta']    = 'centímetro',
		['abreviatura'] = 'cm',
		['conversionSI']  = {0.01, 'Q11573'}, -- 1 centímetro = 0.01 m
		['unidad SI'] = true,
	},
	['Q174789'] = {
		['etiqueta']    = 'milímetro',
		['abreviatura'] = 'mm',
		['conversionSI']  = {0.001, 'Q11573'}, -- 1 milímetro = 0.001 m
		['unidad SI'] = true,		
	},
	['Q175821'] = {
		['etiqueta']    = 'micrómetro',
		['abreviatura'] = 'µm',
		['conversionSI']  = {0.000001, 'Q11573'}, -- 1 micrómetro = 0.000001 m
		['unidad SI'] = true,		
	},
	['Q178674'] = {
		['etiqueta']    = 'nanómetro',
		['abreviatura'] = 'nm',
		['conversionSI']  = {0.000000001, 'Q11573'}, -- 1 nanómetro = 0,000000001 m
		['unidad SI'] = true,		
	},
    -- Unidades de masa
	['Q11570'] = {
		['etiqueta']    = 'kilogramo',
		['abreviatura'] = 'kg',
		['plural']    = 'kilogramos',		
		--['cambio unidad'] = {
		--	{'Q828224', 1000, '>'}, -- km
		--},
		['unidad SI'] = true,
	},
}

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

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

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

return p